Setup
During the setup phase, you’re going to:
- Setup a Git repository where this project will live.
 - Install all required dependencies (if you haven’t already).
 - Set up the NodeJS application that you’re going to deploy to the cloud.
 - Acquire the assets used for the application.
 
Let’s get building!
Create the Git repository
Section titled “Create the Git repository”Create a new Git project where we’re going to store the IaC for our live infrastructure.
mkdir terralith-to-terragruntcd terralith-to-terragruntgit initInstall dependencies with mise
Section titled “Install dependencies with mise”(Assuming you are using it) Use mise to download, install and pin the version of tools you’re going to use in this project.
mise use terragrunt@0.83.2mise use opentofu@1.10.3mise use aws@2.27.63mise use node@22.17.1You should now have a local mise.toml file that looks like the following with all the tools pinned that you need.
[tools]aws = "2.27.63"node = "22.17.1"opentofu = "1.10.3"terragrunt = "0.83.2"Setting up the app
Section titled “Setting up the app”Now that you have the tools installed that are going to be used for this project, you’ll want to setup the application we’re going to be managing throughout the project.
It’s not a very interesting application (it was vibe coded pretty quickly), and the details of how it works aren’t that important to the topic of this blog post. Corners were also cut when designing the application to minimize the resources you have to provision, so don’t design any of your applications based on what you see there.
Create the application directory structure
Section titled “Create the application directory structure”First, create the application directory structure:
mkdir -p app/best-catcd app/best-catNext, copy the application files into the new directory you just created.
{  "name": "best-cat",  "version": "1.0.0",  "description": "Vote for the best cat",  "main": "index.js",  "type": "module",  "scripts": {    "package": "zip -r ../../dist/best-cat.zip . -x '*.git*' 'node_modules/.cache/*'"  },  "dependencies": {    "@aws-sdk/client-s3": "^3.420.0",    "@aws-sdk/client-dynamodb": "^3.420.0",    "@aws-sdk/lib-dynamodb": "^3.420.0",    "@aws-sdk/s3-request-presigner": "^3.420.0",    "handlebars": "^4.7.8"  },  "engines": {    "node": ">=22.0.0"  }}import { S3Client, ListObjectsV2Command, GetObjectCommand } from '@aws-sdk/client-s3';import { DynamoDBClient } from '@aws-sdk/client-dynamodb';import { DynamoDBDocumentClient, GetCommand, UpdateCommand, ScanCommand } from '@aws-sdk/lib-dynamodb';import { getSignedUrl } from '@aws-sdk/s3-request-presigner';import { readFileSync } from 'fs';import { join, dirname } from 'path';import { fileURLToPath } from 'url';import Handlebars from 'handlebars';
const s3Client = new S3Client({  maxAttempts: 3,  requestHandler: {    keepAlive: true  }});const dynamoClient = new DynamoDBClient({  maxAttempts: 3,  requestHandler: {    keepAlive: true  }});const dynamodb = DynamoDBDocumentClient.from(dynamoClient);
// Get the directory path for ES modulesconst __filename = fileURLToPath(import.meta.url);const __dirname = dirname(__filename);
// Load static filesconst templateHtml = readFileSync(join(__dirname, 'template.html'), 'utf8');const stylesCss = readFileSync(join(__dirname, 'styles.css'), 'utf8');const scriptJs = readFileSync(join(__dirname, 'script.js'), 'utf8');
// Compile Handlebars templateconst template = Handlebars.compile(templateHtml);
// Server-side cache for presigned URLsconst presignedUrlCache = new Map();
// Server-side cache for S3 list responseconst s3ListCache = {  data: null,  lastUpdated: 0,  ttl: 10 * 1000 // 10 seconds};
// Cache cleanup interval (every 5 minutes)const CACHE_CLEANUP_INTERVAL = 5 * 60 * 1000;
// Initialize cache cleanupsetInterval(cleanupExpiredCache, CACHE_CLEANUP_INTERVAL);
// Function to clean up expired cache entriesfunction cleanupExpiredCache() {  const now = Date.now();
  // Clean up presigned URL cache  for (const [key, cacheEntry] of presignedUrlCache.entries()) {    if (now > cacheEntry.expiresAt) {      presignedUrlCache.delete(key);    }  }
  // Clean up S3 list cache if expired  if (s3ListCache.data && (now - s3ListCache.lastUpdated) > s3ListCache.ttl) {    s3ListCache.data = null;    s3ListCache.lastUpdated = 0;  }}
// Function to get or generate presigned URL with cachingasync function getCachedPresignedUrl(bucketName, imageKey) {  const cacheKey = `${bucketName}:${imageKey}`;  const now = Date.now();
  // Check if we have a valid cached URL  const cached = presignedUrlCache.get(cacheKey);  if (cached && now < cached.expiresAt) {    return cached.url;  }
  // Generate new presigned URL  const getObjectCommand = new GetObjectCommand({    Bucket: bucketName,    Key: imageKey  });
  const presignedUrl = await getSignedUrl(s3Client, getObjectCommand, { expiresIn: 3600 });
  // Cache the URL with expiration  presignedUrlCache.set(cacheKey, {    url: presignedUrl,    expiresAt: now + (3600 * 1000) // 1 hour from now  });
  return presignedUrl;}
// Function to get cached S3 list dataasync function getCachedS3List(bucketName) {  const now = Date.now();
  // Check if we have valid cached data  if (s3ListCache.data && (now - s3ListCache.lastUpdated) < s3ListCache.ttl) {    console.log('Using cached S3 list data');    return s3ListCache.data;  }
  // Fetch fresh data from S3  console.log('Fetching fresh S3 list data');  const listCommand = new ListObjectsV2Command({    Bucket: bucketName,    MaxKeys: 100  });  const listResponse = await s3Client.send(listCommand);
  // Cache the response if we got data  if (listResponse.Contents && listResponse.Contents.length > 0) {    s3ListCache.data = listResponse;    s3ListCache.lastUpdated = now;    console.log(`Cached S3 list with ${listResponse.Contents.length} objects`);  }
  return listResponse;}
export async function handler(event) {  const bucketName = process.env.S3_BUCKET_NAME;  const tableName = process.env.DYNAMODB_TABLE_NAME;
  try {    // Parse the request - Lambda function URLs have a different event structure    const method = event.requestContext?.http?.method || event.httpMethod;    const path = event.rawPath || event.path || '/';
    console.log('Request:', { method, path, event });
    // Serve static files    if (method === 'GET' && path === '/styles.css') {      return {        statusCode: 200,        headers: {          'Content-Type': 'text/css',          'Cache-Control': 'public, max-age=3600'        },        body: stylesCss      };    }
    if (method === 'GET' && path === '/script.js') {      return {        statusCode: 200,        headers: {          'Content-Type': 'application/javascript',          'Cache-Control': 'public, max-age=3600'        },        body: scriptJs      };    }
    // Serve images with caching headers    if (method === 'GET' && path.startsWith('/image/')) {      const imageKey = path.substring(7); // Remove '/image/' prefix
      try {        const presignedUrl = await getCachedPresignedUrl(bucketName, imageKey);
        return {          statusCode: 302, // Redirect to presigned URL          headers: {            'Location': presignedUrl,            'Cache-Control': 'public, max-age=3600, immutable'          }        };      } catch (error) {        console.error('Error generating presigned URL:', error);        return {          statusCode: 404,          headers: {            'Content-Type': 'text/html'          },          body: '<h1>Image not found</h1>'        };      }    }
    // Main page - serve HTML    if (method === 'GET' && (path === '/' || path === '')) {      // Get all images from S3 (with caching)      const listResponse = await getCachedS3List(bucketName);
      // Get all vote counts from DynamoDB      const scanCommand = new ScanCommand({        TableName: tableName      });      const votesResponse = await dynamodb.send(scanCommand);      const votesMap = {};      if (votesResponse.Items) {        votesResponse.Items.forEach(item => {          votesMap[item.image_id] = item.votes || 0;        });      }
      // Filter and prepare image data first      const imageObjects = (listResponse.Contents || []).filter(obj =>        obj.Key && obj.Key.match(/\.(jpg|jpeg|png|gif|webp)$/i)      );
      // Generate presigned URLs in parallel for better performance      const imagesWithUrls = await Promise.all(        imageObjects.map(async (obj) => {          const presignedUrl = await getCachedPresignedUrl(bucketName, obj.Key);          return {            key: obj.Key,            keyId: obj.Key.replace(/[^a-zA-Z0-9]/g, '-'),            url: presignedUrl,            votes: votesMap[obj.Key] || 0          };        })      );
      // Sort images by vote count (highest votes first)      imagesWithUrls.sort((a, b) => b.votes - a.votes);
      // Render the template with data      const html = template({        images: imagesWithUrls      });
      return {        statusCode: 200,        headers: {          'Content-Type': 'text/html',          'Cache-Control': 'public, max-age=60, s-maxage=300'        },        body: html      };    }
    // API endpoint for voting    if (method === 'POST' && path.startsWith('/vote/')) {      const parts = path.split('/');      const imageId = parts[2];      const voteType = parts[3]; // 'up' or 'down'
      const voteIncrement = voteType === 'up' ? 1 : -1;
      // Update vote count in DynamoDB      const updateCommand = new UpdateCommand({        TableName: tableName,        Key: { image_id: imageId },        UpdateExpression: 'SET votes = if_not_exists(votes, :zero) + :inc',        ExpressionAttributeValues: {          ':inc': voteIncrement,          ':zero': 0        },        ReturnValues: 'UPDATED_NEW'      });      const result = await dynamodb.send(updateCommand);
              return {          statusCode: 200,          headers: {            'Content-Type': 'application/json'          },          body: JSON.stringify({            message: 'Vote recorded successfully',            image_id: imageId,            new_vote_count: result.Attributes.votes          })        };    }
    // API endpoint to get current vote counts    if (method === 'GET' && path === '/api/votes') {      const scanCommand = new ScanCommand({        TableName: tableName      });      const votes = await dynamodb.send(scanCommand);
              return {          statusCode: 200,          headers: {            'Content-Type': 'application/json'          },          body: JSON.stringify({            votes: votes.Items || []          })        };    }
    // For any other GET request, serve the main page (helpful for debugging)    if (method === 'GET') {      console.log('Serving main page for path:', path);
      // Get all images from S3 (with caching)      const listResponse = await getCachedS3List(bucketName);
      // Get all vote counts from DynamoDB      const scanCommand = new ScanCommand({        TableName: tableName      });      const votesResponse = await dynamodb.send(scanCommand);      const votesMap = {};      if (votesResponse.Items) {        votesResponse.Items.forEach(item => {          votesMap[item.image_id] = item.votes || 0;        });      }
      // Filter and prepare image data efficiently      const imageObjects = (listResponse.Contents || []).filter(obj =>        obj.Key && obj.Key.match(/\.(jpg|jpeg|png|gif|webp)$/i)      );
      const imagesWithUrls = imageObjects.map(obj => ({        key: obj.Key,        keyId: obj.Key.replace(/[^a-zA-Z0-9]/g, '-'),        votes: votesMap[obj.Key] || 0      }));
      // Sort images by vote count (highest votes first)      imagesWithUrls.sort((a, b) => b.votes - a.votes);
      // Render the template with data      const html = template({        images: imagesWithUrls      });
      return {        statusCode: 200,        headers: {          'Content-Type': 'text/html',          'Cache-Control': 'public, max-age=60, s-maxage=300'        },        body: html      };    }
    // Default response for unknown endpoints    return {      statusCode: 404,      headers: {        'Content-Type': 'text/html'      },      body: `        <html>          <head><title>404 - Not Found</title></head>          <body>            <h1>404 - Page Not Found</h1>            <p>The requested page could not be found.</p>            <p>Method: ${method}, Path: ${path}</p>            <a href="/">Go back to the main page</a>          </body>        </html>      `    };
  } catch (error) {    console.error('Error:', error);
    return {      statusCode: 500,      headers: {        'Content-Type': 'text/html'      },      body: `        <html>          <head><title>500 - Server Error</title></head>          <body>            <h1>500 - Internal Server Error</h1>            <p>An error occurred while processing your request.</p>            <a href="/">Go back to the main page</a>          </body>        </html>      `    };  }}<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Best Cat Voting</title>    <link rel="stylesheet" href="/styles.css"></head><body>    <div class="container">        <h1>🐱 Vote for the Best Cat! 🐱</h1>
        <div class="images-grid" id="imagesGrid">            {{#if images.length}}                {{#each images}}                <div class="image-card" data-image-key="{{this.key}}">                    <div class="image-container">                        <img src="/image/{{this.key}}" alt="Cat image" loading="lazy" decoding="async">                    </div>                    <div class="voting-section">                        <div class="vote-count" id="votes-{{this.keyId}}">{{this.votes}}</div>                        <div class="vote-buttons">                            <button class="vote-btn up" onclick="vote('{{this.key}}', 'up')" title="Vote Up">⬆️</button>                            <button class="vote-btn down" onclick="vote('{{this.key}}', 'down')" title="Vote Down">⬇️</button>                        </div>
                    </div>                </div>                {{/each}}            {{else}}                <div class="no-images">No images found. Upload some cat pictures to get started!</div>            {{/if}}        </div>    </div>
    <script src="/script.js"></script></body></html>* {    margin: 0;    padding: 0;    box-sizing: border-box;}
body {    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);    min-height: 100vh;    margin: 0;    padding: 0;    display: flex;    align-items: center;    justify-content: center;}
.container {    max-width: 1200px;    width: 100%;    padding: 20px;    text-align: center;}
h1 {    text-align: center;    color: white;    margin-bottom: 40px;    font-size: 3rem;    text-shadow: 2px 2px 4px rgba(0,0,0,0.3);    font-weight: 700;    letter-spacing: 1px;}
.images-grid {    display: grid;    grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));    gap: 25px;    margin-top: 30px;    justify-items: center;}
.image-card {    background: white;    border-radius: 20px;    overflow: hidden;    box-shadow: 0 15px 35px rgba(0,0,0,0.15);    transition: all 0.3s ease;    width: 100%;    max-width: 350px;}
.image-card:hover {    transform: translateY(-8px);    box-shadow: 0 20px 50px rgba(0,0,0,0.25);}
.image-container {    position: relative;    width: 100%;    height: 250px;    overflow: hidden;}
.image-container img {    width: 100%;    height: 100%;    object-fit: cover;    transition: transform 0.3s ease;}
.image-card:hover .image-container img {    transform: scale(1.05);}
.voting-section {    padding: 20px;    text-align: center;}
.vote-count {    font-size: 1.8rem;    font-weight: bold;    color: #333;    margin-bottom: 20px;    background: linear-gradient(135deg, #667eea, #764ba2);    -webkit-background-clip: text;    -webkit-text-fill-color: transparent;    background-clip: text;}
.vote-buttons {    display: flex;    justify-content: center;    gap: 10px;}
.vote-btn {    background: none;    border: 2px solid #e0e0e0;    border-radius: 50%;    width: 55px;    height: 55px;    font-size: 1.6rem;    cursor: pointer;    transition: all 0.3s ease;    display: flex;    align-items: center;    justify-content: center;    position: relative;    overflow: hidden;}
.vote-btn:hover {    border-color: #667eea;    background: linear-gradient(135deg, #667eea, #764ba2);    color: white;    transform: scale(1.1);    box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);}
.vote-btn:active {    transform: scale(0.95);}
.vote-btn.up:hover {    border-color: #4CAF50;    background: linear-gradient(135deg, #4CAF50, #45a049);    box-shadow: 0 5px 15px rgba(76, 175, 80, 0.4);}
.vote-btn.down:hover {    border-color: #f44336;    background: linear-gradient(135deg, #f44336, #d32f2f);    box-shadow: 0 5px 15px rgba(244, 67, 54, 0.4);}
.vote-btn:disabled {    cursor: not-allowed;    opacity: 0.6;    transform: none !important;}
.vote-btn:disabled:hover {    border-color: #e0e0e0;    background: none;    box-shadow: none;    transform: none;}
.loading {    text-align: center;    color: white;    font-size: 1.2rem;    margin: 50px 0;}
.no-images {    text-align: center;    color: white;    font-size: 1.4rem;    margin: 60px auto;    line-height: 1.6;    background: rgba(255, 255, 255, 0.1);    padding: 40px;    border-radius: 15px;    backdrop-filter: blur(10px);    border: 1px solid rgba(255, 255, 255, 0.2);    max-width: 500px;    width: 100%;    grid-column: 1 / -1;    justify-self: center;}
@media (max-width: 768px) {    .images-grid {        grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));        gap: 20px;    }
    h1 {        font-size: 2.2rem;        margin-bottom: 30px;    }
    .vote-btn {        width: 50px;        height: 50px;        font-size: 1.4rem;    }
    .no-images {        font-size: 1.2rem;        padding: 30px;        margin: 40px 0;    }}// Global variable to store the base URL for API callslet baseUrl = '';
// Initialize the applicationdocument.addEventListener('DOMContentLoaded', function() {    // Set the base URL from the current location    baseUrl = window.location.origin;
    // Add click effects to vote buttons    const voteButtons = document.querySelectorAll('.vote-btn');    voteButtons.forEach(button => {        button.addEventListener('click', function() {            // Create a subtle click effect            this.style.transform = 'scale(0.9)';            setTimeout(() => {                this.style.transform = '';            }, 150);        });    });});
// Function to handle voting asynchronouslyasync function vote(imageKey, voteType) {    const voteElement = document.getElementById(`votes-${imageKey.replace(/[^a-zA-Z0-9]/g, '-')}`);    const voteButtons = document.querySelectorAll(`[data-image-key="${imageKey}"] .vote-btn`);
    if (!voteElement) return;
    // Get current vote count    const currentVotes = parseInt(voteElement.textContent) || 0;    const voteIncrement = voteType === 'up' ? 1 : -1;
    // Optimistically update the UI immediately    const newVoteCount = currentVotes + voteIncrement;    voteElement.textContent = newVoteCount;
    // Add immediate visual feedback    voteElement.style.transform = 'scale(1.2)';    voteElement.style.color = voteType === 'up' ? '#4CAF50' : '#f44336';
    // Disable vote buttons to prevent double-clicking    voteButtons.forEach(btn => {        btn.disabled = true;        btn.style.opacity = '0.6';    });
    // Send vote request asynchronously    const votePromise = fetch(`${baseUrl}/vote/${imageKey}/${voteType}`, {        method: 'POST',        headers: {            'Content-Type': 'application/json'        }    });
    try {        const response = await votePromise;
        if (response.ok) {            const result = await response.json();
            // Update with actual server response            voteElement.textContent = result.new_vote_count;
            // Success animation            voteElement.style.transform = 'scale(1.1)';            setTimeout(() => {                voteElement.style.transform = 'scale(1)';                voteElement.style.color = '';            }, 300);
        } else {            // Revert optimistic update on error            voteElement.textContent = currentVotes;            console.error('Vote failed:', response.statusText);
            // Show error feedback            voteElement.style.transform = 'scale(1.1)';            voteElement.style.color = '#f44336';            setTimeout(() => {                voteElement.style.transform = 'scale(1)';                voteElement.style.color = '';            }, 300);
            // Show user-friendly error message            showNotification('Vote failed. Please try again.', 'error');        }    } catch (error) {        // Revert optimistic update on network error        voteElement.textContent = currentVotes;        console.error('Error voting:', error);
        // Show error feedback        voteElement.style.transform = 'scale(1.1)';        voteElement.style.color = '#f44336';        setTimeout(() => {            voteElement.style.transform = 'scale(1)';            voteElement.style.color = '';        }, 300);
        // Show user-friendly error message        showNotification('Network error. Please check your connection.', 'error');    } finally {        // Re-enable vote buttons        voteButtons.forEach(btn => {            btn.disabled = false;            btn.style.opacity = '1';        });    }}
// Function to show notificationsfunction showNotification(message, type = 'info') {    // Remove existing notifications    const existingNotification = document.querySelector('.notification');    if (existingNotification) {        existingNotification.remove();    }
    // Create notification element    const notification = document.createElement('div');    notification.className = `notification notification-${type}`;    notification.textContent = message;
    // Add styles    notification.style.cssText = `        position: fixed;        top: 20px;        right: 20px;        padding: 12px 20px;        border-radius: 8px;        color: white;        font-weight: 500;        z-index: 1000;        transform: translateX(100%);        transition: transform 0.3s ease;        max-width: 300px;        word-wrap: break-word;    `;
    // Set background color based on type    if (type === 'error') {        notification.style.backgroundColor = '#f44336';    } else if (type === 'success') {        notification.style.backgroundColor = '#4CAF50';    } else {        notification.style.backgroundColor = '#2196F3';    }
    // Add to page    document.body.appendChild(notification);
    // Animate in    setTimeout(() => {        notification.style.transform = 'translateX(0)';    }, 100);
    // Auto-remove after 3 seconds    setTimeout(() => {        notification.style.transform = 'translateX(100%)';        setTimeout(() => {            if (notification.parentNode) {                notification.remove();            }        }, 300);    }, 3000);}{  "name": "best-cat",  "version": "1.0.0",  "lockfileVersion": 3,  "requires": true,  "packages": {    "": {      "name": "best-cat",      "version": "1.0.0",      "dependencies": {        "@aws-sdk/client-dynamodb": "^3.420.0",        "@aws-sdk/client-s3": "^3.420.0",        "@aws-sdk/lib-dynamodb": "^3.420.0",        "@aws-sdk/s3-request-presigner": "^3.420.0",        "handlebars": "^4.7.8"      },      "engines": {        "node": ">=22.0.0"      }    },    "node_modules/@aws-crypto/crc32": {      "version": "5.2.0",      "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz",      "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/util": "^5.2.0",        "@aws-sdk/types": "^3.222.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=16.0.0"      }    },    "node_modules/@aws-crypto/crc32c": {      "version": "5.2.0",      "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz",      "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/util": "^5.2.0",        "@aws-sdk/types": "^3.222.0",        "tslib": "^2.6.2"      }    },    "node_modules/@aws-crypto/sha1-browser": {      "version": "5.2.0",      "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz",      "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/supports-web-crypto": "^5.2.0",        "@aws-crypto/util": "^5.2.0",        "@aws-sdk/types": "^3.222.0",        "@aws-sdk/util-locate-window": "^3.0.0",        "@smithy/util-utf8": "^2.0.0",        "tslib": "^2.6.2"      }    },    "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": {      "version": "2.2.0",      "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",      "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=14.0.0"      }    },    "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": {      "version": "2.2.0",      "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",      "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/is-array-buffer": "^2.2.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=14.0.0"      }    },    "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": {      "version": "2.3.0",      "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",      "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/util-buffer-from": "^2.2.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=14.0.0"      }    },    "node_modules/@aws-crypto/sha256-browser": {      "version": "5.2.0",      "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz",      "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/sha256-js": "^5.2.0",        "@aws-crypto/supports-web-crypto": "^5.2.0",        "@aws-crypto/util": "^5.2.0",        "@aws-sdk/types": "^3.222.0",        "@aws-sdk/util-locate-window": "^3.0.0",        "@smithy/util-utf8": "^2.0.0",        "tslib": "^2.6.2"      }    },    "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": {      "version": "2.2.0",      "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",      "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=14.0.0"      }    },    "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": {      "version": "2.2.0",      "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",      "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/is-array-buffer": "^2.2.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=14.0.0"      }    },    "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": {      "version": "2.3.0",      "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",      "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/util-buffer-from": "^2.2.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=14.0.0"      }    },    "node_modules/@aws-crypto/sha256-js": {      "version": "5.2.0",      "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",      "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/util": "^5.2.0",        "@aws-sdk/types": "^3.222.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=16.0.0"      }    },    "node_modules/@aws-crypto/supports-web-crypto": {      "version": "5.2.0",      "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz",      "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      }    },    "node_modules/@aws-crypto/util": {      "version": "5.2.0",      "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",      "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "^3.222.0",        "@smithy/util-utf8": "^2.0.0",        "tslib": "^2.6.2"      }    },    "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": {      "version": "2.2.0",      "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",      "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=14.0.0"      }    },    "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {      "version": "2.2.0",      "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",      "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/is-array-buffer": "^2.2.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=14.0.0"      }    },    "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {      "version": "2.3.0",      "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",      "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/util-buffer-from": "^2.2.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=14.0.0"      }    },    "node_modules/@aws-sdk/client-dynamodb": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.857.0.tgz",      "integrity": "sha512-LnTNiaycQwUE2fpQZW7DU4hgyVOAvBTQd1pouo3V7gklUtCafTf/q7vLMEVoe0uG2YYs1HXUlHo+GT71LM+Xew==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/sha256-browser": "5.2.0",        "@aws-crypto/sha256-js": "5.2.0",        "@aws-sdk/core": "3.857.0",        "@aws-sdk/credential-provider-node": "3.857.0",        "@aws-sdk/middleware-endpoint-discovery": "3.840.0",        "@aws-sdk/middleware-host-header": "3.840.0",        "@aws-sdk/middleware-logger": "3.840.0",        "@aws-sdk/middleware-recursion-detection": "3.840.0",        "@aws-sdk/middleware-user-agent": "3.857.0",        "@aws-sdk/region-config-resolver": "3.840.0",        "@aws-sdk/types": "3.840.0",        "@aws-sdk/util-endpoints": "3.848.0",        "@aws-sdk/util-user-agent-browser": "3.840.0",        "@aws-sdk/util-user-agent-node": "3.857.0",        "@smithy/config-resolver": "^4.1.4",        "@smithy/core": "^3.7.2",        "@smithy/fetch-http-handler": "^5.1.0",        "@smithy/hash-node": "^4.0.4",        "@smithy/invalid-dependency": "^4.0.4",        "@smithy/middleware-content-length": "^4.0.4",        "@smithy/middleware-endpoint": "^4.1.17",        "@smithy/middleware-retry": "^4.1.18",        "@smithy/middleware-serde": "^4.0.8",        "@smithy/middleware-stack": "^4.0.4",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/node-http-handler": "^4.1.0",        "@smithy/protocol-http": "^5.1.2",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "@smithy/url-parser": "^4.0.4",        "@smithy/util-base64": "^4.0.0",        "@smithy/util-body-length-browser": "^4.0.0",        "@smithy/util-body-length-node": "^4.0.0",        "@smithy/util-defaults-mode-browser": "^4.0.25",        "@smithy/util-defaults-mode-node": "^4.0.25",        "@smithy/util-endpoints": "^3.0.6",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-retry": "^4.0.6",        "@smithy/util-utf8": "^4.0.0",        "@smithy/util-waiter": "^4.0.6",        "@types/uuid": "^9.0.1",        "tslib": "^2.6.2",        "uuid": "^9.0.1"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/client-dynamodb/node_modules/uuid": {      "version": "9.0.1",      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",      "funding": [        "https://github.com/sponsors/broofa",        "https://github.com/sponsors/ctavan"      ],      "license": "MIT",      "bin": {        "uuid": "dist/bin/uuid"      }    },    "node_modules/@aws-sdk/client-s3": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.857.0.tgz",      "integrity": "sha512-kdNgv0QUIDc3nBStIXa22lX7WbfFmChTDHzONa53ZPIaP2E8CkPJJeZS55VRzHE7FytF34uP+6q1jDysdSTeYA==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/sha1-browser": "5.2.0",        "@aws-crypto/sha256-browser": "5.2.0",        "@aws-crypto/sha256-js": "5.2.0",        "@aws-sdk/core": "3.857.0",        "@aws-sdk/credential-provider-node": "3.857.0",        "@aws-sdk/middleware-bucket-endpoint": "3.840.0",        "@aws-sdk/middleware-expect-continue": "3.840.0",        "@aws-sdk/middleware-flexible-checksums": "3.857.0",        "@aws-sdk/middleware-host-header": "3.840.0",        "@aws-sdk/middleware-location-constraint": "3.840.0",        "@aws-sdk/middleware-logger": "3.840.0",        "@aws-sdk/middleware-recursion-detection": "3.840.0",        "@aws-sdk/middleware-sdk-s3": "3.857.0",        "@aws-sdk/middleware-ssec": "3.840.0",        "@aws-sdk/middleware-user-agent": "3.857.0",        "@aws-sdk/region-config-resolver": "3.840.0",        "@aws-sdk/signature-v4-multi-region": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@aws-sdk/util-endpoints": "3.848.0",        "@aws-sdk/util-user-agent-browser": "3.840.0",        "@aws-sdk/util-user-agent-node": "3.857.0",        "@aws-sdk/xml-builder": "3.821.0",        "@smithy/config-resolver": "^4.1.4",        "@smithy/core": "^3.7.2",        "@smithy/eventstream-serde-browser": "^4.0.4",        "@smithy/eventstream-serde-config-resolver": "^4.1.2",        "@smithy/eventstream-serde-node": "^4.0.4",        "@smithy/fetch-http-handler": "^5.1.0",        "@smithy/hash-blob-browser": "^4.0.4",        "@smithy/hash-node": "^4.0.4",        "@smithy/hash-stream-node": "^4.0.4",        "@smithy/invalid-dependency": "^4.0.4",        "@smithy/md5-js": "^4.0.4",        "@smithy/middleware-content-length": "^4.0.4",        "@smithy/middleware-endpoint": "^4.1.17",        "@smithy/middleware-retry": "^4.1.18",        "@smithy/middleware-serde": "^4.0.8",        "@smithy/middleware-stack": "^4.0.4",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/node-http-handler": "^4.1.0",        "@smithy/protocol-http": "^5.1.2",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "@smithy/url-parser": "^4.0.4",        "@smithy/util-base64": "^4.0.0",        "@smithy/util-body-length-browser": "^4.0.0",        "@smithy/util-body-length-node": "^4.0.0",        "@smithy/util-defaults-mode-browser": "^4.0.25",        "@smithy/util-defaults-mode-node": "^4.0.25",        "@smithy/util-endpoints": "^3.0.6",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-retry": "^4.0.6",        "@smithy/util-stream": "^4.2.3",        "@smithy/util-utf8": "^4.0.0",        "@smithy/util-waiter": "^4.0.6",        "@types/uuid": "^9.0.1",        "tslib": "^2.6.2",        "uuid": "^9.0.1"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/client-s3/node_modules/uuid": {      "version": "9.0.1",      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",      "funding": [        "https://github.com/sponsors/broofa",        "https://github.com/sponsors/ctavan"      ],      "license": "MIT",      "bin": {        "uuid": "dist/bin/uuid"      }    },    "node_modules/@aws-sdk/client-sso": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.857.0.tgz",      "integrity": "sha512-0jXF4YJ3mGspNsxOU1rdk1uTtm/xadSWvgU+JQb2YCnallEDeT/Kahlyg4GOzPDj0UnnYWsD2s1Hx82O08SbiQ==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/sha256-browser": "5.2.0",        "@aws-crypto/sha256-js": "5.2.0",        "@aws-sdk/core": "3.857.0",        "@aws-sdk/middleware-host-header": "3.840.0",        "@aws-sdk/middleware-logger": "3.840.0",        "@aws-sdk/middleware-recursion-detection": "3.840.0",        "@aws-sdk/middleware-user-agent": "3.857.0",        "@aws-sdk/region-config-resolver": "3.840.0",        "@aws-sdk/types": "3.840.0",        "@aws-sdk/util-endpoints": "3.848.0",        "@aws-sdk/util-user-agent-browser": "3.840.0",        "@aws-sdk/util-user-agent-node": "3.857.0",        "@smithy/config-resolver": "^4.1.4",        "@smithy/core": "^3.7.2",        "@smithy/fetch-http-handler": "^5.1.0",        "@smithy/hash-node": "^4.0.4",        "@smithy/invalid-dependency": "^4.0.4",        "@smithy/middleware-content-length": "^4.0.4",        "@smithy/middleware-endpoint": "^4.1.17",        "@smithy/middleware-retry": "^4.1.18",        "@smithy/middleware-serde": "^4.0.8",        "@smithy/middleware-stack": "^4.0.4",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/node-http-handler": "^4.1.0",        "@smithy/protocol-http": "^5.1.2",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "@smithy/url-parser": "^4.0.4",        "@smithy/util-base64": "^4.0.0",        "@smithy/util-body-length-browser": "^4.0.0",        "@smithy/util-body-length-node": "^4.0.0",        "@smithy/util-defaults-mode-browser": "^4.0.25",        "@smithy/util-defaults-mode-node": "^4.0.25",        "@smithy/util-endpoints": "^3.0.6",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-retry": "^4.0.6",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/core": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.857.0.tgz",      "integrity": "sha512-mgtjKignFcCl19TS6vKbC3e9jtogg6S38a0HFFWjcqMCUAskM+ZROickVTKsYeAk7FoYa2++YkM0qz8J/yteVA==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@aws-sdk/xml-builder": "3.821.0",        "@smithy/core": "^3.7.2",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/property-provider": "^4.0.4",        "@smithy/protocol-http": "^5.1.2",        "@smithy/signature-v4": "^5.1.2",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "@smithy/util-base64": "^4.0.0",        "@smithy/util-body-length-browser": "^4.0.0",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-utf8": "^4.0.0",        "fast-xml-parser": "5.2.5",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/credential-provider-env": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.857.0.tgz",      "integrity": "sha512-i9NjopufQc7mrJr2lVU4DU5cLGJQ1wNEucnP6XcpCozbJfGJExU9o/VY27qU/pI8V0zK428KXuABuN70Qb+xkw==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/core": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/property-provider": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/credential-provider-http": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.857.0.tgz",      "integrity": "sha512-Ig1dwbn+vO7Fo+2uznZ6Pv0xoLIWz6ndzJygn2eR2MRi6LvZSnTZqbeovjJeoEzWO2xFdK++SyjS7aEuAMAmzw==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/core": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/fetch-http-handler": "^5.1.0",        "@smithy/node-http-handler": "^4.1.0",        "@smithy/property-provider": "^4.0.4",        "@smithy/protocol-http": "^5.1.2",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "@smithy/util-stream": "^4.2.3",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/credential-provider-ini": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.857.0.tgz",      "integrity": "sha512-w24ABs913sweDFz0aX/PGEfK1jgpV21a2E8p78ueSkQ7Fb7ELVzsv1C16ESFDDF++P4KVkxNQrjRuKw/5+T7ug==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/core": "3.857.0",        "@aws-sdk/credential-provider-env": "3.857.0",        "@aws-sdk/credential-provider-http": "3.857.0",        "@aws-sdk/credential-provider-process": "3.857.0",        "@aws-sdk/credential-provider-sso": "3.857.0",        "@aws-sdk/credential-provider-web-identity": "3.857.0",        "@aws-sdk/nested-clients": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/credential-provider-imds": "^4.0.6",        "@smithy/property-provider": "^4.0.4",        "@smithy/shared-ini-file-loader": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/credential-provider-node": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.857.0.tgz",      "integrity": "sha512-4ulf6NmbGrE1S+8eAHZQ/krvd441KdKvpT3bFoTsg+89YlGwobW+C+vy94qQBx0iKbqkILbLeFF2F/Bf/ACnmw==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/credential-provider-env": "3.857.0",        "@aws-sdk/credential-provider-http": "3.857.0",        "@aws-sdk/credential-provider-ini": "3.857.0",        "@aws-sdk/credential-provider-process": "3.857.0",        "@aws-sdk/credential-provider-sso": "3.857.0",        "@aws-sdk/credential-provider-web-identity": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/credential-provider-imds": "^4.0.6",        "@smithy/property-provider": "^4.0.4",        "@smithy/shared-ini-file-loader": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/credential-provider-process": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.857.0.tgz",      "integrity": "sha512-WLSLM4+vDyrjT+aeaiUHkAxUXUSQSXIQT8ZoS7RHo2BvTlpBOJY9nxvcmKWNCQ2hW2AhVjqBeMjVz3u3fFhoJQ==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/core": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/property-provider": "^4.0.4",        "@smithy/shared-ini-file-loader": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/credential-provider-sso": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.857.0.tgz",      "integrity": "sha512-OfbkZ//9+nC2HH+3cbjjQz4d4ODQsFml38mPvwq7FSiVrUR7hxgE7OQael4urqKVWLEqFt6/PCr+QZq0J4dJ1A==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/client-sso": "3.857.0",        "@aws-sdk/core": "3.857.0",        "@aws-sdk/token-providers": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/property-provider": "^4.0.4",        "@smithy/shared-ini-file-loader": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/credential-provider-web-identity": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.857.0.tgz",      "integrity": "sha512-aj1QbOyhu+bl+gsgIpMuvVRJa1LkgwHzyu6lzjCrPxuPO6ytHDMmii+QUyM9P5K3Xk6fT/JGposhMFB5AtI+Og==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/core": "3.857.0",        "@aws-sdk/nested-clients": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/property-provider": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/endpoint-cache": {      "version": "3.804.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.804.0.tgz",      "integrity": "sha512-TQVDkA/lV6ua75ELZaichMzlp6x7tDa1bqdy/+0ZftmODPtKXuOOEcJxmdN7Ui/YRo1gkRz2D9txYy7IlNg1Og==",      "license": "Apache-2.0",      "dependencies": {        "mnemonist": "0.38.3",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/lib-dynamodb": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.857.0.tgz",      "integrity": "sha512-5CDHFlcAmr35xKOB7QyxopaBcQeAx0lJs395GKhkvKbJTK+Sp5qg91uWmb7+wKh1zL/rDUd4uwGRlSDhJcDRfQ==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/core": "3.857.0",        "@aws-sdk/util-dynamodb": "3.857.0",        "@smithy/core": "^3.7.2",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      },      "peerDependencies": {        "@aws-sdk/client-dynamodb": "^3.857.0"      }    },    "node_modules/@aws-sdk/middleware-bucket-endpoint": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz",      "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@aws-sdk/util-arn-parser": "3.804.0",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "@smithy/util-config-provider": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-endpoint-discovery": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.840.0.tgz",      "integrity": "sha512-IJDShY5NOg9luTE8h4o2Bm+gsPnHIU0tVWCjMz8vZMLevYjKdIsatcXiu3huTOjKSnelzC9fBHfU6KKsHmjjBQ==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/endpoint-cache": "3.804.0",        "@aws-sdk/types": "3.840.0",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-expect-continue": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.840.0.tgz",      "integrity": "sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-flexible-checksums": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.857.0.tgz",      "integrity": "sha512-6iHar8RMW1JHYHlho3AQXEwvMmFSfxZHaj6d+TR/os0YrmQFBkLqpK8OBmJ750qa0S6QB22s+8kmbH4BCpeccg==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/crc32": "5.2.0",        "@aws-crypto/crc32c": "5.2.0",        "@aws-crypto/util": "5.2.0",        "@aws-sdk/core": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/is-array-buffer": "^4.0.0",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-stream": "^4.2.3",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-host-header": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz",      "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-location-constraint": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.840.0.tgz",      "integrity": "sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-logger": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz",      "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-recursion-detection": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz",      "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-sdk-s3": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.857.0.tgz",      "integrity": "sha512-qKbr6I6+4kRvI9guR1xnTX3dS37JaIM042/uLYzb65/dUfOm7oxBTDW0+7Jdu92nj5bAChYloKQGEsr7dwKxeg==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/core": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@aws-sdk/util-arn-parser": "3.804.0",        "@smithy/core": "^3.7.2",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/protocol-http": "^5.1.2",        "@smithy/signature-v4": "^5.1.2",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "@smithy/util-config-provider": "^4.0.0",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-stream": "^4.2.3",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-ssec": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.840.0.tgz",      "integrity": "sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/middleware-user-agent": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.857.0.tgz",      "integrity": "sha512-JPqTxJGwc5QyxpCpDuOi64+z+9krpkv9FidnWjPqqNwLy25Da8espksTzptPivsMzUukdObFWJsDG89/8/I6TQ==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/core": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@aws-sdk/util-endpoints": "3.848.0",        "@smithy/core": "^3.7.2",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/nested-clients": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.857.0.tgz",      "integrity": "sha512-3P1GP34hu3Yb7C8bcIqIGASMt/MT/1Lxwy37UJwCn4IrccrvYM3i8y5XX4wW8sn1J5832wB4kdb4HTYbEz6+zw==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/sha256-browser": "5.2.0",        "@aws-crypto/sha256-js": "5.2.0",        "@aws-sdk/core": "3.857.0",        "@aws-sdk/middleware-host-header": "3.840.0",        "@aws-sdk/middleware-logger": "3.840.0",        "@aws-sdk/middleware-recursion-detection": "3.840.0",        "@aws-sdk/middleware-user-agent": "3.857.0",        "@aws-sdk/region-config-resolver": "3.840.0",        "@aws-sdk/types": "3.840.0",        "@aws-sdk/util-endpoints": "3.848.0",        "@aws-sdk/util-user-agent-browser": "3.840.0",        "@aws-sdk/util-user-agent-node": "3.857.0",        "@smithy/config-resolver": "^4.1.4",        "@smithy/core": "^3.7.2",        "@smithy/fetch-http-handler": "^5.1.0",        "@smithy/hash-node": "^4.0.4",        "@smithy/invalid-dependency": "^4.0.4",        "@smithy/middleware-content-length": "^4.0.4",        "@smithy/middleware-endpoint": "^4.1.17",        "@smithy/middleware-retry": "^4.1.18",        "@smithy/middleware-serde": "^4.0.8",        "@smithy/middleware-stack": "^4.0.4",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/node-http-handler": "^4.1.0",        "@smithy/protocol-http": "^5.1.2",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "@smithy/url-parser": "^4.0.4",        "@smithy/util-base64": "^4.0.0",        "@smithy/util-body-length-browser": "^4.0.0",        "@smithy/util-body-length-node": "^4.0.0",        "@smithy/util-defaults-mode-browser": "^4.0.25",        "@smithy/util-defaults-mode-node": "^4.0.25",        "@smithy/util-endpoints": "^3.0.6",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-retry": "^4.0.6",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/region-config-resolver": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz",      "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/types": "^4.3.1",        "@smithy/util-config-provider": "^4.0.0",        "@smithy/util-middleware": "^4.0.4",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/s3-request-presigner": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.857.0.tgz",      "integrity": "sha512-ysBzl3mMH68XGArmfaIjx88fJRaeA1jBzzRoX/3VKh0I4a8gXtRqWgttTm9YS/tidfFN5qfHeQgc286VMOVFqg==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/signature-v4-multi-region": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@aws-sdk/util-format-url": "3.840.0",        "@smithy/middleware-endpoint": "^4.1.17",        "@smithy/protocol-http": "^5.1.2",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/signature-v4-multi-region": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.857.0.tgz",      "integrity": "sha512-KVpHAtRjv4oNydwXwAEf2ur4BOAWjjZiT/QtLtTKYbEbnXW1eOFZg4kWwJwHa/T/w2zfPMVf6LhZvyFwLU9XGg==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/middleware-sdk-s3": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/protocol-http": "^5.1.2",        "@smithy/signature-v4": "^5.1.2",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/token-providers": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.857.0.tgz",      "integrity": "sha512-4DBZw+QHpsnpYLXzQtDYCEP9KFFQlYAmNnrCK1bsWoKqnUgjKgwr9Re0yhtNiieHhEE4Lhu+E+IAiNwDx2ClVw==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/core": "3.857.0",        "@aws-sdk/nested-clients": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/property-provider": "^4.0.4",        "@smithy/shared-ini-file-loader": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/types": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz",      "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/util-arn-parser": {      "version": "3.804.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz",      "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/util-dynamodb": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.857.0.tgz",      "integrity": "sha512-j7JOyrHtzYqQQxCixiR6OS+hBBLLKAshPgwOjpmGEEUZhiEnT7cENYu9S/HyEfCh1WkfOUYS+3ApgJv1J65+3w==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      },      "peerDependencies": {        "@aws-sdk/client-dynamodb": "^3.857.0"      }    },    "node_modules/@aws-sdk/util-endpoints": {      "version": "3.848.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz",      "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/types": "^4.3.1",        "@smithy/url-parser": "^4.0.4",        "@smithy/util-endpoints": "^3.0.6",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/util-format-url": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.840.0.tgz",      "integrity": "sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/querystring-builder": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/util-locate-window": {      "version": "3.804.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz",      "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@aws-sdk/util-user-agent-browser": {      "version": "3.840.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz",      "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/types": "3.840.0",        "@smithy/types": "^4.3.1",        "bowser": "^2.11.0",        "tslib": "^2.6.2"      }    },    "node_modules/@aws-sdk/util-user-agent-node": {      "version": "3.857.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.857.0.tgz",      "integrity": "sha512-xWNfAnD2t5yACGW1wM3iLoy2FvRM8N/XjkjgJE1O35gBHn00evtLC9q4nkR4x7+vXdZb8cVw4Y6GmcfMckgFQg==",      "license": "Apache-2.0",      "dependencies": {        "@aws-sdk/middleware-user-agent": "3.857.0",        "@aws-sdk/types": "3.840.0",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      },      "peerDependencies": {        "aws-crt": ">=1.0.0"      },      "peerDependenciesMeta": {        "aws-crt": {          "optional": true        }      }    },    "node_modules/@aws-sdk/xml-builder": {      "version": "3.821.0",      "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz",      "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/abort-controller": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz",      "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/chunked-blob-reader": {      "version": "5.0.0",      "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz",      "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/chunked-blob-reader-native": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz",      "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/util-base64": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/config-resolver": {      "version": "4.1.4",      "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz",      "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/node-config-provider": "^4.1.3",        "@smithy/types": "^4.3.1",        "@smithy/util-config-provider": "^4.0.0",        "@smithy/util-middleware": "^4.0.4",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/core": {      "version": "3.7.2",      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz",      "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/middleware-serde": "^4.0.8",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "@smithy/util-base64": "^4.0.0",        "@smithy/util-body-length-browser": "^4.0.0",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-stream": "^4.2.3",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/credential-provider-imds": {      "version": "4.0.6",      "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz",      "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/node-config-provider": "^4.1.3",        "@smithy/property-provider": "^4.0.4",        "@smithy/types": "^4.3.1",        "@smithy/url-parser": "^4.0.4",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/eventstream-codec": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.4.tgz",      "integrity": "sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==",      "license": "Apache-2.0",      "dependencies": {        "@aws-crypto/crc32": "5.2.0",        "@smithy/types": "^4.3.1",        "@smithy/util-hex-encoding": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/eventstream-serde-browser": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.4.tgz",      "integrity": "sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/eventstream-serde-universal": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/eventstream-serde-config-resolver": {      "version": "4.1.2",      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.2.tgz",      "integrity": "sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/eventstream-serde-node": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.4.tgz",      "integrity": "sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/eventstream-serde-universal": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/eventstream-serde-universal": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.4.tgz",      "integrity": "sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/eventstream-codec": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/fetch-http-handler": {      "version": "5.1.0",      "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz",      "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/protocol-http": "^5.1.2",        "@smithy/querystring-builder": "^4.0.4",        "@smithy/types": "^4.3.1",        "@smithy/util-base64": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/hash-blob-browser": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz",      "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/chunked-blob-reader": "^5.0.0",        "@smithy/chunked-blob-reader-native": "^4.0.0",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/hash-node": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz",      "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "@smithy/util-buffer-from": "^4.0.0",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/hash-stream-node": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz",      "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/invalid-dependency": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz",      "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/is-array-buffer": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz",      "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/md5-js": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz",      "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/middleware-content-length": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz",      "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/middleware-endpoint": {      "version": "4.1.17",      "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz",      "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/core": "^3.7.2",        "@smithy/middleware-serde": "^4.0.8",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/shared-ini-file-loader": "^4.0.4",        "@smithy/types": "^4.3.1",        "@smithy/url-parser": "^4.0.4",        "@smithy/util-middleware": "^4.0.4",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/middleware-retry": {      "version": "4.1.18",      "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz",      "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/node-config-provider": "^4.1.3",        "@smithy/protocol-http": "^5.1.2",        "@smithy/service-error-classification": "^4.0.6",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-retry": "^4.0.6",        "tslib": "^2.6.2",        "uuid": "^9.0.1"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/middleware-retry/node_modules/uuid": {      "version": "9.0.1",      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",      "funding": [        "https://github.com/sponsors/broofa",        "https://github.com/sponsors/ctavan"      ],      "license": "MIT",      "bin": {        "uuid": "dist/bin/uuid"      }    },    "node_modules/@smithy/middleware-serde": {      "version": "4.0.8",      "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz",      "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/middleware-stack": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz",      "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/node-config-provider": {      "version": "4.1.3",      "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz",      "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/property-provider": "^4.0.4",        "@smithy/shared-ini-file-loader": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/node-http-handler": {      "version": "4.1.0",      "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz",      "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/abort-controller": "^4.0.4",        "@smithy/protocol-http": "^5.1.2",        "@smithy/querystring-builder": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/property-provider": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz",      "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/protocol-http": {      "version": "5.1.2",      "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz",      "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/querystring-builder": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz",      "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "@smithy/util-uri-escape": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/querystring-parser": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz",      "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/service-error-classification": {      "version": "4.0.6",      "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz",      "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/shared-ini-file-loader": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz",      "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/signature-v4": {      "version": "5.1.2",      "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz",      "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/is-array-buffer": "^4.0.0",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "@smithy/util-hex-encoding": "^4.0.0",        "@smithy/util-middleware": "^4.0.4",        "@smithy/util-uri-escape": "^4.0.0",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/smithy-client": {      "version": "4.4.9",      "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz",      "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/core": "^3.7.2",        "@smithy/middleware-endpoint": "^4.1.17",        "@smithy/middleware-stack": "^4.0.4",        "@smithy/protocol-http": "^5.1.2",        "@smithy/types": "^4.3.1",        "@smithy/util-stream": "^4.2.3",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/types": {      "version": "4.3.1",      "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz",      "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/url-parser": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz",      "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/querystring-parser": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-base64": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz",      "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/util-buffer-from": "^4.0.0",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-body-length-browser": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz",      "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-body-length-node": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz",      "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-buffer-from": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz",      "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/is-array-buffer": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-config-provider": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz",      "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-defaults-mode-browser": {      "version": "4.0.25",      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz",      "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/property-provider": "^4.0.4",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "bowser": "^2.11.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-defaults-mode-node": {      "version": "4.0.25",      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz",      "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/config-resolver": "^4.1.4",        "@smithy/credential-provider-imds": "^4.0.6",        "@smithy/node-config-provider": "^4.1.3",        "@smithy/property-provider": "^4.0.4",        "@smithy/smithy-client": "^4.4.9",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-endpoints": {      "version": "3.0.6",      "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz",      "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/node-config-provider": "^4.1.3",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-hex-encoding": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz",      "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-middleware": {      "version": "4.0.4",      "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz",      "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-retry": {      "version": "4.0.6",      "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz",      "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/service-error-classification": "^4.0.6",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-stream": {      "version": "4.2.3",      "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz",      "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/fetch-http-handler": "^5.1.0",        "@smithy/node-http-handler": "^4.1.0",        "@smithy/types": "^4.3.1",        "@smithy/util-base64": "^4.0.0",        "@smithy/util-buffer-from": "^4.0.0",        "@smithy/util-hex-encoding": "^4.0.0",        "@smithy/util-utf8": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-uri-escape": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz",      "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==",      "license": "Apache-2.0",      "dependencies": {        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-utf8": {      "version": "4.0.0",      "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz",      "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/util-buffer-from": "^4.0.0",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@smithy/util-waiter": {      "version": "4.0.6",      "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz",      "integrity": "sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==",      "license": "Apache-2.0",      "dependencies": {        "@smithy/abort-controller": "^4.0.4",        "@smithy/types": "^4.3.1",        "tslib": "^2.6.2"      },      "engines": {        "node": ">=18.0.0"      }    },    "node_modules/@types/uuid": {      "version": "9.0.8",      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",      "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",      "license": "MIT"    },    "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==",      "license": "MIT"    },    "node_modules/fast-xml-parser": {      "version": "5.2.5",      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz",      "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==",      "funding": [        {          "type": "github",          "url": "https://github.com/sponsors/NaturalIntelligence"        }      ],      "license": "MIT",      "dependencies": {        "strnum": "^2.1.0"      },      "bin": {        "fxparser": "src/cli/cli.js"      }    },    "node_modules/handlebars": {      "version": "4.7.8",      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",      "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",      "license": "MIT",      "dependencies": {        "minimist": "^1.2.5",        "neo-async": "^2.6.2",        "source-map": "^0.6.1",        "wordwrap": "^1.0.0"      },      "bin": {        "handlebars": "bin/handlebars"      },      "engines": {        "node": ">=0.4.7"      },      "optionalDependencies": {        "uglify-js": "^3.1.4"      }    },    "node_modules/minimist": {      "version": "1.2.8",      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",      "license": "MIT",      "funding": {        "url": "https://github.com/sponsors/ljharb"      }    },    "node_modules/mnemonist": {      "version": "0.38.3",      "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz",      "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==",      "license": "MIT",      "dependencies": {        "obliterator": "^1.6.1"      }    },    "node_modules/neo-async": {      "version": "2.6.2",      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",      "license": "MIT"    },    "node_modules/obliterator": {      "version": "1.6.1",      "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz",      "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==",      "license": "MIT"    },    "node_modules/source-map": {      "version": "0.6.1",      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",      "license": "BSD-3-Clause",      "engines": {        "node": ">=0.10.0"      }    },    "node_modules/strnum": {      "version": "2.1.1",      "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz",      "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==",      "funding": [        {          "type": "github",          "url": "https://github.com/sponsors/NaturalIntelligence"        }      ],      "license": "MIT"    },    "node_modules/tslib": {      "version": "2.8.1",      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",      "license": "0BSD"    },    "node_modules/uglify-js": {      "version": "3.19.3",      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",      "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",      "license": "BSD-2-Clause",      "optional": true,      "bin": {        "uglifyjs": "bin/uglifyjs"      },      "engines": {        "node": ">=0.8.0"      }    },    "node_modules/wordwrap": {      "version": "1.0.0",      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",      "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",      "license": "MIT"    }  }}You should end up with an app/best-cat directory that looks like this:
Directoryapp
Directorybest-cat
- index.js
 - package-lock.json
 - package.json
 - script.js
 - styles.css
 - template.html
 
Packaging the app
Section titled “Packaging the app”Once you have the app stored in app/best-cat, you’ll want to create the dist directory, then package the application for delivery to a lambda function.
mkdir distcd app/best-catnpm inpm run packageI also recommend adding the following .gitignore file to your dist directory so you don’t accidentally commit any other content in this directory to your repository:
*!.gitignoreGenerating assets
Section titled “Generating assets”You’ll also want some assets to use in this project to make it more fun. I generated a bunch of cat pictures using Gemini, but feel free to use stock photos or something else to generate the assets.
I would recommend that you place the images in the same location I did (dist/static), so that the convenience scripts I wrote work out of the box without modification.
This is what my dist directory looks like after following these steps:
Directorydist
- best-cat.zip
 Directorystatic
- 01-cat.png
 - 02-cat.png
 - 03-cat.png
 - 04-cat.png
 - 05-cat.png
 - 06-cat.png
 - 07-cat.png
 - 08-cat.png
 - 09-cat.png
 - 10-cat.png
 
Our end goal is to host a site that looks like this in AWS using these artifacts:
