@epilot/erp-integration-client 0.4.2 → 0.5.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/dist/definition.js +1 -1
- package/dist/openapi-runtime.json +12 -0
- package/dist/openapi.d.ts +113 -6
- package/dist/openapi.json +212 -7
- package/package.json +1 -1
package/dist/definition.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var e={330:function(e,t,o){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var r=n(o(466));t.default=r.default},466:e=>{e.exports=JSON.parse('{"openapi":"3.0.3","info":{"title":"","version":""},"paths":{"/v1/erp/tracking/acknowledgement":{"post":{"operationId":"acknowledgeTracking","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v1/erp/trigger":{"post":{"operationId":"triggerErp","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/erp/updates/events":{"post":{"operationId":"processErpUpdatesEvents","requestBody":{"content":{"application/json":{}}},"responses":{}}}},"components":{"responses":{"BadRequest":{"content":{"application/json":{}}},"Unauthorized":{"content":{"application/json":{}}},"InternalServerError":{"content":{"application/json":{}}},"ERPUpdatesResponse":{"content":{"application/json":{}}},"TriggerWebhookResponse":{"content":{"application/json":{}}}}},"servers":[{"url":"https://erp-integration-api.sls.epilot.io"}]}')}},t={},o=function o(n){var r=t[n];if(void 0!==r)return r.exports;var s=t[n]={exports:{}};return e[n].call(s.exports,s,s.exports,o),s.exports}(330),n=exports;for(var r in o)n[r]=o[r];o.__esModule&&Object.defineProperty(n,"__esModule",{value:!0})})();
|
|
1
|
+
(()=>{"use strict";var e={330:function(e,t,o){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var r=n(o(466));t.default=r.default},466:e=>{e.exports=JSON.parse('{"openapi":"3.0.3","info":{"title":"","version":""},"paths":{"/v1/erp/tracking/acknowledgement":{"post":{"operationId":"acknowledgeTracking","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v1/erp/trigger":{"post":{"operationId":"triggerErp","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/erp/updates/events":{"post":{"operationId":"processErpUpdatesEvents","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v1/erp/updates/mapping_simulation":{"post":{"operationId":"simulateMapping","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}}},"components":{"responses":{"BadRequest":{"content":{"application/json":{}}},"Unauthorized":{"content":{"application/json":{}}},"InternalServerError":{"content":{"application/json":{}}},"ERPUpdatesResponse":{"content":{"application/json":{}}},"TriggerWebhookResponse":{"content":{"application/json":{}}}}},"servers":[{"url":"https://erp-integration-api.sls.epilot.io"}]}')}},t={},o=function o(n){var r=t[n];if(void 0!==r)return r.exports;var s=t[n]={exports:{}};return e[n].call(s.exports,s,s.exports,o),s.exports}(330),n=exports;for(var r in o)n[r]=o[r];o.__esModule&&Object.defineProperty(n,"__esModule",{value:!0})})();
|
|
@@ -38,6 +38,18 @@
|
|
|
38
38
|
},
|
|
39
39
|
"responses": {}
|
|
40
40
|
}
|
|
41
|
+
},
|
|
42
|
+
"/v1/erp/updates/mapping_simulation": {
|
|
43
|
+
"post": {
|
|
44
|
+
"operationId": "simulateMapping",
|
|
45
|
+
"requestBody": {
|
|
46
|
+
"required": true,
|
|
47
|
+
"content": {
|
|
48
|
+
"application/json": {}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"responses": {}
|
|
52
|
+
}
|
|
41
53
|
}
|
|
42
54
|
},
|
|
43
55
|
"components": {
|
package/dist/openapi.d.ts
CHANGED
|
@@ -178,6 +178,91 @@ declare namespace Paths {
|
|
|
178
178
|
export type $500 = Components.Responses.InternalServerError;
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
|
+
namespace SimulateMapping {
|
|
182
|
+
export interface RequestBody {
|
|
183
|
+
/**
|
|
184
|
+
* The integration mapping configuration
|
|
185
|
+
*/
|
|
186
|
+
mapping_configuration: {
|
|
187
|
+
mapping: {
|
|
188
|
+
/**
|
|
189
|
+
* Object type mappings
|
|
190
|
+
*/
|
|
191
|
+
objects: {
|
|
192
|
+
[name: string]: {
|
|
193
|
+
/**
|
|
194
|
+
* Mapping of entity types to their unique identifier field mappings
|
|
195
|
+
*/
|
|
196
|
+
unique_ids: {
|
|
197
|
+
[name: string]: {
|
|
198
|
+
[name: string]: string;
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* Field mapping definitions
|
|
203
|
+
*/
|
|
204
|
+
fields: {
|
|
205
|
+
/**
|
|
206
|
+
* Target entity slug
|
|
207
|
+
*/
|
|
208
|
+
entity: string;
|
|
209
|
+
/**
|
|
210
|
+
* Target attribute name
|
|
211
|
+
*/
|
|
212
|
+
attribute: string;
|
|
213
|
+
/**
|
|
214
|
+
* Source field name (mutually exclusive with jsonataExpression)
|
|
215
|
+
*/
|
|
216
|
+
field?: string;
|
|
217
|
+
/**
|
|
218
|
+
* JSONata expression for transformation (mutually exclusive with field)
|
|
219
|
+
*/
|
|
220
|
+
jsonataExpression?: string;
|
|
221
|
+
}[];
|
|
222
|
+
};
|
|
223
|
+
};
|
|
224
|
+
};
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* Type of the object being mapped (must match a key in mapping_configuration.mapping.objects)
|
|
228
|
+
*/
|
|
229
|
+
object_type: string;
|
|
230
|
+
/**
|
|
231
|
+
* Format of the payload data
|
|
232
|
+
*/
|
|
233
|
+
format: "json" | "xml";
|
|
234
|
+
/**
|
|
235
|
+
* The serialized object data payload (JSON, XML, etc.) as a string
|
|
236
|
+
*/
|
|
237
|
+
payload: string;
|
|
238
|
+
}
|
|
239
|
+
namespace Responses {
|
|
240
|
+
export interface $200 {
|
|
241
|
+
entity_updates: {
|
|
242
|
+
/**
|
|
243
|
+
* The entity type slug
|
|
244
|
+
*/
|
|
245
|
+
entity_slug: string;
|
|
246
|
+
/**
|
|
247
|
+
* Unique identifier mappings for this entity
|
|
248
|
+
*/
|
|
249
|
+
unique_identifiers: {
|
|
250
|
+
[name: string]: any;
|
|
251
|
+
};
|
|
252
|
+
/**
|
|
253
|
+
* Mapped attribute values
|
|
254
|
+
*/
|
|
255
|
+
attributes: {
|
|
256
|
+
[name: string]: any;
|
|
257
|
+
};
|
|
258
|
+
}[];
|
|
259
|
+
}
|
|
260
|
+
export type $400 = Components.Responses.BadRequest;
|
|
261
|
+
export type $401 = Components.Responses.Unauthorized;
|
|
262
|
+
export type $422 = Components.Schemas.ErrorResponseBase;
|
|
263
|
+
export type $500 = Components.Responses.InternalServerError;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
181
266
|
namespace TriggerErp {
|
|
182
267
|
export type RequestBody = Components.Schemas.TriggerErpActionRequest;
|
|
183
268
|
namespace Responses {
|
|
@@ -195,7 +280,7 @@ declare namespace Paths {
|
|
|
195
280
|
|
|
196
281
|
export interface OperationMethods {
|
|
197
282
|
/**
|
|
198
|
-
* acknowledgeTracking -
|
|
283
|
+
* acknowledgeTracking - acknowledgeTracking
|
|
199
284
|
*
|
|
200
285
|
* Acknowledges an ERP tracking record by removing it from the tracking table, requires public authentication
|
|
201
286
|
*/
|
|
@@ -205,7 +290,7 @@ export interface OperationMethods {
|
|
|
205
290
|
config?: AxiosRequestConfig
|
|
206
291
|
): OperationResponse<Paths.AcknowledgeTracking.Responses.$200>
|
|
207
292
|
/**
|
|
208
|
-
* triggerErp -
|
|
293
|
+
* triggerErp - triggerErp
|
|
209
294
|
*
|
|
210
295
|
* Triggers the ERP integration process
|
|
211
296
|
*/
|
|
@@ -215,7 +300,7 @@ export interface OperationMethods {
|
|
|
215
300
|
config?: AxiosRequestConfig
|
|
216
301
|
): OperationResponse<Paths.TriggerErp.Responses.$200>
|
|
217
302
|
/**
|
|
218
|
-
* processErpUpdatesEvents -
|
|
303
|
+
* processErpUpdatesEvents - processErpUpdatesEvents
|
|
219
304
|
*
|
|
220
305
|
* Handles updates from ERP systems and tracks them appropriately
|
|
221
306
|
*/
|
|
@@ -224,12 +309,22 @@ export interface OperationMethods {
|
|
|
224
309
|
data?: Paths.ProcessErpUpdatesEvents.RequestBody,
|
|
225
310
|
config?: AxiosRequestConfig
|
|
226
311
|
): OperationResponse<Paths.ProcessErpUpdatesEvents.Responses.$200>
|
|
312
|
+
/**
|
|
313
|
+
* simulateMapping - simulateMapping
|
|
314
|
+
*
|
|
315
|
+
* Test mapping configuration by transforming a payload using the provided mapping rules without persisting data
|
|
316
|
+
*/
|
|
317
|
+
'simulateMapping'(
|
|
318
|
+
parameters?: Parameters<UnknownParamsObject> | null,
|
|
319
|
+
data?: Paths.SimulateMapping.RequestBody,
|
|
320
|
+
config?: AxiosRequestConfig
|
|
321
|
+
): OperationResponse<Paths.SimulateMapping.Responses.$200>
|
|
227
322
|
}
|
|
228
323
|
|
|
229
324
|
export interface PathsDictionary {
|
|
230
325
|
['/v1/erp/tracking/acknowledgement']: {
|
|
231
326
|
/**
|
|
232
|
-
* acknowledgeTracking -
|
|
327
|
+
* acknowledgeTracking - acknowledgeTracking
|
|
233
328
|
*
|
|
234
329
|
* Acknowledges an ERP tracking record by removing it from the tracking table, requires public authentication
|
|
235
330
|
*/
|
|
@@ -241,7 +336,7 @@ export interface PathsDictionary {
|
|
|
241
336
|
}
|
|
242
337
|
['/v1/erp/trigger']: {
|
|
243
338
|
/**
|
|
244
|
-
* triggerErp -
|
|
339
|
+
* triggerErp - triggerErp
|
|
245
340
|
*
|
|
246
341
|
* Triggers the ERP integration process
|
|
247
342
|
*/
|
|
@@ -253,7 +348,7 @@ export interface PathsDictionary {
|
|
|
253
348
|
}
|
|
254
349
|
['/v1/erp/updates/events']: {
|
|
255
350
|
/**
|
|
256
|
-
* processErpUpdatesEvents -
|
|
351
|
+
* processErpUpdatesEvents - processErpUpdatesEvents
|
|
257
352
|
*
|
|
258
353
|
* Handles updates from ERP systems and tracks them appropriately
|
|
259
354
|
*/
|
|
@@ -263,6 +358,18 @@ export interface PathsDictionary {
|
|
|
263
358
|
config?: AxiosRequestConfig
|
|
264
359
|
): OperationResponse<Paths.ProcessErpUpdatesEvents.Responses.$200>
|
|
265
360
|
}
|
|
361
|
+
['/v1/erp/updates/mapping_simulation']: {
|
|
362
|
+
/**
|
|
363
|
+
* simulateMapping - simulateMapping
|
|
364
|
+
*
|
|
365
|
+
* Test mapping configuration by transforming a payload using the provided mapping rules without persisting data
|
|
366
|
+
*/
|
|
367
|
+
'post'(
|
|
368
|
+
parameters?: Parameters<UnknownParamsObject> | null,
|
|
369
|
+
data?: Paths.SimulateMapping.RequestBody,
|
|
370
|
+
config?: AxiosRequestConfig
|
|
371
|
+
): OperationResponse<Paths.SimulateMapping.Responses.$200>
|
|
372
|
+
}
|
|
266
373
|
}
|
|
267
374
|
|
|
268
375
|
export type Client = OpenAPIClient<OperationMethods, PathsDictionary>
|
package/dist/openapi.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"openapi": "3.0.3",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "ERP Integration API",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.3.0",
|
|
6
6
|
"description": "API for integrating with ERP systems, handling tracking acknowledgments, triggering ERP processes, and processing ERP updates."
|
|
7
7
|
},
|
|
8
8
|
"tags": [
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"/v1/erp/tracking/acknowledgement": {
|
|
25
25
|
"post": {
|
|
26
26
|
"operationId": "acknowledgeTracking",
|
|
27
|
-
"summary": "
|
|
27
|
+
"summary": "acknowledgeTracking",
|
|
28
28
|
"description": "Acknowledges an ERP tracking record by removing it from the tracking table, requires public authentication",
|
|
29
29
|
"tags": [
|
|
30
30
|
"erp"
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"/v1/erp/trigger": {
|
|
82
82
|
"post": {
|
|
83
83
|
"operationId": "triggerErp",
|
|
84
|
-
"summary": "
|
|
84
|
+
"summary": "triggerErp",
|
|
85
85
|
"description": "Triggers the ERP integration process",
|
|
86
86
|
"tags": [
|
|
87
87
|
"erp",
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
"/v1/erp/updates/events": {
|
|
117
117
|
"post": {
|
|
118
118
|
"operationId": "processErpUpdatesEvents",
|
|
119
|
-
"summary": "
|
|
119
|
+
"summary": "processErpUpdatesEvents",
|
|
120
120
|
"description": "Handles updates from ERP systems and tracks them appropriately",
|
|
121
121
|
"tags": [
|
|
122
122
|
"erp"
|
|
@@ -257,6 +257,214 @@
|
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
259
|
}
|
|
260
|
+
},
|
|
261
|
+
"/v1/erp/updates/mapping_simulation": {
|
|
262
|
+
"post": {
|
|
263
|
+
"operationId": "simulateMapping",
|
|
264
|
+
"summary": "simulateMapping",
|
|
265
|
+
"description": "Test mapping configuration by transforming a payload using the provided mapping rules without persisting data",
|
|
266
|
+
"tags": [
|
|
267
|
+
"erp"
|
|
268
|
+
],
|
|
269
|
+
"requestBody": {
|
|
270
|
+
"required": true,
|
|
271
|
+
"content": {
|
|
272
|
+
"application/json": {
|
|
273
|
+
"schema": {
|
|
274
|
+
"type": "object",
|
|
275
|
+
"required": [
|
|
276
|
+
"mapping_configuration",
|
|
277
|
+
"object_type",
|
|
278
|
+
"format",
|
|
279
|
+
"payload"
|
|
280
|
+
],
|
|
281
|
+
"properties": {
|
|
282
|
+
"mapping_configuration": {
|
|
283
|
+
"type": "object",
|
|
284
|
+
"description": "The integration mapping configuration",
|
|
285
|
+
"required": [
|
|
286
|
+
"mapping"
|
|
287
|
+
],
|
|
288
|
+
"properties": {
|
|
289
|
+
"mapping": {
|
|
290
|
+
"type": "object",
|
|
291
|
+
"required": [
|
|
292
|
+
"objects"
|
|
293
|
+
],
|
|
294
|
+
"properties": {
|
|
295
|
+
"objects": {
|
|
296
|
+
"type": "object",
|
|
297
|
+
"description": "Object type mappings",
|
|
298
|
+
"additionalProperties": {
|
|
299
|
+
"type": "object",
|
|
300
|
+
"required": [
|
|
301
|
+
"unique_ids",
|
|
302
|
+
"fields"
|
|
303
|
+
],
|
|
304
|
+
"properties": {
|
|
305
|
+
"unique_ids": {
|
|
306
|
+
"type": "object",
|
|
307
|
+
"description": "Mapping of entity types to their unique identifier field mappings",
|
|
308
|
+
"additionalProperties": {
|
|
309
|
+
"type": "object",
|
|
310
|
+
"description": "Map of remote keys to local entity keys",
|
|
311
|
+
"additionalProperties": {
|
|
312
|
+
"type": "string"
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
"fields": {
|
|
317
|
+
"type": "array",
|
|
318
|
+
"description": "Field mapping definitions",
|
|
319
|
+
"items": {
|
|
320
|
+
"type": "object",
|
|
321
|
+
"required": [
|
|
322
|
+
"entity",
|
|
323
|
+
"attribute"
|
|
324
|
+
],
|
|
325
|
+
"properties": {
|
|
326
|
+
"entity": {
|
|
327
|
+
"type": "string",
|
|
328
|
+
"description": "Target entity slug"
|
|
329
|
+
},
|
|
330
|
+
"attribute": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"description": "Target attribute name"
|
|
333
|
+
},
|
|
334
|
+
"field": {
|
|
335
|
+
"type": "string",
|
|
336
|
+
"description": "Source field name (mutually exclusive with jsonataExpression)"
|
|
337
|
+
},
|
|
338
|
+
"jsonataExpression": {
|
|
339
|
+
"type": "string",
|
|
340
|
+
"description": "JSONata expression for transformation (mutually exclusive with field)"
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
"object_type": {
|
|
353
|
+
"type": "string",
|
|
354
|
+
"description": "Type of the object being mapped (must match a key in mapping_configuration.mapping.objects)"
|
|
355
|
+
},
|
|
356
|
+
"format": {
|
|
357
|
+
"type": "string",
|
|
358
|
+
"enum": [
|
|
359
|
+
"json",
|
|
360
|
+
"xml"
|
|
361
|
+
],
|
|
362
|
+
"default": "json",
|
|
363
|
+
"description": "Format of the payload data"
|
|
364
|
+
},
|
|
365
|
+
"payload": {
|
|
366
|
+
"type": "string",
|
|
367
|
+
"description": "The serialized object data payload (JSON, XML, etc.) as a string"
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
"example": {
|
|
372
|
+
"mapping_configuration": {
|
|
373
|
+
"mapping": {
|
|
374
|
+
"objects": {
|
|
375
|
+
"business_partner": {
|
|
376
|
+
"unique_ids": {
|
|
377
|
+
"contact": {
|
|
378
|
+
"partner_id": "_id"
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
"fields": [
|
|
382
|
+
{
|
|
383
|
+
"entity": "contact",
|
|
384
|
+
"attribute": "first_name",
|
|
385
|
+
"field": "firstName"
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"entity": "contact",
|
|
389
|
+
"attribute": "last_name",
|
|
390
|
+
"field": "lastName"
|
|
391
|
+
}
|
|
392
|
+
]
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
"object_type": "business_partner",
|
|
398
|
+
"format": "json",
|
|
399
|
+
"payload": "{\"partner_id\":\"BP10001\",\"firstName\":\"John\",\"lastName\":\"Doe\"}"
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
"responses": {
|
|
405
|
+
"200": {
|
|
406
|
+
"description": "Successfully simulated mapping",
|
|
407
|
+
"content": {
|
|
408
|
+
"application/json": {
|
|
409
|
+
"schema": {
|
|
410
|
+
"type": "object",
|
|
411
|
+
"required": [
|
|
412
|
+
"entity_updates"
|
|
413
|
+
],
|
|
414
|
+
"properties": {
|
|
415
|
+
"entity_updates": {
|
|
416
|
+
"type": "array",
|
|
417
|
+
"items": {
|
|
418
|
+
"type": "object",
|
|
419
|
+
"required": [
|
|
420
|
+
"entity_slug",
|
|
421
|
+
"unique_identifiers",
|
|
422
|
+
"attributes"
|
|
423
|
+
],
|
|
424
|
+
"properties": {
|
|
425
|
+
"entity_slug": {
|
|
426
|
+
"type": "string",
|
|
427
|
+
"description": "The entity type slug"
|
|
428
|
+
},
|
|
429
|
+
"unique_identifiers": {
|
|
430
|
+
"type": "object",
|
|
431
|
+
"description": "Unique identifier mappings for this entity",
|
|
432
|
+
"additionalProperties": true
|
|
433
|
+
},
|
|
434
|
+
"attributes": {
|
|
435
|
+
"type": "object",
|
|
436
|
+
"description": "Mapped attribute values",
|
|
437
|
+
"additionalProperties": true
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
},
|
|
447
|
+
"400": {
|
|
448
|
+
"$ref": "#/components/responses/BadRequest"
|
|
449
|
+
},
|
|
450
|
+
"401": {
|
|
451
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
452
|
+
},
|
|
453
|
+
"422": {
|
|
454
|
+
"description": "Unprocessable entity - mapping configuration or payload validation failed",
|
|
455
|
+
"content": {
|
|
456
|
+
"application/json": {
|
|
457
|
+
"schema": {
|
|
458
|
+
"$ref": "#/components/schemas/ErrorResponseBase"
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
"500": {
|
|
464
|
+
"$ref": "#/components/responses/InternalServerError"
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
260
468
|
}
|
|
261
469
|
},
|
|
262
470
|
"components": {
|
|
@@ -458,9 +666,6 @@
|
|
|
458
666
|
}
|
|
459
667
|
},
|
|
460
668
|
"servers": [
|
|
461
|
-
{
|
|
462
|
-
"url": "https://erp-integration-api.sls.epilot.io"
|
|
463
|
-
},
|
|
464
669
|
{
|
|
465
670
|
"url": "https://erp-integration-api.sls.epilot.io"
|
|
466
671
|
}
|