From 58488ebc3dbce42723b88de6a2d71cdd29568abb Mon Sep 17 00:00:00 2001 From: Zaid Humaimidi Date: Sun, 30 Jul 2023 23:08:00 -0700 Subject: [PATCH] Refactor DB code to use promises --- build/build.ts | 1 + lib/api-functions.ts | 19 +- lib/cwmp.ts | 7 +- lib/db.ts | 104 +- lib/fs.ts | 8 +- lib/mongodb-types.ts | 59 + lib/nbi.ts | 1326 ++++++++--------- lib/ui/api-functions.ts | 10 +- lib/ui/api.ts | 59 +- lib/ui/db.ts | 206 +-- npm-shrinkwrap.json | 3067 ++++++++++++++++++++++++++++++++++++++- package.json | 2 +- 12 files changed, 3814 insertions(+), 1054 deletions(-) diff --git a/build/build.ts b/build/build.ts index 1f77e83..1932f5b 100644 --- a/build/build.ts +++ b/build/build.ts @@ -61,6 +61,7 @@ const builtins = [ "url", "readline", "stream", + "bson", // not a built-in but not a direct dependency either ]; function rmDirSync(dirPath): void { diff --git a/lib/api-functions.ts b/lib/api-functions.ts index adf5f97..4c2922d 100644 --- a/lib/api-functions.ts +++ b/lib/api-functions.ts @@ -17,7 +17,7 @@ * along with GenieACS. If not, see . */ -import * as db from "./db"; +import { collections } from "./db"; import * as common from "./common"; import * as cache from "./cache"; import { @@ -38,7 +38,7 @@ export async function connectionRequest( device?: Record ): Promise { if (!device) { - const res = await db.devicesCollection.findOne({ _id: deviceId }); + const res = await collections.devices.findOne({ _id: deviceId }); if (!res) throw new Error("No such device"); device = flattenDevice(res); } @@ -184,7 +184,7 @@ export async function awaitSessionStart( timeout: number ): Promise { const now = Date.now(); - const device = await db.devicesCollection.findOne( + const device = await collections.devices.findOne( { _id: deviceId }, { projection: { _lastInform: 1 } } ); @@ -322,26 +322,27 @@ export async function insertTasks(tasks: any[]): Promise { for (const task of tasks) { sanitizeTask(task); if (task.uniqueKey) { - await db.tasksCollection.deleteOne({ + await collections.tasks.deleteOne({ device: task.device, uniqueKey: task.uniqueKey, }); } } - await db.tasksCollection.insertMany(tasks); + await collections.tasks.insertMany(tasks); + for (const task of tasks) task._id = task._id.toString(); return tasks; } export async function deleteDevice(deviceId: string): Promise { await Promise.all([ - db.tasksCollection.deleteMany({ device: deviceId }), - db.devicesCollection.deleteOne({ _id: deviceId }), - db.faultsCollection.deleteMany({ + collections.tasks.deleteMany({ device: deviceId }), + collections.devices.deleteOne({ _id: deviceId }), + collections.faults.deleteMany({ _id: { $regex: `^${common.escapeRegExp(deviceId)}\\:`, }, }), - db.operationsCollection.deleteMany({ + collections.operations.deleteMany({ _id: { $regex: `^${common.escapeRegExp(deviceId)}\\:`, }, diff --git a/lib/cwmp.ts b/lib/cwmp.ts index 70f2591..47ab7a5 100644 --- a/lib/cwmp.ts +++ b/lib/cwmp.ts @@ -1473,10 +1473,15 @@ async function listenerAsync( const chunks: Buffer[] = []; try { + let readableEnded = false; + stream.on("end", () => { + readableEnded = true; + }); for await (const chunk of stream) chunks.push(chunk); // In Node versions prior to 15, the stream will not emit an error if the // connection is closed before the stream is finished. - if (!stream.readableEnded) throw new Error("Connection closed"); + // For Node 12.9+ we can just use stream.readableEnded + if (!readableEnded) throw new Error("Connection closed"); } catch (err) { return; } diff --git a/lib/db.ts b/lib/db.ts index 4f9ad16..94d7959 100644 --- a/lib/db.ts +++ b/lib/db.ts @@ -32,18 +32,20 @@ import { import Path from "./common/path"; import * as MongoTypes from "./mongodb-types"; -export let tasksCollection: Collection, - devicesCollection: Collection, - presetsCollection: Collection, - objectsCollection: Collection, - provisionsCollection: Collection, - virtualParametersCollection: Collection, - faultsCollection: Collection, - filesCollection: Collection, - operationsCollection: Collection, - permissionsCollection: Collection, - usersCollection: Collection, - configCollection: Collection; +export const collections = { + devices: null as Collection, + presets: null as Collection, + objects: null as Collection, + provisions: null as Collection, + virtualParameters: null as Collection, + faults: null as Collection, + tasks: null as Collection, + files: null as Collection, + operations: null as Collection, + permissions: null as Collection, + users: null as Collection, + config: null as Collection, +}; let clientPromise: Promise; @@ -70,20 +72,20 @@ export async function connect(): Promise { } onConnect(async (db) => { - tasksCollection = db.collection("tasks"); - await tasksCollection.createIndex({ device: 1, timestamp: 1 }); + collections.tasks = db.collection("tasks"); + await collections.tasks.createIndex({ device: 1, timestamp: 1 }); - devicesCollection = db.collection("devices"); - presetsCollection = db.collection("presets"); - objectsCollection = db.collection("objects"); - filesCollection = db.collection("fs.files"); - provisionsCollection = db.collection("provisions"); - virtualParametersCollection = db.collection("virtualParameters"); - faultsCollection = db.collection("faults"); - operationsCollection = db.collection("operations"); - permissionsCollection = db.collection("permissions"); - usersCollection = db.collection("users"); - configCollection = db.collection("config"); + collections.devices = db.collection("devices"); + collections.presets = db.collection("presets"); + collections.objects = db.collection("objects"); + collections.files = db.collection("fs.files"); + collections.provisions = db.collection("provisions"); + collections.virtualParameters = db.collection("virtualParameters"); + collections.faults = db.collection("faults"); + collections.operations = db.collection("operations"); + collections.permissions = db.collection("permissions"); + collections.users = db.collection("users"); + collections.config = db.collection("config"); }); export async function disconnect(): Promise { @@ -130,7 +132,7 @@ export async function fetchDevice( ], ]; - const device = await devicesCollection.findOne({ _id: id }); + const device = await collections.devices.findOne({ _id: id }); if (!device) return null; function storeParams( @@ -194,7 +196,7 @@ export async function fetchDevice( res.push([Path.parse(path + ".*"), obj["_timestamp"]]); } - const ts: number = device["_timestamp"] || 0; + const ts: number = +device["_timestamp"] || 0; if (ts) res.push([Path.parse("*"), ts]); for (const [k, v] of Object.entries(device)) { @@ -621,15 +623,19 @@ export async function saveDevice( delete update["$pull"]; } - const result = await devicesCollection.updateOne({ _id: deviceId }, update, { - upsert: isNew, - }); + const result = await collections.devices.updateOne( + { _id: deviceId }, + update, + { + upsert: isNew, + } + ); if (!result.matchedCount && !result.upsertedCount) throw new Error(`Device ${deviceId} not found in database`); if (update2) { - await devicesCollection.updateOne({ _id: deviceId }, update2); + await collections.devices.updateOne({ _id: deviceId }, update2); return; } } @@ -637,7 +643,7 @@ export async function saveDevice( export async function getFaults( deviceId: string ): Promise<{ [channel: string]: SessionFault }> { - const res = await faultsCollection + const res = await collections.faults .find({ _id: { $regex: `^${escapeRegExp(deviceId)}\\:` } }) .toArray(); @@ -677,21 +683,23 @@ export async function saveFault( ...(fault.expiry && { expiry: new Date(fault.expiry) }), provisions: JSON.stringify(fault.provisions), }; - await faultsCollection.replaceOne({ _id: id }, f, { upsert: true }); + await collections.faults.replaceOne({ _id: id }, f, { upsert: true }); } export async function deleteFault( deviceId: string, channel: string ): Promise { - await faultsCollection.deleteOne({ _id: `${deviceId}:${channel}` }); + await collections.faults.deleteOne({ _id: `${deviceId}:${channel}` }); } export async function getDueTasks( deviceId: string, timestamp: number ): Promise<[Task[], number]> { - const cur = tasksCollection.find({ device: deviceId }).sort({ timestamp: 1 }); + const cur = collections.tasks + .find({ device: deviceId }) + .sort({ timestamp: 1 }); const tasks = [] as Task[]; for await (const t of cur) { @@ -736,7 +744,7 @@ export async function getDueTasks( q = { _id: { $in: [t["file"], new ObjectId(t["file"])] } }; else q = { _id: t["file"] }; - const res = await filesCollection.find(q).toArray(); + const res = await collections.files.find(q).toArray(); if (res[0]) { if (!task.fileType) task.fileType = res[0].metadata.fileType; @@ -753,7 +761,7 @@ export async function clearTasks( deviceId: string, taskIds: string[] ): Promise { - await tasksCollection.deleteMany({ + await collections.tasks.deleteMany({ _id: { $in: taskIds.map((id) => new ObjectId(id)) }, }); } @@ -761,7 +769,7 @@ export async function clearTasks( export async function getOperations( deviceId: string ): Promise<{ [commandKey: string]: Operation }> { - const res = await operationsCollection + const res = await collections.operations .find({ _id: { $regex: `^${escapeRegExp(deviceId)}\\:` } }) .toArray(); @@ -803,7 +811,7 @@ export async function saveOperation( retries: JSON.stringify(operation.retries), args: JSON.stringify(operation.args), }; - await operationsCollection.replaceOne({ _id: id }, o, { + await collections.operations.replaceOne({ _id: id }, o, { upsert: true, }); } @@ -812,33 +820,33 @@ export async function deleteOperation( deviceId: string, commandKey: string ): Promise { - await operationsCollection.deleteOne({ _id: `${deviceId}:${commandKey}` }); + await collections.operations.deleteOne({ _id: `${deviceId}:${commandKey}` }); } export async function getPresets(): Promise[]> { - return presetsCollection.find().toArray(); + return collections.presets.find().toArray(); } export async function getObjects(): Promise[]> { - return objectsCollection.find().toArray(); + return collections.objects.find().toArray(); } export async function getProvisions(): Promise[]> { - return provisionsCollection.find().toArray(); + return collections.provisions.find().toArray(); } export async function getVirtualParameters(): Promise[]> { - return virtualParametersCollection.find().toArray(); + return collections.virtualParameters.find().toArray(); } export function getFiles(): Promise[]> { - return filesCollection.find().toArray(); + return collections.files.find().toArray(); } export async function getConfig(): Promise< { id: string; value: Expression }[] > { - const res = await configCollection.find().toArray(); + const res = await collections.config.find().toArray(); return res.map((c) => ({ id: c["_id"], value: parse(c["value"]), @@ -854,7 +862,7 @@ interface Permission { } export async function getPermissions(): Promise { - return permissionsCollection.find().toArray() as unknown as Permission[]; + return collections.permissions.find().toArray() as unknown as Permission[]; } interface User { @@ -865,5 +873,5 @@ interface User { } export async function getUsers(): Promise { - return usersCollection.find().toArray() as unknown as User[]; + return collections.users.find().toArray() as unknown as User[]; } diff --git a/lib/fs.ts b/lib/fs.ts index e1cc5a1..3d44868 100644 --- a/lib/fs.ts +++ b/lib/fs.ts @@ -20,17 +20,15 @@ import * as url from "url"; import { IncomingMessage, ServerResponse } from "http"; import { PassThrough, pipeline, Readable } from "stream"; -import { Collection, GridFSBucket } from "mongodb"; -import { onConnect } from "./db"; +import { GridFSBucket } from "mongodb"; +import { onConnect, collections } from "./db"; import * as logger from "./logger"; import { getRequestOrigin } from "./forwarded"; import memoize from "./common/memoize"; -let filesCollection: Collection; let filesBucket: GridFSBucket; onConnect(async (db) => { - filesCollection = db.collection("fs.files"); filesBucket = new GridFSBucket(db); }); @@ -79,7 +77,7 @@ export async function listener( remoteAddress: getRequestOrigin(request).remoteAddress, }; - const file = await filesCollection.findOne({ _id: filename }); + const file = await collections.files.findOne({ _id: filename }); if (!file) { response.writeHead(404); diff --git a/lib/mongodb-types.ts b/lib/mongodb-types.ts index 64c166a..7b512f5 100644 --- a/lib/mongodb-types.ts +++ b/lib/mongodb-types.ts @@ -25,6 +25,7 @@ interface TaskBase { timestamp?: Date; expiry?: Date; name: string; + device: string; } interface TaskGetParameterValues extends TaskBase { @@ -105,3 +106,61 @@ export interface Cache { timestamp: Date; expire: Date; } + +export interface Device { + _id: string; + _lastInform: Date; + _registered: Date; + _tags?: string[]; + _timestamp?: Date; +} + +export interface Preset { + _id: string; + weight: number; + channels: string; + provisions: string; + events: Record; + configurations: { type: string; name: string; args: Expression[] }[]; +} + +export interface Object { + _id: string; +} + +export interface Provision { + _id: string; + script: string; +} + +export interface VirtualParameter { + _id: string; + script: string; +} + +export interface File { + _id: string; + length: number; + filename: string; + metadata?: { + fileType?: string; + oui?: string; + productClass?: string; + version?: string; + }; +} + +export interface Permission { + _id: string; + role: string; + resource: string; + access: 1 | 2 | 3; + validate: string; +} + +export interface User { + _id: string; + password: string; + roles: string; + salt: string; +} diff --git a/lib/nbi.ts b/lib/nbi.ts index 1deec0b..c4cfe37 100644 --- a/lib/nbi.ts +++ b/lib/nbi.ts @@ -17,11 +17,10 @@ * along with GenieACS. If not, see . */ -import * as url from "url"; import { Collection, GridFSBucket, ObjectId } from "mongodb"; import * as vm from "vm"; import * as config from "./config"; -import { onConnect, optimizeProjection } from "./db"; +import { onConnect, optimizeProjection, collections } from "./db"; import * as query from "./query"; import * as apiFunctions from "./api-functions"; import { IncomingMessage, ServerResponse } from "http"; @@ -30,7 +29,7 @@ import { version as VERSION } from "../package.json"; import { ping } from "./ping"; import * as logger from "./logger"; import { flattenDevice } from "./mongodb-functions"; -import { getSocketEndpoints } from "./server"; +import { getRequestOrigin } from "./forwarded"; const DEVICE_TASKS_REGEX = /^\/devices\/([a-zA-Z0-9\-_%]+)\/tasks\/?$/; const TASKS_REGEX = /^\/tasks\/([a-zA-Z0-9\-_%]+)(\/[a-zA-Z_]*)?$/; @@ -47,681 +46,504 @@ const VIRTUAL_PARAMETERS_REGEX = /^\/virtual_parameters\/([a-zA-Z0-9\-_%]+)\/?$/; const FAULTS_REGEX = /^\/faults\/([a-zA-Z0-9\-_%:]+)\/?$/; -const collections: Record = { - tasks: null as Collection, - devices: null as Collection, - presets: null as Collection, - objects: null as Collection, - files: null as Collection, - provisions: null as Collection, - virtualParameters: null as Collection, - faults: null as Collection, -}; let filesBucket: GridFSBucket; onConnect(async (db) => { - for (const k of Object.keys(collections)) { - if (k === "files") collections[k] = db.collection("fs.files"); - else collections[k] = db.collection(k); - } filesBucket = new GridFSBucket(db); }); -function throwError(err: Error, httpResponse?: ServerResponse): never { - if (httpResponse) { - httpResponse.writeHead(500, { Connection: "close" }); - httpResponse.end(`${err.name}: ${err.message}`); - } - throw err; +async function getBody(request: IncomingMessage): Promise { + const chunks: Buffer[] = []; + let readableEnded = false; + request.on("end", () => { + readableEnded = true; + }); + for await (const chunk of request) chunks.push(chunk); + // In Node versions prior to 15, the stream will not emit an error if the + // connection is closed before the stream is finished. + // For Node 12.9+ we can just use stream.readableEnded + if (!readableEnded) throw new Error("Connection closed"); + return Buffer.concat(chunks); } export function listener( request: IncomingMessage, response: ServerResponse ): void { - const chunks = []; - let bytes = 0; response.setHeader("GenieACS-Version", VERSION); - request.addListener("data", (chunk): void => { - chunks.push(chunk); - bytes += chunk.length; + const origin = getRequestOrigin(request); + const url = new URL( + request.url, + (origin.encrypted ? "https://" : "http://") + origin.host + ); + + let readableEnded = false; + // For Node 12.9+ we can just use stream.readableEnded + request.on("end", () => { + readableEnded = true; }); - function getBody(): Buffer { - // Write all chunks into a Buffer - const body = Buffer.allocUnsafe(bytes); - let offset = 0; - for (const chunk of chunks) { - chunk.copy(body, offset, 0, chunk.length); - offset += chunk.length; + getBody(request) + .then((body) => { + logger.accessInfo( + Object.assign({}, Object.fromEntries(url.searchParams), { + remoteAddress: origin.remoteAddress, + message: `${request.method} ${url.pathname}`, + }) + ); + return handler(request, response, url, body); + }) + .catch((err) => { + // Ignore incomplete requests + if (!readableEnded) return; + + if (!response.headersSent) { + response.writeHead(500, { Connection: "close" }); + response.end(`${err.name}: ${err.message}`); + } + throw err; + }); +} + +async function handler( + request: IncomingMessage, + response: ServerResponse, + url: URL, + body: Buffer +): Promise { + if (PRESETS_REGEX.test(url.pathname)) { + const presetName = decodeURIComponent(PRESETS_REGEX.exec(url.pathname)[1]); + if (request.method === "PUT") { + let preset; + try { + preset = JSON.parse(body.toString()); + } catch (err) { + response.writeHead(400); + response.end(`${err.name}: ${err.message}`); + return; + } + preset._id = presetName; + await collections.presets.replaceOne({ _id: presetName }, preset, { + upsert: true, + }); + await cache.del("presets_hash"); + response.writeHead(200); + response.end(); + } else if (request.method === "DELETE") { + await collections.presets.deleteOne({ _id: presetName }); + await cache.del("presets_hash"); + response.writeHead(200); + response.end(); + } else { + response.writeHead(405, { Allow: "PUT, DELETE" }); + response.end("405 Method Not Allowed"); } - return body; - } - - request.addListener("end", () => { - const body = getBody(); - const urlParts = url.parse(request.url, true); - const socketEndpoints = getSocketEndpoints(request.socket); - - logger.accessInfo( - Object.assign({}, urlParts.query, { - remoteAddress: socketEndpoints.remoteAddress, - message: `${request.method} ${urlParts.pathname}`, - }) + } else if (OBJECTS_REGEX.test(url.pathname)) { + const objectName = decodeURIComponent(OBJECTS_REGEX.exec(url.pathname)[1]); + if (request.method === "PUT") { + let object; + try { + object = JSON.parse(body.toString()); + } catch (err) { + response.writeHead(400); + response.end(`${err.name}: ${err.message}`); + return; + } + object._id = objectName; + await collections.objects.replaceOne({ _id: objectName }, object, { + upsert: true, + }); + await cache.del("presets_hash"); + response.writeHead(200); + response.end(); + } else if (request.method === "DELETE") { + await collections.objects.deleteOne({ _id: objectName }); + await cache.del("presets_hash"); + response.writeHead(200); + response.end(); + } else { + response.writeHead(405, { Allow: "PUT, DELETE" }); + response.end("405 Method Not Allowed"); + } + } else if (PROVISIONS_REGEX.test(url.pathname)) { + const provisionName = decodeURIComponent( + PROVISIONS_REGEX.exec(url.pathname)[1] ); + if (request.method === "PUT") { + const object = { + _id: provisionName, + script: body.toString(), + }; - if (PRESETS_REGEX.test(urlParts.pathname)) { - const presetName = decodeURIComponent( - PRESETS_REGEX.exec(urlParts.pathname)[1] + try { + new vm.Script(`"use strict";(function(){\n${object.script}\n})();`); + } catch (err) { + response.writeHead(400); + response.end(`${err.name}: ${err.message}`); + return; + } + + await collections.provisions.replaceOne({ _id: provisionName }, object, { + upsert: true, + }); + await cache.del("presets_hash"); + response.writeHead(200); + response.end(); + } else if (request.method === "DELETE") { + await collections.provisions.deleteOne({ _id: provisionName }); + await cache.del("presets_hash"); + response.writeHead(200); + response.end(); + } else { + response.writeHead(405, { Allow: "PUT, DELETE" }); + response.end("405 Method Not Allowed"); + } + } else if (VIRTUAL_PARAMETERS_REGEX.test(url.pathname)) { + const virtualParameterName = decodeURIComponent( + VIRTUAL_PARAMETERS_REGEX.exec(url.pathname)[1] + ); + if (request.method === "PUT") { + const object = { + _id: virtualParameterName, + script: body.toString(), + }; + + try { + new vm.Script(`"use strict";(function(){\n${object.script}\n})();`); + } catch (err) { + response.writeHead(400); + response.end(`${err.name}: ${err.message}`); + return; + } + + await collections.virtualParameters.replaceOne( + { _id: virtualParameterName }, + object, + { upsert: true } ); - if (request.method === "PUT") { - let preset; + await cache.del("presets_hash"); + response.writeHead(200); + response.end(); + } else if (request.method === "DELETE") { + await collections.virtualParameters.deleteOne({ + _id: virtualParameterName, + }); + await cache.del("presets_hash"); + response.writeHead(200); + response.end(); + } else { + response.writeHead(405, { Allow: "PUT, DELETE" }); + response.end("405 Method Not Allowed"); + } + } else if (TAGS_REGEX.test(url.pathname)) { + const r = TAGS_REGEX.exec(url.pathname); + const deviceId = decodeURIComponent(r[1]); + const tag = decodeURIComponent(r[2]); + if (request.method === "POST") { + await collections.devices.updateOne( + { _id: deviceId }, + { $addToSet: { _tags: tag } } + ); + response.writeHead(200); + response.end(); + } else if (request.method === "DELETE") { + await collections.devices.updateOne( + { _id: deviceId }, + { $pull: { _tags: tag } } + ); + response.writeHead(200); + response.end(); + } else { + response.writeHead(405, { Allow: "POST, DELETE" }); + response.end("405 Method Not Allowed"); + } + } else if (FAULTS_REGEX.test(url.pathname)) { + if (request.method === "DELETE") { + const faultId = decodeURIComponent(FAULTS_REGEX.exec(url.pathname)[1]); + const deviceId = faultId.split(":", 1)[0]; + const channel = faultId.slice(deviceId.length + 1); + await collections.faults.deleteOne({ _id: faultId }); + if (channel.startsWith("task_")) { + const objId = new ObjectId(channel.slice(5)); + await collections.tasks.deleteOne({ _id: objId }); + await cache.del(`${deviceId}_tasks_faults_operations`); + response.writeHead(200); + response.end(); + return; + } + + await cache.del(`${deviceId}_tasks_faults_operations`); + response.writeHead(200); + response.end(); + } else { + response.writeHead(405, { Allow: "DELETE" }); + response.end("405 Method Not Allowed"); + } + } else if (DEVICE_TASKS_REGEX.test(url.pathname)) { + if (request.method === "POST") { + const deviceId = decodeURIComponent( + DEVICE_TASKS_REGEX.exec(url.pathname)[1] + ); + if (body.length) { + let task; try { - preset = JSON.parse(body.toString()); + task = JSON.parse(body.toString()); } catch (err) { response.writeHead(400); response.end(`${err.name}: ${err.message}`); return; } - preset._id = presetName; - collections.presets.replaceOne( - { _id: presetName }, - preset, - { upsert: true }, - (err) => { - if (err) return void throwError(err, response); - - cache - .del("presets_hash") - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - } - ); - } else if (request.method === "DELETE") { - collections.presets.deleteOne({ _id: presetName }, (err) => { - if (err) return void throwError(err, response); - - cache - .del("presets_hash") - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); + task.device = deviceId; + const dev = await collections.devices.findOne({ + _id: deviceId, }); - } else { - response.writeHead(405, { Allow: "PUT, DELETE" }); - response.end("405 Method Not Allowed"); - } - } else if (OBJECTS_REGEX.test(urlParts.pathname)) { - const objectName = decodeURIComponent( - OBJECTS_REGEX.exec(urlParts.pathname)[1] - ); - if (request.method === "PUT") { - let object; - try { - object = JSON.parse(body.toString()); - } catch (err) { - response.writeHead(400); - response.end(`${err.name}: ${err.message}`); - return; - } - object._id = objectName; - collections.objects.replaceOne( - { _id: objectName }, - object, - { upsert: true }, - (err) => { - if (err) return void throwError(err, response); - - cache - .del("presets_hash") - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - } - ); - } else if (request.method === "DELETE") { - collections.objects.deleteOne({ _id: objectName }, (err) => { - if (err) return void throwError(err, response); - - cache - .del("presets_hash") - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - }); - } else { - response.writeHead(405, { Allow: "PUT, DELETE" }); - response.end("405 Method Not Allowed"); - } - } else if (PROVISIONS_REGEX.test(urlParts.pathname)) { - const provisionName = decodeURIComponent( - PROVISIONS_REGEX.exec(urlParts.pathname)[1] - ); - if (request.method === "PUT") { - const object = { - _id: provisionName, - script: body.toString(), - }; - - try { - new vm.Script(`"use strict";(function(){\n${object.script}\n})();`); - } catch (err) { - response.writeHead(400); - response.end(`${err.name}: ${err.message}`); + if (!dev) { + response.writeHead(404); + response.end("No such device"); return; } - collections.provisions.replaceOne( - { _id: provisionName }, - object, - { upsert: true }, - (err) => { - if (err) return void throwError(err, response); + const device = flattenDevice(dev); + await apiFunctions.insertTasks(task); - cache - .del("presets_hash") - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - } + const lastInform = Date.now(); + + const socketTimeout: number = request.socket["timeout"]; + + // Disable socket timeout while waiting for session + if (socketTimeout) request.socket.setTimeout(0); + + const notInSession = await apiFunctions.awaitSessionEnd( + deviceId, + 30000 ); - } else if (request.method === "DELETE") { - collections.provisions.deleteOne({ _id: provisionName }, (err) => { - if (err) return void throwError(err, response); - - cache - .del("presets_hash") - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - }); - } else { - response.writeHead(405, { Allow: "PUT, DELETE" }); - response.end("405 Method Not Allowed"); - } - } else if (VIRTUAL_PARAMETERS_REGEX.test(urlParts.pathname)) { - const virtualParameterName = decodeURIComponent( - VIRTUAL_PARAMETERS_REGEX.exec(urlParts.pathname)[1] - ); - if (request.method === "PUT") { - const object = { - _id: virtualParameterName, - script: body.toString(), - }; - - try { - new vm.Script(`"use strict";(function(){\n${object.script}\n})();`); - } catch (err) { - response.writeHead(400); - response.end(`${err.name}: ${err.message}`); + await cache.del(`${deviceId}_tasks_faults_operations`); + if (url.searchParams.has("connection_request")) { + if (socketTimeout) request.socket.setTimeout(socketTimeout); + response.writeHead(202, { + "Content-Type": "application/json", + }); + response.end(JSON.stringify(task)); return; } - collections.virtualParameters.replaceOne( - { _id: virtualParameterName }, - object, - { upsert: true }, - (err) => { - if (err) return void throwError(err, response); + if (!notInSession) { + if (socketTimeout) request.socket.setTimeout(socketTimeout); + response.writeHead(202, "Task queued but not processed", { + "Content-Type": "application/json", + }); + response.end(JSON.stringify(task)); + return; + } - cache - .del("presets_hash") - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); + const status = await apiFunctions.connectionRequest(deviceId, device); + + if (status) { + if (socketTimeout) request.socket.setTimeout(socketTimeout); + response.writeHead(202, status, { + "Content-Type": "application/json", + }); + response.end(JSON.stringify(task)); + return; + } + + const onlineThreshold = + (url.searchParams.has("timeout") && + parseInt(url.searchParams.get("timeout"))) || + (config.get("DEVICE_ONLINE_THRESHOLD", deviceId) as number); + + const sessionStarted = await apiFunctions.awaitSessionStart( + deviceId, + lastInform, + onlineThreshold + ); + if (!sessionStarted) { + if (socketTimeout) request.socket.setTimeout(socketTimeout); + response.writeHead(202, "Task queued but not processed", { + "Content-Type": "application/json", + }); + response.end(JSON.stringify(task)); + return; + } + + const sessionEnded = await apiFunctions.awaitSessionEnd( + deviceId, + 120000 + ); + if (!sessionEnded) { + if (socketTimeout) request.socket.setTimeout(socketTimeout); + response.writeHead(202, "Task queued but not processed", { + "Content-Type": "application/json", + }); + response.end(JSON.stringify(task)); + return; + } + + const prom1 = collections.tasks.findOne( + { _id: task._id }, + { projection: { _id: 1 } } + ); + const prom2 = collections.faults.findOne( + { _id: `${deviceId}:task_${task._id}` }, + { + projection: { _id: 1 }, } ); - } else if (request.method === "DELETE") { - collections.virtualParameters.deleteOne( - { _id: virtualParameterName }, - (err) => { - if (err) return void throwError(err, response); - cache - .del("presets_hash") - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - } - ); - } else { - response.writeHead(405, { Allow: "PUT, DELETE" }); - response.end("405 Method Not Allowed"); - } - } else if (TAGS_REGEX.test(urlParts.pathname)) { - const r = TAGS_REGEX.exec(urlParts.pathname); - const deviceId = decodeURIComponent(r[1]); - const tag = decodeURIComponent(r[2]); - if (request.method === "POST") { - collections.devices.updateOne( - { _id: deviceId }, - { $addToSet: { _tags: tag } }, - (err) => { - if (err) return void throwError(err, response); - response.writeHead(200); - response.end(); - } - ); - } else if (request.method === "DELETE") { - collections.devices.updateOne( - { _id: deviceId }, - { $pull: { _tags: tag } }, - (err) => { - if (err) return void throwError(err, response); + const [t, f] = await Promise.all([prom1, prom2]); - response.writeHead(200); - response.end(); - } - ); - } else { - response.writeHead(405, { Allow: "POST, DELETE" }); - response.end("405 Method Not Allowed"); - } - } else if (FAULTS_REGEX.test(urlParts.pathname)) { - if (request.method === "DELETE") { - const faultId = decodeURIComponent( - FAULTS_REGEX.exec(urlParts.pathname)[1] - ); - const deviceId = faultId.split(":", 1)[0]; - const channel = faultId.slice(deviceId.length + 1); - collections.faults.deleteOne({ _id: faultId }, (err) => { - if (err) return void throwError(err, response); + // Restore socket timeout + if (socketTimeout) request.socket.setTimeout(socketTimeout); - if (channel.startsWith("task_")) { - const objId = new ObjectId(channel.slice(5)); - return void collections.tasks.deleteOne({ _id: objId }, (err) => { - if (err) return void throwError(err, response); - - cache - .del(`${deviceId}_tasks_faults_operations`) - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - }); - } - - cache - .del(`${deviceId}_tasks_faults_operations`) - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - }); - } else { - response.writeHead(405, { Allow: "DELETE" }); - response.end("405 Method Not Allowed"); - } - } else if (DEVICE_TASKS_REGEX.test(urlParts.pathname)) { - if (request.method === "POST") { - const deviceId = decodeURIComponent( - DEVICE_TASKS_REGEX.exec(urlParts.pathname)[1] - ); - if (body.length) { - let task; - try { - task = JSON.parse(body.toString()); - } catch (err) { - response.writeHead(400); - response.end(`${err.name}: ${err.message}`); - return; - } - task.device = deviceId; - collections.devices - .findOne({ _id: deviceId }) - .then(async (dev) => { - if (!dev) { - response.writeHead(404); - response.end("No such device"); - return; - } - - const device = flattenDevice(dev); - await apiFunctions.insertTasks(task); - - const lastInform = Date.now(); - - const socketTimeout: number = request.socket["timeout"]; - - // Disable socket timeout while waiting for session - if (socketTimeout) request.socket.setTimeout(0); - - const notInSession = await apiFunctions.awaitSessionEnd( - deviceId, - 30000 - ); - await cache.del(`${deviceId}_tasks_faults_operations`); - if (urlParts.query.connection_request == null) { - if (socketTimeout) request.socket.setTimeout(socketTimeout); - response.writeHead(202, { - "Content-Type": "application/json", - }); - response.end(JSON.stringify(task)); - return; - } - - if (!notInSession) { - if (socketTimeout) request.socket.setTimeout(socketTimeout); - response.writeHead(202, "Task queued but not processed", { - "Content-Type": "application/json", - }); - response.end(JSON.stringify(task)); - return; - } - - const status = await apiFunctions.connectionRequest( - deviceId, - device - ); - - if (status) { - if (socketTimeout) request.socket.setTimeout(socketTimeout); - response.writeHead(202, status, { - "Content-Type": "application/json", - }); - response.end(JSON.stringify(task)); - return; - } - - const onlineThreshold = - (urlParts.query.timeout && - parseInt(urlParts.query.timeout as string)) || - (config.get("DEVICE_ONLINE_THRESHOLD", deviceId) as number); - - const sessionStarted = await apiFunctions.awaitSessionStart( - deviceId, - lastInform, - onlineThreshold - ); - if (!sessionStarted) { - if (socketTimeout) request.socket.setTimeout(socketTimeout); - response.writeHead(202, "Task queued but not processed", { - "Content-Type": "application/json", - }); - response.end(JSON.stringify(task)); - return; - } - - const sessionEnded = await apiFunctions.awaitSessionEnd( - deviceId, - 120000 - ); - if (!sessionEnded) { - if (socketTimeout) request.socket.setTimeout(socketTimeout); - response.writeHead(202, "Task queued but not processed", { - "Content-Type": "application/json", - }); - response.end(JSON.stringify(task)); - return; - } - - const prom1 = collections.tasks.findOne( - { _id: task._id }, - { projection: { _id: 1 } } - ); - const prom2 = collections.faults.findOne( - { _id: `${deviceId}:task_${task._id}` }, - { - projection: { _id: 1 }, - } - ); - - const [t, f] = await Promise.all([prom1, prom2]); - - // Restore socket timeout - if (socketTimeout) request.socket.setTimeout(socketTimeout); - - if (f) { - response.writeHead(202, "Task faulted", { - "Content-Type": "application/json", - }); - response.end(JSON.stringify(t || task)); - } else if (t) { - response.writeHead(202, "Task queued but not processed", { - "Content-Type": "application/json", - }); - response.end(JSON.stringify(t)); - } else { - response.writeHead(200, { - "Content-Type": "application/json", - }); - response.end(JSON.stringify(task)); - } - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - } else if (urlParts.query.connection_request != null) { - // No task, send connection request only - collections.devices - .findOne({ _id: deviceId }) - .then(async (dev) => { - if (!dev) { - response.writeHead(404); - response.end("No such device"); - return; - } - return apiFunctions.connectionRequest(deviceId).then((status) => { - if (status) { - response.writeHead(504, status); - response.end(status); - return; - } - response.writeHead(200); - response.end(); - }); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); + if (f) { + response.writeHead(202, "Task faulted", { + "Content-Type": "application/json", + }); + response.end(JSON.stringify(t || task)); + } else if (t) { + response.writeHead(202, "Task queued but not processed", { + "Content-Type": "application/json", + }); + response.end(JSON.stringify(t)); } else { - response.writeHead(400); - response.end(); + response.writeHead(200, { + "Content-Type": "application/json", + }); + response.end(JSON.stringify(task)); } + } else if (url.searchParams.has("connection_request")) { + // No task, send connection request only + const dev = await collections.devices.findOne({ + _id: deviceId, + }); + if (!dev) { + response.writeHead(404); + response.end("No such device"); + return; + } + const status = await apiFunctions.connectionRequest(deviceId); + if (status) { + response.writeHead(504, status); + response.end(status); + return; + } + response.writeHead(200); + response.end(); + } else { + response.writeHead(400); + response.end(); + } + } else { + response.writeHead(405, { Allow: "POST" }); + response.end("405 Method Not Allowed"); + } + } else if (TASKS_REGEX.test(url.pathname)) { + const r = TASKS_REGEX.exec(url.pathname); + const taskId = decodeURIComponent(r[1]); + const action = r[2]; + if (!action || action === "/") { + if (request.method === "DELETE") { + const task = await collections.tasks.findOne( + { _id: new ObjectId(taskId) }, + { projection: { device: 1 } } + ); + + if (!task) { + response.writeHead(404); + response.end("Task not found"); + return; + } + + const deviceId = task.device; + await collections.tasks.deleteOne({ _id: new ObjectId(taskId) }); + + await collections.faults.deleteOne({ + _id: `${deviceId}:task_${taskId}`, + }); + + await cache.del(`${deviceId}_tasks_faults_operations`); + response.writeHead(200); + response.end(); + } else { + response.writeHead(405, { Allow: "PUT DELETE" }); + response.end("405 Method Not Allowed"); + } + } else if (action === "/retry") { + if (request.method === "POST") { + const task = await collections.tasks.findOne( + { _id: new ObjectId(taskId) }, + { projection: { device: 1 } } + ); + + const deviceId = task.device; + await collections.faults.deleteOne({ + _id: `${deviceId}:task_${taskId}`, + }); + + await cache.del(`${deviceId}_tasks_faults_operations`); + response.writeHead(200); + response.end(); } else { response.writeHead(405, { Allow: "POST" }); response.end("405 Method Not Allowed"); } - } else if (TASKS_REGEX.test(urlParts.pathname)) { - const r = TASKS_REGEX.exec(urlParts.pathname); - const taskId = decodeURIComponent(r[1]); - const action = r[2]; - if (!action || action === "/") { - if (request.method === "DELETE") { - collections.tasks.findOne( - { _id: new ObjectId(taskId) }, - { projection: { device: 1 } }, - (err, task) => { - if (err) return void throwError(err, response); - - if (!task) { - response.writeHead(404); - response.end("Task not found"); - return; - } - - const deviceId = task.device; - collections.tasks.deleteOne( - { _id: new ObjectId(taskId) }, - (err) => { - if (err) return void throwError(err, response); - - collections.faults.deleteOne( - { _id: `${deviceId}:task_${taskId}` }, - (err) => { - if (err) return void throwError(err, response); - - cache - .del(`${deviceId}_tasks_faults_operations`) - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - } - ); - } - ); - } - ); - } else { - response.writeHead(405, { Allow: "PUT DELETE" }); - response.end("405 Method Not Allowed"); - } - } else if (action === "/retry") { - if (request.method === "POST") { - collections.tasks.findOne( - { _id: new ObjectId(taskId) }, - { projection: { device: 1 } }, - (err, task) => { - if (err) return void throwError(err, response); - - const deviceId = task.device; - collections.faults.deleteOne( - { _id: `${deviceId}:task_${taskId}` }, - (err) => { - if (err) return void throwError(err, response); - - cache - .del(`${deviceId}_tasks_faults_operations`) - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - } - ); - } - ); - } else { - response.writeHead(405, { Allow: "POST" }); - response.end("405 Method Not Allowed"); - } - } else { - response.writeHead(404); - response.end(); + } else { + response.writeHead(404); + response.end(); + } + } else if (FILES_REGEX.test(url.pathname)) { + const filename = decodeURIComponent(FILES_REGEX.exec(url.pathname)[1]); + if (request.method === "PUT") { + const metadata = { + fileType: request.headers.filetype, + oui: request.headers.oui, + productClass: request.headers.productclass, + version: request.headers.version, + }; + try { + await filesBucket.delete(filename as unknown as ObjectId); + } catch (err) { + // Ignore error if file doesn't exist } - } else if (FILES_REGEX.test(urlParts.pathname)) { - const filename = decodeURIComponent( - FILES_REGEX.exec(urlParts.pathname)[1] - ); - if (request.method === "PUT") { - const metadata = { - fileType: request.headers.filetype, - oui: request.headers.oui, - productClass: request.headers.productclass, - version: request.headers.version, - }; - filesBucket.delete(filename as unknown as ObjectId, () => { - const uploadStream = filesBucket.openUploadStreamWithId( - filename as unknown as ObjectId, - filename, - { - metadata: metadata, - } - ); - uploadStream.on("error", (err) => { - throwError(err, response); - }); - - uploadStream.end(body, () => { - response.writeHead(201); - response.end(); - }); - }); - } else if (request.method === "DELETE") { - filesBucket.delete(filename as unknown as ObjectId, (err) => { - if (err) { - if (err.message.startsWith("FileNotFound")) { - response.writeHead(404); - response.end("404 Not Found"); - return; - } - return void throwError(err, response); + return new Promise((resolve, reject) => { + const uploadStream = filesBucket.openUploadStreamWithId( + filename as unknown as ObjectId, + filename, + { + metadata: metadata, } + ); - response.writeHead(200); + uploadStream.on("error", reject); + + uploadStream.end(body, () => { + response.writeHead(201); response.end(); + resolve(); }); - } else { - response.writeHead(405, { Allow: "PUT, DELETE" }); - response.end("405 Method Not Allowed"); + }); + } else if (request.method === "DELETE") { + try { + await filesBucket.delete(filename as unknown as ObjectId); + } catch (err) { + if (err.message.startsWith("FileNotFound")) { + response.writeHead(404); + response.end("404 Not Found"); + return; + } + throw err; } - } else if (PING_REGEX.test(urlParts.pathname)) { - const host = decodeURIComponent(PING_REGEX.exec(urlParts.pathname)[1]); + response.writeHead(200); + response.end(); + } else { + response.writeHead(405, { Allow: "PUT, DELETE" }); + response.end("405 Method Not Allowed"); + } + } else if (PING_REGEX.test(url.pathname)) { + const host = decodeURIComponent(PING_REGEX.exec(url.pathname)[1]); + return new Promise((resolve) => { ping(host, (err, res, stdout) => { if (err) { if (!res) { @@ -739,147 +561,133 @@ export function listener( "Cache-Control": "no-cache", }); response.end(stdout); + resolve(); }); - } else if (DELETE_DEVICE_REGEX.test(urlParts.pathname)) { - if (request.method !== "DELETE") { - response.writeHead(405, { Allow: "DELETE" }); - response.end("405 Method Not Allowed"); - return; - } + }); + } else if (DELETE_DEVICE_REGEX.test(url.pathname)) { + if (request.method !== "DELETE") { + response.writeHead(405, { Allow: "DELETE" }); + response.end("405 Method Not Allowed"); + return; + } - const deviceId = decodeURIComponent( - DELETE_DEVICE_REGEX.exec(urlParts.pathname)[1] - ); - apiFunctions - .deleteDevice(deviceId) - .then(() => { - response.writeHead(200); - response.end(); - }) - .catch((err) => { - setTimeout(() => { - throwError(err, response); - }); - }); - } else if (QUERY_REGEX.test(urlParts.pathname)) { - let collectionName = QUERY_REGEX.exec(urlParts.pathname)[1]; + const deviceId = decodeURIComponent( + DELETE_DEVICE_REGEX.exec(url.pathname)[1] + ); + await apiFunctions.deleteDevice(deviceId); + response.writeHead(200); + response.end(); + } else if (QUERY_REGEX.test(url.pathname)) { + let collectionName = QUERY_REGEX.exec(url.pathname)[1]; - // Convert to camel case - let i = collectionName.indexOf("_"); - while (i++ >= 0) { - const up = - i < collectionName.length ? collectionName[i].toUpperCase() : ""; - collectionName = - collectionName.slice(0, i - 1) + up + collectionName.slice(i + 1); - i = collectionName.indexOf("_", i); - } + // Convert to camel case + let i = collectionName.indexOf("_"); + while (i++ >= 0) { + const up = + i < collectionName.length ? collectionName[i].toUpperCase() : ""; + collectionName = + collectionName.slice(0, i - 1) + up + collectionName.slice(i + 1); + i = collectionName.indexOf("_", i); + } - if (request.method !== "GET" && request.method !== "HEAD") { - response.writeHead(405, { Allow: "GET, HEAD" }); - response.end("405 Method Not Allowed"); - return; - } + if (request.method !== "GET" && request.method !== "HEAD") { + response.writeHead(405, { Allow: "GET, HEAD" }); + response.end("405 Method Not Allowed"); + return; + } - const collection = collections[collectionName]; - if (!collection) { - response.writeHead(404); - response.end("404 Not Found"); - return; - } - - let q = {}; - if (urlParts.query.query) { - try { - q = JSON.parse(urlParts.query.query as string); - } catch (err) { - response.writeHead(400); - response.end(`${err.name}: ${err.message}`); - return; - } - } - - switch (collectionName) { - case "devices": - q = query.expand(q); - break; - case "tasks": - q = query.sanitizeQueryTypes(q, { - _id: (v) => new ObjectId(v as string), - timestamp: (v) => new Date(v as number), - retries: Number, - }); - break; - case "faults": - q = query.sanitizeQueryTypes(q, { - timestamp: (v) => new Date(v as number), - retries: Number, - }); - } - - let projection = null; - if (urlParts.query.projection) { - projection = {}; - for (const p of (urlParts.query.projection as string).split(",")) - projection[p.trim()] = 1; - projection = optimizeProjection(projection); - } - - const cur = collection.find(q, { projection: projection }); - - if (urlParts.query.sort) { - let s; - try { - s = JSON.parse(urlParts.query.sort as string); - } catch (err) { - response.writeHead(400); - response.end(`${err.name}: ${err.message}`); - return; - } - const sort = {}; - for (const [k, v] of Object.entries(s)) { - if (k[k.lastIndexOf(".") + 1] !== "_" && collectionName === "devices") - sort[`${k}._value`] = v; - else sort[k] = v; - } - - cur.sort(sort); - } - - collection.countDocuments(q, (err, total) => { - if (err) return void throwError(err); - - response.writeHead(200, { - "Content-Type": "application/json", - total: total, - }); - - if (request.method === "HEAD") { - response.end(); - return; - } - - if (urlParts.query.skip) - cur.skip(parseInt(urlParts.query.skip as string)); - - if (urlParts.query.limit) - cur.limit(parseInt(urlParts.query.limit as string)); - - response.write("[\n"); - i = 0; - cur.forEach( - (item) => { - if (i++) response.write(",\n"); - response.write(JSON.stringify(item)); - }, - (err) => { - if (err) return void throwError(err); - response.end("\n]"); - } - ); - }); - } else { + const collection = collections[collectionName] as Collection; + if (!collection) { response.writeHead(404); response.end("404 Not Found"); + return; } - }); + + let q = {}; + if (url.searchParams.has("query")) { + try { + q = JSON.parse(url.searchParams.get("query") as string); + } catch (err) { + response.writeHead(400); + response.end(`${err.name}: ${err.message}`); + return; + } + } + + switch (collectionName) { + case "devices": + q = query.expand(q); + break; + case "tasks": + q = query.sanitizeQueryTypes(q, { + _id: (v) => new ObjectId(v as string), + timestamp: (v) => new Date(v as number), + retries: Number, + }); + break; + case "faults": + q = query.sanitizeQueryTypes(q, { + timestamp: (v) => new Date(v as number), + retries: Number, + }); + } + + let projection = null; + if (url.searchParams.has("projection")) { + projection = {}; + for (const p of (url.searchParams.get("projection") as string).split(",")) + projection[p.trim()] = 1; + projection = optimizeProjection(projection); + } + + const cur = collection.find(q, { projection: projection }); + + if (url.searchParams.has("sort")) { + let s; + try { + s = JSON.parse(url.searchParams.get("sort") as string); + } catch (err) { + response.writeHead(400); + response.end(`${err.name}: ${err.message}`); + return; + } + const sort = {}; + for (const [k, v] of Object.entries(s)) { + if (k[k.lastIndexOf(".") + 1] !== "_" && collectionName === "devices") + sort[`${k}._value`] = v; + else sort[k] = v; + } + + cur.sort(sort); + } + + const total = await collection.countDocuments(q); + + response.writeHead(200, { + "Content-Type": "application/json", + total: total, + }); + + if (request.method === "HEAD") { + response.end(); + return; + } + + if (url.searchParams.has("skip")) + cur.skip(parseInt(url.searchParams.get("skip") as string)); + + if (url.searchParams.has("limit")) + cur.limit(parseInt(url.searchParams.get("limit") as string)); + + response.write("[\n"); + i = 0; + for await (const item of cur) { + if (i++) response.write(",\n"); + response.write(JSON.stringify(item)); + } + response.end("\n]"); + } else { + response.writeHead(404); + response.end("404 Not Found"); + } } diff --git a/lib/ui/api-functions.ts b/lib/ui/api-functions.ts index c128a34..140732b 100644 --- a/lib/ui/api-functions.ts +++ b/lib/ui/api-functions.ts @@ -145,19 +145,19 @@ export async function postTasks( }; } - const promises = []; + const promises: Promise[] = []; for (const s of statuses) { - promises.push(db.query("tasks", ["=", ["PARAM", "_id"], s._id])); + promises.push(db.count("tasks", ["=", ["PARAM", "_id"], s._id])); promises.push( - db.query("faults", ["=", ["PARAM", "_id"], `${deviceId}:task_${s._id}`]) + db.count("faults", ["=", ["PARAM", "_id"], `${deviceId}:task_${s._id}`]) ); } const res = await Promise.all(promises); for (const [i, r] of statuses.entries()) { - if (res[i * 2].length === 0) { + if (!res[i * 2]) { r.status = "done"; - } else if (res[i * 2 + 1].length === 1) { + } else if (res[i * 2 + 1]) { r.status = "fault"; r["fault"] = res[i * 2 + 1][0]; } diff --git a/lib/ui/api.ts b/lib/ui/api.ts index c21919e..bc7d8aa 100644 --- a/lib/ui/api.ts +++ b/lib/ui/api.ts @@ -221,16 +221,11 @@ for (const [resource, flags] of Object.entries(resources)) { let c = 0; ctx.body.write("[\n"); - db.query(resource, filter, options, (obj) => { + for await (const obj of db.query(resource, filter, options)) ctx.body.write((c++ ? "," : "") + JSON.stringify(obj) + "\n"); - }) - .then(() => { - ctx.body.end("]"); - logger.accessInfo(log); - }) - .catch((err) => { - ctx.body.emit("error", err); - }); + + ctx.body.end("]"); + logger.accessInfo(log); }); // CSV download @@ -289,7 +284,7 @@ for (const [resource, flags] of Object.entries(resources)) { ctx.body.write( Object.keys(columns).map((k) => `"${k.replace(/"/, '""')}"`) + "\n" ); - db.query(resource, filter, options, (obj) => { + for await (const obj of db.query(resource, filter, options)) { const arr = Object.values(columns).map((exp) => { const v = evaluate(exp, obj, null, (e) => { if (Array.isArray(e)) { @@ -331,14 +326,9 @@ for (const [resource, flags] of Object.entries(resources)) { return v; }); ctx.body.write(arr.join(",") + "\n"); - }) - .then(() => { - ctx.body.end(); - logger.accessInfo(log); - }) - .catch((err) => { - ctx.body.emit("error", err); - }); + } + ctx.body.end(); + logger.accessInfo(log); }); router.head(`/${resource}/:id`, async (ctx) => { @@ -359,9 +349,9 @@ for (const [resource, flags] of Object.entries(resources)) { return void (ctx.status = 403); } - const res = await db.query(resource, filter); + const count = await db.count(resource, filter); - if (!res.length) return void (ctx.status = 404); + if (!count) return void (ctx.status = 404); logger.accessInfo(log); ctx.body = ""; @@ -385,12 +375,12 @@ for (const [resource, flags] of Object.entries(resources)) { return void (ctx.status = 403); } - const res = await db.query(resource, filter); + const { value: res } = await db.query(resource, filter).next(); - if (!res.length) return void (ctx.status = 404); + if (!res) return void (ctx.status = 404); logger.accessInfo(log); - ctx.body = res[0]; + ctx.body = res; }); if (flags & RESOURCE_DELETE) { @@ -411,10 +401,10 @@ for (const [resource, flags] of Object.entries(resources)) { logUnauthorizedWarning(log); return void (ctx.status = 403); } - const res = await db.query(resource, filter); - if (!res.length) return void (ctx.status = 404); + const { value: res } = await db.query(resource, filter).next(); + if (!res) return void (ctx.status = 404); - const validate = authorizer.getValidator(resource, res[0]); + const validate = authorizer.getValidator(resource, res); if (!validate("delete")) { logUnauthorizedWarning(log); return void (ctx.status = 403); @@ -560,9 +550,8 @@ router.post("/devices/:id/tasks", async (ctx) => { logUnauthorizedWarning(log); return void (ctx.status = 403); } - const devices = await db.query("devices", filter); - if (!devices.length) return void (ctx.status = 404); - const device = devices[0]; + const { value: device } = await db.query("devices", filter).next(); + if (!device) return void (ctx.status = 404); const validate = authorizer.getValidator("devices", device); for (const t of ctx.request.body) { @@ -636,10 +625,10 @@ router.post("/devices/:id/tags", async (ctx) => { logUnauthorizedWarning(log); return void (ctx.status = 403); } - const res = await db.query("devices", filter); - if (!res.length) return void (ctx.status = 404); + const { value: res } = await db.query("devices", filter).next(); + if (!res) return void (ctx.status = 404); - const validate = authorizer.getValidator("devices", res[0]); + const validate = authorizer.getValidator("devices", res); if (!validate("tags", ctx.request.body)) { logUnauthorizedWarning(log); return void (ctx.status = 403); @@ -707,12 +696,12 @@ router.put("/users/:id/password", async (ctx) => { ["PARAM", RESOURCE_IDS.users], username, ]); - const res = await db.query("users", filter); - if (!res.length) return void (ctx.status = 404); + const { value: res } = await db.query("users", filter).next(); + if (!res) return void (ctx.status = 404); const newPassword = ctx.request.body.newPassword; if (ctx.state.user) { - const validate = authorizer.getValidator("users", res[0]); + const validate = authorizer.getValidator("users", res); if (!validate("password", { password: newPassword })) { logUnauthorizedWarning(log); return void (ctx.status = 403); diff --git a/lib/ui/db.ts b/lib/ui/db.ts index 13a1159..e960b6c 100644 --- a/lib/ui/db.ts +++ b/lib/ui/db.ts @@ -17,121 +17,73 @@ * along with GenieACS. If not, see . */ -import { Db, GridFSBucket, ObjectId } from "mongodb"; +import { Collection, GridFSBucket, ObjectId } from "mongodb"; import { Script } from "vm"; -import { onConnect, optimizeProjection } from "../db"; +import { collections, onConnect, optimizeProjection } from "../db"; import * as mongodbFunctions from "../mongodb-functions"; import { evaluate } from "../common/expression/util"; import { QueryOptions, Expression } from "../types"; import { Readable } from "stream"; -const RESOURCE_COLLECTION = { - files: "fs.files", -}; +let filesBucket: GridFSBucket; -let db: Db; - -onConnect(async (_db) => { - db = _db; +onConnect(async (db) => { + filesBucket = new GridFSBucket(db); }); -export function query( +export async function* query( resource: string, filter: Expression, options?: QueryOptions -): Promise; -export function query( - resource: string, - filter: Expression, - options: QueryOptions, - callback: (doc: any) => void -): Promise; -export function query( - resource: string, - filter: Expression, - options?: QueryOptions, - callback?: (doc: any) => void -): Promise { +): AsyncGenerator { options = options || {}; filter = evaluate(filter, null, Date.now()); const q = mongodbFunctions.toMongoQuery(filter, resource); - if (!q) return Promise.resolve([]); + if (!q) return; - return new Promise((resolve, reject) => { - const collection = db.collection(RESOURCE_COLLECTION[resource] || resource); - const cursor = collection.find(q); - if (options.projection) { - let projection = options.projection; - if (resource === "devices") { - projection = mongodbFunctions.processDeviceProjection( - options.projection - ); - } + const collection = collections[resource] as Collection; + const cursor = collection.find(q); + if (options.projection) { + let projection = options.projection; + if (resource === "devices") + projection = mongodbFunctions.processDeviceProjection(options.projection); - if (resource === "presets") projection.configurations = 1; - projection = optimizeProjection(projection); - cursor.project(projection); - } + if (resource === "presets") projection.configurations = 1; + projection = optimizeProjection(projection); + cursor.project(projection); + } - if (resource === "users") cursor.project({ password: 0, salt: 0 }); + if (resource === "users") cursor.project({ password: 0, salt: 0 }); - if (options.skip) cursor.skip(options.skip); - if (options.limit) cursor.limit(options.limit); + if (options.skip) cursor.skip(options.skip); + if (options.limit) cursor.limit(options.limit); - if (options.sort) { - let s = Object.entries(options.sort) - .sort((a, b) => Math.abs(b[1]) - Math.abs(a[1])) - .reduce( - (obj, [k, v]) => - Object.assign(obj, { [k]: Math.min(Math.max(v, -1), 1) }), - {} - ); - - if (resource === "devices") s = mongodbFunctions.processDeviceSort(s); - cursor.sort(s); - } - - if (!callback) { - cursor.toArray((err, docs) => { - if (err) return reject(err); - if (resource === "devices") - return resolve(docs.map((d) => mongodbFunctions.flattenDevice(d))); - else if (resource === "faults") - return resolve(docs.map((d) => mongodbFunctions.flattenFault(d))); - else if (resource === "tasks") - return resolve(docs.map((d) => mongodbFunctions.flattenTask(d))); - else if (resource === "presets") - return resolve(docs.map((d) => mongodbFunctions.flattenPreset(d))); - else if (resource === "files") - return resolve(docs.map((d) => mongodbFunctions.flattenFile(d))); - return resolve(docs); - }); - } else { - cursor.forEach( - (doc) => { - if (resource === "devices") - callback(mongodbFunctions.flattenDevice(doc)); - else if (resource === "faults") - callback(mongodbFunctions.flattenFault(doc)); - else if (resource === "tasks") - callback(mongodbFunctions.flattenTask(doc)); - else if (resource === "presets") - callback(mongodbFunctions.flattenPreset(doc)); - else if (resource === "files") - callback(mongodbFunctions.flattenFile(doc)); - else callback(doc); - }, - (err) => { - if (err) reject(err); - else resolve(); - } + if (options.sort) { + let s = Object.entries(options.sort) + .sort((a, b) => Math.abs(b[1]) - Math.abs(a[1])) + .reduce( + (obj, [k, v]) => + Object.assign(obj, { [k]: Math.min(Math.max(v, -1), 1) }), + {} ); - } - }); + + if (resource === "devices") s = mongodbFunctions.processDeviceSort(s); + cursor.sort(s); + } + + for await (let doc of cursor) { + if (resource === "devices") doc = mongodbFunctions.flattenDevice(doc); + else if (resource === "faults") doc = mongodbFunctions.flattenFault(doc); + else if (resource === "tasks") doc = mongodbFunctions.flattenTask(doc); + else if (resource === "presets") doc = mongodbFunctions.flattenPreset(doc); + else if (resource === "files") doc = mongodbFunctions.flattenFile(doc); + + yield doc; + } } export function count(resource: string, filter: Expression): Promise { - const collection = db.collection(RESOURCE_COLLECTION[resource] || resource); + const collection = collections[resource] as Collection; filter = evaluate(filter, null, Date.now()); const q = mongodbFunctions.toMongoQuery(filter, resource); if (!q) return Promise.resolve(0); @@ -150,37 +102,25 @@ export async function updateDeviceTags( if (onOff) add.push(tag); else pull.push(tag); } - - const collection = db.collection("devices"); const object = {}; if (add?.length) object["$addToSet"] = { _tags: { $each: add } }; if (pull?.length) object["$pullAll"] = { _tags: pull }; - await collection.updateOne({ _id: deviceId }, object); + await collections.devices.updateOne({ _id: deviceId }, object); } -function putResource(resource, id, object): Promise { - return new Promise((resolve, reject) => { - const collection = db.collection(RESOURCE_COLLECTION[resource] || resource); - collection.replaceOne({ _id: id }, object, { upsert: true }, (err) => { - if (err) return void reject(err); - resolve(); - }); - }); +async function putResource(resource, id, object): Promise { + const collection = collections[resource] as Collection; + await collection.replaceOne({ _id: id }, object, { upsert: true }); } -function deleteResource( +async function deleteResource( resource: string, id: string | ObjectId ): Promise { - return new Promise((resolve, reject) => { - const collection = db.collection(RESOURCE_COLLECTION[resource] || resource); - collection.deleteOne({ _id: id }, (err) => { - if (err) return void reject(err); - resolve(); - }); - }); + const collection = collections[resource] as Collection; + await collection.deleteOne({ _id: id }); } export function putPreset( @@ -267,23 +207,16 @@ export function deletePermission(id: string): Promise { return deleteResource("permissions", id); } -export function putUser( +export async function putUser( id: string, object: Record ): Promise { - return new Promise((resolve, reject) => { - const collection = db.collection("users"); - // update instead of replace to keep the password if not set by user - collection.updateOne( - { _id: id }, - { $set: object }, - { upsert: true }, - (err) => { - if (err) return void reject(err); - resolve(); - } - ); - }); + // update instead of replace to keep the password if not set by user + await collections.users.updateOne( + { _id: id }, + { $set: object }, + { upsert: true } + ); } export function deleteUser(id: string): Promise { @@ -291,8 +224,7 @@ export function deleteUser(id: string): Promise { } export function downloadFile(filename: string): Readable { - const bucket = new GridFSBucket(db); - return bucket.openDownloadStreamByName(filename); + return filesBucket.openDownloadStreamByName(filename); } export function putFile( @@ -301,8 +233,7 @@ export function putFile( contentStream: Readable ): Promise { return new Promise((resolve, reject) => { - const bucket = new GridFSBucket(db); - const uploadStream = bucket.openUploadStreamWithId( + const uploadStream = filesBucket.openUploadStreamWithId( filename as unknown as ObjectId, filename, { @@ -310,8 +241,15 @@ export function putFile( } ); + let readableEnded = false; + contentStream.on("end", () => { + readableEnded = true; + }); contentStream.on("close", () => { - if (!contentStream.readableEnded) + // In Node versions prior to 15, the stream will not emit an error if the + // connection is closed before the stream is finished. + // For Node 12.9+ we can just use stream.readableEnded + if (!readableEnded) uploadStream.destroy(new Error("Stream closed prematurely")); }); @@ -325,14 +263,8 @@ export function putFile( }); } -export function deleteFile(filename: string): Promise { - return new Promise((resolve, reject) => { - const bucket = new GridFSBucket(db); - bucket.delete(filename as any, (err) => { - if (err) return void reject(err); - resolve(); - }); - }); +export async function deleteFile(filename: string): Promise { + await filesBucket.delete(filename as any); } export function deleteFault(id: string): Promise { diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 9541d3d..3aa8d96 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -20,7 +20,7 @@ "koa-jwt": "^4.0.3", "koa-router": "^12.0.0", "koa-static": "^5.0.0", - "mongodb": "^4.9.0", + "mongodb": "^4.16.0", "parsimmon": "^1.18.1", "seedrandom": "^3.0.5" }, @@ -72,6 +72,747 @@ "node": ">=12.13.0" } }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "optional": true, + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.379.1.tgz", + "integrity": "sha512-aONC8IyC54OMcdoRCqI+Fw4VIIlonWmFdLDyZPfGoqwYpe/Vqz7DPF7s/ohqiZBSpEt2SzZeKHEpmkBPR8fpkw==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.379.1", + "@aws-sdk/credential-provider-node": "3.379.1", + "@aws-sdk/middleware-host-header": "3.379.1", + "@aws-sdk/middleware-logger": "3.378.0", + "@aws-sdk/middleware-recursion-detection": "3.378.0", + "@aws-sdk/middleware-signing": "3.379.1", + "@aws-sdk/middleware-user-agent": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@aws-sdk/util-user-agent-browser": "3.378.0", + "@aws-sdk/util-user-agent-node": "3.378.0", + "@smithy/config-resolver": "^2.0.1", + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/hash-node": "^2.0.1", + "@smithy/invalid-dependency": "^2.0.1", + "@smithy/middleware-content-length": "^2.0.1", + "@smithy/middleware-endpoint": "^2.0.1", + "@smithy/middleware-retry": "^2.0.1", + "@smithy/middleware-serde": "^2.0.1", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/smithy-client": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.1", + "@smithy/util-defaults-mode-node": "^2.0.1", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.379.1.tgz", + "integrity": "sha512-2N16TPnRcq+seNP8VY/Zq7kfnrUOrJMbVNpyDZWGe5Qglua3n8v/FzxmXFNI87MiSODq8IHtiXhggWhefCd+TA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.379.1", + "@aws-sdk/middleware-logger": "3.378.0", + "@aws-sdk/middleware-recursion-detection": "3.378.0", + "@aws-sdk/middleware-user-agent": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@aws-sdk/util-user-agent-browser": "3.378.0", + "@aws-sdk/util-user-agent-node": "3.378.0", + "@smithy/config-resolver": "^2.0.1", + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/hash-node": "^2.0.1", + "@smithy/invalid-dependency": "^2.0.1", + "@smithy/middleware-content-length": "^2.0.1", + "@smithy/middleware-endpoint": "^2.0.1", + "@smithy/middleware-retry": "^2.0.1", + "@smithy/middleware-serde": "^2.0.1", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/smithy-client": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.1", + "@smithy/util-defaults-mode-node": "^2.0.1", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.379.1.tgz", + "integrity": "sha512-B6hZ2ysPyvafCMf6gls1jHI/IUviVZ4+TURpNfUBqThg/hZ1IMxc4BLkXca6VlgzYR+bWU8GKiClS9fFH6mu0g==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.379.1", + "@aws-sdk/middleware-logger": "3.378.0", + "@aws-sdk/middleware-recursion-detection": "3.378.0", + "@aws-sdk/middleware-user-agent": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@aws-sdk/util-user-agent-browser": "3.378.0", + "@aws-sdk/util-user-agent-node": "3.378.0", + "@smithy/config-resolver": "^2.0.1", + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/hash-node": "^2.0.1", + "@smithy/invalid-dependency": "^2.0.1", + "@smithy/middleware-content-length": "^2.0.1", + "@smithy/middleware-endpoint": "^2.0.1", + "@smithy/middleware-retry": "^2.0.1", + "@smithy/middleware-serde": "^2.0.1", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/smithy-client": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.1", + "@smithy/util-defaults-mode-node": "^2.0.1", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/client-sso/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.379.1.tgz", + "integrity": "sha512-gEnKuk9bYjThvmxCgOgCn1qa+rRX8IgIRE2+xhbWhlpDanozhkDq9aMB5moX4tBNYQEmi1LtGD+JOvOoZRnToQ==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.379.1", + "@aws-sdk/middleware-host-header": "3.379.1", + "@aws-sdk/middleware-logger": "3.378.0", + "@aws-sdk/middleware-recursion-detection": "3.378.0", + "@aws-sdk/middleware-sdk-sts": "3.379.1", + "@aws-sdk/middleware-signing": "3.379.1", + "@aws-sdk/middleware-user-agent": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@aws-sdk/util-user-agent-browser": "3.378.0", + "@aws-sdk/util-user-agent-node": "3.378.0", + "@smithy/config-resolver": "^2.0.1", + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/hash-node": "^2.0.1", + "@smithy/invalid-dependency": "^2.0.1", + "@smithy/middleware-content-length": "^2.0.1", + "@smithy/middleware-endpoint": "^2.0.1", + "@smithy/middleware-retry": "^2.0.1", + "@smithy/middleware-serde": "^2.0.1", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/smithy-client": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.1", + "@smithy/util-defaults-mode-node": "^2.0.1", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.379.1.tgz", + "integrity": "sha512-29X4nxo+47TeENgCpaTeMaK66cn7Uv7Fo4HPvGoevtWljqMqlSSNwQgmvpvqkQWGNtG6Ma/7GXkPMBuoqpwC8g==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.378.0.tgz", + "integrity": "sha512-B2OVdO9kBClDwGgWTBLAQwFV8qYTYGyVujg++1FZFSFMt8ORFdZ5fNpErvJtiSjYiOOQMzyBeSNhKyYNXCiJjQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.379.1.tgz", + "integrity": "sha512-YhEsJIskzCFwIIKiMN9GSHQkgWwj/b7rq0ofhsXsCRimFtdVkmMlB9veE6vtFAuXpX/WOGWdlWek1az0V22uuw==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.378.0", + "@aws-sdk/credential-provider-process": "3.378.0", + "@aws-sdk/credential-provider-sso": "3.379.1", + "@aws-sdk/credential-provider-web-identity": "3.378.0", + "@aws-sdk/types": "3.378.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.379.1.tgz", + "integrity": "sha512-39Y4OHKn6a8lY8YJhSLLw08aZytWxfvSjM4ObIEnE6hjLl8gsL9vROKKITsh3q6iGQ1EDSWMWZL50aOh3LJUIg==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.378.0", + "@aws-sdk/credential-provider-ini": "3.379.1", + "@aws-sdk/credential-provider-process": "3.378.0", + "@aws-sdk/credential-provider-sso": "3.379.1", + "@aws-sdk/credential-provider-web-identity": "3.378.0", + "@aws-sdk/types": "3.378.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.378.0.tgz", + "integrity": "sha512-KFTIy7u+wXj3eDua4rgS0tODzMnXtXhAm1RxzCW9FL5JLBBrd82ymCj1Dp72217Sw5Do6NjCnDTTNkCHZMA77w==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.379.1.tgz", + "integrity": "sha512-PhGtu1+JbUntYP/5CSfazQhWsjUBiksEuhg9fLhYl5OAgZVjVygbgoNVUz/gM7gZJSEMsasTazkn7yZVzO/k7w==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso": "3.379.1", + "@aws-sdk/token-providers": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.378.0.tgz", + "integrity": "sha512-GWjydOszhc4xDF8xuPtBvboglXQr0gwCW1oHAvmLcOT38+Hd6qnKywnMSeoXYRPgoKfF9TkWQgW1jxplzCG0UA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.379.1.tgz", + "integrity": "sha512-srPdRQmavvWAwtrlYqo5GaIhIH0bhMl0knzxIDUf81aBfitNKACWwnbML7TpL/dWSPH2b7ciOBWneK1o1GKNLg==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.379.1", + "@aws-sdk/client-sso": "3.379.1", + "@aws-sdk/client-sts": "3.379.1", + "@aws-sdk/credential-provider-cognito-identity": "3.379.1", + "@aws-sdk/credential-provider-env": "3.378.0", + "@aws-sdk/credential-provider-ini": "3.379.1", + "@aws-sdk/credential-provider-node": "3.379.1", + "@aws-sdk/credential-provider-process": "3.378.0", + "@aws-sdk/credential-provider-sso": "3.379.1", + "@aws-sdk/credential-provider-web-identity": "3.378.0", + "@aws-sdk/types": "3.378.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.379.1.tgz", + "integrity": "sha512-LI4KpAFWNWVr2aH2vRVblr0Y8tvDz23lj8LOmbDmCrzd5M21nxuocI/8nEAQj55LiTIf9Zs+dHCdsyegnFXdrA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@smithy/protocol-http": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.378.0.tgz", + "integrity": "sha512-l1DyaDLm3KeBMNMuANI3scWh8Xvu248x+vw6Z7ExWOhGXFmQ1MW7YvASg/SdxWkhlF9HmkkTif1LdMB22x6QDA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.378.0.tgz", + "integrity": "sha512-mUMfHAz0oGNIWiTZHTVJb+I515Hqs2zx1j36Le4MMiiaMkPW1SRUF1FIwGuc1wh6E8jB5q+XfEMriDjRi4TZRA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@smithy/protocol-http": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.379.1.tgz", + "integrity": "sha512-SK3gSyT0XbLiY12+AjLFYL9YngxOXHnZF3Z33Cdd4a+AUYrVBV7JBEEGD1Nlwrcmko+3XgaKlmgUaR5s91MYvg==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.379.1.tgz", + "integrity": "sha512-kBk2ZUvR84EM4fICjr8K+Ykpf8SI1UzzPp2/UVYZ0X+4H/ZCjfSqohGRwHykMqeplne9qHSL7/rGJs1H3l3gPg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.1", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.379.1.tgz", + "integrity": "sha512-4zIGeAIuutcRieAvovs82uBNhJBHuxfxaAUqrKiw49xUBG7xeNVUl+DYPSpbALbEIy4ujfwWCBOOWVCt6dyUZg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@smithy/protocol-http": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.379.1.tgz", + "integrity": "sha512-NlYPkArJ7A/txCrjqqkje+4hsv7pSOqm+Qdx3BUIOc7PRYrBVs/XwThxUkGceSntVXoNlO8g9DFL0NY53/wb8Q==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/types": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.378.0.tgz", + "integrity": "sha512-qP0CvR/ItgktmN8YXpGQglzzR/6s0nrsQ4zIfx3HMwpsBTwuouYahcCtF1Vr82P4NFcoDA412EJahJ2pIqEd+w==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.378.0.tgz", + "integrity": "sha512-NU5C2l2xAXxpyB5nT0fIhahLPlJoJdzHWw4uC53KH9b4PrjHtgvgCN8beIsD3QxyfgeoM4A5J9Auo6WurfRnLw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.378.0.tgz", + "integrity": "sha512-FSCpagzftK1W+m7Ar6lpX7/Gr9y5P56nhFYz8U4EYQ4PkufS6czWX9YW+/FA5OYV0vlQ/SvPqMnzoHIPUNhZrQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@smithy/types": "^2.0.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.378.0.tgz", + "integrity": "sha512-IdwVJV0E96MkJeFte4dlWqvB+oiqCiZ5lOlheY3W9NynTuuX0GGYNC8Y9yIsV8Oava1+ujpJq0ww6qXdYxmO4A==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.378.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -755,6 +1496,742 @@ "node": ">=6" } }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.1.tgz", + "integrity": "sha512-0s7XjIbsTwZyUW9OwXQ8J6x1UiA1TNCh60Vaw56nHahL7kUZsLhmTlWiaxfLkFtO2Utkj8YewcpHTYpxaTzO+w==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/abort-controller/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.1.tgz", + "integrity": "sha512-l83Pm7hV+8CBQOCmBRopWDtF+CURUJol7NsuPYvimiDhkC2F8Ba9T1imSFE+pD1UIJ9jlsDPAnZfPJT5cjnuEw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.1.tgz", + "integrity": "sha512-8VxriuRINNEfVZjEFKBY75y9ZWAx73DZ5K/u+3LmB6r8WR2h3NaFxFKMlwlq0uzNdGhD1ouKBn9XWEGYHKiPLw==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.0.1", + "@smithy/property-provider": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.1.tgz", + "integrity": "sha512-/IiNB7gQM2y2ZC/GAWOWDa8+iXfhr1g9Xe5979cQEOdCWDISvrAiv18cn3OtIQUhbYOR3gm7QtCpkq1to2takQ==", + "optional": true, + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/eventstream-codec/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.0.1.tgz", + "integrity": "sha512-/SoU/ClazgcdOxgE4zA7RX8euiELwpsrKCSvulVQvu9zpmqJRyEJn8ZTWYFV17/eHOBdHTs9kqodhNhsNT+cUw==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^2.0.1", + "@smithy/querystring-builder": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.1.tgz", + "integrity": "sha512-oTKYimQdF4psX54ZonpcIE+MXjMUWFxLCNosjPkJPFQ9whRX0K/PFX/+JZGRQh3zO9RlEOEUIbhy9NO+Wha6hw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.1.tgz", + "integrity": "sha512-2q/Eb0AE662zwyMV+z+TL7deBwcHCgaZZGc0RItamBE8kak3MzCi/EZCNoFWoBfxgQ4jfR12wm8KKsSXhJzJtQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/invalid-dependency/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/is-array-buffer/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.1.tgz", + "integrity": "sha512-IZhRSk5GkVBcrKaqPXddBS2uKhaqwBgaSgbBb1OJyGsKe7SxRFbclWS0LqOR9fKUkDl+3lL8E2ffpo6EQg0igw==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.1.tgz", + "integrity": "sha512-uz/KI1MBd9WHrrkVFZO4L4Wyv24raf0oR4EsOYEeG5jPJO5U+C7MZGLcMxX8gWERDn1sycBDqmGv8fjUMLxT6w==", + "optional": true, + "dependencies": { + "@smithy/middleware-serde": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.1.tgz", + "integrity": "sha512-NKHF4i0gjSyjO6C0ZyjEpNqzGgIu7s8HOK6oT/1Jqws2Q1GynR1xV8XTUs1gKXeaNRzbzKQRewHHmfPwZjOtHA==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^2.0.1", + "@smithy/service-error-classification": "^2.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-retry": "^2.0.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.1.tgz", + "integrity": "sha512-uKxPaC6ItH9ZXdpdqNtf8sda7GcU4SPMp0tomq/5lUg9oiMa/Q7+kD35MUrpKaX3IVXVrwEtkjCU9dogZ/RAUA==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.0.tgz", + "integrity": "sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.1.tgz", + "integrity": "sha512-Zoel4CPkKRTQ2XxmozZUfqBYqjPKL53/SvTDhJHj+VBSiJy6MXRav1iDCyFPS92t40Uh+Yi+Km5Ch3hQ+c/zSA==", + "optional": true, + "dependencies": { + "@smithy/property-provider": "^2.0.1", + "@smithy/shared-ini-file-loader": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.0.1.tgz", + "integrity": "sha512-Zv3fxk3p9tsmPT2CKMsbuwbbxnq2gzLDIulxv+yI6aE+02WPYorObbbe9gh7SW3weadMODL1vTfOoJ9yFypDzg==", + "optional": true, + "dependencies": { + "@smithy/abort-controller": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/querystring-builder": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.1.tgz", + "integrity": "sha512-pmJRyY9SF6sutWIktIhe+bUdSQDxv/qZ4mYr3/u+u45riTPN7nmRxPo+e4sjWVoM0caKFjRSlj3tf5teRFy0Vg==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/protocol-http": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", + "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.1.tgz", + "integrity": "sha512-bp+93WFzx1FojVEIeFPtG0A1pKsFdCUcZvVdZdRlmNooOUrz9Mm9bneRd8hDwAQ37pxiZkCOxopSXXRQN10mYw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.1.tgz", + "integrity": "sha512-h+e7k1z+IvI2sSbUBG9Aq46JsgLl4UqIUl6aigAlRBj+P6ocNXpM6Yn1vMBw5ijtXeZbYpd1YvCxwDgdw3jhmg==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.0.tgz", + "integrity": "sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.1.tgz", + "integrity": "sha512-a463YiZrPGvM+F336rIF8pLfQsHAdCRAn/BiI/EWzg5xLoxbC7GSxIgliDDXrOu0z8gT3nhVsif85eU6jyct3A==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.1.tgz", + "integrity": "sha512-jztv5Mirca42ilxmMDjzLdXcoAmRhZskGafGL49sRo5u7swEZcToEFrq6vtX5YMbSyTVrE9Teog5EFexY5Ff2Q==", + "optional": true, + "dependencies": { + "@smithy/eventstream-codec": "^2.0.1", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/smithy-client": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.0.1.tgz", + "integrity": "sha512-LHC5m6tYpEu1iNbONfvMbwtErboyTZJfEIPoD78Ei5MVr36vZQCaCla5mvo36+q/a2NAk2//fA5Rx3I1Kf7+lQ==", + "optional": true, + "dependencies": { + "@smithy/middleware-stack": "^2.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-stream": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", + "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.1.tgz", + "integrity": "sha512-NpHVOAwddo+OyyIoujDL9zGL96piHWrTNXqltWmBvlUoWgt1HPyBuKs6oHjioyFnNZXUqveTOkEEq0U5w6Uv8A==", + "optional": true, + "dependencies": { + "@smithy/querystring-parser": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/url-parser/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-base64/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-browser/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.0.0.tgz", + "integrity": "sha512-ZV7Z/WHTMxHJe/xL/56qZwSUcl63/5aaPAGjkfynJm4poILjdD4GmFI+V+YWabh2WJIjwTKZ5PNsuvPQKt93Mg==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-node/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.1.tgz", + "integrity": "sha512-w72Qwsb+IaEYEFtYICn0Do42eFju78hTaBzzJfT107lFOPdbjWjKnFutV+6GL/nZd5HWXY7ccAKka++C3NrjHw==", + "optional": true, + "dependencies": { + "@smithy/property-provider": "^2.0.1", + "@smithy/types": "^2.0.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.1.tgz", + "integrity": "sha512-dNF45caelEBambo0SgkzQ0v76m4YM+aFKZNTtSafy7P5dVF8TbjZuR2UX1A5gJABD9XK6lzN+v/9Yfzj/EDgGg==", + "optional": true, + "dependencies": { + "@smithy/config-resolver": "^2.0.1", + "@smithy/credential-provider-imds": "^2.0.1", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/property-provider": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.0.tgz", + "integrity": "sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.0.tgz", + "integrity": "sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==", + "optional": true, + "dependencies": { + "@smithy/service-error-classification": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-retry/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.1.tgz", + "integrity": "sha512-2a0IOtwIKC46EEo7E7cxDN8u2jwOiYYJqcFKA6rd5rdXqKakHT2Gc+AqHWngr0IEHUfW92zX12wRQKwyoqZf2Q==", + "optional": true, + "dependencies": { + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + }, "node_modules/@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -1056,9 +2533,9 @@ } }, "node_modules/@types/webidl-conversions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", - "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" }, "node_modules/@types/whatwg-url": { "version": "8.2.2", @@ -1583,6 +3060,12 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true + }, "node_modules/boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -1656,9 +3139,9 @@ } }, "node_modules/bson": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", - "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", "dependencies": { "buffer": "^5.6.0" }, @@ -2616,14 +4099,6 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3164,6 +4639,28 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -4692,26 +6189,26 @@ } }, "node_modules/mongodb": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.0.tgz", - "integrity": "sha512-tJJEFJz7OQTQPZeVHZJIeSOjMRqc5eSyXTt86vSQENEErpkiG7279tM/GT5AVZ7TgXNh9HQxoa2ZkbrANz5GQw==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.16.0.tgz", + "integrity": "sha512-0EB113Fsucaq1wsY0dOhi1fmZOwFtLOtteQkiqOXGklvWMnSH3g2QS53f0KTP+/6qOkuoXE2JksubSZNmxeI+g==", "dependencies": { - "bson": "^4.7.0", - "denque": "^2.1.0", - "mongodb-connection-string-url": "^2.5.3", - "socks": "^2.7.0" + "bson": "^4.7.2", + "mongodb-connection-string-url": "^2.5.4", + "socks": "^2.7.1" }, "engines": { "node": ">=12.9.0" }, "optionalDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", "saslprep": "^1.0.3" } }, "node_modules/mongodb-connection-string-url": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz", - "integrity": "sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", "dependencies": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" @@ -7139,9 +8636,9 @@ } }, "node_modules/socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -7350,6 +8847,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, "node_modules/stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", @@ -7593,7 +9096,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "devOptional": true }, "node_modules/tsscmp": { "version": "1.0.6", @@ -7783,6 +9286,15 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -8046,6 +9558,720 @@ } }, "dependencies": { + "@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "optional": true, + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "optional": true, + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "optional": true, + "requires": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "optional": true, + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "optional": true, + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "optional": true, + "requires": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.379.1.tgz", + "integrity": "sha512-aONC8IyC54OMcdoRCqI+Fw4VIIlonWmFdLDyZPfGoqwYpe/Vqz7DPF7s/ohqiZBSpEt2SzZeKHEpmkBPR8fpkw==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.379.1", + "@aws-sdk/credential-provider-node": "3.379.1", + "@aws-sdk/middleware-host-header": "3.379.1", + "@aws-sdk/middleware-logger": "3.378.0", + "@aws-sdk/middleware-recursion-detection": "3.378.0", + "@aws-sdk/middleware-signing": "3.379.1", + "@aws-sdk/middleware-user-agent": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@aws-sdk/util-user-agent-browser": "3.378.0", + "@aws-sdk/util-user-agent-node": "3.378.0", + "@smithy/config-resolver": "^2.0.1", + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/hash-node": "^2.0.1", + "@smithy/invalid-dependency": "^2.0.1", + "@smithy/middleware-content-length": "^2.0.1", + "@smithy/middleware-endpoint": "^2.0.1", + "@smithy/middleware-retry": "^2.0.1", + "@smithy/middleware-serde": "^2.0.1", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/smithy-client": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.1", + "@smithy/util-defaults-mode-node": "^2.0.1", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/client-sso": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.379.1.tgz", + "integrity": "sha512-2N16TPnRcq+seNP8VY/Zq7kfnrUOrJMbVNpyDZWGe5Qglua3n8v/FzxmXFNI87MiSODq8IHtiXhggWhefCd+TA==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.379.1", + "@aws-sdk/middleware-logger": "3.378.0", + "@aws-sdk/middleware-recursion-detection": "3.378.0", + "@aws-sdk/middleware-user-agent": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@aws-sdk/util-user-agent-browser": "3.378.0", + "@aws-sdk/util-user-agent-node": "3.378.0", + "@smithy/config-resolver": "^2.0.1", + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/hash-node": "^2.0.1", + "@smithy/invalid-dependency": "^2.0.1", + "@smithy/middleware-content-length": "^2.0.1", + "@smithy/middleware-endpoint": "^2.0.1", + "@smithy/middleware-retry": "^2.0.1", + "@smithy/middleware-serde": "^2.0.1", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/smithy-client": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.1", + "@smithy/util-defaults-mode-node": "^2.0.1", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.379.1.tgz", + "integrity": "sha512-B6hZ2ysPyvafCMf6gls1jHI/IUviVZ4+TURpNfUBqThg/hZ1IMxc4BLkXca6VlgzYR+bWU8GKiClS9fFH6mu0g==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.379.1", + "@aws-sdk/middleware-logger": "3.378.0", + "@aws-sdk/middleware-recursion-detection": "3.378.0", + "@aws-sdk/middleware-user-agent": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@aws-sdk/util-user-agent-browser": "3.378.0", + "@aws-sdk/util-user-agent-node": "3.378.0", + "@smithy/config-resolver": "^2.0.1", + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/hash-node": "^2.0.1", + "@smithy/invalid-dependency": "^2.0.1", + "@smithy/middleware-content-length": "^2.0.1", + "@smithy/middleware-endpoint": "^2.0.1", + "@smithy/middleware-retry": "^2.0.1", + "@smithy/middleware-serde": "^2.0.1", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/smithy-client": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.1", + "@smithy/util-defaults-mode-node": "^2.0.1", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/client-sts": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.379.1.tgz", + "integrity": "sha512-gEnKuk9bYjThvmxCgOgCn1qa+rRX8IgIRE2+xhbWhlpDanozhkDq9aMB5moX4tBNYQEmi1LtGD+JOvOoZRnToQ==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.379.1", + "@aws-sdk/middleware-host-header": "3.379.1", + "@aws-sdk/middleware-logger": "3.378.0", + "@aws-sdk/middleware-recursion-detection": "3.378.0", + "@aws-sdk/middleware-sdk-sts": "3.379.1", + "@aws-sdk/middleware-signing": "3.379.1", + "@aws-sdk/middleware-user-agent": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@aws-sdk/util-user-agent-browser": "3.378.0", + "@aws-sdk/util-user-agent-node": "3.378.0", + "@smithy/config-resolver": "^2.0.1", + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/hash-node": "^2.0.1", + "@smithy/invalid-dependency": "^2.0.1", + "@smithy/middleware-content-length": "^2.0.1", + "@smithy/middleware-endpoint": "^2.0.1", + "@smithy/middleware-retry": "^2.0.1", + "@smithy/middleware-serde": "^2.0.1", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/smithy-client": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.1", + "@smithy/util-defaults-mode-node": "^2.0.1", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.379.1.tgz", + "integrity": "sha512-29X4nxo+47TeENgCpaTeMaK66cn7Uv7Fo4HPvGoevtWljqMqlSSNwQgmvpvqkQWGNtG6Ma/7GXkPMBuoqpwC8g==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.378.0.tgz", + "integrity": "sha512-B2OVdO9kBClDwGgWTBLAQwFV8qYTYGyVujg++1FZFSFMt8ORFdZ5fNpErvJtiSjYiOOQMzyBeSNhKyYNXCiJjQ==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.379.1.tgz", + "integrity": "sha512-YhEsJIskzCFwIIKiMN9GSHQkgWwj/b7rq0ofhsXsCRimFtdVkmMlB9veE6vtFAuXpX/WOGWdlWek1az0V22uuw==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.378.0", + "@aws-sdk/credential-provider-process": "3.378.0", + "@aws-sdk/credential-provider-sso": "3.379.1", + "@aws-sdk/credential-provider-web-identity": "3.378.0", + "@aws-sdk/types": "3.378.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.379.1.tgz", + "integrity": "sha512-39Y4OHKn6a8lY8YJhSLLw08aZytWxfvSjM4ObIEnE6hjLl8gsL9vROKKITsh3q6iGQ1EDSWMWZL50aOh3LJUIg==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.378.0", + "@aws-sdk/credential-provider-ini": "3.379.1", + "@aws-sdk/credential-provider-process": "3.378.0", + "@aws-sdk/credential-provider-sso": "3.379.1", + "@aws-sdk/credential-provider-web-identity": "3.378.0", + "@aws-sdk/types": "3.378.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.378.0.tgz", + "integrity": "sha512-KFTIy7u+wXj3eDua4rgS0tODzMnXtXhAm1RxzCW9FL5JLBBrd82ymCj1Dp72217Sw5Do6NjCnDTTNkCHZMA77w==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.379.1.tgz", + "integrity": "sha512-PhGtu1+JbUntYP/5CSfazQhWsjUBiksEuhg9fLhYl5OAgZVjVygbgoNVUz/gM7gZJSEMsasTazkn7yZVzO/k7w==", + "optional": true, + "requires": { + "@aws-sdk/client-sso": "3.379.1", + "@aws-sdk/token-providers": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.378.0.tgz", + "integrity": "sha512-GWjydOszhc4xDF8xuPtBvboglXQr0gwCW1oHAvmLcOT38+Hd6qnKywnMSeoXYRPgoKfF9TkWQgW1jxplzCG0UA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/credential-providers": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.379.1.tgz", + "integrity": "sha512-srPdRQmavvWAwtrlYqo5GaIhIH0bhMl0knzxIDUf81aBfitNKACWwnbML7TpL/dWSPH2b7ciOBWneK1o1GKNLg==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.379.1", + "@aws-sdk/client-sso": "3.379.1", + "@aws-sdk/client-sts": "3.379.1", + "@aws-sdk/credential-provider-cognito-identity": "3.379.1", + "@aws-sdk/credential-provider-env": "3.378.0", + "@aws-sdk/credential-provider-ini": "3.379.1", + "@aws-sdk/credential-provider-node": "3.379.1", + "@aws-sdk/credential-provider-process": "3.378.0", + "@aws-sdk/credential-provider-sso": "3.379.1", + "@aws-sdk/credential-provider-web-identity": "3.378.0", + "@aws-sdk/types": "3.378.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.379.1.tgz", + "integrity": "sha512-LI4KpAFWNWVr2aH2vRVblr0Y8tvDz23lj8LOmbDmCrzd5M21nxuocI/8nEAQj55LiTIf9Zs+dHCdsyegnFXdrA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@smithy/protocol-http": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.378.0.tgz", + "integrity": "sha512-l1DyaDLm3KeBMNMuANI3scWh8Xvu248x+vw6Z7ExWOhGXFmQ1MW7YvASg/SdxWkhlF9HmkkTif1LdMB22x6QDA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.378.0.tgz", + "integrity": "sha512-mUMfHAz0oGNIWiTZHTVJb+I515Hqs2zx1j36Le4MMiiaMkPW1SRUF1FIwGuc1wh6E8jB5q+XfEMriDjRi4TZRA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@smithy/protocol-http": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.379.1.tgz", + "integrity": "sha512-SK3gSyT0XbLiY12+AjLFYL9YngxOXHnZF3Z33Cdd4a+AUYrVBV7JBEEGD1Nlwrcmko+3XgaKlmgUaR5s91MYvg==", + "optional": true, + "requires": { + "@aws-sdk/middleware-signing": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.379.1.tgz", + "integrity": "sha512-kBk2ZUvR84EM4fICjr8K+Ykpf8SI1UzzPp2/UVYZ0X+4H/ZCjfSqohGRwHykMqeplne9qHSL7/rGJs1H3l3gPg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.1", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.379.1.tgz", + "integrity": "sha512-4zIGeAIuutcRieAvovs82uBNhJBHuxfxaAUqrKiw49xUBG7xeNVUl+DYPSpbALbEIy4ujfwWCBOOWVCt6dyUZg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@aws-sdk/util-endpoints": "3.378.0", + "@smithy/protocol-http": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/token-providers": { + "version": "3.379.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.379.1.tgz", + "integrity": "sha512-NlYPkArJ7A/txCrjqqkje+4hsv7pSOqm+Qdx3BUIOc7PRYrBVs/XwThxUkGceSntVXoNlO8g9DFL0NY53/wb8Q==", + "optional": true, + "requires": { + "@aws-sdk/client-sso-oidc": "3.379.1", + "@aws-sdk/types": "3.378.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.0", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/types": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.378.0.tgz", + "integrity": "sha512-qP0CvR/ItgktmN8YXpGQglzzR/6s0nrsQ4zIfx3HMwpsBTwuouYahcCtF1Vr82P4NFcoDA412EJahJ2pIqEd+w==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.378.0.tgz", + "integrity": "sha512-NU5C2l2xAXxpyB5nT0fIhahLPlJoJdzHWw4uC53KH9b4PrjHtgvgCN8beIsD3QxyfgeoM4A5J9Auo6WurfRnLw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.378.0.tgz", + "integrity": "sha512-FSCpagzftK1W+m7Ar6lpX7/Gr9y5P56nhFYz8U4EYQ4PkufS6czWX9YW+/FA5OYV0vlQ/SvPqMnzoHIPUNhZrQ==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@smithy/types": "^2.0.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.378.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.378.0.tgz", + "integrity": "sha512-IdwVJV0E96MkJeFte4dlWqvB+oiqCiZ5lOlheY3W9NynTuuX0GGYNC8Y9yIsV8Oava1+ujpJq0ww6qXdYxmO4A==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.378.0", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -8488,6 +10714,717 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, + "@smithy/abort-controller": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.1.tgz", + "integrity": "sha512-0s7XjIbsTwZyUW9OwXQ8J6x1UiA1TNCh60Vaw56nHahL7kUZsLhmTlWiaxfLkFtO2Utkj8YewcpHTYpxaTzO+w==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/config-resolver": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.1.tgz", + "integrity": "sha512-l83Pm7hV+8CBQOCmBRopWDtF+CURUJol7NsuPYvimiDhkC2F8Ba9T1imSFE+pD1UIJ9jlsDPAnZfPJT5cjnuEw==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/credential-provider-imds": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.1.tgz", + "integrity": "sha512-8VxriuRINNEfVZjEFKBY75y9ZWAx73DZ5K/u+3LmB6r8WR2h3NaFxFKMlwlq0uzNdGhD1ouKBn9XWEGYHKiPLw==", + "optional": true, + "requires": { + "@smithy/node-config-provider": "^2.0.1", + "@smithy/property-provider": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/eventstream-codec": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.1.tgz", + "integrity": "sha512-/IiNB7gQM2y2ZC/GAWOWDa8+iXfhr1g9Xe5979cQEOdCWDISvrAiv18cn3OtIQUhbYOR3gm7QtCpkq1to2takQ==", + "optional": true, + "requires": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/fetch-http-handler": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.0.1.tgz", + "integrity": "sha512-/SoU/ClazgcdOxgE4zA7RX8euiELwpsrKCSvulVQvu9zpmqJRyEJn8ZTWYFV17/eHOBdHTs9kqodhNhsNT+cUw==", + "optional": true, + "requires": { + "@smithy/protocol-http": "^2.0.1", + "@smithy/querystring-builder": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/hash-node": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.1.tgz", + "integrity": "sha512-oTKYimQdF4psX54ZonpcIE+MXjMUWFxLCNosjPkJPFQ9whRX0K/PFX/+JZGRQh3zO9RlEOEUIbhy9NO+Wha6hw==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/invalid-dependency": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.1.tgz", + "integrity": "sha512-2q/Eb0AE662zwyMV+z+TL7deBwcHCgaZZGc0RItamBE8kak3MzCi/EZCNoFWoBfxgQ4jfR12wm8KKsSXhJzJtQ==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/middleware-content-length": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.1.tgz", + "integrity": "sha512-IZhRSk5GkVBcrKaqPXddBS2uKhaqwBgaSgbBb1OJyGsKe7SxRFbclWS0LqOR9fKUkDl+3lL8E2ffpo6EQg0igw==", + "optional": true, + "requires": { + "@smithy/protocol-http": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/middleware-endpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.1.tgz", + "integrity": "sha512-uz/KI1MBd9WHrrkVFZO4L4Wyv24raf0oR4EsOYEeG5jPJO5U+C7MZGLcMxX8gWERDn1sycBDqmGv8fjUMLxT6w==", + "optional": true, + "requires": { + "@smithy/middleware-serde": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/url-parser": "^2.0.1", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/middleware-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.1.tgz", + "integrity": "sha512-NKHF4i0gjSyjO6C0ZyjEpNqzGgIu7s8HOK6oT/1Jqws2Q1GynR1xV8XTUs1gKXeaNRzbzKQRewHHmfPwZjOtHA==", + "optional": true, + "requires": { + "@smithy/protocol-http": "^2.0.1", + "@smithy/service-error-classification": "^2.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-retry": "^2.0.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/middleware-serde": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.1.tgz", + "integrity": "sha512-uKxPaC6ItH9ZXdpdqNtf8sda7GcU4SPMp0tomq/5lUg9oiMa/Q7+kD35MUrpKaX3IVXVrwEtkjCU9dogZ/RAUA==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/middleware-stack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.0.tgz", + "integrity": "sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/node-config-provider": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.1.tgz", + "integrity": "sha512-Zoel4CPkKRTQ2XxmozZUfqBYqjPKL53/SvTDhJHj+VBSiJy6MXRav1iDCyFPS92t40Uh+Yi+Km5Ch3hQ+c/zSA==", + "optional": true, + "requires": { + "@smithy/property-provider": "^2.0.1", + "@smithy/shared-ini-file-loader": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/node-http-handler": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.0.1.tgz", + "integrity": "sha512-Zv3fxk3p9tsmPT2CKMsbuwbbxnq2gzLDIulxv+yI6aE+02WPYorObbbe9gh7SW3weadMODL1vTfOoJ9yFypDzg==", + "optional": true, + "requires": { + "@smithy/abort-controller": "^2.0.1", + "@smithy/protocol-http": "^2.0.1", + "@smithy/querystring-builder": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/property-provider": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.1.tgz", + "integrity": "sha512-pmJRyY9SF6sutWIktIhe+bUdSQDxv/qZ4mYr3/u+u45riTPN7nmRxPo+e4sjWVoM0caKFjRSlj3tf5teRFy0Vg==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/protocol-http": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", + "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/querystring-builder": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.1.tgz", + "integrity": "sha512-bp+93WFzx1FojVEIeFPtG0A1pKsFdCUcZvVdZdRlmNooOUrz9Mm9bneRd8hDwAQ37pxiZkCOxopSXXRQN10mYw==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/querystring-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.1.tgz", + "integrity": "sha512-h+e7k1z+IvI2sSbUBG9Aq46JsgLl4UqIUl6aigAlRBj+P6ocNXpM6Yn1vMBw5ijtXeZbYpd1YvCxwDgdw3jhmg==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/service-error-classification": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.0.tgz", + "integrity": "sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==", + "optional": true + }, + "@smithy/shared-ini-file-loader": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.1.tgz", + "integrity": "sha512-a463YiZrPGvM+F336rIF8pLfQsHAdCRAn/BiI/EWzg5xLoxbC7GSxIgliDDXrOu0z8gT3nhVsif85eU6jyct3A==", + "optional": true, + "requires": { + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/signature-v4": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.1.tgz", + "integrity": "sha512-jztv5Mirca42ilxmMDjzLdXcoAmRhZskGafGL49sRo5u7swEZcToEFrq6vtX5YMbSyTVrE9Teog5EFexY5Ff2Q==", + "optional": true, + "requires": { + "@smithy/eventstream-codec": "^2.0.1", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/smithy-client": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.0.1.tgz", + "integrity": "sha512-LHC5m6tYpEu1iNbONfvMbwtErboyTZJfEIPoD78Ei5MVr36vZQCaCla5mvo36+q/a2NAk2//fA5Rx3I1Kf7+lQ==", + "optional": true, + "requires": { + "@smithy/middleware-stack": "^2.0.0", + "@smithy/types": "^2.0.2", + "@smithy/util-stream": "^2.0.1", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", + "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/url-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.1.tgz", + "integrity": "sha512-NpHVOAwddo+OyyIoujDL9zGL96piHWrTNXqltWmBvlUoWgt1HPyBuKs6oHjioyFnNZXUqveTOkEEq0U5w6Uv8A==", + "optional": true, + "requires": { + "@smithy/querystring-parser": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "optional": true, + "requires": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-body-length-node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.0.0.tgz", + "integrity": "sha512-ZV7Z/WHTMxHJe/xL/56qZwSUcl63/5aaPAGjkfynJm4poILjdD4GmFI+V+YWabh2WJIjwTKZ5PNsuvPQKt93Mg==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "optional": true, + "requires": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-defaults-mode-browser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.1.tgz", + "integrity": "sha512-w72Qwsb+IaEYEFtYICn0Do42eFju78hTaBzzJfT107lFOPdbjWjKnFutV+6GL/nZd5HWXY7ccAKka++C3NrjHw==", + "optional": true, + "requires": { + "@smithy/property-provider": "^2.0.1", + "@smithy/types": "^2.0.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-defaults-mode-node": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.1.tgz", + "integrity": "sha512-dNF45caelEBambo0SgkzQ0v76m4YM+aFKZNTtSafy7P5dVF8TbjZuR2UX1A5gJABD9XK6lzN+v/9Yfzj/EDgGg==", + "optional": true, + "requires": { + "@smithy/config-resolver": "^2.0.1", + "@smithy/credential-provider-imds": "^2.0.1", + "@smithy/node-config-provider": "^2.0.1", + "@smithy/property-provider": "^2.0.1", + "@smithy/types": "^2.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-middleware": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.0.tgz", + "integrity": "sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-retry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.0.tgz", + "integrity": "sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==", + "optional": true, + "requires": { + "@smithy/service-error-classification": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.1.tgz", + "integrity": "sha512-2a0IOtwIKC46EEo7E7cxDN8u2jwOiYYJqcFKA6rd5rdXqKakHT2Gc+AqHWngr0IEHUfW92zX12wRQKwyoqZf2Q==", + "optional": true, + "requires": { + "@smithy/fetch-http-handler": "^2.0.1", + "@smithy/node-http-handler": "^2.0.1", + "@smithy/types": "^2.0.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, + "@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "optional": true, + "requires": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "optional": true + } + } + }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -8783,9 +11720,9 @@ } }, "@types/webidl-conversions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", - "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" }, "@types/whatwg-url": { "version": "8.2.2", @@ -9131,6 +12068,12 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true + }, "boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -9179,9 +12122,9 @@ } }, "bson": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", - "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", "requires": { "buffer": "^5.6.0" } @@ -9865,11 +12808,6 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, - "denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -10276,6 +13214,15 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "optional": true, + "requires": { + "strnum": "^1.0.5" + } + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -11444,21 +14391,21 @@ } }, "mongodb": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.0.tgz", - "integrity": "sha512-tJJEFJz7OQTQPZeVHZJIeSOjMRqc5eSyXTt86vSQENEErpkiG7279tM/GT5AVZ7TgXNh9HQxoa2ZkbrANz5GQw==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.16.0.tgz", + "integrity": "sha512-0EB113Fsucaq1wsY0dOhi1fmZOwFtLOtteQkiqOXGklvWMnSH3g2QS53f0KTP+/6qOkuoXE2JksubSZNmxeI+g==", "requires": { - "bson": "^4.7.0", - "denque": "^2.1.0", - "mongodb-connection-string-url": "^2.5.3", + "@aws-sdk/credential-providers": "^3.186.0", + "bson": "^4.7.2", + "mongodb-connection-string-url": "^2.5.4", "saslprep": "^1.0.3", - "socks": "^2.7.0" + "socks": "^2.7.1" } }, "mongodb-connection-string-url": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz", - "integrity": "sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", "requires": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" @@ -13093,9 +16040,9 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "requires": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -13259,6 +16206,12 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, "stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", @@ -13430,7 +16383,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "devOptional": true }, "tsscmp": { "version": "1.0.6", @@ -13561,6 +16514,12 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", diff --git a/package.json b/package.json index a326ccb..3eff185 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "koa-jwt": "^4.0.3", "koa-router": "^12.0.0", "koa-static": "^5.0.0", - "mongodb": "^4.9.0", + "mongodb": "^4.16.0", "parsimmon": "^1.18.1", "seedrandom": "^3.0.5" },