digitaltwin-core 0.6.0 → 0.7.1
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/README.md +216 -0
- package/dist/auth/apisix_parser.d.ts +122 -0
- package/dist/auth/apisix_parser.d.ts.map +1 -0
- package/dist/auth/apisix_parser.js +157 -0
- package/dist/auth/apisix_parser.js.map +1 -0
- package/dist/auth/auth_config.d.ts +95 -0
- package/dist/auth/auth_config.d.ts.map +1 -0
- package/dist/auth/auth_config.js +125 -0
- package/dist/auth/auth_config.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/types.d.ts +100 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/user_service.d.ts +86 -0
- package/dist/auth/user_service.d.ts.map +1 -0
- package/dist/auth/user_service.js +240 -0
- package/dist/auth/user_service.js.map +1 -0
- package/dist/components/assets_manager.d.ts +42 -5
- package/dist/components/assets_manager.d.ts.map +1 -1
- package/dist/components/assets_manager.js +199 -7
- package/dist/components/assets_manager.js.map +1 -1
- package/dist/components/custom_table_manager.d.ts +344 -0
- package/dist/components/custom_table_manager.d.ts.map +1 -0
- package/dist/components/custom_table_manager.js +525 -0
- package/dist/components/custom_table_manager.js.map +1 -0
- package/dist/components/index.d.ts +4 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +3 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/map_manager.d.ts +61 -0
- package/dist/components/map_manager.d.ts.map +1 -0
- package/dist/components/map_manager.js +233 -0
- package/dist/components/map_manager.js.map +1 -0
- package/dist/components/tileset_manager.d.ts +55 -0
- package/dist/components/tileset_manager.d.ts.map +1 -0
- package/dist/components/tileset_manager.js +212 -0
- package/dist/components/tileset_manager.js.map +1 -0
- package/dist/components/types.d.ts +22 -0
- package/dist/components/types.d.ts.map +1 -1
- package/dist/database/adapters/knex_database_adapter.d.ts +3 -0
- package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -1
- package/dist/database/adapters/knex_database_adapter.js +130 -2
- package/dist/database/adapters/knex_database_adapter.js.map +1 -1
- package/dist/database/database_adapter.d.ts +22 -1
- package/dist/database/database_adapter.d.ts.map +1 -1
- package/dist/database/database_adapter.js.map +1 -1
- package/dist/engine/digital_twin_engine.d.ts +4 -1
- package/dist/engine/digital_twin_engine.d.ts.map +1 -1
- package/dist/engine/digital_twin_engine.js +69 -3
- package/dist/engine/digital_twin_engine.js.map +1 -1
- package/dist/engine/endpoints.d.ts +2 -2
- package/dist/engine/endpoints.d.ts.map +1 -1
- package/dist/engine/endpoints.js.map +1 -1
- package/dist/env/env.d.ts +8 -0
- package/dist/env/env.d.ts.map +1 -1
- package/dist/env/env.js +22 -1
- package/dist/env/env.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/types/data_record.d.ts +1 -1
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/zip_utils.d.ts +24 -0
- package/dist/utils/zip_utils.d.ts.map +1 -0
- package/dist/utils/zip_utils.js +77 -0
- package/dist/utils/zip_utils.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { AssetsManager } from './assets_manager.js';
|
|
2
|
+
import { ApisixAuthParser } from '../auth/apisix_parser.js';
|
|
3
|
+
/**
|
|
4
|
+
* Specialized Assets Manager for handling map layer data.
|
|
5
|
+
*
|
|
6
|
+
* Extends the base AssetsManager with specialized logic for:
|
|
7
|
+
* - Processing JSON layer objects containing map data
|
|
8
|
+
* - Extracting and analyzing layer metadata
|
|
9
|
+
* - Storing layer-specific information
|
|
10
|
+
*
|
|
11
|
+
* Inherits all CRUD endpoints from AssetsManager:
|
|
12
|
+
* - GET /{name} - List all layers
|
|
13
|
+
* - POST /{name}/upload - Upload layer data (overridden)
|
|
14
|
+
* - GET /{name}/:id - Get layer data
|
|
15
|
+
* - PUT /{name}/:id - Update layer metadata
|
|
16
|
+
* - DELETE /{name}/:id - Delete layer
|
|
17
|
+
* - GET /{name}/:id/download - Download layer data
|
|
18
|
+
*/
|
|
19
|
+
export class MapManager extends AssetsManager {
|
|
20
|
+
/**
|
|
21
|
+
* Override the upload handler to process JSON layer objects instead of files.
|
|
22
|
+
*
|
|
23
|
+
* Processes the layer data:
|
|
24
|
+
* 1. Validates the layer object structure
|
|
25
|
+
* 2. Extracts layer-specific metadata
|
|
26
|
+
* 3. Stores the layer data as JSON
|
|
27
|
+
*
|
|
28
|
+
* @param req - HTTP request with layer JSON data
|
|
29
|
+
* @returns DataResponse with upload result
|
|
30
|
+
*/
|
|
31
|
+
async handleUpload(req) {
|
|
32
|
+
try {
|
|
33
|
+
if (!req || !req.body) {
|
|
34
|
+
return {
|
|
35
|
+
status: 400,
|
|
36
|
+
content: JSON.stringify({
|
|
37
|
+
error: 'Invalid request: missing request body'
|
|
38
|
+
}),
|
|
39
|
+
headers: { 'Content-Type': 'application/json' }
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Check authentication
|
|
43
|
+
if (!ApisixAuthParser.hasValidAuth(req.headers || {})) {
|
|
44
|
+
return {
|
|
45
|
+
status: 401,
|
|
46
|
+
content: JSON.stringify({
|
|
47
|
+
error: 'Authentication required'
|
|
48
|
+
}),
|
|
49
|
+
headers: { 'Content-Type': 'application/json' }
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Parse authenticated user
|
|
53
|
+
const authUser = ApisixAuthParser.parseAuthHeaders(req.headers || {});
|
|
54
|
+
if (!authUser) {
|
|
55
|
+
return {
|
|
56
|
+
status: 401,
|
|
57
|
+
content: JSON.stringify({
|
|
58
|
+
error: 'Invalid authentication headers'
|
|
59
|
+
}),
|
|
60
|
+
headers: { 'Content-Type': 'application/json' }
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Find or create user in database
|
|
64
|
+
const userRecord = await this.userService.findOrCreateUser(authUser);
|
|
65
|
+
const { layer, description } = req.body;
|
|
66
|
+
if (!layer) {
|
|
67
|
+
return {
|
|
68
|
+
status: 400,
|
|
69
|
+
content: JSON.stringify({
|
|
70
|
+
error: 'Missing required field: layer (JSON object)'
|
|
71
|
+
}),
|
|
72
|
+
headers: { 'Content-Type': 'application/json' }
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Validate layer structure
|
|
76
|
+
if (typeof layer !== 'object' || layer === null) {
|
|
77
|
+
return {
|
|
78
|
+
status: 400,
|
|
79
|
+
content: JSON.stringify({
|
|
80
|
+
error: 'Layer must be a valid JSON object'
|
|
81
|
+
}),
|
|
82
|
+
headers: { 'Content-Type': 'application/json' }
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Analyze layer content
|
|
86
|
+
const layerInfo = this.analyzeLayerContent(layer);
|
|
87
|
+
const config = this.getConfiguration();
|
|
88
|
+
const now = new Date();
|
|
89
|
+
// Convert layer object to JSON string for storage
|
|
90
|
+
const layerJson = JSON.stringify(layer, null, 2);
|
|
91
|
+
const layerBuffer = Buffer.from(layerJson, 'utf-8');
|
|
92
|
+
// Generate filename from layer name or use timestamp
|
|
93
|
+
const filename = `${layerInfo.layer_name || 'layer'}_${Date.now()}.json`;
|
|
94
|
+
// Store layer data using framework pattern
|
|
95
|
+
const url = await this.storage.save(layerBuffer, config.name, filename);
|
|
96
|
+
// Create extended metadata with layer-specific fields
|
|
97
|
+
const metadata = {
|
|
98
|
+
name: config.name,
|
|
99
|
+
type: config.contentType || 'application/json',
|
|
100
|
+
url,
|
|
101
|
+
date: now,
|
|
102
|
+
description: description || layerInfo.description || 'Map layer',
|
|
103
|
+
source: req.body.source || 'uploaded',
|
|
104
|
+
owner_id: userRecord.id,
|
|
105
|
+
filename,
|
|
106
|
+
// Layer-specific metadata
|
|
107
|
+
layer_type: layerInfo.layer_type,
|
|
108
|
+
layer_name: layerInfo.layer_name,
|
|
109
|
+
geometry_type: layerInfo.geometry_type,
|
|
110
|
+
properties_count: layerInfo.properties_count
|
|
111
|
+
};
|
|
112
|
+
await this.db.save(metadata);
|
|
113
|
+
return {
|
|
114
|
+
status: 200,
|
|
115
|
+
content: JSON.stringify({
|
|
116
|
+
message: 'Layer uploaded successfully',
|
|
117
|
+
layer_name: layerInfo.layer_name,
|
|
118
|
+
geometry_type: layerInfo.geometry_type,
|
|
119
|
+
properties_count: layerInfo.properties_count
|
|
120
|
+
}),
|
|
121
|
+
headers: { 'Content-Type': 'application/json' }
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
return {
|
|
126
|
+
status: 500,
|
|
127
|
+
content: JSON.stringify({
|
|
128
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
129
|
+
}),
|
|
130
|
+
headers: { 'Content-Type': 'application/json' }
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Analyze layer content to extract metadata
|
|
136
|
+
* @param layer - The layer object to analyze
|
|
137
|
+
* @returns Layer metadata information
|
|
138
|
+
*/
|
|
139
|
+
analyzeLayerContent(layer) {
|
|
140
|
+
// Default values
|
|
141
|
+
let layer_type = 'unknown';
|
|
142
|
+
let layer_name = 'layer';
|
|
143
|
+
let geometry_type;
|
|
144
|
+
let properties_count = 0;
|
|
145
|
+
// Try to detect GeoJSON
|
|
146
|
+
if (layer.type === 'FeatureCollection' && Array.isArray(layer.features)) {
|
|
147
|
+
layer_type = 'geojson';
|
|
148
|
+
layer_name = layer.name || 'geojson_layer';
|
|
149
|
+
// Analyze first feature for geometry type
|
|
150
|
+
if (layer.features.length > 0) {
|
|
151
|
+
const firstFeature = layer.features[0];
|
|
152
|
+
if (firstFeature.geometry && firstFeature.geometry.type) {
|
|
153
|
+
geometry_type = firstFeature.geometry.type.toLowerCase();
|
|
154
|
+
}
|
|
155
|
+
// Count properties in first feature
|
|
156
|
+
if (firstFeature.properties) {
|
|
157
|
+
properties_count = Object.keys(firstFeature.properties).length;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Try to detect single GeoJSON Feature
|
|
162
|
+
else if (layer.type === 'Feature' && layer.geometry) {
|
|
163
|
+
layer_type = 'geojson_feature';
|
|
164
|
+
layer_name = layer.properties?.name || 'feature';
|
|
165
|
+
geometry_type = layer.geometry.type?.toLowerCase();
|
|
166
|
+
properties_count = layer.properties ? Object.keys(layer.properties).length : 0;
|
|
167
|
+
}
|
|
168
|
+
// Try to detect other common layer formats
|
|
169
|
+
else if (layer.layers && Array.isArray(layer.layers)) {
|
|
170
|
+
layer_type = 'layer_group';
|
|
171
|
+
layer_name = layer.name || 'layer_group';
|
|
172
|
+
properties_count = layer.layers.length;
|
|
173
|
+
}
|
|
174
|
+
// Generic object
|
|
175
|
+
else {
|
|
176
|
+
layer_type = 'custom';
|
|
177
|
+
layer_name = layer.name || layer.title || layer.id || 'custom_layer';
|
|
178
|
+
properties_count = Object.keys(layer).length;
|
|
179
|
+
}
|
|
180
|
+
// Extract description from various fields
|
|
181
|
+
const description = layer.description || layer.desc || layer.summary;
|
|
182
|
+
return {
|
|
183
|
+
layer_type,
|
|
184
|
+
layer_name,
|
|
185
|
+
geometry_type,
|
|
186
|
+
properties_count,
|
|
187
|
+
description
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Override retrieve to include layer-specific metadata in the response
|
|
192
|
+
*/
|
|
193
|
+
async retrieve() {
|
|
194
|
+
try {
|
|
195
|
+
const assets = await this.getAllAssets();
|
|
196
|
+
const config = this.getConfiguration();
|
|
197
|
+
// Transform to include layer metadata
|
|
198
|
+
const assetsWithMetadata = assets.map(asset => ({
|
|
199
|
+
id: asset.id,
|
|
200
|
+
name: asset.name,
|
|
201
|
+
date: asset.date,
|
|
202
|
+
contentType: asset.contentType,
|
|
203
|
+
description: asset.description || '',
|
|
204
|
+
source: asset.source || '',
|
|
205
|
+
owner_id: asset.owner_id || null,
|
|
206
|
+
filename: asset.filename || '',
|
|
207
|
+
// Layer-specific fields
|
|
208
|
+
layer_type: asset.layer_type || '',
|
|
209
|
+
layer_name: asset.layer_name || '',
|
|
210
|
+
geometry_type: asset.geometry_type || null,
|
|
211
|
+
properties_count: asset.properties_count || 0,
|
|
212
|
+
// URLs for frontend
|
|
213
|
+
url: `/${config.name}/${asset.id}`,
|
|
214
|
+
download_url: `/${config.name}/${asset.id}/download`
|
|
215
|
+
}));
|
|
216
|
+
return {
|
|
217
|
+
status: 200,
|
|
218
|
+
content: JSON.stringify(assetsWithMetadata),
|
|
219
|
+
headers: { 'Content-Type': 'application/json' }
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
return {
|
|
224
|
+
status: 500,
|
|
225
|
+
content: JSON.stringify({
|
|
226
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
227
|
+
}),
|
|
228
|
+
headers: { 'Content-Type': 'application/json' }
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=map_manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map_manager.js","sourceRoot":"","sources":["../../src/components/map_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { AssetsManager } from './assets_manager.js';
|
|
2
|
+
import type { DataResponse } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Extended metadata for tileset assets
|
|
5
|
+
*/
|
|
6
|
+
export interface TilesetMetadataRow {
|
|
7
|
+
id?: number;
|
|
8
|
+
name: string;
|
|
9
|
+
type: string;
|
|
10
|
+
url: string;
|
|
11
|
+
date: Date;
|
|
12
|
+
description: string;
|
|
13
|
+
source: string;
|
|
14
|
+
owner_id: number | null;
|
|
15
|
+
filename: string;
|
|
16
|
+
tileset_name?: string;
|
|
17
|
+
file_count?: number;
|
|
18
|
+
has_metadata?: boolean;
|
|
19
|
+
main_files?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Specialized Assets Manager for handling tileset ZIP files.
|
|
23
|
+
*
|
|
24
|
+
* Extends the base AssetsManager with specialized logic for:
|
|
25
|
+
* - Processing ZIP files containing tileset data
|
|
26
|
+
* - Extracting and analyzing tileset metadata
|
|
27
|
+
* - Storing tileset-specific information
|
|
28
|
+
*
|
|
29
|
+
* Inherits all CRUD endpoints from AssetsManager:
|
|
30
|
+
* - GET /{name} - List all tilesets
|
|
31
|
+
* - POST /{name}/upload - Upload tileset ZIP (overridden)
|
|
32
|
+
* - GET /{name}/:id - Get tileset file
|
|
33
|
+
* - PUT /{name}/:id - Update tileset metadata
|
|
34
|
+
* - DELETE /{name}/:id - Delete tileset
|
|
35
|
+
* - GET /{name}/:id/download - Download tileset ZIP
|
|
36
|
+
*/
|
|
37
|
+
export declare abstract class TilesetManager extends AssetsManager {
|
|
38
|
+
/**
|
|
39
|
+
* Override the upload handler to process ZIP files containing tilesets.
|
|
40
|
+
*
|
|
41
|
+
* Processes the uploaded ZIP file:
|
|
42
|
+
* 1. Extracts and analyzes the ZIP content
|
|
43
|
+
* 2. Stores tileset-specific metadata
|
|
44
|
+
* 3. Saves the ZIP file using the storage service
|
|
45
|
+
*
|
|
46
|
+
* @param req - HTTP request with ZIP file upload
|
|
47
|
+
* @returns DataResponse with upload result
|
|
48
|
+
*/
|
|
49
|
+
handleUpload(req: any): Promise<DataResponse>;
|
|
50
|
+
/**
|
|
51
|
+
* Override retrieve to include tileset-specific metadata in the response
|
|
52
|
+
*/
|
|
53
|
+
retrieve(): Promise<DataResponse>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=tileset_manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tileset_manager.d.ts","sourceRoot":"","sources":["../../src/components/tileset_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EAA0B,YAAY,EAAE,MAAM,YAAY,CAAA;AAKtE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,IAAI,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAEhB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,8BAAsB,cAAe,SAAQ,aAAa;IACtD;;;;;;;;;;OAUG;IACG,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IAsJnD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;CAwC1C"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { AssetsManager } from './assets_manager.js';
|
|
2
|
+
import { zipToDict, analyzeTilesetContent } from '../utils/zip_utils.js';
|
|
3
|
+
import { ApisixAuthParser } from '../auth/apisix_parser.js';
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
/**
|
|
6
|
+
* Specialized Assets Manager for handling tileset ZIP files.
|
|
7
|
+
*
|
|
8
|
+
* Extends the base AssetsManager with specialized logic for:
|
|
9
|
+
* - Processing ZIP files containing tileset data
|
|
10
|
+
* - Extracting and analyzing tileset metadata
|
|
11
|
+
* - Storing tileset-specific information
|
|
12
|
+
*
|
|
13
|
+
* Inherits all CRUD endpoints from AssetsManager:
|
|
14
|
+
* - GET /{name} - List all tilesets
|
|
15
|
+
* - POST /{name}/upload - Upload tileset ZIP (overridden)
|
|
16
|
+
* - GET /{name}/:id - Get tileset file
|
|
17
|
+
* - PUT /{name}/:id - Update tileset metadata
|
|
18
|
+
* - DELETE /{name}/:id - Delete tileset
|
|
19
|
+
* - GET /{name}/:id/download - Download tileset ZIP
|
|
20
|
+
*/
|
|
21
|
+
export class TilesetManager extends AssetsManager {
|
|
22
|
+
/**
|
|
23
|
+
* Override the upload handler to process ZIP files containing tilesets.
|
|
24
|
+
*
|
|
25
|
+
* Processes the uploaded ZIP file:
|
|
26
|
+
* 1. Extracts and analyzes the ZIP content
|
|
27
|
+
* 2. Stores tileset-specific metadata
|
|
28
|
+
* 3. Saves the ZIP file using the storage service
|
|
29
|
+
*
|
|
30
|
+
* @param req - HTTP request with ZIP file upload
|
|
31
|
+
* @returns DataResponse with upload result
|
|
32
|
+
*/
|
|
33
|
+
async handleUpload(req) {
|
|
34
|
+
try {
|
|
35
|
+
if (!req || !req.body) {
|
|
36
|
+
return {
|
|
37
|
+
status: 400,
|
|
38
|
+
content: JSON.stringify({
|
|
39
|
+
error: 'Invalid request: missing request body'
|
|
40
|
+
}),
|
|
41
|
+
headers: { 'Content-Type': 'application/json' }
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Check authentication
|
|
45
|
+
if (!ApisixAuthParser.hasValidAuth(req.headers || {})) {
|
|
46
|
+
return {
|
|
47
|
+
status: 401,
|
|
48
|
+
content: JSON.stringify({
|
|
49
|
+
error: 'Authentication required'
|
|
50
|
+
}),
|
|
51
|
+
headers: { 'Content-Type': 'application/json' }
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Parse authenticated user
|
|
55
|
+
const authUser = ApisixAuthParser.parseAuthHeaders(req.headers || {});
|
|
56
|
+
if (!authUser) {
|
|
57
|
+
return {
|
|
58
|
+
status: 401,
|
|
59
|
+
content: JSON.stringify({
|
|
60
|
+
error: 'Invalid authentication headers'
|
|
61
|
+
}),
|
|
62
|
+
headers: { 'Content-Type': 'application/json' }
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Find or create user in database
|
|
66
|
+
const userRecord = await this.userService.findOrCreateUser(authUser);
|
|
67
|
+
const { description } = req.body;
|
|
68
|
+
const filePath = req.file?.path;
|
|
69
|
+
const filename = req.file?.originalname || req.body.filename;
|
|
70
|
+
if (!filePath || !description) {
|
|
71
|
+
return {
|
|
72
|
+
status: 400,
|
|
73
|
+
content: JSON.stringify({
|
|
74
|
+
error: 'Missing required fields: description, ZIP file'
|
|
75
|
+
}),
|
|
76
|
+
headers: { 'Content-Type': 'application/json' }
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (!filename) {
|
|
80
|
+
return {
|
|
81
|
+
status: 400,
|
|
82
|
+
content: JSON.stringify({
|
|
83
|
+
error: 'Filename could not be determined from uploaded file'
|
|
84
|
+
}),
|
|
85
|
+
headers: { 'Content-Type': 'application/json' }
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Validate ZIP file extension
|
|
89
|
+
if (!filename.toLowerCase().endsWith('.zip')) {
|
|
90
|
+
return {
|
|
91
|
+
status: 400,
|
|
92
|
+
content: JSON.stringify({
|
|
93
|
+
error: 'Invalid file extension. Expected: .zip'
|
|
94
|
+
}),
|
|
95
|
+
headers: { 'Content-Type': 'application/json' }
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// Read and process ZIP file
|
|
99
|
+
let fileBuffer;
|
|
100
|
+
try {
|
|
101
|
+
fileBuffer = await fs.readFile(filePath);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return {
|
|
105
|
+
status: 500,
|
|
106
|
+
content: JSON.stringify({
|
|
107
|
+
error: `Failed to read uploaded file: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
108
|
+
}),
|
|
109
|
+
headers: { 'Content-Type': 'application/json' }
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
// Extract and analyze tileset content
|
|
114
|
+
const zipDict = await zipToDict(fileBuffer);
|
|
115
|
+
const tilesetInfo = analyzeTilesetContent(zipDict);
|
|
116
|
+
// Use the analyzed name or fallback to filename
|
|
117
|
+
const tilesetName = tilesetInfo.name || filename.replace('.zip', '');
|
|
118
|
+
const config = this.getConfiguration();
|
|
119
|
+
const now = new Date();
|
|
120
|
+
// Store ZIP file using framework pattern
|
|
121
|
+
const url = await this.storage.save(fileBuffer, config.name, filename);
|
|
122
|
+
// Create extended metadata with tileset-specific fields
|
|
123
|
+
const metadata = {
|
|
124
|
+
name: config.name,
|
|
125
|
+
type: config.contentType || 'application/zip',
|
|
126
|
+
url,
|
|
127
|
+
date: now,
|
|
128
|
+
description,
|
|
129
|
+
source: req.body.source || 'uploaded',
|
|
130
|
+
owner_id: userRecord.id,
|
|
131
|
+
filename,
|
|
132
|
+
// Tileset-specific metadata
|
|
133
|
+
tileset_name: tilesetName,
|
|
134
|
+
file_count: tilesetInfo.fileCount,
|
|
135
|
+
has_metadata: tilesetInfo.hasMetadata,
|
|
136
|
+
main_files: tilesetInfo.mainFiles.join(',')
|
|
137
|
+
};
|
|
138
|
+
await this.db.save(metadata);
|
|
139
|
+
// Clean up temporary file after successful upload
|
|
140
|
+
await fs.unlink(filePath).catch(() => {
|
|
141
|
+
// Ignore cleanup errors
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
status: 200,
|
|
145
|
+
content: JSON.stringify({
|
|
146
|
+
message: 'Tileset uploaded successfully',
|
|
147
|
+
tileset_name: tilesetName,
|
|
148
|
+
file_count: tilesetInfo.fileCount
|
|
149
|
+
}),
|
|
150
|
+
headers: { 'Content-Type': 'application/json' }
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
// Clean up temporary file even on error
|
|
155
|
+
await fs.unlink(filePath).catch(() => { });
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return {
|
|
161
|
+
status: 500,
|
|
162
|
+
content: JSON.stringify({
|
|
163
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
164
|
+
}),
|
|
165
|
+
headers: { 'Content-Type': 'application/json' }
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Override retrieve to include tileset-specific metadata in the response
|
|
171
|
+
*/
|
|
172
|
+
async retrieve() {
|
|
173
|
+
try {
|
|
174
|
+
const assets = await this.getAllAssets();
|
|
175
|
+
const config = this.getConfiguration();
|
|
176
|
+
// Transform to include tileset metadata
|
|
177
|
+
const assetsWithMetadata = assets.map(asset => ({
|
|
178
|
+
id: asset.id,
|
|
179
|
+
name: asset.name,
|
|
180
|
+
date: asset.date,
|
|
181
|
+
contentType: asset.contentType,
|
|
182
|
+
description: asset.description || '',
|
|
183
|
+
source: asset.source || '',
|
|
184
|
+
owner_id: asset.owner_id || null,
|
|
185
|
+
filename: asset.filename || '',
|
|
186
|
+
// Tileset-specific fields
|
|
187
|
+
tileset_name: asset.tileset_name || '',
|
|
188
|
+
file_count: asset.file_count || 0,
|
|
189
|
+
has_metadata: asset.has_metadata || false,
|
|
190
|
+
main_files: asset.main_files ? asset.main_files.split(',') : [],
|
|
191
|
+
// URLs for frontend
|
|
192
|
+
url: `/${config.name}/${asset.id}`,
|
|
193
|
+
download_url: `/${config.name}/${asset.id}/download`
|
|
194
|
+
}));
|
|
195
|
+
return {
|
|
196
|
+
status: 200,
|
|
197
|
+
content: JSON.stringify(assetsWithMetadata),
|
|
198
|
+
headers: { 'Content-Type': 'application/json' }
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
return {
|
|
203
|
+
status: 500,
|
|
204
|
+
content: JSON.stringify({
|
|
205
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
206
|
+
}),
|
|
207
|
+
headers: { 'Content-Type': 'application/json' }
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=tileset_manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tileset_manager.js","sourceRoot":"","sources":["../../src/components/tileset_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ export interface ComponentConfiguration {
|
|
|
3
3
|
description: string;
|
|
4
4
|
contentType: string;
|
|
5
5
|
tags?: string[];
|
|
6
|
+
/** Allowed file extension for uploads (e.g., '.glb', '.json'). If set, POST/PUT operations will validate file extensions. */
|
|
7
|
+
extension?: string;
|
|
6
8
|
}
|
|
7
9
|
export interface CollectorConfiguration extends ComponentConfiguration {
|
|
8
10
|
endpoint: string;
|
|
@@ -44,4 +46,24 @@ export interface DataResponse {
|
|
|
44
46
|
content: Buffer | string;
|
|
45
47
|
headers?: Record<string, string>;
|
|
46
48
|
}
|
|
49
|
+
export interface StoreConfiguration {
|
|
50
|
+
/** Name of the store (will be used as table name) */
|
|
51
|
+
name: string;
|
|
52
|
+
/** Description of what this store manages */
|
|
53
|
+
description: string;
|
|
54
|
+
/** Database columns definition with SQL types */
|
|
55
|
+
columns: {
|
|
56
|
+
[columnName: string]: string;
|
|
57
|
+
};
|
|
58
|
+
/** Custom endpoints for this store manager (optional) */
|
|
59
|
+
endpoints?: EndpointDefinition[];
|
|
60
|
+
}
|
|
61
|
+
export interface EndpointDefinition {
|
|
62
|
+
/** HTTP path relative to store name (e.g., "/add-layers") */
|
|
63
|
+
path: string;
|
|
64
|
+
/** HTTP method */
|
|
65
|
+
method: 'get' | 'post' | 'put' | 'delete';
|
|
66
|
+
/** Method name in the class to handle this endpoint */
|
|
67
|
+
handler: string;
|
|
68
|
+
}
|
|
47
69
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,6HAA6H;IAC7H,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IAClE,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IAClE,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAE9B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAEhB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE5B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,CAAA;IAE/C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IAC/D,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,kBAAkB;IAC/B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,iDAAiD;IACjD,OAAO,EAAE;QACL,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;KAC/B,CAAA;IACD,yDAAyD;IACzD,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,kBAAkB;IAC/B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB;IAClB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;IACzC,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAA;CAClB"}
|
|
@@ -37,6 +37,7 @@ export declare class KnexDatabaseAdapter extends DatabaseAdapter {
|
|
|
37
37
|
getLatestByName(name: string): Promise<DataRecord | undefined>;
|
|
38
38
|
doesTableExists(name: string): Promise<boolean>;
|
|
39
39
|
createTable(name: string): Promise<void>;
|
|
40
|
+
createTableWithColumns(name: string, columns: Record<string, string>): Promise<void>;
|
|
40
41
|
getFirstByName(name: string): Promise<DataRecord | undefined>;
|
|
41
42
|
getByDateRange(name: string, startDate: Date, endDate?: Date, limit?: number): Promise<DataRecord[]>;
|
|
42
43
|
getAfterDate(name: string, afterDate: Date, limit?: number): Promise<DataRecord[]>;
|
|
@@ -57,6 +58,8 @@ export declare class KnexDatabaseAdapter extends DatabaseAdapter {
|
|
|
57
58
|
records: DataRecord[];
|
|
58
59
|
total: number;
|
|
59
60
|
}>;
|
|
61
|
+
findByConditions(tableName: string, conditions: Record<string, any>): Promise<DataRecord[]>;
|
|
62
|
+
updateById(tableName: string, id: number, data: Record<string, any>): Promise<void>;
|
|
60
63
|
close(): Promise<void>;
|
|
61
64
|
}
|
|
62
65
|
//# sourceMappingURL=knex_database_adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knex_database_adapter.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/knex_database_adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAGtE,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAAA;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;;gBAIxC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc;IAMxD;;OAEG;IACH,MAAM,CAAC,aAAa,CAChB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAqB,GACjC,mBAAmB;IAyBtB;;OAEG;IACH,MAAM,CAAC,SAAS,CACZ,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAqB,GACjC,mBAAmB;IA2ChB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAoB5C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAKlE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAK9D,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"knex_database_adapter.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/knex_database_adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAGtE,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAAA;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;;gBAIxC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc;IAMxD;;OAEG;IACH,MAAM,CAAC,aAAa,CAChB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAqB,GACjC,mBAAmB;IAyBtB;;OAEG;IACH,MAAM,CAAC,SAAS,CACZ,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAqB,GACjC,mBAAmB;IA2ChB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAoB5C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAKlE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAK9D,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCxC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsEpF,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAK7D,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAiBpG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAWlF,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAKhF,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAS5F,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAahF,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAkD7D,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB/E,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA4BnF,qBAAqB,CACvB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAU,EAClB,KAAK,GAAE,MAAY,GACpB,OAAO,CAAC;QACP,OAAO,EAAE,UAAU,EAAE,CAAA;QACrB,KAAK,EAAE,MAAM,CAAA;KAChB,CAAC;IAeI,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmB3F,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|