@deepintel-ltd/farmpro-contracts 1.5.12 → 1.5.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/routes/agent-workflows.routes.d.ts +48 -42
- package/dist/routes/agent-workflows.routes.d.ts.map +1 -1
- package/dist/routes/agent-workflows.routes.js +17 -20
- package/dist/routes/agents.routes.d.ts +632 -84
- package/dist/routes/agents.routes.d.ts.map +1 -1
- package/dist/routes/agents.routes.js +48 -5
- package/dist/routes/field-monitoring.routes.d.ts +18 -18
- package/dist/routes/field-observations.routes.d.ts +56 -48
- package/dist/routes/field-observations.routes.d.ts.map +1 -1
- package/dist/routes/finance.routes.d.ts +107 -2
- package/dist/routes/finance.routes.d.ts.map +1 -1
- package/dist/routes/finance.routes.js +2 -2
- package/dist/schemas/agents.schemas.d.ts +916 -0
- package/dist/schemas/agents.schemas.d.ts.map +1 -1
- package/dist/schemas/agents.schemas.js +34 -0
- package/dist/schemas/field-monitoring.schemas.d.ts +18 -18
- package/dist/schemas/field-observations.schemas.d.ts +38 -24
- package/dist/schemas/field-observations.schemas.d.ts.map +1 -1
- package/dist/schemas/field-observations.schemas.js +9 -11
- package/dist/schemas/finance.schemas.d.ts +116 -0
- package/dist/schemas/finance.schemas.d.ts.map +1 -1
- package/dist/schemas/finance.schemas.js +11 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.routes.d.ts","sourceRoot":"","sources":["../../src/routes/agents.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.routes.d.ts","sourceRoot":"","sources":["../../src/routes/agents.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoGvB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { initContract } from '@ts-rest/core';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { chatRequestSchema, agentChatResponseSchema, conversationHistoryResponseSchema, conversationListResponseSchema, } from '../schemas/agents.schemas';
|
|
3
|
+
import { chatRequestSchema, agentChatResponseSchema, conversationHistoryResponseSchema, conversationListResponseSchema, surveyGeoJsonResponseSchema, } from '../schemas/agents.schemas';
|
|
4
4
|
import { jsonApiErrorResponseSchema } from '../schemas/common.schemas';
|
|
5
5
|
const c = initContract();
|
|
6
6
|
export const agentsRouter = c.router({
|
|
@@ -9,10 +9,36 @@ export const agentsRouter = c.router({
|
|
|
9
9
|
method: 'POST',
|
|
10
10
|
path: '/agents/agronomics/chat',
|
|
11
11
|
contentType: 'multipart/form-data', // Support file uploads
|
|
12
|
-
body: z.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
body: z.object({
|
|
13
|
+
// In multipart/form-data, 'data' comes as a JSON string that needs to be parsed
|
|
14
|
+
// Accept both string (from form-data) and object (already parsed) for flexibility
|
|
15
|
+
data: z.union([
|
|
16
|
+
chatRequestSchema, // Already an object
|
|
17
|
+
z.string().transform((str, ctx) => {
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(str);
|
|
20
|
+
return chatRequestSchema.parse(parsed);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof z.ZodError) {
|
|
24
|
+
ctx.addIssue({
|
|
25
|
+
code: z.ZodIssueCode.custom,
|
|
26
|
+
message: `Invalid data structure: ${error.errors.map(e => e.message).join(', ')}`,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
ctx.addIssue({
|
|
31
|
+
code: z.ZodIssueCode.custom,
|
|
32
|
+
message: 'Invalid JSON in data field',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return z.NEVER;
|
|
36
|
+
}
|
|
37
|
+
}),
|
|
38
|
+
]),
|
|
39
|
+
file: z.instanceof(File).optional(),
|
|
40
|
+
files: z.union([z.instanceof(File), z.array(z.instanceof(File))]).optional(),
|
|
41
|
+
}),
|
|
16
42
|
responses: {
|
|
17
43
|
200: agentChatResponseSchema,
|
|
18
44
|
400: jsonApiErrorResponseSchema,
|
|
@@ -62,4 +88,21 @@ export const agentsRouter = c.router({
|
|
|
62
88
|
summary: 'List all conversations for a farm',
|
|
63
89
|
description: 'Retrieve a list of all conversations for a specific farm, ordered by most recent first',
|
|
64
90
|
},
|
|
91
|
+
// Generate GeoJSON from survey document
|
|
92
|
+
generateSurveyGeoJSON: {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
path: '/agents/survey/geojson',
|
|
95
|
+
contentType: 'multipart/form-data',
|
|
96
|
+
body: z.object({
|
|
97
|
+
file: z.instanceof(File),
|
|
98
|
+
}),
|
|
99
|
+
responses: {
|
|
100
|
+
200: surveyGeoJsonResponseSchema,
|
|
101
|
+
400: jsonApiErrorResponseSchema,
|
|
102
|
+
401: jsonApiErrorResponseSchema,
|
|
103
|
+
500: jsonApiErrorResponseSchema,
|
|
104
|
+
},
|
|
105
|
+
summary: 'Generate GeoJSON from survey document',
|
|
106
|
+
description: 'Upload a survey document (PDF or image) and generate standardized GeoJSON. The agent intelligently extracts survey data, handles errors, and makes approximations when needed to create accurate geospatial boundaries.',
|
|
107
|
+
},
|
|
65
108
|
});
|
|
@@ -2200,6 +2200,15 @@ export declare const fieldMonitoringRouter: {
|
|
|
2200
2200
|
confidence?: number | undefined;
|
|
2201
2201
|
}[] | undefined;
|
|
2202
2202
|
};
|
|
2203
|
+
properties: {
|
|
2204
|
+
texture: {
|
|
2205
|
+
sand: number;
|
|
2206
|
+
silt: number;
|
|
2207
|
+
clay: number;
|
|
2208
|
+
classification: string;
|
|
2209
|
+
};
|
|
2210
|
+
bulkDensity: number;
|
|
2211
|
+
};
|
|
2203
2212
|
quality: {
|
|
2204
2213
|
overall: "critical" | "poor" | "fair" | "good" | "excellent";
|
|
2205
2214
|
score: number;
|
|
@@ -2287,15 +2296,6 @@ export declare const fieldMonitoringRouter: {
|
|
|
2287
2296
|
sourceId?: string | undefined;
|
|
2288
2297
|
};
|
|
2289
2298
|
};
|
|
2290
|
-
properties: {
|
|
2291
|
-
texture: {
|
|
2292
|
-
sand: number;
|
|
2293
|
-
silt: number;
|
|
2294
|
-
clay: number;
|
|
2295
|
-
classification: string;
|
|
2296
|
-
};
|
|
2297
|
-
bulkDensity: number;
|
|
2298
|
-
};
|
|
2299
2299
|
dataSources: Record<string, {
|
|
2300
2300
|
date: string;
|
|
2301
2301
|
source: "manual" | "regional_api" | "global_api" | "predicted";
|
|
@@ -2386,6 +2386,15 @@ export declare const fieldMonitoringRouter: {
|
|
|
2386
2386
|
confidence?: number | undefined;
|
|
2387
2387
|
}[] | undefined;
|
|
2388
2388
|
};
|
|
2389
|
+
properties: {
|
|
2390
|
+
texture: {
|
|
2391
|
+
sand: number;
|
|
2392
|
+
silt: number;
|
|
2393
|
+
clay: number;
|
|
2394
|
+
classification: string;
|
|
2395
|
+
};
|
|
2396
|
+
bulkDensity: number;
|
|
2397
|
+
};
|
|
2389
2398
|
quality: {
|
|
2390
2399
|
overall: "critical" | "poor" | "fair" | "good" | "excellent";
|
|
2391
2400
|
score: number;
|
|
@@ -2473,15 +2482,6 @@ export declare const fieldMonitoringRouter: {
|
|
|
2473
2482
|
sourceId?: string | undefined;
|
|
2474
2483
|
};
|
|
2475
2484
|
};
|
|
2476
|
-
properties: {
|
|
2477
|
-
texture: {
|
|
2478
|
-
sand: number;
|
|
2479
|
-
silt: number;
|
|
2480
|
-
clay: number;
|
|
2481
|
-
classification: string;
|
|
2482
|
-
};
|
|
2483
|
-
bulkDensity: number;
|
|
2484
|
-
};
|
|
2485
2485
|
dataSources: Record<string, {
|
|
2486
2486
|
date: string;
|
|
2487
2487
|
source: "manual" | "regional_api" | "global_api" | "predicted";
|
|
@@ -1001,32 +1001,36 @@ export declare const fieldObservationsRouter: {
|
|
|
1001
1001
|
};
|
|
1002
1002
|
listFieldObservations: {
|
|
1003
1003
|
query: z.ZodObject<{
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1004
|
+
'page[number]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1005
|
+
'page[size]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1006
|
+
'filter[startDate]': z.ZodOptional<z.ZodString>;
|
|
1007
|
+
'filter[endDate]': z.ZodOptional<z.ZodString>;
|
|
1008
|
+
'filter[crop]': z.ZodOptional<z.ZodString>;
|
|
1009
|
+
} & {
|
|
1010
|
+
'filter[fieldId]': z.ZodOptional<z.ZodString>;
|
|
1011
|
+
'filter[status]': z.ZodOptional<z.ZodEnum<["pending", "processing", "completed", "failed"]>>;
|
|
1012
|
+
'filter[observationType]': z.ZodOptional<z.ZodString>;
|
|
1013
|
+
'filter[severity]': z.ZodOptional<z.ZodEnum<["low", "medium", "high", "critical"]>>;
|
|
1012
1014
|
}, "strip", z.ZodTypeAny, {
|
|
1013
|
-
|
|
1014
|
-
page
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
observationType?: string | undefined;
|
|
1015
|
+
'page[number]'?: number | undefined;
|
|
1016
|
+
'page[size]'?: number | undefined;
|
|
1017
|
+
'filter[startDate]'?: string | undefined;
|
|
1018
|
+
'filter[endDate]'?: string | undefined;
|
|
1019
|
+
'filter[status]'?: "pending" | "completed" | "failed" | "processing" | undefined;
|
|
1020
|
+
'filter[crop]'?: string | undefined;
|
|
1021
|
+
'filter[fieldId]'?: string | undefined;
|
|
1022
|
+
'filter[observationType]'?: string | undefined;
|
|
1023
|
+
'filter[severity]'?: "critical" | "low" | "medium" | "high" | undefined;
|
|
1021
1024
|
}, {
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1025
|
+
'page[number]'?: number | undefined;
|
|
1026
|
+
'page[size]'?: number | undefined;
|
|
1027
|
+
'filter[startDate]'?: string | undefined;
|
|
1028
|
+
'filter[endDate]'?: string | undefined;
|
|
1029
|
+
'filter[status]'?: "pending" | "completed" | "failed" | "processing" | undefined;
|
|
1030
|
+
'filter[crop]'?: string | undefined;
|
|
1031
|
+
'filter[fieldId]'?: string | undefined;
|
|
1032
|
+
'filter[observationType]'?: string | undefined;
|
|
1033
|
+
'filter[severity]'?: "critical" | "low" | "medium" | "high" | undefined;
|
|
1030
1034
|
}>;
|
|
1031
1035
|
summary: "List all observations for a field";
|
|
1032
1036
|
method: "GET";
|
|
@@ -1854,32 +1858,36 @@ export declare const fieldObservationsRouter: {
|
|
|
1854
1858
|
};
|
|
1855
1859
|
listFarmObservations: {
|
|
1856
1860
|
query: z.ZodObject<{
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1861
|
+
'page[number]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1862
|
+
'page[size]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1863
|
+
'filter[startDate]': z.ZodOptional<z.ZodString>;
|
|
1864
|
+
'filter[endDate]': z.ZodOptional<z.ZodString>;
|
|
1865
|
+
'filter[crop]': z.ZodOptional<z.ZodString>;
|
|
1866
|
+
} & {
|
|
1867
|
+
'filter[fieldId]': z.ZodOptional<z.ZodString>;
|
|
1868
|
+
'filter[status]': z.ZodOptional<z.ZodEnum<["pending", "processing", "completed", "failed"]>>;
|
|
1869
|
+
'filter[observationType]': z.ZodOptional<z.ZodString>;
|
|
1870
|
+
'filter[severity]': z.ZodOptional<z.ZodEnum<["low", "medium", "high", "critical"]>>;
|
|
1865
1871
|
}, "strip", z.ZodTypeAny, {
|
|
1866
|
-
|
|
1867
|
-
page
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
observationType?: string | undefined;
|
|
1872
|
+
'page[number]'?: number | undefined;
|
|
1873
|
+
'page[size]'?: number | undefined;
|
|
1874
|
+
'filter[startDate]'?: string | undefined;
|
|
1875
|
+
'filter[endDate]'?: string | undefined;
|
|
1876
|
+
'filter[status]'?: "pending" | "completed" | "failed" | "processing" | undefined;
|
|
1877
|
+
'filter[crop]'?: string | undefined;
|
|
1878
|
+
'filter[fieldId]'?: string | undefined;
|
|
1879
|
+
'filter[observationType]'?: string | undefined;
|
|
1880
|
+
'filter[severity]'?: "critical" | "low" | "medium" | "high" | undefined;
|
|
1874
1881
|
}, {
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1882
|
+
'page[number]'?: number | undefined;
|
|
1883
|
+
'page[size]'?: number | undefined;
|
|
1884
|
+
'filter[startDate]'?: string | undefined;
|
|
1885
|
+
'filter[endDate]'?: string | undefined;
|
|
1886
|
+
'filter[status]'?: "pending" | "completed" | "failed" | "processing" | undefined;
|
|
1887
|
+
'filter[crop]'?: string | undefined;
|
|
1888
|
+
'filter[fieldId]'?: string | undefined;
|
|
1889
|
+
'filter[observationType]'?: string | undefined;
|
|
1890
|
+
'filter[severity]'?: "critical" | "low" | "medium" | "high" | undefined;
|
|
1883
1891
|
}>;
|
|
1884
1892
|
summary: "List all observations across all farm fields";
|
|
1885
1893
|
method: "GET";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-observations.routes.d.ts","sourceRoot":"","sources":["../../src/routes/field-observations.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,uBAAuB
|
|
1
|
+
{"version":3,"file":"field-observations.routes.d.ts","sourceRoot":"","sources":["../../src/routes/field-observations.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoHlC,CAAC"}
|