diff --git a/entropy/AleaArt/PYTHON_BACKEND_README.md b/entropy/AleaArt/PYTHON_BACKEND_README.md new file mode 100644 index 0000000..0e027a1 --- /dev/null +++ b/entropy/AleaArt/PYTHON_BACKEND_README.md @@ -0,0 +1,250 @@ +# ๐ŸŽจ AleaArt Python Backend Integration + +This document explains how to set up and use the Python backend for AI image generation using the art parameters from the blockchain. + +## ๐Ÿš€ Quick Start + +### 1. Start the Python Backend + +```bash +# From the main project directory +./start_python_backend.sh +``` + +This script will: +- Create a Python virtual environment +- Install all required dependencies +- Start the Flask server on `http://localhost:8000` + +### 2. Start the Next.js Frontend + +```bash +# From the frontend-aleart directory +cd frontend-aleart +npm run dev +``` + +## ๐Ÿ”ง How It Works + +### Parameter Mapping + +The art parameters from the blockchain are mapped to Stable Diffusion parameters as follows: + +| Blockchain Parameter | Stable Diffusion Parameter | Description | +|---------------------|---------------------------|-------------| +| `promptIndex` (0-11) | `prompt` | Selects from 12 predefined prompt templates | +| `styleIndex` (0-9) | `style_modifier` | Selects from 10 style modifiers | +| `samplerIndex` (0-5) | `scheduler` | Selects from 6 different samplers | +| `aspectIndex` (0-4) | `width/height` | Selects from 5 aspect ratios | +| `steps` (18-64) | `num_inference_steps` | Number of denoising steps | +| `cfg` (70-180) | `guidance_scale` | How closely to follow the prompt (7.0-18.0) | +| `latentSeed` | `generator.seed` | Random seed for reproducible generation | +| `paletteId` (0-23) | `color_palette` | Future: Color palette selection | + +### Prompt Templates + +The system includes 12 diverse prompt templates: + +1. **Retrofuturism** - "retrofuturism bodywear, primitive, vintage, intricate detail..." +2. **Cyberpunk** - "cyberpunk cityscape, neon lights, futuristic architecture..." +3. **Fantasy** - "fantasy landscape, magical forest, ethereal lighting..." +4. **Steampunk** - "steampunk machinery, brass and copper, Victorian era..." +5. **Space** - "space exploration, cosmic landscapes, nebula..." +6. **Underwater** - "underwater world, marine life, bioluminescent..." +7. **Medieval** - "medieval fantasy, castle, dragons, magical atmosphere..." +8. **Post-Apocalyptic** - "post-apocalyptic wasteland, ruins, desolate landscape..." +9. **Alien** - "alien planet, exotic flora and fauna, otherworldly..." +10. **Ancient** - "ancient civilization, pyramids, desert, mystical atmosphere..." +11. **Arctic** - "arctic wilderness, aurora borealis, ice formations..." +12. **Tropical** - "tropical paradise, lush vegetation, crystal clear water..." + +### Style Modifiers + +10 different artistic styles: + +1. **Ultra Realistic** - "max detail, 8k, ultra realistic" +2. **Painterly** - "artistic, painterly, brush strokes" +3. **Minimalist** - "minimalist, clean, simple" +4. **Baroque** - "baroque, ornate, decorative" +5. **Impressionist** - "impressionist, soft, dreamy" +6. **Expressionist** - "expressionist, bold, dramatic" +7. **Surreal** - "surreal, abstract, dreamlike" +8. **Photorealistic** - "photorealistic, detailed, sharp" +9. **Watercolor** - "watercolor, soft, flowing" +10. **Oil Painting** - "oil painting, rich, textured" + +### Aspect Ratios + +5 different aspect ratios: + +1. **Square** - 512x512 (1:1) +2. **Landscape** - 1024x576 (16:9) +3. **Portrait** - 768x1024 (9:16) +4. **Wide** - 1024x448 (21:9) +5. **Tall** - 512x683 (3:4) + +### Samplers + +6 different sampling methods: + +1. **DPM++ 2M Karras** - Fast, high quality +2. **DPM++ SDE Karras** - Good balance +3. **Euler a** - Fast, good quality +4. **DPM++ 2M** - High quality +5. **DPM++ SDE** - Balanced +6. **LMS** - Stable, slower + +## ๐ŸŽฏ API Endpoints + +### POST /generate-image + +Generates an image using art parameters from the blockchain. + +**Request Body:** +```json +{ + "parameters": { + "promptIndex": 0, + "styleIndex": 0, + "samplerIndex": 0, + "aspectIndex": 0, + "steps": 20, + "cfg": 75, + "latentSeed": 12345, + "paletteId": 5 + }, + "tokenId": "1" +} +``` + +**Response:** +```json +{ + "success": true, + "imageUrl": "/generated_images/art_token_1_abc123.png", + "imageBase64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...", + "tokenId": "1", + "prompt": "retrofuturism bodywear, primitive, vintage, intricate detail, digital art, digital painting, concept art, poster, award winning, max detail, 8k, ultra realistic, square, 1:1 | max detail | 8k", + "parameters": { + "steps": 20, + "cfg_scale": 7.5, + "seed": 12345, + "sampler": "DPM++ 2M Karras", + "width": 512, + "height": 512 + } +} +``` + +### GET /health + +Health check endpoint. + +**Response:** +```json +{ + "status": "healthy", + "model_loaded": true, + "cuda_available": true +} +``` + +### GET /generated_images/ + +Serves generated images. + +## ๐Ÿ–ฅ๏ธ System Requirements + +### Hardware Requirements + +**Minimum:** +- 8GB RAM +- 4GB VRAM (GPU) or 16GB RAM (CPU only) +- 10GB free disk space + +**Recommended:** +- 16GB RAM +- 8GB+ VRAM (RTX 3070 or better) +- 20GB free disk space + +### Software Requirements + +- Python 3.8+ +- CUDA 11.8+ (for GPU acceleration) +- pip3 + +## ๐Ÿ”ง Installation Details + +The startup script automatically installs: + +- **torch** - PyTorch for deep learning +- **diffusers** - Hugging Face Diffusers library +- **transformers** - Hugging Face Transformers +- **scipy** - Scientific computing +- **flask** - Web framework +- **flask-cors** - CORS support +- **pillow** - Image processing +- **accelerate** - Training acceleration +- **xformers** - Memory efficient attention + +## ๐ŸŽจ Usage in Frontend + +### Dashboard Integration + +1. **Load Parameters**: Click "Load Parameters" on any art token +2. **Generate Image**: Click "๐ŸŽจ Generate Image" button +3. **View Result**: Generated image appears below the parameters + +### Latest Parameters Integration + +1. **Fetch Latest**: Click "Get Latest Art Parameters" +2. **Generate Image**: Click "๐ŸŽจ Generate Image" button +3. **View Result**: Generated image appears below the parameters + +## ๐Ÿ› Troubleshooting + +### Common Issues + +1. **"Python backend failed to generate image"** + - Check if Python backend is running on port 8000 + - Verify GPU/CPU resources are available + - Check Python backend logs + +2. **"Model loading failed"** + - Ensure sufficient disk space (10GB+) + - Check internet connection for model download + - Verify CUDA installation (if using GPU) + +3. **"Out of memory"** + - Reduce image resolution + - Use CPU instead of GPU + - Close other applications + +### Performance Tips + +1. **GPU Acceleration**: Ensure CUDA is properly installed +2. **Memory Management**: Enable attention slicing (automatic) +3. **Batch Processing**: Generate multiple images in sequence +4. **Model Caching**: Model stays loaded between requests + +## ๐Ÿ”ฎ Future Enhancements + +1. **Color Palette Integration**: Use `paletteId` for color schemes +2. **Batch Generation**: Generate multiple variations +3. **Image Upscaling**: Add upscaling options +4. **Style Transfer**: Apply additional style modifications +5. **Animation**: Generate video sequences +6. **Custom Models**: Support for user-uploaded models + +## ๐Ÿ“ Example Workflow + +1. User generates art parameters on blockchain +2. Parameters are fetched and displayed in frontend +3. User clicks "Generate Image" +4. Frontend sends parameters to Python backend +5. Python backend maps parameters to Stable Diffusion +6. Image is generated using the specified model +7. Image is returned as base64 and displayed +8. Image is also saved to disk for future access + +This creates a complete pipeline from blockchain randomness to AI-generated art! diff --git a/entropy/AleaArt/README.md b/entropy/AleaArt/README.md new file mode 100644 index 0000000..2a84dd0 --- /dev/null +++ b/entropy/AleaArt/README.md @@ -0,0 +1,186 @@ +# AleaArt - Blockchain-Powered Generative Art Platform + +AleaArt is a decentralized platform that generates unique art parameters using on-chain randomness from Pyth Entropy, creates AI-generated images using Stable Diffusion, and enables NFT minting and trading. Each art piece is truly unique, verifiable on the blockchain, and tradeable as NFTs. + +## ๐ŸŽจ Key Features + +- **On-Chain Randomness**: Uses Pyth Entropy V2 for verifiable, tamper-proof randomness +- **Generative Art Parameters**: Converts randomness into detailed art generation parameters +- **AI Image Generation**: Creates stunning images using Stable Diffusion models +- **NFT Minting**: Convert generated art into tradeable NFTs on Arbitrum Sepolia +- **Decentralized Marketplace**: Buy and sell NFTs directly peer-to-peer +- **Spotlight Feature**: Randomly select and feature NFT holders using Pyth Entropy +- **IPFS Storage**: Images stored on decentralized IPFS network via Pinata +- **User Authentication**: Secure login/signup with NextAuth.js +- **Wallet Integration**: MetaMask connection for blockchain interactions +- **Image Gallery**: Personal gallery to view and manage generated artwork +- **Real-time Generation**: Asynchronous image generation with status tracking + +## ๐Ÿ”— Smart Contracts + +### EntropyArtParamsV2 Contract +**Address**: `0x420D121aE08007Ef0A66E67D5D7BfFdC98AbECF0` +**Network**: Arbitrum Sepolia +**Location**: `contracts/EntropyArtParamsV2.sol` + +The core contract that leverages **Pyth Entropy V2** to generate deterministic art parameters: + +- **Randomness Request**: Requests verifiable randomness from Pyth's decentralized network +- **Parameter Generation**: Converts randomness into art parameters: + - Prompt templates (12 different styles) + - Style modifiers (10 artistic styles) + - Technical parameters (steps, CFG scale, aspect ratio) + - Unique seeds for reproducibility +- **On-Chain Storage**: Stores parameters permanently for verification +- **Event Emission**: Emits events for frontend integration + +### AleaArtNFT Contract +**Address**: `0x806019F8a33A01a4A3fea93320601cC77B6Dcb79` +**Network**: Arbitrum Sepolia +**Location**: `contracts/AleaArtNFT.sol` + +The NFT marketplace contract enabling art trading: + +- **NFT Minting**: Convert generated art into ERC721 NFTs +- **IPFS Integration**: Links NFTs to images stored on IPFS +- **Marketplace Functions**: Buy, sell, and trade NFTs +- **Price Management**: Set and update NFT prices +- **Ownership Tracking**: Tracks both creator and current owner +- **Direct Payments**: 100% of sale proceeds go to seller (no platform fees) +- **Sale Status**: Enable/disable NFTs for sale + +### SpotlightSelector Contract +**Address**: `0xd596C7C17331013C85c791092247e33267d9291e` +**Network**: Arbitrum Sepolia +**Location**: `contracts/SpotlightSelector.sol` + +The spotlight feature contract for random NFT selection: + +- **Random Selection**: Uses Pyth Entropy to randomly select NFT holders +- **Spotlight Duration**: Features selected NFT for 24 hours (configurable) +- **Fee System**: Requires 0.001 ETH fee to request new spotlight +- **Automatic Expiry**: Spotlight automatically expires after duration +- **Fair Selection**: Truly random selection from all available NFTs +- **Event Tracking**: Emits events for spotlight requests and selections + +### Contract Functions Overview + +#### EntropyArtParamsV2: +- `requestArtParams()` - Request new art parameters (costs ~0.0004 ETH) +- `viewRenderParams(tokenId)` - View generated parameters +- `tokenSeed(tokenId)` - Get the random seed used +- `nextTokenId()` - Get next available token ID + +#### AleaArtNFT: +- `mintNFT(to, ipfsHash, prompt, price)` - Mint new NFT +- `buyNFT(tokenId)` - Purchase NFT (sends ETH to seller) +- `setPrice(tokenId, newPrice)` - Update NFT price +- `setSaleStatus(tokenId, isForSale)` - Enable/disable for sale +- `getAllNFTs()` - Get all minted NFTs +- `getNFTsForSale()` - Get NFTs currently for sale + +#### SpotlightSelector: +- `requestSpotlight()` - Request new spotlight selection (costs 0.001 ETH) +- `getCurrentSpotlight()` - Get current active spotlight +- `isSpotlightActive(spotlightId)` - Check if spotlight is active +- `getSpotlight(spotlightId)` - Get spotlight by ID +- `setSpotlightDuration(duration)` - Update spotlight duration (owner only) +- `setSpotlightFee(fee)` - Update spotlight fee (owner only) + + +## ๐Ÿ“ Project Structure + +``` +AleaArt/ +โ”œโ”€โ”€ contracts/ # Smart Contracts (Solidity) +โ”‚ โ”œโ”€โ”€ AleaArtNFT.sol # NFT marketplace and trading +โ”‚ โ”œโ”€โ”€ EntropyArtParamsV2.sol # Pyth Entropy integration for art parameters +โ”‚ โ””โ”€โ”€ SpotlightSelector.sol # Random NFT selection for spotlight +โ”‚ +โ”œโ”€โ”€ frontend-aleart/ # Frontend Application (Next.js) +โ”‚ โ”œโ”€โ”€ src/ +โ”‚ โ”‚ โ”œโ”€โ”€ app/ # Next.js app router pages +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ page.tsx # Landing page +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ create/ # Art generation page +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ marketplace/ # NFT marketplace page +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ gallery/ # User gallery page +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ api/ # API routes +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ buy-nft/ # NFT purchase endpoint +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ marketplace/ # Market data endpoint +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ spotlight/ # Spotlight feature endpoint +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ ... +โ”‚ โ”‚ โ”œโ”€โ”€ components/ # React components +โ”‚ โ”‚ โ”œโ”€โ”€ lib/ # Utilities (auth, db) +โ”‚ โ”‚ โ”œโ”€โ”€ models/ # MongoDB models +โ”‚ โ”‚ โ””โ”€โ”€ types/ # TypeScript types +โ”‚ โ”œโ”€โ”€ public/ # Static assets +โ”‚ โ””โ”€โ”€ package.json # Node.js dependencies +โ”‚ +โ”œโ”€โ”€ python_backend.py # Flask backend for Stable Diffusion +โ”œโ”€โ”€ python_backend_macos.py # macOS-specific backend +โ”œโ”€โ”€ python_backend_simple.py # Simplified backend version +โ”œโ”€โ”€ test_async_api.py # Async API testing +โ”‚ +โ”œโ”€โ”€ scripts/ # Deployment scripts +โ”‚ โ”œโ”€โ”€ deploy-artParams.ts # Deploy art params contract +โ”‚ โ”œโ”€โ”€ deploy-nft-arbitrum.ts # Deploy NFT contract +โ”‚ โ””โ”€โ”€ deploy-spotlight-arbitrum.ts # Deploy spotlight contract +โ”‚ +โ”œโ”€โ”€ generated_images/ # Generated artwork storage (local) +โ”œโ”€โ”€ artifacts/ # Compiled contract artifacts +โ”œโ”€โ”€ cache/ # Build cache +โ”œโ”€โ”€ hardhat.config.ts # Hardhat configuration +โ”‚ +โ”œโ”€โ”€ requirements.txt # Python dependencies +โ”œโ”€โ”€ requirements_macos.txt # macOS Python dependencies +โ”œโ”€โ”€ package.json # Root node.js dependencies +โ””โ”€โ”€ README.md # This file +``` + +### Directory Overview + +- **`contracts/`** - Solidity smart contracts that handle on-chain logic, NFT minting, trading, and randomness +- **`frontend-aleart/`** - Next.js frontend application with TypeScript, Tailwind CSS, and React components +- **`python_backend*.py`** - Python Flask servers that run Stable Diffusion models to generate AI images +- **`scripts/`** - Hardhat deployment scripts for deploying contracts to Arbitrum Sepolia +- **`generated_images/`** - Local storage for generated artwork before IPFS upload +- **`artifacts/`** - Compiled contract artifacts and build information + +## ๐Ÿ—๏ธ Architecture + +- **Frontend**: Next.js with TypeScript and Tailwind CSS +- **Backend**: Python Flask with Stable Diffusion integration +- **Database**: MongoDB for user data and generated images metadata +- **Blockchain**: Arbitrum Sepolia testnet +- **Authentication**: NextAuth.js with JWT tokens +- **Image Storage**: IPFS via Pinata (decentralized) +- **NFT Standard**: ERC721 compliant +- **Payment**: Direct ETH transfers (no platform fees) + +## ๐Ÿš€ Technology Stack + +- **Blockchain**: Solidity, Hardhat, Ethers.js, OpenZeppelin +- **Frontend**: Next.js, React, TypeScript, Tailwind CSS +- **Backend**: Python, Flask, Stable Diffusion, PyTorch +- **Database**: MongoDB, Mongoose +- **Authentication**: NextAuth.js +- **Randomness**: Pyth Entropy V2 SDK +- **Storage**: IPFS, Pinata API +- **NFT**: ERC721 standard + +## ๐ŸŽฏ User Journey + +1. **Connect Wallet**: Link MetaMask to Arbitrum Sepolia +2. **Generate Parameters**: Request art parameters using Pyth Entropy (~0.0004 ETH) +3. **Create Art**: AI generates unique image using Stable Diffusion +4. **Mint NFT**: Convert art to tradeable NFT with custom price +5. **Trade**: Buy/sell NFTs in the decentralized marketplace +6. **Spotlight**: Request spotlight to randomly feature NFT holders (0.001 ETH) +7. **Own**: Full ownership and control of your digital art + +## Screenshots + +screencapture-aleart-taupe-vercel-app-dashboard-2025-10-26-00_24_24 + +screencapture-aleart-taupe-vercel-app-marketplace-2025-10-26-00_24_51 + diff --git a/entropy/AleaArt/check_db_images.py b/entropy/AleaArt/check_db_images.py new file mode 100644 index 0000000..7c1debe --- /dev/null +++ b/entropy/AleaArt/check_db_images.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +""" +Check if generated images are saved in MongoDB +""" + +import pymongo +from pymongo import MongoClient +import os +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() + +def check_generated_images(): + """Check generated images in the database""" + try: + # Connect to MongoDB + mongo_uri = os.getenv('MONGODB_URI', 'mongodb://localhost:27017/aleart') + client = MongoClient(mongo_uri) + db = client.get_default_database() + + # Get the users collection + users_collection = db.useralearts + + # Find all users with generated images + users_with_images = list(users_collection.find( + {"generatedImages": {"$exists": True, "$ne": []}}, + {"email": 1, "generatedImages": 1} + )) + + print(f"๐Ÿ“Š Found {len(users_with_images)} users with generated images") + + for user in users_with_images: + print(f"\n๐Ÿ‘ค User: {user.get('email', 'Unknown')}") + images = user.get('generatedImages', []) + print(f" ๐Ÿ“ธ Generated Images: {len(images)}") + + for i, img in enumerate(images): + print(f" ๐Ÿ–ผ๏ธ Image {i+1}:") + print(f" Token ID: {img.get('tokenId')}") + print(f" Status: {img.get('status')}") + print(f" Has Image Data: {'Yes' if img.get('imageData') else 'No'}") + print(f" Prompt: {img.get('prompt', 'N/A')[:50]}...") + print(f" Created: {img.get('createdAt')}") + + # Close connection + client.close() + + return True + + except Exception as e: + print(f"โŒ Error checking database: {e}") + return False + +if __name__ == "__main__": + print("๐Ÿ” Checking generated images in database...") + success = check_generated_images() + if success: + print("\nโœ… Database check completed!") + else: + print("\n๐Ÿ’ฅ Database check failed.") + diff --git a/entropy/AleaArt/clear_generated_images.py b/entropy/AleaArt/clear_generated_images.py new file mode 100644 index 0000000..f6afff3 --- /dev/null +++ b/entropy/AleaArt/clear_generated_images.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +""" +Clear existing generated images to fix schema issues +""" + +import pymongo +from pymongo import MongoClient +import os +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() + +def clear_generated_images(): + """Clear all generated images from the database""" + try: + # Connect to MongoDB + mongo_uri = os.getenv('MONGODB_URI', 'mongodb://localhost:27017/aleart') + client = MongoClient(mongo_uri) + db = client.get_default_database() + + # Get the users collection + users_collection = db.useralearts + + # Update all users to remove generatedImages array + result = users_collection.update_many( + {}, + {"$unset": {"generatedImages": ""}} + ) + + print(f"โœ… Cleared generated images from {result.modified_count} users") + + # Close connection + client.close() + + return True + + except Exception as e: + print(f"โŒ Error clearing generated images: {e}") + return False + +if __name__ == "__main__": + print("๐Ÿงน Clearing existing generated images...") + success = clear_generated_images() + if success: + print("๐ŸŽ‰ Database cleared successfully!") + print("You can now try the image generation again.") + else: + print("๐Ÿ’ฅ Failed to clear database.") + diff --git a/entropy/AleaArt/contracts/AleaArtNFT.sol b/entropy/AleaArt/contracts/AleaArtNFT.sol new file mode 100644 index 0000000..d92bc7a --- /dev/null +++ b/entropy/AleaArt/contracts/AleaArtNFT.sol @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +contract AleaArtNFT is ERC721, Ownable, ReentrancyGuard { + uint256 private _tokenIdCounter = 0; + + struct NFTData { + uint256 tokenId; + address owner; + string ipfsHash; + string prompt; + uint256 price; + bool isForSale; + address creator; + uint256 createdAt; + } + + mapping(uint256 => NFTData) public nftData; + mapping(address => uint256[]) public userNFTs; + mapping(string => bool) public ipfsHashExists; + + event NFTMinted( + uint256 indexed tokenId, + address indexed owner, + string ipfsHash, + string prompt, + uint256 price + ); + + event NFTSold( + uint256 indexed tokenId, + address indexed seller, + address indexed buyer, + uint256 price + ); + + event PriceUpdated( + uint256 indexed tokenId, + uint256 oldPrice, + uint256 newPrice + ); + + event SaleStatusChanged( + uint256 indexed tokenId, + bool isForSale + ); + + constructor() ERC721("AleaArt NFT", "ALEART") Ownable(msg.sender) {} + + function mintNFT( + address to, + string memory ipfsHash, + string memory prompt, + uint256 price + ) public returns (uint256) { + require(!ipfsHashExists[ipfsHash], "IPFS hash already exists"); + + uint256 tokenId = _tokenIdCounter; + _tokenIdCounter++; + + _safeMint(to, tokenId); + + nftData[tokenId] = NFTData({ + tokenId: tokenId, + owner: to, + ipfsHash: ipfsHash, + prompt: prompt, + price: price, + isForSale: price > 0, + creator: to, + createdAt: block.timestamp + }); + + userNFTs[to].push(tokenId); + ipfsHashExists[ipfsHash] = true; + + emit NFTMinted(tokenId, to, ipfsHash, prompt, price); + + return tokenId; + } + + function buyNFT(uint256 tokenId) public payable nonReentrant { + NFTData storage nft = nftData[tokenId]; + require(nft.isForSale, "NFT is not for sale"); + require(msg.value >= nft.price, "Insufficient payment"); + require(msg.sender != nft.owner, "Cannot buy your own NFT"); + + address seller = nft.owner; + uint256 salePrice = nft.price; + + // Transfer NFT + _transfer(seller, msg.sender, tokenId); + + // Update NFT data + nft.owner = msg.sender; + nft.isForSale = false; + nft.price = 0; + + // Update user NFT lists + _removeFromUserNFTs(seller, tokenId); + userNFTs[msg.sender].push(tokenId); + + // Transfer payment to seller + payable(seller).transfer(salePrice); + + emit NFTSold(tokenId, seller, msg.sender, salePrice); + } + + function setPrice(uint256 tokenId, uint256 newPrice) public { + require(ownerOf(tokenId) != address(0), "NFT does not exist"); + require(ownerOf(tokenId) == msg.sender, "Not the owner"); + + uint256 oldPrice = nftData[tokenId].price; + nftData[tokenId].price = newPrice; + nftData[tokenId].isForSale = newPrice > 0; + + emit PriceUpdated(tokenId, oldPrice, newPrice); + emit SaleStatusChanged(tokenId, newPrice > 0); + } + + function setSaleStatus(uint256 tokenId, bool isForSale) public { + require(ownerOf(tokenId) != address(0), "NFT does not exist"); + require(ownerOf(tokenId) == msg.sender, "Not the owner"); + + nftData[tokenId].isForSale = isForSale; + + emit SaleStatusChanged(tokenId, isForSale); + } + + function getUserNFTs(address user) public view returns (uint256[] memory) { + return userNFTs[user]; + } + + function getAllNFTs() public view returns (NFTData[] memory) { + uint256 totalNFTs = _tokenIdCounter; + NFTData[] memory allNFTs = new NFTData[](totalNFTs); + + for (uint256 i = 0; i < totalNFTs; i++) { + allNFTs[i] = nftData[i]; + } + + return allNFTs; + } + + function getNFTsForSale() public view returns (NFTData[] memory) { + uint256 totalNFTs = _tokenIdCounter; + uint256 saleCount = 0; + + // Count NFTs for sale + for (uint256 i = 0; i < totalNFTs; i++) { + if (nftData[i].isForSale) { + saleCount++; + } + } + + NFTData[] memory saleNFTs = new NFTData[](saleCount); + uint256 index = 0; + + // Populate NFTs for sale + for (uint256 i = 0; i < totalNFTs; i++) { + if (nftData[i].isForSale) { + saleNFTs[index] = nftData[i]; + index++; + } + } + + return saleNFTs; + } + + function _removeFromUserNFTs(address user, uint256 tokenId) internal { + uint256[] storage userTokens = userNFTs[user]; + for (uint256 i = 0; i < userTokens.length; i++) { + if (userTokens[i] == tokenId) { + userTokens[i] = userTokens[userTokens.length - 1]; + userTokens.pop(); + break; + } + } + } + + function tokenURI(uint256 tokenId) public view override returns (string memory) { + require(ownerOf(tokenId) != address(0), "NFT does not exist"); + + NFTData memory nft = nftData[tokenId]; + return string(abi.encodePacked("https://gateway.pinata.cloud/ipfs/", nft.ipfsHash)); + } +} \ No newline at end of file diff --git a/entropy/AleaArt/contracts/EntropyArtParamsV2.sol b/entropy/AleaArt/contracts/EntropyArtParamsV2.sol new file mode 100644 index 0000000..b681f2d --- /dev/null +++ b/entropy/AleaArt/contracts/EntropyArtParamsV2.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title EntropyArtParamsV2 + * @notice Fully compliant Pyth Entropy v2 Consumer for Arbitrum Sepolia + * - Uses official @pythnetwork/entropy-sdk-solidity + * - Requests randomness via provider callback + * - Generates deterministic art parameters from randomness + * + * Network: Arbitrum Sepolia + * Entropy Contract: 0x549Ebba8036Ab746611B4fFA1423eb0A4Df61440 + * Default Provider: 0x6CC14824Ea2918f5De5C2f75A9Da968ad4BD6344 + */ + +import { IEntropyV2 } from "@pythnetwork/entropy-sdk-solidity/IEntropyV2.sol"; +import { IEntropyConsumer } from "@pythnetwork/entropy-sdk-solidity/IEntropyConsumer.sol"; + +contract EntropyArtParamsV2 is IEntropyConsumer { + // ๐Ÿ”น Entropy contract on Arbitrum Sepolia + IEntropyV2 public constant ENTROPY = + IEntropyV2(0x549Ebba8036Ab746611B4fFA1423eb0A4Df61440); + + // ๐Ÿ”น Default provider (Arbitrum Sepolia) + address public constant DEFAULT_PROVIDER = + 0x6CC14824Ea2918f5De5C2f75A9Da968ad4BD6344; + + // ๐Ÿ”น Gas limit for the callback + uint32 public constant CALLBACK_GAS_LIMIT = 200_000; + + // ๐Ÿ”น Domain separator for uniqueness + bytes32 public immutable COLLECTION_SALT; + + uint256 public nextTokenId = 1; + + // Mapping: requestId โ†’ tokenId + mapping(uint64 => uint256) public requestToTokenId; + // Mapping: tokenId โ†’ final randomness seed + mapping(uint256 => bytes32) public tokenSeed; + + struct RenderParams { + uint8 promptIndex; + uint8 styleIndex; + uint8 samplerIndex; + uint8 aspectIndex; + uint16 steps; + uint16 cfg; + uint32 latentSeed; + uint16 paletteId; + } + + mapping(uint256 => RenderParams) internal _params; + + event EntropyRequested(uint256 indexed tokenId, uint64 indexed requestId, uint256 feePaid); + event EntropyFulfilled(uint256 indexed tokenId, bytes32 seed); + + constructor(bytes32 collectionSalt) { + COLLECTION_SALT = collectionSalt; + } + + // ๐Ÿ”น Required by IEntropyConsumer + function getEntropy() internal pure override returns (address) { + return address(ENTROPY); + } + + // ๐Ÿ”น View fee (dynamically determined by provider gas limit) + function quoteEntropyFee() public view returns (uint256) { + return ENTROPY.getFeeV2(DEFAULT_PROVIDER, CALLBACK_GAS_LIMIT); + } + + // ๐Ÿ”น Request random number for next art token + function requestArtParams() + external + payable + returns (uint256 tokenId, uint64 requestId) + { + uint256 fee = ENTROPY.getFeeV2(DEFAULT_PROVIDER, CALLBACK_GAS_LIMIT); + require(msg.value >= fee, "fee too low"); + + tokenId = nextTokenId++; + + // Request randomness with provider and callback gas limit + requestId = ENTROPY.requestV2{ value: fee }( + DEFAULT_PROVIDER, + CALLBACK_GAS_LIMIT + ); + + requestToTokenId[requestId] = tokenId; + + // Refund extra ETH if sent + if (msg.value > fee) { + payable(msg.sender).transfer(msg.value - fee); + } + + emit EntropyRequested(tokenId, requestId, fee); + } + + // ๐Ÿ”น Callback from Pyth Entropy + function entropyCallback( + uint64 sequenceNumber, + address /* provider */, + bytes32 randomNumber + ) internal override { + // Only callable by the Entropy contract + require(msg.sender == address(ENTROPY), "unauthorized"); + + uint256 tokenId = requestToTokenId[sequenceNumber]; + require(tokenId != 0, "unknown request"); + require(tokenSeed[tokenId] == bytes32(0), "already fulfilled"); + + // Combine randomness with salt for uniqueness + bytes32 seed = keccak256(abi.encodePacked(randomNumber, tokenId, COLLECTION_SALT)); + tokenSeed[tokenId] = seed; + + // Derive render parameters + _params[tokenId] = _deriveParams(seed); + + emit EntropyFulfilled(tokenId, seed); + } + + // ๐Ÿ”น Derive visual parameters from randomness + function _deriveParams(bytes32 seed) + internal + pure + returns (RenderParams memory p) + { + uint256 s0 = uint256(seed); + uint256 s1 = uint256(keccak256(abi.encodePacked(seed, uint256(1)))); + uint256 s2 = uint256(keccak256(abi.encodePacked(seed, uint256(2)))); + uint256 s3 = uint256(keccak256(abi.encodePacked(seed, uint256(3)))); + + p.promptIndex = uint8(s0 % 12); + p.styleIndex = uint8((s0 >> 40) % 10); + p.samplerIndex = uint8((s1 >> 96) % 6); + p.aspectIndex = uint8((s1 >> 160) % 5); + p.paletteId = uint16((s2 >> 200) % 24); + p.steps = uint16(18 + (s2 % 47)); // 18โ€“64 + p.cfg = uint16(70 + (s3 % 111)); // 7.0โ€“18.0 (ร—10) + p.latentSeed = uint32(s3); + } + + // ๐Ÿ”น Public view of generated art parameters + function viewRenderParams(uint256 tokenId) + external + view + returns (RenderParams memory) + { + require(tokenSeed[tokenId] != bytes32(0), "not ready"); + return _params[tokenId]; + } + + receive() external payable {} + fallback() external payable {} +} diff --git a/entropy/AleaArt/contracts/SpotlightSelector.sol b/entropy/AleaArt/contracts/SpotlightSelector.sol new file mode 100644 index 0000000..4e0855b --- /dev/null +++ b/entropy/AleaArt/contracts/SpotlightSelector.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import { IEntropyV2 } from "@pythnetwork/entropy-sdk-solidity/IEntropyV2.sol"; +import { IEntropyConsumer } from "@pythnetwork/entropy-sdk-solidity/IEntropyConsumer.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +interface IAleaArtNFT { + struct NFTData { + uint256 tokenId; + address owner; + string ipfsHash; + string prompt; + uint256 price; + bool isForSale; + address creator; + uint256 createdAt; + } + + function getAllNFTs() external view returns (NFTData[] memory); + function ownerOf(uint256 tokenId) external view returns (address); +} + +contract SpotlightSelector is IEntropyConsumer, Ownable, ReentrancyGuard { + IAleaArtNFT public aleaArtNFT; + + // ๐Ÿ”น Entropy contract on Arbitrum Sepolia + IEntropyV2 public constant ENTROPY = + IEntropyV2(0x549Ebba8036Ab746611B4fFA1423eb0A4Df61440); + + // ๐Ÿ”น Default provider (Arbitrum Sepolia) + address public constant DEFAULT_PROVIDER = + 0x6CC14824Ea2918f5De5C2f75A9Da968ad4BD6344; + + // ๐Ÿ”น Gas limit for the callback + uint32 public constant CALLBACK_GAS_LIMIT = 200_000; + + struct SpotlightInfo { + uint256 tokenId; + address owner; + string ipfsHash; + string prompt; + uint256 price; + bool isForSale; + address creator; + uint256 createdAt; + uint256 spotlightStartTime; + uint256 spotlightDuration; + bool isActive; + } + + mapping(uint256 => SpotlightInfo) public spotlights; + mapping(uint64 => uint256) public requestToSpotlightId; + uint256 public currentSpotlightId; + uint256 public spotlightDuration = 24 hours; // Default 24 hours + uint256 public spotlightFee = 0.001 ether; // Fee to request new spotlight + + event SpotlightRequested(uint256 indexed spotlightId, uint64 indexed requestId, uint256 feePaid); + event SpotlightSelected(uint256 indexed spotlightId, uint256 indexed tokenId, address indexed owner); + event SpotlightDurationUpdated(uint256 newDuration); + event SpotlightFeeUpdated(uint256 newFee); + + constructor(address _aleaArtNFT) Ownable(msg.sender) { + aleaArtNFT = IAleaArtNFT(_aleaArtNFT); + } + + // ๐Ÿ”น Required by IEntropyConsumer + function getEntropy() internal pure override returns (address) { + return address(ENTROPY); + } + + // ๐Ÿ”น View fee (dynamically determined by provider gas limit) + function quoteEntropyFee() public view returns (uint256) { + return ENTROPY.getFeeV2(DEFAULT_PROVIDER, CALLBACK_GAS_LIMIT); + } + + /** + * @dev Request a new spotlight selection using Pyth Entropy + */ + function requestSpotlight() external payable nonReentrant { + require(msg.value >= spotlightFee, "Insufficient fee"); + + uint256 spotlightId = currentSpotlightId + 1; + currentSpotlightId = spotlightId; + + // Get the entropy fee + uint256 entropyFee = ENTROPY.getFeeV2(DEFAULT_PROVIDER, CALLBACK_GAS_LIMIT); + + // Request randomness from Pyth Entropy + uint64 requestId = ENTROPY.requestV2{ value: entropyFee }( + DEFAULT_PROVIDER, + CALLBACK_GAS_LIMIT + ); + + requestToSpotlightId[requestId] = spotlightId; + + emit SpotlightRequested(spotlightId, requestId, msg.value); + + // Refund excess payment + if (msg.value > spotlightFee) { + payable(msg.sender).transfer(msg.value - spotlightFee); + } + } + + /** + * @dev Callback function called by Pyth Entropy when randomness is available + */ + function entropyCallback( + uint64 sequence, + address provider, + bytes32 randomNumber + ) internal override { + uint256 spotlightId = requestToSpotlightId[sequence]; + require(spotlightId > 0, "Invalid request ID"); + + // Get all NFTs from the marketplace + IAleaArtNFT.NFTData[] memory allNFTs = aleaArtNFT.getAllNFTs(); + + require(allNFTs.length > 0, "No NFTs available for spotlight"); + + // Use randomness to select a random NFT + uint256 randomValue = uint256(randomNumber); + uint256 selectedIndex = randomValue % allNFTs.length; + + IAleaArtNFT.NFTData memory selectedNFT = allNFTs[selectedIndex]; + + // Create spotlight info + SpotlightInfo memory spotlight = SpotlightInfo({ + tokenId: selectedNFT.tokenId, + owner: selectedNFT.owner, + ipfsHash: selectedNFT.ipfsHash, + prompt: selectedNFT.prompt, + price: selectedNFT.price, + isForSale: selectedNFT.isForSale, + creator: selectedNFT.creator, + createdAt: selectedNFT.createdAt, + spotlightStartTime: block.timestamp, + spotlightDuration: spotlightDuration, + isActive: true + }); + + spotlights[spotlightId] = spotlight; + + emit SpotlightSelected(spotlightId, selectedNFT.tokenId, selectedNFT.owner); + } + + /** + * @dev Get current active spotlight + */ + function getCurrentSpotlight() external view returns (SpotlightInfo memory) { + require(currentSpotlightId > 0, "No spotlight available"); + + SpotlightInfo memory spotlight = spotlights[currentSpotlightId]; + require(spotlight.isActive, "No active spotlight"); + require( + block.timestamp <= spotlight.spotlightStartTime + spotlight.spotlightDuration, + "Spotlight expired" + ); + + return spotlight; + } + + /** + * @dev Check if spotlight is active and not expired + */ + function isSpotlightActive(uint256 spotlightId) external view returns (bool) { + SpotlightInfo memory spotlight = spotlights[spotlightId]; + return spotlight.isActive && + block.timestamp <= spotlight.spotlightStartTime + spotlight.spotlightDuration; + } + + /** + * @dev Get spotlight by ID + */ + function getSpotlight(uint256 spotlightId) external view returns (SpotlightInfo memory) { + return spotlights[spotlightId]; + } + + /** + * @dev Update spotlight duration (only owner) + */ + function setSpotlightDuration(uint256 _duration) external onlyOwner { + require(_duration > 0, "Duration must be greater than 0"); + spotlightDuration = _duration; + emit SpotlightDurationUpdated(_duration); + } + + /** + * @dev Update spotlight fee (only owner) + */ + function setSpotlightFee(uint256 _fee) external onlyOwner { + spotlightFee = _fee; + emit SpotlightFeeUpdated(_fee); + } + + /** + * @dev Withdraw contract balance (only owner) + */ + function withdraw() external onlyOwner { + uint256 balance = address(this).balance; + require(balance > 0, "No funds to withdraw"); + payable(owner()).transfer(balance); + } + + /** + * @dev Get contract balance + */ + function getBalance() external view returns (uint256) { + return address(this).balance; + } +} diff --git a/entropy/AleaArt/env.example b/entropy/AleaArt/env.example new file mode 100644 index 0000000..4130c4b --- /dev/null +++ b/entropy/AleaArt/env.example @@ -0,0 +1,15 @@ +# MongoDB Configuration +MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/?retryWrites=true&w=majority + +# Pinata IPFS Configuration +PINATA_API_KEY=your_pinata_api_key_here +PINATA_API_SECRET=your_pinata_api_secret_here +PINATA_JWT=your_pinata_jwt_token_here + +# NextAuth Configuration +NEXTAUTH_URL=http://localhost:3000 +NEXTAUTH_SECRET=your_nextauth_secret_here + +# Blockchain Configuration +NEXT_PUBLIC_CONTRACT_ADDRESS=your_contract_address_here +NEXT_PUBLIC_RPC_URL=your_rpc_url_here diff --git a/entropy/AleaArt/frontend-aleart/.gitignore b/entropy/AleaArt/frontend-aleart/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/entropy/AleaArt/frontend-aleart/README.md b/entropy/AleaArt/frontend-aleart/README.md new file mode 100644 index 0000000..41eb3c9 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/README.md @@ -0,0 +1,139 @@ +# AleaArt - Next.js Frontend + +A complete Next.js application for generating and managing art parameters using blockchain randomness. + +## Features + +- ๐Ÿ” **Authentication**: User registration and login with MongoDB +- ๐Ÿ”— **Wallet Integration**: MetaMask connection for blockchain interactions +- ๐ŸŽจ **Art Parameter Generation**: Generate unique art parameters using Pyth Entropy V2 +- ๐Ÿ’พ **Data Persistence**: Save generated art tokens to user profiles +- ๐Ÿ“Š **Dashboard**: View and manage your art tokens +- ๐Ÿ‘ค **Profile Management**: Track your art generation history + +## Setup Instructions + +### 1. Environment Variables + +Create a `.env.local` file in the root directory: + +```bash +# Database +MONGODB_URI=mongodb://localhost:27017/aleaart + +# NextAuth +NEXTAUTH_URL=http://localhost:3000 +NEXTAUTH_SECRET=your-secret-key-here + +# Contract Configuration +NEXT_PUBLIC_CONTRACT_ADDRESS=0x420D121aE08007Ef0A66E67D5D7BfFdC98AbECF0 +NEXT_PUBLIC_ENTROPY_ADDRESS=0x549Ebba8036Ab746611B4fFA1423eb0A4Df61440 +NEXT_PUBLIC_COLLECTION_SALT=0x7d0293489313c8b010a0b94fadf33237ae4b7f212d87b2b69753426aa1179b27 +``` + +### 2. Install Dependencies + +```bash +npm install +``` + +### 3. Run the Development Server + +```bash +npm run dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +## Project Structure + +``` +src/ +โ”œโ”€โ”€ app/ +โ”‚ โ”œโ”€โ”€ api/ +โ”‚ โ”‚ โ”œโ”€โ”€ auth/ +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ [...nextauth]/route.ts # NextAuth configuration +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ signup/route.ts # User registration +โ”‚ โ”‚ โ”œโ”€โ”€ art-tokens/route.ts # Art token management +โ”‚ โ”‚ โ””โ”€โ”€ wallet/connect/route.ts # Wallet connection +โ”‚ โ”œโ”€โ”€ dashboard/page.tsx # Main dashboard +โ”‚ โ”œโ”€โ”€ login/page.tsx # Login page +โ”‚ โ”œโ”€โ”€ profile/page.tsx # User profile +โ”‚ โ”œโ”€โ”€ signup/page.tsx # Registration page +โ”‚ โ”œโ”€โ”€ layout.tsx # Root layout +โ”‚ โ””โ”€โ”€ page.tsx # Landing page +โ”œโ”€โ”€ components/ +โ”‚ โ””โ”€โ”€ Navigation.tsx # Navigation component +โ”œโ”€โ”€ lib/ +โ”‚ โ”œโ”€โ”€ auth.ts # NextAuth configuration +โ”‚ โ””โ”€โ”€ mongodb.ts # Database connection +โ”œโ”€โ”€ models/ +โ”‚ โ””โ”€โ”€ UserAleart.ts # UserAleart model +โ””โ”€โ”€ middleware.ts # Route protection +``` + +## Usage + +1. **Sign Up**: Create a new account +2. **Connect Wallet**: Connect your MetaMask wallet +3. **Generate Art**: Request art parameters from the blockchain +4. **View Results**: Check your generated art tokens in the dashboard +5. **Profile**: View your art generation history + +## Technologies Used + +- **Next.js 14** - React framework +- **NextAuth.js** - Authentication +- **MongoDB** - Database +- **Mongoose** - ODM +- **Ethers.js** - Blockchain interactions +- **Tailwind CSS** - Styling +- **TypeScript** - Type safety + +## Smart Contract Integration + +The application integrates with the deployed `EntropyArtParamsV2` contract on Arbitrum Sepolia: + +- **Contract Address**: `0x420D121aE08007Ef0A66E67D5D7BfFdC98AbECF0` +- **Network**: Arbitrum Sepolia +- **Entropy Provider**: Pyth Entropy V2 + +## API Endpoints + +- `POST /api/auth/signup` - User registration +- `GET /api/art-tokens` - Get user's art tokens +- `POST /api/art-tokens` - Save new art token +- `POST /api/wallet/connect` - Connect wallet to user profile + +## Environment Variables + +Make sure to set up your environment variables properly: + +- `MONGODB_URI`: Your MongoDB connection string +- `NEXTAUTH_SECRET`: A random secret for NextAuth +- `NEXT_PUBLIC_CONTRACT_ADDRESS`: The deployed contract address +- `NEXT_PUBLIC_ENTROPY_ADDRESS`: The Pyth Entropy contract address +- `NEXT_PUBLIC_COLLECTION_SALT`: The collection salt for uniqueness + +## Deployment + +1. Build the application: + ```bash + npm run build + ``` + +2. Start the production server: + ```bash + npm start + ``` + +## Contributing + +1. Fork the repository +2. Create a feature branch +3. Make your changes +4. Submit a pull request + +## License + +MIT License \ No newline at end of file diff --git a/entropy/AleaArt/frontend-aleart/eslint.config.mjs b/entropy/AleaArt/frontend-aleart/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/entropy/AleaArt/frontend-aleart/next.config.ts b/entropy/AleaArt/frontend-aleart/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/entropy/AleaArt/frontend-aleart/package-lock.json b/entropy/AleaArt/frontend-aleart/package-lock.json new file mode 100644 index 0000000..7756703 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/package-lock.json @@ -0,0 +1,7030 @@ +{ + "name": "frontend-aleart", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend-aleart", + "version": "0.1.0", + "dependencies": { + "@next-auth/mongodb-adapter": "^1.1.3", + "@types/bcryptjs": "^2.4.6", + "bcryptjs": "^3.0.2", + "ethers": "^6.15.0", + "mongodb": "^6.20.0", + "mongoose": "^8.19.2", + "next": "16.0.0", + "next-auth": "^4.24.11", + "react": "19.2.0", + "react-dom": "19.2.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.0.0", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", + "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz", + "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz", + "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz", + "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz", + "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz", + "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz", + "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz", + "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz", + "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz", + "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz", + "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz", + "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz", + "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz", + "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz", + "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz", + "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz", + "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz", + "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.5.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz", + "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz", + "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz", + "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.2.tgz", + "integrity": "sha512-QgA5AySqB27cGTXBFmnpifAi7HxoGUeezwo6p9dI03MuDB6Pp33zgclqVb6oVK3j6I9Vesg0+oojW2XxB59SGg==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next-auth/mongodb-adapter": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@next-auth/mongodb-adapter/-/mongodb-adapter-1.1.3.tgz", + "integrity": "sha512-nH/may8hntYBlcuxepSsR2b95w6SRnP+c/FFt3KKjdTScNjhrN0zZdlT90nisjG/3gK+MvzMbz/F4Rwpgr9RMA==", + "license": "ISC", + "peerDependencies": { + "mongodb": "^5 || ^4", + "next-auth": "^4" + } + }, + "node_modules/@next/env": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.0.tgz", + "integrity": "sha512-s5j2iFGp38QsG1LWRQaE2iUY3h1jc014/melHFfLdrsMJPqxqDQwWNwyQTcNoUSGZlCVZuM7t7JDMmSyRilsnA==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.0.tgz", + "integrity": "sha512-IB7RzmmtrPOrpAgEBR1PIQPD0yea5lggh5cq54m51jHjjljU80Ia+czfxJYMlSDl1DPvpzb8S9TalCc0VMo9Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.0.tgz", + "integrity": "sha512-/CntqDCnk5w2qIwMiF0a9r6+9qunZzFmU0cBX4T82LOflE72zzH6gnOjCwUXYKOBlQi8OpP/rMj8cBIr18x4TA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.0.tgz", + "integrity": "sha512-hB4GZnJGKa8m4efvTGNyii6qs76vTNl+3dKHTCAUaksN6KjYy4iEO3Q5ira405NW2PKb3EcqWiRaL9DrYJfMHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.0.tgz", + "integrity": "sha512-E2IHMdE+C1k+nUgndM13/BY/iJY9KGCphCftMh7SXWcaQqExq/pJU/1Hgn8n/tFwSoLoYC/yUghOv97tAsIxqg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.0.tgz", + "integrity": "sha512-xzgl7c7BVk4+7PDWldU+On2nlwnGgFqJ1siWp3/8S0KBBLCjonB6zwJYPtl4MUY7YZJrzzumdUpUoquu5zk8vg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.0.tgz", + "integrity": "sha512-sdyOg4cbiCw7YUr0F/7ya42oiVBXLD21EYkSwN+PhE4csJH4MSXUsYyslliiiBwkM+KsuQH/y9wuxVz6s7Nstg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.0.tgz", + "integrity": "sha512-IAXv3OBYqVaNOgyd3kxR4L3msuhmSy1bcchPHxDOjypG33i2yDWvGBwFD94OuuTjjTt/7cuIKtAmoOOml6kfbg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.0.tgz", + "integrity": "sha512-bmo3ncIJKUS9PWK1JD9pEVv0yuvp1KPuOsyJTHXTv8KDrEmgV/K+U0C75rl9rhIaODcS7JEb6/7eJhdwXI0XmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.0.tgz", + "integrity": "sha512-O1cJbT+lZp+cTjYyZGiDwsOjO3UHHzSqobkPNipdlnnuPb1swfcuY6r3p8dsKU4hAIEO4cO67ZCfVVH/M1ETXA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@panva/hkdf": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz", + "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.15.tgz", + "integrity": "sha512-HF4+7QxATZWY3Jr8OlZrBSXmwT3Watj0OogeDvdUY/ByXJHQ+LBtqA2brDb3sBxYslIFx6UP94BJ4X6a4L9Bmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.2", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.15" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.15.tgz", + "integrity": "sha512-krhX+UOOgnsUuks2SR7hFafXmLQrKxB4YyRTERuCE59JlYL+FawgaAlSkOYmDRJdf1Q+IFNDMl9iRnBW7QBDfQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.15", + "@tailwindcss/oxide-darwin-arm64": "4.1.15", + "@tailwindcss/oxide-darwin-x64": "4.1.15", + "@tailwindcss/oxide-freebsd-x64": "4.1.15", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.15", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.15", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.15", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.15", + "@tailwindcss/oxide-linux-x64-musl": "4.1.15", + "@tailwindcss/oxide-wasm32-wasi": "4.1.15", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.15", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.15" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.15.tgz", + "integrity": "sha512-TkUkUgAw8At4cBjCeVCRMc/guVLKOU1D+sBPrHt5uVcGhlbVKxrCaCW9OKUIBv1oWkjh4GbunD/u/Mf0ql6kEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.15.tgz", + "integrity": "sha512-xt5XEJpn2piMSfvd1UFN6jrWXyaKCwikP4Pidcf+yfHTSzSpYhG3dcMktjNkQO3JiLCp+0bG0HoWGvz97K162w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.15.tgz", + "integrity": "sha512-TnWaxP6Bx2CojZEXAV2M01Yl13nYPpp0EtGpUrY+LMciKfIXiLL2r/SiSRpagE5Fp2gX+rflp/Os1VJDAyqymg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.15.tgz", + "integrity": "sha512-quISQDWqiB6Cqhjc3iWptXVZHNVENsWoI77L1qgGEHNIdLDLFnw3/AfY7DidAiiCIkGX/MjIdB3bbBZR/G2aJg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.15.tgz", + "integrity": "sha512-ObG76+vPlab65xzVUQbExmDU9FIeYLQ5k2LrQdR2Ud6hboR+ZobXpDoKEYXf/uOezOfIYmy2Ta3w0ejkTg9yxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.15.tgz", + "integrity": "sha512-4WbBacRmk43pkb8/xts3wnOZMDKsPFyEH/oisCm2q3aLZND25ufvJKcDUpAu0cS+CBOL05dYa8D4U5OWECuH/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.15.tgz", + "integrity": "sha512-AbvmEiteEj1nf42nE8skdHv73NoR+EwXVSgPY6l39X12Ex8pzOwwfi3Kc8GAmjsnsaDEbk+aj9NyL3UeyHcTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.15.tgz", + "integrity": "sha512-+rzMVlvVgrXtFiS+ES78yWgKqpThgV19ISKD58Ck+YO5pO5KjyxLt7AWKsWMbY0R9yBDC82w6QVGz837AKQcHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.15.tgz", + "integrity": "sha512-fPdEy7a8eQN9qOIK3Em9D3TO1z41JScJn8yxl/76mp4sAXFDfV4YXxsiptJcOwy6bGR+70ZSwFIZhTXzQeqwQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.15.tgz", + "integrity": "sha512-sJ4yd6iXXdlgIMfIBXuVGp/NvmviEoMVWMOAGxtxhzLPp9LOj5k0pMEMZdjeMCl4C6Up+RM8T3Zgk+BMQ0bGcQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.15.tgz", + "integrity": "sha512-sJGE5faXnNQ1iXeqmRin7Ds/ru2fgCiaQZQQz3ZGIDtvbkeV85rAZ0QJFMDg0FrqsffZG96H1U9AQlNBRLsHVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.15.tgz", + "integrity": "sha512-NLeHE7jUV6HcFKS504bpOohyi01zPXi2PXmjFfkzTph8xRxDdxkRsXm/xDO5uV5K3brrE1cCwbUYmFUSHR3u1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.15.tgz", + "integrity": "sha512-IZh8IT76KujRz6d15wZw4eoeViT4TqmzVWNNfpuNCTKiaZUwgr5vtPqO4HjuYDyx3MgGR5qgPt1HMzTeLJyA3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.15", + "@tailwindcss/oxide": "4.1.15", + "postcss": "^8.4.41", + "tailwindcss": "4.1.15" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.23.tgz", + "integrity": "sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", + "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", + "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/type-utils": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.2", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", + "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", + "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", + "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", + "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", + "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", + "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", + "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.19.tgz", + "integrity": "sha512-zoKGUdu6vb2jd3YOq0nnhEDQVbPcHhco3UImJrv5dSkvxTc2pl2WjOPsjZXDwPDSl5eghIMuY3R6J9NDKF3KcQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bcryptjs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", + "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bson": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz", + "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.238", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.238.tgz", + "integrity": "sha512-khBdc+w/Gv+cS8e/Pbnaw/FXcBUeKrRVik9IxfXtgREOWyJhR4tj43n3amkVogJ/yeQUqzkrZcFhtIxIdqmmcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.38.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.0.tgz", + "integrity": "sha512-DWKT1YAO9ex2rK0/EeiPpKU++ghTiG59z6m08/ReLRECOYIaEv17maSCYT8zmFQLwIrY5lhJ+iaJPQdT4sJd4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.0.tgz", + "integrity": "sha512-fNXaOwvKwq2+pXiRpXc825Vd63+KM4DLL40Rtlycb8m7fYpp6efrTp1sa6ZbP/Ap58K2bEKFXRmhURE+CJAQWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.22.4 || ^4.0.0", + "zod-validation-error": "^3.0.3 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ethers": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz", + "integrity": "sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mongodb": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.20.0.tgz", + "integrity": "sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.3.0", + "bson": "^6.10.4", + "mongodb-connection-string-url": "^3.0.2" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.3.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.19.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.19.2.tgz", + "integrity": "sha512-ww2T4dBV+suCbOfG5YPwj9pLCfUVyj8FEA1D3Ux1HHqutpLxGyOYEPU06iPRBW4cKr3PJfOSYsIpHWPTkz5zig==", + "license": "MIT", + "dependencies": { + "bson": "^6.10.4", + "kareem": "2.6.3", + "mongodb": "~6.20.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.0.tgz", + "integrity": "sha512-nYohiNdxGu4OmBzggxy9rczmjIGI+TpR5vbKTsE1HqYwNm1B+YSiugSrFguX6omMOKnDHAmBPY4+8TNJk0Idyg==", + "license": "MIT", + "dependencies": { + "@next/env": "16.0.0", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.0.0", + "@next/swc-darwin-x64": "16.0.0", + "@next/swc-linux-arm64-gnu": "16.0.0", + "@next/swc-linux-arm64-musl": "16.0.0", + "@next/swc-linux-x64-gnu": "16.0.0", + "@next/swc-linux-x64-musl": "16.0.0", + "@next/swc-win32-arm64-msvc": "16.0.0", + "@next/swc-win32-x64-msvc": "16.0.0", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-auth": { + "version": "4.24.11", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.11.tgz", + "integrity": "sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==", + "license": "ISC", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.7.0", + "jose": "^4.15.5", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "@auth/core": "0.34.2", + "next": "^12.2.5 || ^13 || ^14 || ^15", + "nodemailer": "^6.6.5", + "react": "^17.0.2 || ^18 || ^19", + "react-dom": "^17.0.2 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@auth/core": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", + "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oidc-token-hash": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.1.tgz", + "integrity": "sha512-D7EmwxJV6DsEB6vOFLrBM2OzsVgQzgPWyHlV2OOAVj772n+WTXpudC9e9u5BVKQnYwaD30Ivhi9b+4UeBcGu9g==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/openid-client": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", + "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", + "license": "MIT", + "dependencies": { + "jose": "^4.15.9", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openid-client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "license": "MIT", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==", + "license": "MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz", + "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.0", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.4", + "@img/sharp-darwin-x64": "0.34.4", + "@img/sharp-libvips-darwin-arm64": "1.2.3", + "@img/sharp-libvips-darwin-x64": "1.2.3", + "@img/sharp-libvips-linux-arm": "1.2.3", + "@img/sharp-libvips-linux-arm64": "1.2.3", + "@img/sharp-libvips-linux-ppc64": "1.2.3", + "@img/sharp-libvips-linux-s390x": "1.2.3", + "@img/sharp-libvips-linux-x64": "1.2.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", + "@img/sharp-libvips-linuxmusl-x64": "1.2.3", + "@img/sharp-linux-arm": "0.34.4", + "@img/sharp-linux-arm64": "0.34.4", + "@img/sharp-linux-ppc64": "0.34.4", + "@img/sharp-linux-s390x": "0.34.4", + "@img/sharp-linux-x64": "0.34.4", + "@img/sharp-linuxmusl-arm64": "0.34.4", + "@img/sharp-linuxmusl-x64": "0.34.4", + "@img/sharp-wasm32": "0.34.4", + "@img/sharp-win32-arm64": "0.34.4", + "@img/sharp-win32-ia32": "0.34.4", + "@img/sharp-win32-x64": "0.34.4" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.15.tgz", + "integrity": "sha512-k2WLnWkYFkdpRv+Oby3EBXIyQC8/s1HOFMBUViwtAh6Z5uAozeUSMQlIsn/c6Q2iJzqG6aJT3wdPaRNj70iYxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "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/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz", + "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.2", + "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/entropy/AleaArt/frontend-aleart/package.json b/entropy/AleaArt/frontend-aleart/package.json new file mode 100644 index 0000000..0752df8 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/package.json @@ -0,0 +1,33 @@ +{ + "name": "frontend-aleart", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --webpack", + "build": "next build --webpack", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "@next-auth/mongodb-adapter": "^1.1.3", + "@types/bcryptjs": "^2.4.6", + "bcryptjs": "^3.0.2", + "ethers": "^6.15.0", + "mongodb": "^6.20.0", + "mongoose": "^8.19.2", + "next": "16.0.0", + "next-auth": "^4.24.11", + "react": "19.2.0", + "react-dom": "19.2.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.0.0", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/entropy/AleaArt/frontend-aleart/postcss.config.mjs b/entropy/AleaArt/frontend-aleart/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/entropy/AleaArt/frontend-aleart/public/file.svg b/entropy/AleaArt/frontend-aleart/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entropy/AleaArt/frontend-aleart/public/globe.svg b/entropy/AleaArt/frontend-aleart/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entropy/AleaArt/frontend-aleart/public/hero-design.png b/entropy/AleaArt/frontend-aleart/public/hero-design.png new file mode 100644 index 0000000..faa374a Binary files /dev/null and b/entropy/AleaArt/frontend-aleart/public/hero-design.png differ diff --git a/entropy/AleaArt/frontend-aleart/public/landing-vector.png b/entropy/AleaArt/frontend-aleart/public/landing-vector.png new file mode 100644 index 0000000..4f6b9f8 Binary files /dev/null and b/entropy/AleaArt/frontend-aleart/public/landing-vector.png differ diff --git a/entropy/AleaArt/frontend-aleart/public/next.svg b/entropy/AleaArt/frontend-aleart/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entropy/AleaArt/frontend-aleart/public/vercel.svg b/entropy/AleaArt/frontend-aleart/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entropy/AleaArt/frontend-aleart/public/window.svg b/entropy/AleaArt/frontend-aleart/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/entropy/AleaArt/frontend-aleart/setup.sh b/entropy/AleaArt/frontend-aleart/setup.sh new file mode 100755 index 0000000..d7876af --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/setup.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +echo "๐ŸŽจ AleaArt Frontend Setup" +echo "=========================" + +# Check if .env.local exists +if [ ! -f .env.local ]; then + echo "๐Ÿ“ Creating .env.local from template..." + cp .env.local.example .env.local + echo "โœ… .env.local created! Please update it with your MongoDB URI and other settings." +else + echo "โœ… .env.local already exists" +fi + +# Check if node_modules exists +if [ ! -d "node_modules" ]; then + echo "๐Ÿ“ฆ Installing dependencies..." + npm install + echo "โœ… Dependencies installed!" +else + echo "โœ… Dependencies already installed" +fi + +echo "" +echo "๐Ÿš€ Setup complete! Next steps:" +echo "1. Update .env.local with your MongoDB URI and other settings" +echo "2. Make sure MongoDB is running" +echo "3. Run 'npm run dev' to start the development server" +echo "4. Open http://localhost:3000 in your browser" +echo "" +echo "๐Ÿ“š For more information, check the README.md file" + diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/art-tokens/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/art-tokens/route.ts new file mode 100644 index 0000000..2f12a02 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/art-tokens/route.ts @@ -0,0 +1,75 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import connectDB from '@/lib/mongodb'; +import UserAleart from '@/models/UserAleart'; + +export async function GET(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + await connectDB(); + + const user = await UserAleart.findById(session.user.id).select('artTokens'); + + if (!user) { + return NextResponse.json({ error: 'User not found' }, { status: 404 }); + } + + return NextResponse.json({ artTokens: user.artTokens }); + } catch (error) { + console.error('Get art tokens error:', error); + return NextResponse.json( + { error: 'Internal server error' }, + { status: 500 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { tokenId, requestId } = await request.json(); + + if (!tokenId || !requestId) { + return NextResponse.json( + { error: 'Missing required fields' }, + { status: 400 } + ); + } + + await connectDB(); + + const user = await UserAleart.findById(session.user.id); + + if (!user) { + return NextResponse.json({ error: 'User not found' }, { status: 404 }); + } + + const artToken = { + tokenId, + requestId, + createdAt: new Date(), + }; + + user.artTokens.push(artToken); + await user.save(); + + return NextResponse.json({ message: 'Art token saved successfully' }); + } catch (error) { + console.error('Save art token error:', error); + return NextResponse.json( + { error: 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/auth/[...nextauth]/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000..802bebd --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,7 @@ +import NextAuth from 'next-auth'; +import { authOptions } from '@/lib/auth'; + +const handler = NextAuth(authOptions); + +export { handler as GET, handler as POST }; + diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/auth/signup/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/auth/signup/route.ts new file mode 100644 index 0000000..c3f84bc --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/auth/signup/route.ts @@ -0,0 +1,56 @@ +import { NextRequest, NextResponse } from 'next/server'; +import bcrypt from 'bcryptjs'; +import connectDB from '@/lib/mongodb'; +import UserAleart from '@/models/UserAleart'; + +export async function POST(request: NextRequest) { + try { + const { name, email, password } = await request.json(); + + if (!name || !email || !password) { + return NextResponse.json( + { error: 'Name, email, and password are required' }, + { status: 400 } + ); + } + + if (password.length < 6) { + return NextResponse.json( + { error: 'Password must be at least 6 characters long' }, + { status: 400 } + ); + } + + await connectDB(); + + const existingUser = await UserAleart.findOne({ email }); + if (existingUser) { + return NextResponse.json( + { error: 'User already exists with this email' }, + { status: 400 } + ); + } + + const hashedPassword = await bcrypt.hash(password, 12); + + const user = new UserAleart({ + name, + email, + password: hashedPassword, + artTokens: [], + }); + + await user.save(); + + return NextResponse.json( + { message: 'User created successfully' }, + { status: 201 } + ); + } catch (error) { + console.error('Signup error:', error); + return NextResponse.json( + { error: 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/buy-nft/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/buy-nft/route.ts new file mode 100644 index 0000000..44c24fd --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/buy-nft/route.ts @@ -0,0 +1,69 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import { ethers } from 'ethers'; + +const NFT_CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_NFT_CONTRACT_ADDRESS || '0x806019F8a33A01a4A3fea93320601cC77B6Dcb79'; +const ARBITRUM_SEPOLIA_RPC = 'https://arbitrum-sepolia-rpc.publicnode.com'; + +// NFT Contract ABI +const NFT_CONTRACT_ABI = [ + "function buyNFT(uint256 tokenId) public payable", + "function nftData(uint256 tokenId) public view returns (tuple(uint256 tokenId, address owner, string ipfsHash, string prompt, uint256 price, bool isForSale, address creator, uint256 createdAt))" +]; + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { tokenId, price, userAddress } = await request.json(); + + if (!tokenId || !price || !userAddress) { + return NextResponse.json( + { error: 'Missing required fields' }, + { status: 400 } + ); + } + + // Connect to Arbitrum Sepolia (read-only provider) + const provider = new ethers.JsonRpcProvider(ARBITRUM_SEPOLIA_RPC); + const contract = new ethers.Contract(NFT_CONTRACT_ADDRESS, NFT_CONTRACT_ABI, provider); + + // Check if NFT is for sale and get current price + const nftData = await contract.nftData(tokenId); + if (!nftData.isForSale) { + return NextResponse.json( + { error: 'NFT is not for sale' }, + { status: 400 } + ); + } + + if (nftData.price.toString() !== price) { + return NextResponse.json( + { error: 'Price mismatch' }, + { status: 400 } + ); + } + + // Return contract details for client-side execution + return NextResponse.json({ + success: true, + contractAddress: NFT_CONTRACT_ADDRESS, + contractABI: NFT_CONTRACT_ABI, + value: price, + tokenId: tokenId, + message: 'Use these details to execute the transaction from your wallet' + }); + + } catch (error: unknown) { + console.error('NFT purchase error:', error); + return NextResponse.json( + { error: 'Failed to purchase NFT: ' + (error as Error).message }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/generate-image-async/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/generate-image-async/route.ts new file mode 100644 index 0000000..eecc214 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/generate-image-async/route.ts @@ -0,0 +1,245 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import connectDB from '@/lib/mongodb'; +import UserAleart from '@/models/UserAleart'; + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { parameters, tokenId } = await request.json(); + + if (!parameters || !tokenId) { + return NextResponse.json( + { error: 'Missing parameters or tokenId' }, + { status: 400 } + ); + } + + await connectDB(); + + const user = await UserAleart.findById(session.user.id); + + if (!user) { + return NextResponse.json({ error: 'User not found' }, { status: 404 }); + } + + // Check if image already exists for this token + const existingImage = user.generatedImages.find((img: { tokenId: number; status: string }) => img.tokenId === tokenId); + if (existingImage && existingImage.status === 'completed') { + return NextResponse.json({ + success: true, + message: 'Image already exists', + imageData: existingImage.imageData, + tokenId: tokenId + }); + } + + // Map our art parameters to Stable Diffusion parameters + const artParams = { + tokenId: tokenId, + promptIndex: parameters.promptIndex, + styleIndex: parameters.styleIndex, + samplerIndex: parameters.samplerIndex, + aspectIndex: parameters.aspectIndex, + steps: parameters.steps, + cfg: parameters.cfg / 10, // Convert from our scale (70-180) to SD scale (7.0-18.0) + latentSeed: parameters.latentSeed, + paletteId: parameters.paletteId, + }; + + // Define prompt templates based on promptIndex + const promptTemplates = [ + "retrofuturism bodywear, primitive, vintage, intricate detail, digital art, digital painting, concept art, poster, award winning", + "cyberpunk cityscape, neon lights, futuristic architecture, digital art, concept art, detailed", + "fantasy landscape, magical forest, ethereal lighting, digital painting, concept art, detailed", + "steampunk machinery, brass and copper, Victorian era, intricate detail, digital art", + "space exploration, cosmic landscapes, nebula, digital art, concept art, detailed", + "underwater world, marine life, bioluminescent, digital painting, concept art", + "medieval fantasy, castle, dragons, magical atmosphere, digital art, detailed", + "post-apocalyptic wasteland, ruins, desolate landscape, digital art, concept art", + "alien planet, exotic flora and fauna, otherworldly, digital painting, detailed", + "ancient civilization, pyramids, desert, mystical atmosphere, digital art", + "arctic wilderness, aurora borealis, ice formations, digital painting, concept art", + "tropical paradise, lush vegetation, crystal clear water, digital art, detailed" + ]; + + // Define style modifiers based on styleIndex + const styleModifiers = [ + "max detail, 8k, ultra realistic", + "artistic, painterly, brush strokes", + "minimalist, clean, simple", + "baroque, ornate, decorative", + "impressionist, soft, dreamy", + "expressionist, bold, dramatic", + "surreal, abstract, dreamlike", + "photorealistic, detailed, sharp", + "watercolor, soft, flowing", + "oil painting, rich, textured" + ]; + + // Define aspect ratios based on aspectIndex + const aspectRatios = [ + "square, 1:1", + "landscape, 16:9", + "portrait, 9:16", + "wide, 21:9", + "tall, 3:4" + ]; + + // Define samplers based on samplerIndex + const samplers = [ + "DPM++ 2M Karras", + "DPM++ SDE Karras", + "Euler a", + "DPM++ 2M", + "DPM++ SDE", + "LMS" + ]; + + // Build the final prompt + const basePrompt = promptTemplates[artParams.promptIndex] || promptTemplates[0]; + const styleModifier = styleModifiers[artParams.styleIndex] || styleModifiers[0]; + const aspectRatio = aspectRatios[artParams.aspectIndex] || aspectRatios[0]; + + const finalPrompt = `${basePrompt}, ${styleModifier}, ${aspectRatio} | max detail | 8k`; + + // Prepare the request for Python backend + const pythonRequest = { + prompt: finalPrompt, + steps: artParams.steps, + cfg_scale: artParams.cfg, + seed: artParams.latentSeed, + sampler: samplers[artParams.samplerIndex] || samplers[0], + width: artParams.aspectIndex === 1 ? 1024 : artParams.aspectIndex === 2 ? 768 : 512, + height: artParams.aspectIndex === 2 ? 1024 : artParams.aspectIndex === 1 ? 576 : 512, + tokenId: artParams.tokenId, + userId: session.user.id // Add user ID + }; + + // Create a placeholder image entry with 'generating' status + const imageEntry = { + tokenId: artParams.tokenId, + // imageData will be added when generation completes + prompt: finalPrompt, + parameters: { + steps: artParams.steps, + cfg_scale: artParams.cfg, + seed: artParams.latentSeed, + width: pythonRequest.width, + height: pythonRequest.height, + }, + status: 'generating' as const, + createdAt: new Date(), + }; + + // Add to user's generated images + user.generatedImages.push(imageEntry); + await user.save(); + + // Start async image generation (don't await) + generateImageAsync(session.user.id, tokenId, pythonRequest); + + return NextResponse.json({ + success: true, + message: 'Image generation started. Your art will be ready in a few minutes!', + tokenId: artParams.tokenId, + status: 'generating' + }); + + } catch (error: unknown) { + console.error('Image generation error:', error); + return NextResponse.json( + { error: 'Failed to start image generation' }, + { status: 500 } + ); + } +} + +async function generateImageAsync(userId: string, tokenId: number, pythonRequest: { + prompt: string; + steps: number; + cfg_scale: number; + seed: number; + sampler: string; + width: number; + height: number; + tokenId: number; + userId: string; +}) { + try { + console.log(`Starting async image generation for token ${tokenId}`); + + // Call Python backend with longer timeout + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 20 * 60 * 1000); // 20 minutes timeout + + const pythonResponse = await fetch('http://localhost:8000/generate-image', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(pythonRequest), + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + if (!pythonResponse.ok) { + throw new Error(`Python backend failed with status ${pythonResponse.status}`); + } + + const result = await pythonResponse.json(); + console.log(`Python backend response for token ${tokenId}:`, result.success ? 'Success' : 'Failed'); + + if (result.success) { + // Update the image entry in MongoDB with IPFS data + await connectDB(); + const user = await UserAleart.findById(userId); + + if (user) { + const imageEntry = user.generatedImages.find((img: { tokenId: number; status: string }) => img.tokenId === tokenId); + if (imageEntry) { + // Update with IPFS data instead of base64 + imageEntry.ipfsHash = result.ipfsHash; + imageEntry.ipfsUrl = result.ipfsUrl; + imageEntry.imageData = result.imageBase64; // Keep base64 as fallback + imageEntry.status = 'completed'; + await user.save(); + console.log(`โœ… Image generation completed and saved for token ${tokenId}`); + console.log(`๐ŸŒ IPFS URL: ${result.ipfsUrl}`); + } else { + console.log(`โŒ Image entry not found for token ${tokenId}`); + } + } else { + console.log(`โŒ User not found for ID ${userId}`); + } + } else { + throw new Error(result.error || 'Image generation failed'); + } + } catch (error) { + console.error(`โŒ Async image generation failed for token ${tokenId}:`, error); + + // Update status to failed + try { + await connectDB(); + const user = await UserAleart.findById(userId); + + if (user) { + const imageEntry = user.generatedImages.find((img: { tokenId: number; status: string }) => img.tokenId === tokenId); + if (imageEntry) { + imageEntry.status = 'failed'; + await user.save(); + console.log(`๐Ÿ“ Updated status to failed for token ${tokenId}`); + } + } + } catch (dbError) { + console.error('โŒ Failed to update image status:', dbError); + } + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/generate-image/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/generate-image/route.ts new file mode 100644 index 0000000..8b3ad15 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/generate-image/route.ts @@ -0,0 +1,125 @@ +import { NextRequest, NextResponse } from 'next/server'; + +export async function POST(request: NextRequest) { + try { + const { parameters, tokenId } = await request.json(); + + if (!parameters || !tokenId) { + return NextResponse.json( + { error: 'Missing parameters or tokenId' }, + { status: 400 } + ); + } + + // Map our art parameters to Stable Diffusion parameters + const artParams = { + tokenId: tokenId, + promptIndex: parameters.promptIndex, + styleIndex: parameters.styleIndex, + samplerIndex: parameters.samplerIndex, + aspectIndex: parameters.aspectIndex, + steps: parameters.steps, + cfg: parameters.cfg / 10, // Convert from our scale (70-180) to SD scale (7.0-18.0) + latentSeed: parameters.latentSeed, + paletteId: parameters.paletteId, + }; + + // Define prompt templates based on promptIndex + const promptTemplates = [ + "retrofuturism bodywear, primitive, vintage, intricate detail, digital art, digital painting, concept art, poster, award winning", + "cyberpunk cityscape, neon lights, futuristic architecture, digital art, concept art, detailed", + "fantasy landscape, magical forest, ethereal lighting, digital painting, concept art, detailed", + "steampunk machinery, brass and copper, Victorian era, intricate detail, digital art", + "space exploration, cosmic landscapes, nebula, digital art, concept art, detailed", + "underwater world, marine life, bioluminescent, digital painting, concept art", + "medieval fantasy, castle, dragons, magical atmosphere, digital art, detailed", + "post-apocalyptic wasteland, ruins, desolate landscape, digital art, concept art", + "alien planet, exotic flora and fauna, otherworldly, digital painting, detailed", + "ancient civilization, pyramids, desert, mystical atmosphere, digital art", + "arctic wilderness, aurora borealis, ice formations, digital painting, concept art", + "tropical paradise, lush vegetation, crystal clear water, digital art, detailed" + ]; + + // Define style modifiers based on styleIndex + const styleModifiers = [ + "max detail, 8k, ultra realistic", + "artistic, painterly, brush strokes", + "minimalist, clean, simple", + "baroque, ornate, decorative", + "impressionist, soft, dreamy", + "expressionist, bold, dramatic", + "surreal, abstract, dreamlike", + "photorealistic, detailed, sharp", + "watercolor, soft, flowing", + "oil painting, rich, textured" + ]; + + // Define aspect ratios based on aspectIndex + const aspectRatios = [ + "square, 1:1", + "landscape, 16:9", + "portrait, 9:16", + "wide, 21:9", + "tall, 3:4" + ]; + + // Define samplers based on samplerIndex + const samplers = [ + "DPM++ 2M Karras", + "DPM++ SDE Karras", + "Euler a", + "DPM++ 2M", + "DPM++ SDE", + "LMS" + ]; + + // Build the final prompt + const basePrompt = promptTemplates[artParams.promptIndex] || promptTemplates[0]; + const styleModifier = styleModifiers[artParams.styleIndex] || styleModifiers[0]; + const aspectRatio = aspectRatios[artParams.aspectIndex] || aspectRatios[0]; + + const finalPrompt = `${basePrompt}, ${styleModifier}, ${aspectRatio} | max detail | 8k`; + + // Prepare the request for Python backend + const pythonRequest = { + prompt: finalPrompt, + steps: artParams.steps, + cfg_scale: artParams.cfg, + seed: artParams.latentSeed, + sampler: samplers[artParams.samplerIndex] || samplers[0], + width: artParams.aspectIndex === 1 ? 1024 : artParams.aspectIndex === 2 ? 768 : 512, + height: artParams.aspectIndex === 2 ? 1024 : artParams.aspectIndex === 1 ? 576 : 512, + tokenId: artParams.tokenId + }; + + // Call Python backend (you'll need to implement this endpoint) + const pythonResponse = await fetch('http://localhost:8000/generate-image', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(pythonRequest), + }); + + if (!pythonResponse.ok) { + throw new Error('Python backend failed to generate image'); + } + + const result = await pythonResponse.json(); + + return NextResponse.json({ + success: true, + imageUrl: result.imageUrl, + tokenId: artParams.tokenId, + prompt: finalPrompt, + parameters: artParams + }); + + } catch (error: unknown) { + console.error('Image generation error:', error); + return NextResponse.json( + { error: 'Failed to generate image' }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/images/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/images/route.ts new file mode 100644 index 0000000..a77ebf8 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/images/route.ts @@ -0,0 +1,113 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import connectDB from '@/lib/mongodb'; +import { MongoClient } from 'mongodb'; +import UserAleart from '@/models/UserAleart'; + +export async function GET(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { searchParams } = new URL(request.url); + const tokenId = searchParams.get('tokenId'); + + if (!tokenId) { + return NextResponse.json( + { error: 'Missing tokenId parameter' }, + { status: 400 } + ); + } + + await connectDB(); + + // Connect to MongoDB directly to access the generatedImages collection + const client = new MongoClient(process.env.MONGODB_URI!); + await client.connect(); + const db = client.db('aleart'); + + const imageEntry = await db.collection('generatedImages') + .findOne({ + userId: session.user.id, + tokenId: parseInt(tokenId) + }); + + await client.close(); + + if (!imageEntry) { + return NextResponse.json({ error: 'Image not found' }, { status: 404 }); + } + + return NextResponse.json({ + success: true, + tokenId: imageEntry.tokenId, + status: imageEntry.status, + ipfsHash: imageEntry.ipfsHash || null, + ipfsUrl: imageEntry.ipfsUrl || null, + imageData: imageEntry.status === 'completed' && imageEntry.imageData ? imageEntry.imageData : null, + prompt: imageEntry.prompt, + parameters: imageEntry.parameters, + createdAt: imageEntry.createdAt + }); + + } catch (error: unknown) { + console.error('Image status check error:', error); + return NextResponse.json( + { error: 'Failed to check image status' }, + { status: 500 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { tokenId } = await request.json(); + + if (!tokenId) { + return NextResponse.json( + { error: 'Missing tokenId' }, + { status: 400 } + ); + } + + await connectDB(); + + const user = await UserAleart.findById(session.user.id); + + if (!user) { + return NextResponse.json({ error: 'User not found' }, { status: 404 }); + } + + // Get all generated images for the user + const generatedImages = user.generatedImages.map((img: { tokenId: number; status: string; imageData?: string; prompt: string; parameters: unknown; createdAt: Date }) => ({ + tokenId: img.tokenId, + status: img.status, + imageData: img.status === 'completed' && img.imageData ? img.imageData : null, + prompt: img.prompt, + parameters: img.parameters, + createdAt: img.createdAt + })); + + return NextResponse.json({ + success: true, + images: generatedImages + }); + + } catch (error: unknown) { + console.error('Get images error:', error); + return NextResponse.json( + { error: 'Failed to get images' }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/manual-update-image/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/manual-update-image/route.ts new file mode 100644 index 0000000..9907597 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/manual-update-image/route.ts @@ -0,0 +1,96 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import connectDB from '@/lib/mongodb'; +import UserAleart from '@/models/UserAleart'; +import fs from 'fs'; +import path from 'path'; + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { tokenId } = await request.json(); + + if (!tokenId) { + return NextResponse.json( + { error: 'Missing tokenId' }, + { status: 400 } + ); + } + + await connectDB(); + + const user = await UserAleart.findById(session.user.id); + + if (!user) { + return NextResponse.json({ error: 'User not found' }, { status: 404 }); + } + + // Find the generating image entry + const imageEntry = user.generatedImages.find((img: { tokenId: number; status: string }) => img.tokenId === tokenId && img.status === 'generating'); + + if (!imageEntry) { + return NextResponse.json({ error: 'No generating image found for this token' }, { status: 404 }); + } + + // Check if there's a generated image file + const generatedImagesDir = path.join(process.cwd(), '..', 'generated_images'); + + if (!fs.existsSync(generatedImagesDir)) { + return NextResponse.json({ error: 'Generated images directory not found' }, { status: 404 }); + } + + const imageFiles = fs.readdirSync(generatedImagesDir) + .filter(file => file.startsWith(`art_token_${tokenId}_`)) + .map(file => ({ + name: file, + path: path.join(generatedImagesDir, file), + mtime: fs.statSync(path.join(generatedImagesDir, file)).mtime + })) + .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); + + if (imageFiles.length === 0) { + return NextResponse.json({ error: 'No generated image files found for this token' }, { status: 404 }); + } + + // Use the most recent image file + const latestImage = imageFiles[0]; + + try { + // Read and encode the image + const imageBuffer = fs.readFileSync(latestImage.path); + const imageBase64 = imageBuffer.toString('base64'); + + // Update the database + imageEntry.imageData = imageBase64; + imageEntry.status = 'completed'; + + await user.save(); + + return NextResponse.json({ + success: true, + message: 'Image data updated successfully', + tokenId: tokenId, + imageFile: latestImage.name, + imageSize: imageBase64.length + }); + + } catch (error) { + console.error('Error reading image file:', error); + return NextResponse.json({ error: 'Failed to read image file' }, { status: 500 }); + } + + } catch (error: unknown) { + console.error('Manual update error:', error); + return NextResponse.json( + { error: 'Failed to update image data' }, + { status: 500 } + ); + } +} + diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/marketplace/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/marketplace/route.ts new file mode 100644 index 0000000..f43dc31 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/marketplace/route.ts @@ -0,0 +1,54 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import { ethers } from 'ethers'; + +const NFT_CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_NFT_CONTRACT_ADDRESS || '0x806019F8a33A01a4A3fea93320601cC77B6Dcb79'; +const ARBITRUM_SEPOLIA_RPC = 'https://arbitrum-sepolia-rpc.publicnode.com'; + +// NFT Contract ABI +const NFT_CONTRACT_ABI = [ + "function getAllNFTs() public view returns (tuple(uint256 tokenId, address owner, string ipfsHash, string prompt, uint256 price, bool isForSale, address creator, uint256 createdAt)[])", + "function getNFTsForSale() public view returns (tuple(uint256 tokenId, address owner, string ipfsHash, string prompt, uint256 price, bool isForSale, address creator, uint256 createdAt)[])" +]; + +export async function GET(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + // Connect to Arbitrum Sepolia + const provider = new ethers.JsonRpcProvider(ARBITRUM_SEPOLIA_RPC); + const contract = new ethers.Contract(NFT_CONTRACT_ADDRESS, NFT_CONTRACT_ABI, provider); + + // Fetch all NFTs from the contract + const allNFTs = await contract.getAllNFTs(); + + // Convert the contract data to a more usable format + const nfts = allNFTs.map((nft: any) => ({ + tokenId: Number(nft.tokenId), + owner: nft.owner, + ipfsHash: nft.ipfsHash, + prompt: nft.prompt, + price: nft.price.toString(), + isForSale: nft.isForSale, + creator: nft.creator, + createdAt: Number(nft.createdAt) + })); + + return NextResponse.json({ + success: true, + nfts: nfts + }); + + } catch (error: unknown) { + console.error('Marketplace fetch error:', error); + return NextResponse.json( + { error: 'Failed to fetch NFTs: ' + (error as Error).message }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/mint-nft/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/mint-nft/route.ts new file mode 100644 index 0000000..7ec153d --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/mint-nft/route.ts @@ -0,0 +1,50 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; + +const NFT_CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_NFT_CONTRACT_ADDRESS || '0x806019F8a33A01a4A3fea93320601cC77B6Dcb79'; + +// NFT Contract ABI - only the functions we need +const NFT_CONTRACT_ABI = [ + "function mintNFT(address to, string memory ipfsHash, string memory prompt, uint256 price) public returns (uint256)", + "function owner() public view returns (address)", + "function nftData(uint256 tokenId) public view returns (tuple(uint256 tokenId, address owner, string ipfsHash, string prompt, uint256 price, bool isForSale, address creator, uint256 createdAt))", + "function getAllNFTs() public view returns (tuple(uint256 tokenId, address owner, string ipfsHash, string prompt, uint256 price, bool isForSale, address creator, uint256 createdAt)[])", + "function getNFTsForSale() public view returns (tuple(uint256 tokenId, address owner, string ipfsHash, string prompt, uint256 price, bool isForSale, address creator, uint256 createdAt)[])" +]; + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { tokenId, ipfsHash, prompt, price, userAddress } = await request.json(); + + if (!tokenId || !ipfsHash || !prompt || !userAddress) { + return NextResponse.json( + { error: 'Missing required fields' }, + { status: 400 } + ); + } + + // Return the transaction data for the frontend to sign and send + return NextResponse.json({ + success: true, + contractAddress: NFT_CONTRACT_ADDRESS, + contractABI: NFT_CONTRACT_ABI, + functionName: 'mintNFT', + functionArgs: [userAddress, ipfsHash, prompt, price], + message: 'Transaction data prepared for user wallet signing' + }); + + } catch (error: unknown) { + console.error('NFT minting error:', error); + return NextResponse.json( + { error: 'Failed to prepare mint transaction: ' + (error as Error).message }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/recover-image/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/recover-image/route.ts new file mode 100644 index 0000000..da59240 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/recover-image/route.ts @@ -0,0 +1,96 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import connectDB from '@/lib/mongodb'; +import UserAleart from '@/models/UserAleart'; +import fs from 'fs'; +import path from 'path'; + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { tokenId } = await request.json(); + + if (!tokenId) { + return NextResponse.json( + { error: 'Missing tokenId' }, + { status: 400 } + ); + } + + await connectDB(); + + const user = await UserAleart.findById(session.user.id); + + if (!user) { + return NextResponse.json({ error: 'User not found' }, { status: 404 }); + } + + // Find the generating image entry + const imageEntry = user.generatedImages.find((img: { tokenId: number; status: string }) => img.tokenId === tokenId && img.status === 'generating'); + + if (!imageEntry) { + return NextResponse.json({ error: 'No generating image found for this token' }, { status: 404 }); + } + + // Check if there's a generated image file + const generatedImagesDir = path.join(process.cwd(), '..', 'generated_images'); + + if (!fs.existsSync(generatedImagesDir)) { + return NextResponse.json({ error: 'Generated images directory not found' }, { status: 404 }); + } + + const imageFiles = fs.readdirSync(generatedImagesDir) + .filter(file => file.startsWith(`art_token_${tokenId}_`)) + .map(file => ({ + name: file, + path: path.join(generatedImagesDir, file), + mtime: fs.statSync(path.join(generatedImagesDir, file)).mtime + })) + .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); + + if (imageFiles.length === 0) { + return NextResponse.json({ error: 'No generated image files found for this token' }, { status: 404 }); + } + + // Use the most recent image file + const latestImage = imageFiles[0]; + + try { + // Read and encode the image + const imageBuffer = fs.readFileSync(latestImage.path); + const imageBase64 = imageBuffer.toString('base64'); + + // Update the database + imageEntry.imageData = imageBase64; + imageEntry.status = 'completed'; + + await user.save(); + + return NextResponse.json({ + success: true, + message: 'Image data updated successfully', + tokenId: tokenId, + imageFile: latestImage.name, + imageSize: imageBase64.length + }); + + } catch (error) { + console.error('Error reading image file:', error); + return NextResponse.json({ error: 'Failed to read image file' }, { status: 500 }); + } + + } catch (error: any) { + console.error('Manual update error:', error); + return NextResponse.json( + { error: 'Failed to update image data' }, + { status: 500 } + ); + } +} + diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/request-spotlight/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/request-spotlight/route.ts new file mode 100644 index 0000000..34e81dd --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/request-spotlight/route.ts @@ -0,0 +1,64 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import { ethers } from 'ethers'; + +const SPOTLIGHT_CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_SPOTLIGHT_CONTRACT_ADDRESS || '0xd596C7C17331013C85c791092247e33267d9291e'; +const RPC_URL = 'https://arbitrum-sepolia-rpc.publicnode.com'; + +const SPOTLIGHT_CONTRACT_ABI = [ + "function requestSpotlight() external payable", + "function spotlightFee() external view returns (uint256)", + "function getBalance() external view returns (uint256)" +]; + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + if (SPOTLIGHT_CONTRACT_ADDRESS === '0x0000000000000000000000000000000000000000') { + return NextResponse.json({ + success: false, + error: 'Spotlight contract not deployed' + }); + } + + const { userAddress } = await request.json(); + + if (!userAddress) { + return NextResponse.json( + { error: 'Missing user address' }, + { status: 400 } + ); + } + + const provider = new ethers.JsonRpcProvider(RPC_URL); + const contract = new ethers.Contract(SPOTLIGHT_CONTRACT_ADDRESS, SPOTLIGHT_CONTRACT_ABI, provider); + + // Get the spotlight fee + const fee = await contract.spotlightFee(); + const feeInEth = ethers.formatEther(fee); + + return NextResponse.json({ + success: true, + contractAddress: SPOTLIGHT_CONTRACT_ADDRESS, + contractABI: SPOTLIGHT_CONTRACT_ABI, + functionName: 'requestSpotlight', + functionArgs: [], + value: fee.toString(), + feeInEth: feeInEth, + message: 'Transaction data prepared for user wallet signing' + }); + + } catch (error: unknown) { + console.error('Spotlight request error:', error); + return NextResponse.json( + { error: 'Failed to prepare spotlight request: ' + (error as Error).message }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/spotlight/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/spotlight/route.ts new file mode 100644 index 0000000..304935d --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/spotlight/route.ts @@ -0,0 +1,96 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { ethers } from 'ethers'; + +const SPOTLIGHT_CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_SPOTLIGHT_CONTRACT_ADDRESS || '0xd596C7C17331013C85c791092247e33267d9291e'; +const RPC_URL = 'https://arbitrum-sepolia-rpc.publicnode.com'; + +const SPOTLIGHT_CONTRACT_ABI = [ + "function getCurrentSpotlight() external view returns (tuple(uint256 tokenId, address owner, string ipfsHash, string prompt, uint256 price, bool isForSale, address creator, uint256 createdAt, uint256 spotlightStartTime, uint256 spotlightDuration, bool isActive))", + "function isSpotlightActive(uint256 spotlightId) external view returns (bool)", + "function getSpotlight(uint256 spotlightId) external view returns (tuple(uint256 tokenId, address owner, string ipfsHash, string prompt, uint256 price, bool isForSale, address creator, uint256 createdAt, uint256 spotlightStartTime, uint256 spotlightDuration, bool isActive))", + "function currentSpotlightId() external view returns (uint256)", + "function spotlightDuration() external view returns (uint256)", + "function spotlightFee() external view returns (uint256)" +]; + +export async function GET(request: NextRequest) { + try { + if (SPOTLIGHT_CONTRACT_ADDRESS === '0x0000000000000000000000000000000000000000') { + return NextResponse.json({ + success: false, + error: 'Spotlight contract not deployed' + }); + } + + const provider = new ethers.JsonRpcProvider(RPC_URL); + const contract = new ethers.Contract(SPOTLIGHT_CONTRACT_ADDRESS, SPOTLIGHT_CONTRACT_ABI, provider); + + // Check if user can request spotlight (only specific wallet address) + const canRequestSpotlight = request.headers.get('x-wallet-address') === '0xBEdD38f260e3C936d0A743A57F211cde97f7401F'; + + try { + // First check if there are any spotlights at all + const currentSpotlightId = await contract.currentSpotlightId(); + + if (currentSpotlightId.toString() === '0') { + return NextResponse.json({ + success: true, + spotlight: null, + canRequestSpotlight: canRequestSpotlight + }); + } + + // Try to get current spotlight + const spotlight = await contract.getCurrentSpotlight(); + + // Format the spotlight data + const spotlightData = { + tokenId: Number(spotlight.tokenId), + owner: spotlight.owner, + ipfsHash: spotlight.ipfsHash, + prompt: spotlight.prompt, + price: spotlight.price.toString(), + isForSale: spotlight.isForSale, + creator: spotlight.creator, + createdAt: Number(spotlight.createdAt), + spotlightStartTime: Number(spotlight.spotlightStartTime), + spotlightDuration: Number(spotlight.spotlightDuration), + isActive: spotlight.isActive, + spotlightEndTime: Number(spotlight.spotlightStartTime) + Number(spotlight.spotlightDuration), + timeRemaining: Math.max(0, (Number(spotlight.spotlightStartTime) + Number(spotlight.spotlightDuration)) - Math.floor(Date.now() / 1000)) + }; + + return NextResponse.json({ + success: true, + spotlight: spotlightData, + canRequestSpotlight: canRequestSpotlight + }); + + } catch (error) { + console.log('Contract call error:', error); + + // If no active spotlight, return empty result + if (error instanceof Error && (error.message.includes('No spotlight available') || + error.message.includes('No active spotlight') || + error.message.includes('Spotlight expired'))) { + return NextResponse.json({ + success: true, + spotlight: null, + canRequestSpotlight: canRequestSpotlight + }); + } + + throw error; + } + + } catch (error: unknown) { + console.error('Error fetching spotlight:', error); + return NextResponse.json( + { + success: false, + error: 'Failed to fetch spotlight: ' + (error as Error).message + }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/user-images/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/user-images/route.ts new file mode 100644 index 0000000..dcbf0cc --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/user-images/route.ts @@ -0,0 +1,45 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import connectDB from '@/lib/mongodb'; +import { MongoClient } from 'mongodb'; + +export async function GET(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + await connectDB(); + + // Connect to MongoDB directly to access the generatedImages collection + const client = new MongoClient(process.env.MONGODB_URI!); + await client.connect(); + const db = client.db('aleart'); + + // Get all completed images for the user from the generatedImages collection + const completedImages = await db.collection('generatedImages') + .find({ + userId: session.user.id, + status: 'completed' + }) + .sort({ createdAt: -1 }) // Sort by newest first + .toArray(); + + await client.close(); + + return NextResponse.json({ + success: true, + images: completedImages + }); + + } catch (error: unknown) { + console.error('Error fetching images:', error); + return NextResponse.json( + { error: 'Failed to fetch images' }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/api/wallet/connect/route.ts b/entropy/AleaArt/frontend-aleart/src/app/api/wallet/connect/route.ts new file mode 100644 index 0000000..d0c77f9 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/api/wallet/connect/route.ts @@ -0,0 +1,43 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import connectDB from '@/lib/mongodb'; +import UserAleart from '@/models/UserAleart'; + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + + if (!session) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); + } + + const { walletAddress } = await request.json(); + + if (!walletAddress) { + return NextResponse.json( + { error: 'Wallet address is required' }, + { status: 400 } + ); + } + + await connectDB(); + + const user = await UserAleart.findById(session.user.id); + + if (!user) { + return NextResponse.json({ error: 'User not found' }, { status: 404 }); + } + + user.walletAddress = walletAddress; + await user.save(); + + return NextResponse.json({ message: 'Wallet connected successfully' }); + } catch (error) { + console.error('Connect wallet error:', error); + return NextResponse.json( + { error: 'Internal server error' }, + { status: 500 } + ); + } +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/dashboard/page.tsx b/entropy/AleaArt/frontend-aleart/src/app/dashboard/page.tsx new file mode 100644 index 0000000..17b4c83 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/dashboard/page.tsx @@ -0,0 +1,806 @@ +'use client'; + +import { useState, useEffect } from 'react'; +import { useSession } from 'next-auth/react'; +import { useRouter } from 'next/navigation'; +import { BrowserProvider, Contract, parseEther, ethers } from 'ethers'; +import { ArtToken } from '@/types'; +import Navbar from '@/components/Navbar'; + +// Extend Window interface to include ethereum +interface EthereumProvider { + request: (args: { method: string; params?: unknown[] }) => Promise; + send: (method: string, params?: unknown[]) => Promise; + on: (event: string, callback: (...args: unknown[]) => void) => void; + removeListener: (event: string, callback: (...args: unknown[]) => void) => void; +} + +declare global { + interface Window { + ethereum?: EthereumProvider; + } +} + +interface ArtTokenCardProps { + token: ArtToken; + fetchTokenParameters: (tokenId: number) => Promise<{ + tokenId: number; + seed: string; + parameters: { + promptIndex: number; + styleIndex: number; + samplerIndex: number; + aspectIndex: number; + steps: number; + cfg: number; + latentSeed: number; + paletteId: number; + }; + } | null>; +} + +function ArtTokenCard({ token, fetchTokenParameters }: ArtTokenCardProps) { + const [parameters, setParameters] = useState<{ + tokenId: number; + seed: string; + parameters: { + promptIndex: number; + styleIndex: number; + samplerIndex: number; + aspectIndex: number; + steps: number; + cfg: number; + latentSeed: number; + paletteId: number; + }; + } | null>(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + const [generatingImage, setGeneratingImage] = useState(false); + const [generatedImage, setGeneratedImage] = useState(null); + + const loadParameters = async () => { + if (parameters) return; // Already loaded + + setLoading(true); + setError(''); + + try { + const params = await fetchTokenParameters(token.tokenId); + if (params) { + setParameters(params); + } else { + setError('Failed to load parameters'); + } + } catch { + setError('Failed to load parameters'); + } finally { + setLoading(false); + } + }; + + const generateImage = async () => { + if (!parameters) return; + + setGeneratingImage(true); + setError(''); + + try { + const response = await fetch('/api/generate-image-async', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + parameters: parameters.parameters, + tokenId: token.tokenId + }), + }); + + const result = await response.json(); + + if (result.success) { + // Show success message + alert('Image generation started! Your art will be ready in a few minutes. You can check the status by refreshing the page.'); + + // Start polling for status updates + pollImageStatus(); + } else { + setError('Failed to start image generation'); + } + } catch { + setError('Failed to start image generation'); + } finally { + setGeneratingImage(false); + } + }; + + const pollImageStatus = async () => { + const maxAttempts = 30; // Poll for up to 5 minutes (10 seconds * 30) + let attempts = 0; + + const poll = async () => { + try { + const response = await fetch(`/api/images?tokenId=${token.tokenId}`); + if (response.ok) { + const result = await response.json(); + + if (result.status === 'completed') { + // Image is ready, update the UI + setGeneratedImage(result.imageData); + setGeneratingImage(false); + return; + } else if (result.status === 'failed') { + setError('Image generation failed'); + setGeneratingImage(false); + return; + } + } + + attempts++; + if (attempts < maxAttempts) { + setTimeout(poll, 10000); // Poll every 10 seconds + } else { + setError('Image generation timed out'); + setGeneratingImage(false); + } + } catch (error) { + console.error('Error polling image status:', error); + attempts++; + if (attempts < maxAttempts) { + setTimeout(poll, 10000); + } else { + setError('Failed to check image status'); + setGeneratingImage(false); + } + } + }; + + poll(); + }; + + return ( +
+
+

Token #{token.tokenId}

+ Ready +
+ + {!parameters ? ( +
+ + {error &&

{error}

} +
+ ) : ( +
+
+
+ Prompt: {parameters.parameters.promptIndex}/12 +
+
+ Style: {parameters.parameters.styleIndex}/10 +
+
+ Sampler: {parameters.parameters.samplerIndex}/6 +
+
+ Aspect: {parameters.parameters.aspectIndex}/5 +
+
+ Steps: {parameters.parameters.steps} +
+
+ CFG: {(parameters.parameters.cfg / 10).toFixed(1)} +
+
+ Palette: {parameters.parameters.paletteId}/24 +
+
+ Seed: {parameters.parameters.latentSeed} +
+
+ +
+ +
+ + {generatedImage && ( +
+

Generated Image:

+ {`Generated +
+ )} +
+ )} + +
+ Generated: {new Date(token.createdAt).toLocaleString()} +
+
+ ); +} + +export default function DashboardPage() { + const { data: session, status } = useSession(); + const router = useRouter(); + const [walletConnected, setWalletConnected] = useState(false); + const [walletAddress, setWalletAddress] = useState(''); + const [artTokens, setArtTokens] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + const [success, setSuccess] = useState(''); + const [generatedImages, setGeneratedImages] = useState<{ + tokenId: number; + imageData: string; + prompt: string; + createdAt: string; + ipfsHash?: string; + ipfsUrl?: string; + }[]>([]); + const [loadingImages, setLoadingImages] = useState(false); + const [mintingNFT, setMintingNFT] = useState(null); + const [showPriceInput, setShowPriceInput] = useState(null); + const [nftPrice, setNftPrice] = useState('0'); + + const CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_CONTRACT_ADDRESS || '0x420D121aE08007Ef0A66E67D5D7BfFdC98AbECF0'; + const CONTRACT_ABI = [ + "function requestArtParams() external payable returns (uint256 tokenId, uint64 requestId)", + "function viewRenderParams(uint256 tokenId) external view returns (tuple(uint8 promptIndex, uint8 styleIndex, uint8 samplerIndex, uint8 aspectIndex, uint16 steps, uint16 cfg, uint32 latentSeed, uint16 paletteId))", + "function tokenSeed(uint256 tokenId) external view returns (bytes32)", + "function nextTokenId() external view returns (uint256)", + "event EntropyRequested(uint256 indexed tokenId, uint64 indexed requestId, uint256 feePaid)", + "event EntropyFulfilled(uint256 indexed tokenId, bytes32 seed)" + ]; + + useEffect(() => { + if (status === 'unauthenticated') { + router.push('/login'); + } + }, [status, router]); + + useEffect(() => { + if (session) { + fetchArtTokens(); + checkWalletConnection(); + fetchGeneratedImages(); + } + }, [session]); + + const checkWalletConnection = async () => { + try { + if (typeof window.ethereum !== 'undefined') { + const provider = new BrowserProvider(window.ethereum!); + const accounts = await provider.send('eth_accounts', []); + + if (accounts.length > 0) { + const signer = await provider.getSigner(); + const address = await signer.getAddress(); + setWalletAddress(address); + setWalletConnected(true); + console.log('Wallet already connected:', address); + } + } + } catch { + console.log('No wallet connected'); + } + }; + + const fetchTokenParameters = async (tokenId: number) => { + try { + const provider = new BrowserProvider(window.ethereum!); + const contract = new Contract(CONTRACT_ADDRESS, CONTRACT_ABI, provider); + + const params = await contract.viewRenderParams(tokenId); + const seed = await contract.tokenSeed(tokenId); + + return { + tokenId, + seed: seed, + parameters: { + promptIndex: Number(params.promptIndex), + styleIndex: Number(params.styleIndex), + samplerIndex: Number(params.samplerIndex), + aspectIndex: Number(params.aspectIndex), + steps: Number(params.steps), + cfg: Number(params.cfg), + latentSeed: Number(params.latentSeed), + paletteId: Number(params.paletteId), + } + }; + } catch (error) { + console.error(`Failed to fetch parameters for token ${tokenId}:`, error); + return null; + } + }; + + const fetchArtTokens = async () => { + try { + const response = await fetch('/api/art-tokens'); + if (response.ok) { + const data = await response.json(); + setArtTokens(data.artTokens || []); + } + } catch (error) { + console.error('Failed to fetch art tokens:', error); + } + }; + + const fetchGeneratedImages = async () => { + try { + setLoadingImages(true); + const response = await fetch('/api/user-images'); + if (response.ok) { + const data = await response.json(); + console.log('Fetched images data:', data); + setGeneratedImages(data.images || []); + } + } catch (error) { + console.error('Error fetching generated images:', error); + } finally { + setLoadingImages(false); + } + }; + + const showPriceInputForNFT = (tokenId: number) => { + setShowPriceInput(tokenId); + setNftPrice('0'); + }; + + const mintNFT = async (image: { + tokenId: number; + ipfsHash?: string; + prompt: string; + }) => { + try { + setMintingNFT(image.tokenId); + + // Get user's wallet address + if (!window.ethereum) { + alert('Please install MetaMask!'); + return; + } + + const provider = new BrowserProvider(window.ethereum); + const signer = await provider.getSigner(); + const userAddress = await signer.getAddress(); + + // Use the price from state + const priceInWei = parseFloat(nftPrice) * 1e18; + + // Get transaction data from API + const response = await fetch('/api/mint-nft', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + tokenId: image.tokenId, + ipfsHash: image.ipfsHash, + prompt: image.prompt, + price: priceInWei.toString(), + userAddress: userAddress, + }), + }); + + const data = await response.json(); + + if (!data.success) { + alert(`Failed to prepare mint transaction: ${data.error}`); + return; + } + + // Create contract instance with user's signer + const contract = new ethers.Contract(data.contractAddress, data.contractABI, signer); + + // Call the mintNFT function directly with user's wallet + const tx = await contract.mintNFT(...data.functionArgs); + + console.log('Minting transaction sent:', tx.hash); + + // Wait for transaction confirmation + const receipt = await tx.wait(); + + console.log('Transaction confirmed:', receipt); + + // Get the token ID from the transaction logs + const mintEvent = receipt.logs.find((log: ethers.Log) => { + try { + const parsed = contract.interface.parseLog(log); + return parsed?.name === 'NFTMinted'; + } catch { + return false; + } + }); + + let mintedTokenId = image.tokenId; // fallback + + if (mintEvent) { + const parsed = contract.interface.parseLog(mintEvent); + if (parsed) { + mintedTokenId = parsed.args.tokenId.toString(); + } + } + + alert(`NFT minted successfully! Token ID: ${mintedTokenId}\nTransaction: ${tx.hash}`); + + } catch (error) { + console.error('Error minting NFT:', error); + alert('Error minting NFT. Please try again.'); + } finally { + setMintingNFT(null); + } + }; + + const connectWallet = async () => { + try { + if (typeof window.ethereum === 'undefined') { + setError('MetaMask not detected. Please install MetaMask.'); + return; + } + + console.log('Connecting to MetaMask...'); + + // Request account access + await window.ethereum.request({ method: 'eth_requestAccounts' }); + + // Switch to Arbitrum Sepolia network + try { + await window.ethereum.request({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: '0x66eee' }], // Arbitrum Sepolia chain ID + }); + } catch { + // If the network doesn't exist, add it + await window.ethereum.request({ + method: 'wallet_addEthereumChain', + params: [{ + chainId: '0x66eee', + chainName: 'Arbitrum Sepolia', + rpcUrls: ['https://arbitrum-sepolia-rpc.publicnode.com'], + nativeCurrency: { + name: 'ETH', + symbol: 'ETH', + decimals: 18, + }, + blockExplorerUrls: ['https://sepolia.arbiscan.io/'], + }], + }); + } + + const provider = new BrowserProvider(window.ethereum!); + const accounts = await provider.send('eth_requestAccounts', []); + console.log('Accounts:', accounts); + + const signer = await provider.getSigner(); + const address = await signer.getAddress(); + console.log('Connected address:', address); + + setWalletAddress(address); + setWalletConnected(true); + + // Save wallet address to user profile + const response = await fetch('/api/wallet/connect', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ walletAddress: address }), + }); + + if (response.ok) { + setSuccess('Wallet connected successfully!'); + } else { + console.error('Failed to save wallet address to profile'); + setSuccess('Wallet connected! (Profile update failed)'); + } + } catch (error: unknown) { + console.error('Wallet connection error:', error); + setError(`Failed to connect wallet: ${error instanceof Error ? error.message : 'Unknown error'}`); + } + }; + + const requestArtParams = async () => { + if (!walletConnected) { + setError('Please connect your wallet first'); + return; + } + + setLoading(true); + setError(''); + + try { + const provider = new BrowserProvider(window.ethereum!); + const signer = await provider.getSigner(); + const contract = new Contract(CONTRACT_ADDRESS, CONTRACT_ABI, signer); + + const totalValue = parseEther("0.001"); + const tx = await contract.requestArtParams({ value: totalValue }); + + setSuccess(`Transaction sent: ${tx.hash}`); + + const receipt = await tx.wait(); + const event = receipt.logs.find((log: ethers.Log) => { + try { + const parsed = contract.interface.parseLog(log); + return parsed?.name === 'EntropyRequested'; + } catch { + return false; + } + }); + + if (event) { + const parsed = contract.interface.parseLog(event); + const tokenId = parsed?.args.tokenId.toString(); + // const requestId = parsed?.args.requestId.toString(); + + setSuccess(`Art parameters requested! Token ID: ${tokenId}`); + + // Poll for completion + pollForArtParams(tokenId); + } + } catch (error: unknown) { + setError(`Request failed: ${error instanceof Error ? error.message : 'Unknown error'}`); + } finally { + setLoading(false); + } + }; + + const pollForArtParams = async (tokenId: string) => { + const maxAttempts = 30; + let attempts = 0; + + const poll = async () => { + try { + // const provider = new BrowserProvider(window.ethereum); + // const contract = new Contract(CONTRACT_ADDRESS, CONTRACT_ABI, provider); + + // const params = await contract.viewRenderParams(tokenId); + // const seed = await contract.tokenSeed(tokenId); + + // Save only token ID to database + await fetch('/api/art-tokens', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + tokenId: parseInt(tokenId), + requestId: tokenId, + }), + }); + + setSuccess(`Art parameters generated for Token #${tokenId}!`); + fetchArtTokens(); // Refresh the list + return; + } catch { + attempts++; + if (attempts < maxAttempts) { + setTimeout(poll, 2000); // Poll every 2 seconds + } else { + setError('Art parameters generation timed out'); + } + } + }; + + poll(); + }; + + + + + if (status === 'loading') { + return ( +
+
Loading...
+
+ ); + } + + return ( +
+ + +
+
+

+ Generate unique art with blockchain randomness +

+ + {/* Steps Guide */} +
+
+
+ 1 +
+
+
Request Parameters
+
Generate random art parameters
+
+
+ +
+ + + +
+ +
+
+ 2 +
+
+
Generate Image
+
Create AI art from parameters
+
+
+ +
+ + + +
+ +
+
+ 3 +
+
+
Mint as NFT
+
Turn your art into blockchain NFT
+
+
+
+
+ + {/* Art Generation */} +
+

Generate Art Parameters

+
+ +

+ Estimated cost: ~0.0004 ETH + gas +

+
+
+ + + {/* Status Messages */} + {error && ( +
+ {error} +
+ )} + {success && ( +
+ {success} +
+ )} + + {/* Generated Images */} +
+
+

Generated Images

+ +
+ + {generatedImages.length === 0 ? ( +
+ No generated images yet. Generate some art from your tokens above! +
+ ) : ( +
+ {generatedImages.map((image, index) => ( +
+
+ {`Generated +
+
+
Token #{image.tokenId}
+
+ {new Date(image.createdAt).toLocaleDateString()} +
+
+ {image.prompt} +
+ + {showPriceInput === image.tokenId ? ( +
+
+ + setNftPrice(e.target.value)} + className="w-full px-3 py-2 bg-gray-700 border border-gray-600 rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-yellow-400" + style={{ fontFamily: 'Poppins, sans-serif', fontWeight: 400 }} + placeholder="0" + /> +
+
+ + +
+
+ ) : ( + + )} +
+
+ ))} +
+ )} +
+ + {/* Art Tokens */} +
+

Your Art Tokens

+ {artTokens.length === 0 ? ( +
+

No art tokens generated yet

+

Connect your wallet and generate your first art parameters!

+
+ ) : ( +
+ {artTokens.map((token, index) => ( + + ))} +
+ )} +
+
+
+ ); +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/favicon.ico b/entropy/AleaArt/frontend-aleart/src/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/entropy/AleaArt/frontend-aleart/src/app/favicon.ico differ diff --git a/entropy/AleaArt/frontend-aleart/src/app/globals.css b/entropy/AleaArt/frontend-aleart/src/app/globals.css new file mode 100644 index 0000000..6513539 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/globals.css @@ -0,0 +1,83 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} + +/* Custom Animations */ +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes slideInLeft { + from { + opacity: 0; + transform: translateX(-50px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes slideInRight { + from { + opacity: 0; + transform: translateX(50px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.animate-fade-in-up { + animation: fadeInUp 0.8s ease-out forwards; + opacity: 0; +} + +.animate-slide-in-left { + animation: slideInLeft 0.8s ease-out forwards; + opacity: 0; +} + +.animate-slide-in-right { + animation: slideInRight 0.8s ease-out forwards; + opacity: 0; +} + +.animation-delay-200 { + animation-delay: 0.2s; +} + +.animation-delay-400 { + animation-delay: 0.4s; +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/layout.tsx b/entropy/AleaArt/frontend-aleart/src/app/layout.tsx new file mode 100644 index 0000000..2a310f5 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/layout.tsx @@ -0,0 +1,23 @@ +import Providers from '@/components/Providers'; +import './globals.css'; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + + + + + + + {children} + + + + ); +} \ No newline at end of file diff --git a/entropy/AleaArt/frontend-aleart/src/app/login/page.tsx b/entropy/AleaArt/frontend-aleart/src/app/login/page.tsx new file mode 100644 index 0000000..2797486 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/login/page.tsx @@ -0,0 +1,129 @@ +'use client'; + +import { useState } from 'react'; +import { signIn, getSession } from 'next-auth/react'; +import { useRouter } from 'next/navigation'; +import Link from 'next/link'; + +export default function LoginPage() { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + const router = useRouter(); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + setError(''); + + try { + const result = await signIn('credentials', { + email, + password, + redirect: false, + }); + + if (result?.error) { + setError('Invalid email or password'); + } else { + router.push('/dashboard'); + } + } catch (error) { + setError('An error occurred. Please try again.'); + } finally { + setLoading(false); + } + }; + + return ( +
+ {/* Paint-like background elements */} +
+ {/* Large colorful splashes */} +
+
+
+
+ + {/* Medium splashes */} +
+
+ + {/* Small accent splashes */} +
+
+ + {/* Paint drips effect */} +
+
+
+ +
+
+

AleaArt

+

Sign in to your account

+
+ +
+
+ + setEmail(e.target.value)} + className="w-full px-6 py-4 rounded-lg bg-white/10 border border-gray-600 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-yellow-400 text-lg" + style={{ fontFamily: 'Poppins, sans-serif', fontWeight: 400 }} + placeholder="Enter your email" + required + /> +
+ +
+ + setPassword(e.target.value)} + className="w-full px-6 py-4 rounded-lg bg-white/10 border border-gray-600 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-yellow-400 text-lg" + style={{ fontFamily: 'Poppins, sans-serif', fontWeight: 400 }} + placeholder="Enter your password" + required + /> +
+ + {error && ( +
+ {error} +
+ )} + + +
+ +
+

+ Don't have an account?{' '} + + Sign up + +

+
+
+
+ ); +} + diff --git a/entropy/AleaArt/frontend-aleart/src/app/marketplace/page.tsx b/entropy/AleaArt/frontend-aleart/src/app/marketplace/page.tsx new file mode 100644 index 0000000..6e7631f --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/marketplace/page.tsx @@ -0,0 +1,516 @@ +'use client'; + +import { useState, useEffect } from 'react'; +import { useSession } from 'next-auth/react'; +import { useRouter } from 'next/navigation'; +import { BrowserProvider, ethers } from 'ethers'; +import Navbar from '@/components/Navbar'; + +interface NFTData { + tokenId: number; + owner: string; + ipfsHash: string; + prompt: string; + price: string; + isForSale: boolean; + creator: string; + createdAt: number; +} + +interface SpotlightData { + tokenId: number; + owner: string; + ipfsHash: string; + prompt: string; + price: string; + isForSale: boolean; + creator: string; + createdAt: number; + spotlightStartTime: number; + spotlightDuration: number; + isActive: boolean; + spotlightEndTime: number; + timeRemaining: number; +} + +export default function Marketplace() { + const { data: session, status } = useSession(); + const router = useRouter(); + const [nfts, setNfts] = useState([]); + const [loading, setLoading] = useState(true); + const [buyingNFT, setBuyingNFT] = useState(null); + const [walletConnected, setWalletConnected] = useState(false); + const [userAddress, setUserAddress] = useState(''); + const [currentPage, setCurrentPage] = useState(1); + const [itemsPerPage] = useState(8); + const [spotlight, setSpotlight] = useState(null); + const [loadingSpotlight, setLoadingSpotlight] = useState(true); + const [requestingSpotlight, setRequestingSpotlight] = useState(false); + const [canRequestSpotlight, setCanRequestSpotlight] = useState(false); + + useEffect(() => { + if (status === 'loading') return; + if (!session) { + router.push('/auth/signin'); + return; + } + + fetchNFTs(); + checkWalletConnection(); + }, [session, status, router]); + + // Fetch spotlight when wallet connection changes + useEffect(() => { + fetchSpotlight(); + }, [walletConnected, userAddress]); + + const checkWalletConnection = async () => { + if (typeof window.ethereum !== 'undefined') { + try { + const provider = new BrowserProvider(window.ethereum); + const signer = await provider.getSigner(); + const address = await signer.getAddress(); + setUserAddress(address); + setWalletConnected(true); + } catch (error) { + console.log('Wallet not connected'); + } + } + }; + + const connectWallet = async () => { + if (typeof window.ethereum === 'undefined') { + alert('Please install MetaMask!'); + return; + } + + try { + // Request account access + await window.ethereum.request({ method: 'eth_requestAccounts' }); + + // Switch to Arbitrum Sepolia network + await window.ethereum.request({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: '0x66eee' }], // Arbitrum Sepolia chain ID + }); + + const provider = new BrowserProvider(window.ethereum); + const signer = await provider.getSigner(); + const address = await signer.getAddress(); + setUserAddress(address); + setWalletConnected(true); + } catch (error) { + console.error('Error connecting wallet:', error); + alert('Failed to connect wallet. Please make sure you\'re on Arbitrum Sepolia network.'); + } + }; + + const fetchNFTs = async () => { + try { + setLoading(true); + const response = await fetch('/api/marketplace'); + const data = await response.json(); + + if (data.success) { + setNfts(data.nfts); + } + } catch (error) { + console.error('Error fetching NFTs:', error); + } finally { + setLoading(false); + } + }; + + const fetchSpotlight = async () => { + try { + setLoadingSpotlight(true); + const headers: HeadersInit = {}; + + // Add wallet address to headers if connected + if (walletConnected && userAddress) { + headers['x-wallet-address'] = userAddress; + } + + const response = await fetch('/api/spotlight', { headers }); + const data = await response.json(); + + if (data.success) { + setSpotlight(data.spotlight); + setCanRequestSpotlight(data.canRequestSpotlight || false); + } + } catch (error) { + console.error('Error fetching spotlight:', error); + } finally { + setLoadingSpotlight(false); + } + }; + + const requestSpotlight = async () => { + if (!walletConnected) { + alert('Please connect your wallet first!'); + return; + } + + try { + setRequestingSpotlight(true); + + const response = await fetch('/api/request-spotlight', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + userAddress: userAddress, + }), + }); + + const data = await response.json(); + + if (data.success) { + // Create contract instance with user's signer + const provider = new BrowserProvider(window.ethereum!); + const signer = await provider.getSigner(); + const contract = new ethers.Contract(data.contractAddress, data.contractABI, signer); + + // Call the requestSpotlight function with ETH value + const tx = await contract.requestSpotlight({ value: data.value }); + + console.log('Spotlight request transaction sent:', tx.hash); + + // Wait for transaction confirmation + const receipt = await tx.wait(); + + console.log('Transaction confirmed:', receipt); + + alert(`Spotlight request submitted! Transaction: ${tx.hash}\nA random NFT will be selected and featured for 24 hours.`); + + // Refresh spotlight after a delay to allow for processing + setTimeout(() => { + fetchSpotlight(); + }, 10000); + + } else { + alert(`Failed to request spotlight: ${data.error}`); + } + } catch (error) { + console.error('Error requesting spotlight:', error); + alert('Error requesting spotlight. Please try again.'); + } finally { + setRequestingSpotlight(false); + } + }; + + const buyNFT = async (nft: NFTData) => { + if (!walletConnected) { + alert('Please connect your wallet first!'); + return; + } + + try { + setBuyingNFT(nft.tokenId); + + const response = await fetch('/api/buy-nft', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + tokenId: nft.tokenId, + price: nft.price, + userAddress: userAddress, + }), + }); + + const data = await response.json(); + + if (data.success) { + // Create contract instance with user's signer + const provider = new BrowserProvider(window.ethereum!); + const signer = await provider.getSigner(); + const contract = new ethers.Contract(data.contractAddress, data.contractABI, signer); + + // Call the buyNFT function with ETH value + const tx = await contract.buyNFT(data.tokenId, { value: data.value }); + + console.log('Buy transaction sent:', tx.hash); + + // Wait for transaction confirmation + const receipt = await tx.wait(); + + console.log('Transaction confirmed:', receipt); + + alert(`NFT purchased successfully! Transaction: ${tx.hash}`); + + // Refresh the list after a delay to allow for processing + setTimeout(() => { + fetchNFTs(); + fetchSpotlight(); + }, 5000); + } else { + alert(`Failed to buy NFT: ${data.error}`); + } + } catch (error) { + console.error('Error buying NFT:', error); + alert('Error buying NFT. Please try again.'); + } finally { + setBuyingNFT(null); + } + }; + + const formatPrice = (price: string) => { + const priceInEth = parseFloat(price) / 1e18; + return priceInEth.toFixed(4); + }; + + const formatDate = (timestamp: number) => { + return new Date(timestamp * 1000).toLocaleDateString(); + }; + + // Pagination logic + const totalPages = Math.ceil(nfts.length / itemsPerPage); + const startIndex = (currentPage - 1) * itemsPerPage; + const endIndex = startIndex + itemsPerPage; + const currentNFTs = nfts.slice(startIndex, endIndex); + + if (status === 'loading' || loading) { + return ( +
+
Loading marketplace...
+
+ ); + } + + return ( +
+ + +
+ {/* Welcome Section */} +
+

+ Welcome to AleaArt Marketplace +

+

+ Discover and collect unique AI-generated art NFTs +

+
+ + {/* Spotlight Section */} +
+
+

Spotlight

+ {canRequestSpotlight && ( + + )} +
+ + {loadingSpotlight ? ( +
+
Loading spotlight...
+
+ ) : spotlight ? ( +
+
+
+
+ FEATURED +
+
+ {Math.floor(spotlight.timeRemaining / 3600)}h {Math.floor((spotlight.timeRemaining % 3600) / 60)}m remaining +
+
+
+ Token #{spotlight.tokenId} +
+
+ +
+
+ {`Spotlight +
+ +
+

+ Featured Artwork +

+ +

+ {spotlight.prompt} +

+ +
+
+ Owner: + + {spotlight.owner.slice(0, 6)}...{spotlight.owner.slice(-4)} + +
+
+ Creator: + + {spotlight.creator.slice(0, 6)}...{spotlight.creator.slice(-4)} + +
+
+ Price: + + {spotlight.isForSale ? `${formatPrice(spotlight.price)} ETH` : 'Not for sale'} + +
+
+ Created: + + {formatDate(spotlight.createdAt)} + +
+
+ + {spotlight.isForSale && ( + + )} +
+
+
+ ) : ( +
+
No spotlight active
+

+ Request a new spotlight to feature a random NFT for 24 hours +

+
+ )} +
+ + {/* NFT Grid */} + {nfts.length === 0 ? ( +
+
No NFTs available yet
+

Be the first to mint an NFT!

+
+ ) : ( + <> +
+ {currentNFTs.map((nft) => ( +
+ {/* NFT Image */} +
+ {`NFT +
+ + {/* NFT Info */} +
+
+

#{nft.tokenId}

+ {nft.isForSale && ( + + For Sale + + )} +
+ +

+ {nft.prompt} +

+ +
+
+

Price

+

+ {nft.isForSale ? `${formatPrice(nft.price)} ETH` : 'Not for sale'} +

+
+
+

Created

+

{formatDate(nft.createdAt)}

+
+
+ + {/* Action Button */} + {nft.isForSale ? ( + + ) : ( +
+ Not for Sale +
+ )} +
+
+ ))} +
+ + {/* Pagination */} + {totalPages > 1 && ( +
+ + +
+ {Array.from({ length: totalPages }, (_, i) => i + 1).map((page) => ( + + ))} +
+ + +
+ )} + + )} +
+
+ ); +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/page.tsx b/entropy/AleaArt/frontend-aleart/src/app/page.tsx new file mode 100644 index 0000000..de4de7d --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/page.tsx @@ -0,0 +1,300 @@ +import Link from 'next/link'; +import Image from 'next/image'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/lib/auth'; +import { redirect } from 'next/navigation'; + +export default async function LandingPage() { + const session = await getServerSession(authOptions); + + if (session) { + redirect('/dashboard'); + } + + return ( +
+ {/* Header */} +
+
+
+ + LOGIN + + + SIGN UP + +
+
+
+ + {/* Hero Section */} +
+ {/* Paint-like background elements */} +
+ {/* Large colorful splashes */} +
+
+
+
+ + {/* Medium splashes */} +
+
+ + {/* Small accent splashes */} +
+
+ + {/* Paint drips effect */} +
+
+
+ +
+

AleaArt

+

Art that flows from blockchain randomness

+ + TRY FOR FREE + +
+
+ + {/* Feature Section 1 */} +
+
+
+
+
+

+ Art doesn't
+ have to feel
+ like a different
+ language +

+
+
+
+
+
+ + + +
+
+
+
+

+ We built AleaArt to provide artists with blockchain-powered randomness that makes art creation easier, + so you can focus on creativity more. +

+
+ + LEARN MORE + +
+
+
+
+
+ + {/* Services Section */} +
+ {/* Paint-like background elements */} +
+ {/* Large colorful splashes */} +
+
+
+
+ + {/* Medium splashes */} +
+
+ + {/* Small accent splashes */} +
+
+ + {/* Paint drips effect */} +
+
+
+ +
+
+ {/* Feature 1 */} +
+

+ Random Art Generation +

+

+ Generate unique art parameters using Pyth Entropy V2 for verifiable blockchain randomness. +

+ {/* Right border line */} +
+
+ + {/* Feature 2 */} +
+

+ NFT Minting +

+

+ Convert your generated art into tradeable NFTs on Arbitrum Sepolia blockchain. +

+ {/* Right border line */} +
+
+ + {/* Feature 3 */} +
+

+ Decentralized Marketplace +

+

+ Buy and sell NFTs directly peer-to-peer with no platform fees. +

+
+
+ +
+ + EXPLORE + +
+
+
+ + {/* Innovation Section */} +
+
+
+ {/* Left Side - Heading and Image */} +
+

+ Innovation
+ that flows +

+
+ Art Innovation +
+
+ + {/* Right Side - Text */} +
+ +
+
+

+ Seamless blockchain integration +

+

+ Our platform integrates seamlessly with Arbitrum Sepolia, providing fast and cost-effective + blockchain interactions for art generation and NFT trading. +

+
+ +
+

+ Intuitive art creation +

+

+ Generate unique art parameters with just a few clicks. Our AI-powered system creates + deterministic parameters that ensure each piece is truly unique. +

+
+ +
+

+ Excellent user experience +

+

+ From wallet connection to NFT minting, we've designed every step to be simple and intuitive + for both artists and collectors. +

+
+
+
+
+
+
+ + + {/* Footer CTA */} +
+ {/* Paint-like background elements */} +
+ {/* Large colorful splashes */} +
+
+
+
+ + {/* Medium splashes */} +
+
+ + {/* Small accent splashes */} +
+
+ + {/* Paint drips effect */} +
+
+
+ +
+
+

Create with us

+

+ Generate unique art parameters and mint NFTs with blockchain-powered randomness + on Arbitrum Sepolia. +

+ + START TODAY + +
+ +
+
+
+ ยฉ 2025 AleaArt. All rights reserved. +
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/entropy/AleaArt/frontend-aleart/src/app/profile/page.tsx b/entropy/AleaArt/frontend-aleart/src/app/profile/page.tsx new file mode 100644 index 0000000..5b9d45d --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/profile/page.tsx @@ -0,0 +1,229 @@ +'use client'; + +import { useState, useEffect } from 'react'; +import { useSession, signOut } from 'next-auth/react'; +import { useRouter } from 'next/navigation'; +import { ArtToken } from '@/types'; + +interface ProfileArtTokenCardProps { + token: ArtToken; +} + +function ProfileArtTokenCard({ token }: ProfileArtTokenCardProps) { + const [parameters, setParameters] = useState(null); + const [loading, setLoading] = useState(false); + + const loadParameters = async () => { + if (parameters) return; // Already loaded + + setLoading(true); + + try { + // This would need to be implemented similar to dashboard + // For now, we'll just show the token ID + setParameters({ loaded: true }); + } catch (err) { + console.error('Failed to load parameters'); + } finally { + setLoading(false); + } + }; + + return ( + + #{token.tokenId} + + {!parameters ? ( + + ) : ( + 'Loaded' + )} + + - + - + - + - + - + + {new Date(token.createdAt).toLocaleDateString()} + + + ); +} + +export default function ProfilePage() { + const { data: session, status } = useSession(); + const router = useRouter(); + const [artTokens, setArtTokens] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + if (status === 'unauthenticated') { + router.push('/login'); + } + }, [status, router]); + + useEffect(() => { + if (session) { + fetchArtTokens(); + } + }, [session]); + + const fetchArtTokens = async () => { + try { + const response = await fetch('/api/art-tokens'); + if (response.ok) { + const data = await response.json(); + setArtTokens(data.artTokens || []); + } + } catch (error) { + console.error('Failed to fetch art tokens:', error); + } finally { + setLoading(false); + } + }; + + if (status === 'loading' || loading) { + return ( +
+
Loading...
+
+ ); + } + + return ( +
+
+
+

๐Ÿ‘ค Profile

+
+ + +
+
+ +
+ {/* User Info */} +
+

๐Ÿ‘ค User Information

+
+
+ Name: +

{session?.user?.name}

+
+
+ Email: +

{session?.user?.email}

+
+
+ Wallet: +

+ {session?.user?.walletAddress || 'Not connected'} +

+
+
+
+ + {/* Statistics */} +
+

๐Ÿ“Š Statistics

+
+
+ Total Art Tokens: +

{artTokens.length}

+
+
+ First Generation: +

+ {artTokens.length > 0 + ? new Date(artTokens[artTokens.length - 1].createdAt).toLocaleDateString() + : 'None' + } +

+
+
+ Latest Generation: +

+ {artTokens.length > 0 + ? new Date(artTokens[0].createdAt).toLocaleDateString() + : 'None' + } +

+
+
+
+ + {/* Quick Actions */} +
+

โšก Quick Actions

+
+ + +
+
+
+ + {/* Art Tokens History */} +
+

๐ŸŽจ Art Tokens History

+ {artTokens.length === 0 ? ( +
+

No art tokens generated yet

+

Visit the dashboard to generate your first art parameters!

+
+ ) : ( +
+
+ + + + + + + + + + + + + + + {artTokens.map((token, index) => ( + + ))} + +
Token IDPromptStyleSamplerStepsCFGPaletteCreated
+
+
+ )} +
+
+
+ ); +} diff --git a/entropy/AleaArt/frontend-aleart/src/app/signup/page.tsx b/entropy/AleaArt/frontend-aleart/src/app/signup/page.tsx new file mode 100644 index 0000000..40bf7cd --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/app/signup/page.tsx @@ -0,0 +1,178 @@ +'use client'; + +import { useState } from 'react'; +import { useRouter } from 'next/navigation'; +import Link from 'next/link'; + +export default function SignupPage() { + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + const router = useRouter(); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + setError(''); + + if (password !== confirmPassword) { + setError('Passwords do not match'); + setLoading(false); + return; + } + + if (password.length < 6) { + setError('Password must be at least 6 characters long'); + setLoading(false); + return; + } + + try { + const response = await fetch('/api/auth/signup', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ name, email, password }), + }); + + const data = await response.json(); + + if (response.ok) { + router.push('/login?message=Account created successfully'); + } else { + setError(data.error || 'An error occurred'); + } + } catch (error) { + setError('An error occurred. Please try again.'); + } finally { + setLoading(false); + } + }; + + return ( +
+ {/* Paint-like background elements */} +
+ {/* Large colorful splashes */} +
+
+
+
+ + {/* Medium splashes */} +
+
+ + {/* Small accent splashes */} +
+
+ + {/* Paint drips effect */} +
+
+
+ +
+
+

AleaArt

+

Create your account

+
+ +
+
+ + setName(e.target.value)} + className="w-full px-6 py-4 rounded-lg bg-white/10 border border-gray-600 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-yellow-400 text-lg" + style={{ fontFamily: 'Poppins, sans-serif', fontWeight: 400 }} + placeholder="Enter your full name" + required + /> +
+ +
+ + setEmail(e.target.value)} + className="w-full px-6 py-4 rounded-lg bg-white/10 border border-gray-600 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-yellow-400 text-lg" + style={{ fontFamily: 'Poppins, sans-serif', fontWeight: 400 }} + placeholder="Enter your email" + required + /> +
+ +
+ + setPassword(e.target.value)} + className="w-full px-6 py-4 rounded-lg bg-white/10 border border-gray-600 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-yellow-400 text-lg" + style={{ fontFamily: 'Poppins, sans-serif', fontWeight: 400 }} + placeholder="Enter your password" + required + /> +
+ +
+ + setConfirmPassword(e.target.value)} + className="w-full px-6 py-4 rounded-lg bg-white/10 border border-gray-600 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-yellow-400 text-lg" + style={{ fontFamily: 'Poppins, sans-serif', fontWeight: 400 }} + placeholder="Confirm your password" + required + /> +
+ + {error && ( +
+ {error} +
+ )} + + +
+ +
+

+ Already have an account?{' '} + + Sign in + +

+
+
+
+ ); +} + diff --git a/entropy/AleaArt/frontend-aleart/src/components/Navbar.tsx b/entropy/AleaArt/frontend-aleart/src/components/Navbar.tsx new file mode 100644 index 0000000..0df25aa --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/components/Navbar.tsx @@ -0,0 +1,235 @@ +'use client'; + +import Link from 'next/link'; +import { useSession, signOut } from 'next-auth/react'; +import { useRouter, usePathname } from 'next/navigation'; +import { useState, useEffect } from 'react'; +import { BrowserProvider } from 'ethers'; + +export default function Navbar() { + const { data: session } = useSession(); + const router = useRouter(); + const pathname = usePathname(); + const [isMenuOpen, setIsMenuOpen] = useState(false); + const [walletConnected, setWalletConnected] = useState(false); + const [userAddress, setUserAddress] = useState(''); + + const checkWalletConnection = async () => { + if (typeof window.ethereum !== 'undefined') { + try { + const provider = new BrowserProvider(window.ethereum); + const signer = await provider.getSigner(); + const address = await signer.getAddress(); + setUserAddress(address); + setWalletConnected(true); + } catch (error) { + console.log('Wallet not connected'); + } + } + }; + + useEffect(() => { + setTimeout(() => { + checkWalletConnection(); + }, 0); + }, []); + + const connectWallet = async () => { + if (typeof window.ethereum === 'undefined') { + alert('Please install MetaMask!'); + return; + } + + try { + await window.ethereum.request({ method: 'eth_requestAccounts' }); + + await window.ethereum.request({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: '0x66eee' }], + }); + + const provider = new BrowserProvider(window.ethereum); + const signer = await provider.getSigner(); + const address = await signer.getAddress(); + setUserAddress(address); + setWalletConnected(true); + } catch (error) { + console.error('Error connecting wallet:', error); + alert('Failed to connect wallet. Please make sure you\'re on Arbitrum Sepolia network.'); + } + }; + + const handleSignOut = async () => { + await signOut({ callbackUrl: '/' }); + }; + + return ( + + ); +} diff --git a/entropy/AleaArt/frontend-aleart/src/components/Navigation.tsx b/entropy/AleaArt/frontend-aleart/src/components/Navigation.tsx new file mode 100644 index 0000000..a307621 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/components/Navigation.tsx @@ -0,0 +1,49 @@ +'use client'; + +import Link from 'next/link'; +import { useSession } from 'next-auth/react'; +import { usePathname } from 'next/navigation'; + +export default function Navigation() { + const { data: session } = useSession(); + const pathname = usePathname(); + + if (!session) { + return null; + } + + const navItems = [ + { href: '/dashboard', label: 'Dashboard', icon: '๐ŸŽจ' }, + { href: '/profile', label: 'Profile', icon: '๐Ÿ‘ค' }, + ]; + + return ( + + ); +} + diff --git a/entropy/AleaArt/frontend-aleart/src/components/Providers.tsx b/entropy/AleaArt/frontend-aleart/src/components/Providers.tsx new file mode 100644 index 0000000..48a7de6 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/components/Providers.tsx @@ -0,0 +1,8 @@ +'use client'; + +import { SessionProvider } from 'next-auth/react'; + +export default function Providers({ children }: { children: React.ReactNode }) { + return {children}; +} + diff --git a/entropy/AleaArt/frontend-aleart/src/lib/auth.ts b/entropy/AleaArt/frontend-aleart/src/lib/auth.ts new file mode 100644 index 0000000..dbaa321 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/lib/auth.ts @@ -0,0 +1,69 @@ +import NextAuth from 'next-auth'; +import CredentialsProvider from 'next-auth/providers/credentials'; +import bcrypt from 'bcryptjs'; +import connectDB from '@/lib/mongodb'; +import UserAleart from '@/models/UserAleart'; + +export const authOptions = { + providers: [ + CredentialsProvider({ + name: 'credentials', + credentials: { + email: { label: 'Email', type: 'email' }, + password: { label: 'Password', type: 'password' } + }, + async authorize(credentials) { + if (!credentials?.email || !credentials?.password) { + return null; + } + + await connectDB(); + + const user = await UserAleart.findOne({ email: credentials.email }); + + if (!user) { + return null; + } + + const isPasswordValid = await bcrypt.compare(credentials.password, user.password); + + if (!isPasswordValid) { + return null; + } + + return { + id: user._id.toString(), + email: user.email, + name: user.name, + walletAddress: user.walletAddress, + }; + } + }) + ], + session: { + strategy: 'jwt' as const, + }, + callbacks: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async jwt({ token, user }: { token: any; user: any }) { + if (user) { + token.walletAddress = user.walletAddress; + } + return token; + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async session({ session, token }: { session: any; token: any }) { + if (token) { + session.user.id = token.sub; + session.user.walletAddress = token.walletAddress; + } + return session; + }, + }, + pages: { + signIn: '/login', + signUp: '/signup', + }, +}; + +export default NextAuth(authOptions); diff --git a/entropy/AleaArt/frontend-aleart/src/lib/mongodb.ts b/entropy/AleaArt/frontend-aleart/src/lib/mongodb.ts new file mode 100644 index 0000000..7d5a487 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/lib/mongodb.ts @@ -0,0 +1,41 @@ +import mongoose from 'mongoose'; + +const MONGODB_URI = process.env.MONGODB_URI!; + +if (!MONGODB_URI) { + throw new Error('Please define the MONGODB_URI environment variable inside .env.local'); +} + +let cached = (global as any).mongoose; + +if (!cached) { + cached = (global as any).mongoose = { conn: null, promise: null }; +} + +async function connectDB() { + if (cached.conn) { + return cached.conn; + } + + if (!cached.promise) { + const opts = { + bufferCommands: false, + }; + + cached.promise = mongoose.connect(MONGODB_URI, opts).then((mongoose) => { + return mongoose; + }); + } + + try { + cached.conn = await cached.promise; + } catch (e) { + cached.promise = null; + throw e; + } + + return cached.conn; +} + +export default connectDB; + diff --git a/entropy/AleaArt/frontend-aleart/src/middleware.ts b/entropy/AleaArt/frontend-aleart/src/middleware.ts new file mode 100644 index 0000000..2cc28a2 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/middleware.ts @@ -0,0 +1,17 @@ +import { withAuth } from 'next-auth/middleware'; + +export default withAuth( + function middleware(req) { + // Add any additional middleware logic here + }, + { + callbacks: { + authorized: ({ token }) => !!token, + }, + } +); + +export const config = { + matcher: ['/dashboard/:path*', '/profile/:path*'] +}; + diff --git a/entropy/AleaArt/frontend-aleart/src/models/User.ts b/entropy/AleaArt/frontend-aleart/src/models/User.ts new file mode 100644 index 0000000..434f954 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/models/User.ts @@ -0,0 +1,57 @@ +import mongoose, { Document, Schema } from 'mongoose'; + +export interface IUserAleart extends Document { + email: string; + password: string; + name: string; + walletAddress?: string; + artTokens: IArtToken[]; + createdAt: Date; + updatedAt: Date; +} + +export interface IArtToken { + tokenId: number; + requestId: string; + seed: string; + parameters: { + promptIndex: number; + styleIndex: number; + samplerIndex: number; + aspectIndex: number; + steps: number; + cfg: number; + latentSeed: number; + paletteId: number; + }; + createdAt: Date; +} + +const ArtTokenSchema = new Schema({ + tokenId: { type: Number, required: true }, + requestId: { type: String, required: true }, + seed: { type: String, required: true }, + parameters: { + promptIndex: { type: Number, required: true }, + styleIndex: { type: Number, required: true }, + samplerIndex: { type: Number, required: true }, + aspectIndex: { type: Number, required: true }, + steps: { type: Number, required: true }, + cfg: { type: Number, required: true }, + latentSeed: { type: Number, required: true }, + paletteId: { type: Number, required: true }, + }, + createdAt: { type: Date, default: Date.now }, +}); + +const UserAleartSchema = new Schema({ + email: { type: String, required: true, unique: true }, + password: { type: String, required: true }, + name: { type: String, required: true }, + walletAddress: { type: String }, + artTokens: [ArtTokenSchema], +}, { + timestamps: true, +}); + +export default mongoose.models.UserAleart || mongoose.model('UserAleart', UserAleartSchema); diff --git a/entropy/AleaArt/frontend-aleart/src/models/UserAleart.ts b/entropy/AleaArt/frontend-aleart/src/models/UserAleart.ts new file mode 100644 index 0000000..f888f41 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/models/UserAleart.ts @@ -0,0 +1,71 @@ +import mongoose, { Document, Schema } from 'mongoose'; + +export interface IGeneratedImage { + tokenId: number; + imageData?: string; // Make optional for initial creation + ipfsHash?: string; // IPFS content hash + ipfsUrl?: string; // IPFS gateway URL + prompt: string; + parameters: { + steps: number; + cfg_scale: number; + seed: number; + width: number; + height: number; + }; + status: 'generating' | 'completed' | 'failed'; + createdAt: Date; +} + +export interface IUserAleart extends Document { + email: string; + password: string; + name: string; + walletAddress?: string; + artTokens: IArtToken[]; + generatedImages: IGeneratedImage[]; + createdAt: Date; + updatedAt: Date; +} + +export interface IArtToken { + tokenId: number; + requestId: string; + createdAt: Date; +} + +const GeneratedImageSchema = new Schema({ + tokenId: { type: Number, required: true }, + imageData: { type: String, required: false }, // Make optional for initial creation + ipfsHash: { type: String, required: false }, // IPFS content hash + ipfsUrl: { type: String, required: false }, // IPFS gateway URL + prompt: { type: String, required: true }, + parameters: { + steps: { type: Number, required: true }, + cfg_scale: { type: Number, required: true }, + seed: { type: Number, required: true }, + width: { type: Number, required: true }, + height: { type: Number, required: true }, + }, + status: { type: String, enum: ['generating', 'completed', 'failed'], default: 'generating' }, + createdAt: { type: Date, default: Date.now }, +}); + +const ArtTokenSchema = new Schema({ + tokenId: { type: Number, required: true }, + requestId: { type: String, required: true }, + createdAt: { type: Date, default: Date.now }, +}); + +const UserAleartSchema = new Schema({ + email: { type: String, required: true, unique: true }, + password: { type: String, required: true }, + name: { type: String, required: true }, + walletAddress: { type: String }, + artTokens: [ArtTokenSchema], + generatedImages: [GeneratedImageSchema], +}, { + timestamps: true, +}); + +export default mongoose.models.UserAleart || mongoose.model('UserAleart', UserAleartSchema); diff --git a/entropy/AleaArt/frontend-aleart/src/types/index.ts b/entropy/AleaArt/frontend-aleart/src/types/index.ts new file mode 100644 index 0000000..ac95bf1 --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/src/types/index.ts @@ -0,0 +1,28 @@ +import { DefaultSession, DefaultUser } from 'next-auth'; +import { JWT, DefaultJWT } from 'next-auth/jwt'; + +declare module 'next-auth' { + interface Session { + user: { + id: string; + walletAddress?: string; + } & DefaultSession['user']; + } + + interface User extends DefaultUser { + walletAddress?: string; + } +} + +declare module 'next-auth/jwt' { + interface JWT extends DefaultJWT { + walletAddress?: string; + } +} + +export interface ArtToken { + tokenId: number; + requestId: string; + createdAt: string; + generatedImage?: string; // Base64 encoded image +} diff --git a/entropy/AleaArt/frontend-aleart/tsconfig.json b/entropy/AleaArt/frontend-aleart/tsconfig.json new file mode 100644 index 0000000..cf9c65d --- /dev/null +++ b/entropy/AleaArt/frontend-aleart/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} diff --git a/entropy/AleaArt/generated_images/art_token_5_1478b3b8.png b/entropy/AleaArt/generated_images/art_token_5_1478b3b8.png new file mode 100644 index 0000000..036a495 Binary files /dev/null and b/entropy/AleaArt/generated_images/art_token_5_1478b3b8.png differ diff --git a/entropy/AleaArt/generated_images/art_token_5_3c5d50f5.png b/entropy/AleaArt/generated_images/art_token_5_3c5d50f5.png new file mode 100644 index 0000000..036a495 Binary files /dev/null and b/entropy/AleaArt/generated_images/art_token_5_3c5d50f5.png differ diff --git a/entropy/AleaArt/generated_images/art_token_5_b03206c0.png b/entropy/AleaArt/generated_images/art_token_5_b03206c0.png new file mode 100644 index 0000000..036a495 Binary files /dev/null and b/entropy/AleaArt/generated_images/art_token_5_b03206c0.png differ diff --git a/entropy/AleaArt/generated_images/art_token_5_d2e382ab.png b/entropy/AleaArt/generated_images/art_token_5_d2e382ab.png new file mode 100644 index 0000000..036a495 Binary files /dev/null and b/entropy/AleaArt/generated_images/art_token_5_d2e382ab.png differ diff --git a/entropy/AleaArt/generated_images/art_token_6_ca2e1534.png b/entropy/AleaArt/generated_images/art_token_6_ca2e1534.png new file mode 100644 index 0000000..34d091e Binary files /dev/null and b/entropy/AleaArt/generated_images/art_token_6_ca2e1534.png differ diff --git a/entropy/AleaArt/generated_images/art_token_7_98a7fc2b.png b/entropy/AleaArt/generated_images/art_token_7_98a7fc2b.png new file mode 100644 index 0000000..f538867 Binary files /dev/null and b/entropy/AleaArt/generated_images/art_token_7_98a7fc2b.png differ diff --git a/entropy/AleaArt/generated_images/art_token_test_3d43def2.png b/entropy/AleaArt/generated_images/art_token_test_3d43def2.png new file mode 100644 index 0000000..941cf5a Binary files /dev/null and b/entropy/AleaArt/generated_images/art_token_test_3d43def2.png differ diff --git a/entropy/AleaArt/generated_images/art_token_test_async_bd392848.png b/entropy/AleaArt/generated_images/art_token_test_async_bd392848.png new file mode 100644 index 0000000..dd82edf Binary files /dev/null and b/entropy/AleaArt/generated_images/art_token_test_async_bd392848.png differ diff --git a/entropy/AleaArt/hardhat.config.ts b/entropy/AleaArt/hardhat.config.ts new file mode 100644 index 0000000..555f1fd --- /dev/null +++ b/entropy/AleaArt/hardhat.config.ts @@ -0,0 +1,39 @@ +import type { HardhatUserConfig } from "hardhat/config"; +import { configVariable } from "hardhat/config"; + +const config: HardhatUserConfig = { + solidity: { + version: "0.8.28", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + networks: { + hardhat: { + type: "edr-simulated", + chainType: "l1", + }, + localhost: { + url: "http://127.0.0.1:8545", + accounts: ["0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"], + }, + sepolia: { + type: "http", + chainType: "l1", + url: configVariable("SEPOLIA_RPC_URL"), + accounts: [configVariable("SEPOLIA_PRIVATE_KEY")], + }, + arbitrumSepolia: { + type: "http", + chainType: "l1", + url: "https://sepolia-rollup.arbitrum.io/rpc", + accounts: [configVariable("SEPOLIA_PRIVATE_KEY")], + chainId: 421614, + }, + }, +}; + +export default config; diff --git a/entropy/AleaArt/ignition/modules/Counter.ts b/entropy/AleaArt/ignition/modules/Counter.ts new file mode 100644 index 0000000..042e61c --- /dev/null +++ b/entropy/AleaArt/ignition/modules/Counter.ts @@ -0,0 +1,9 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +export default buildModule("CounterModule", (m) => { + const counter = m.contract("Counter"); + + m.call(counter, "incBy", [5n]); + + return { counter }; +}); diff --git a/entropy/AleaArt/package-lock.json b/entropy/AleaArt/package-lock.json new file mode 100644 index 0000000..0c8c075 --- /dev/null +++ b/entropy/AleaArt/package-lock.json @@ -0,0 +1,1532 @@ +{ + "name": "AleaArt", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "AleaArt", + "version": "1.0.0", + "dependencies": { + "@openzeppelin/contracts": "^5.4.0", + "@pythnetwork/entropy-sdk-solidity": "^2.1.0" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.1.0", + "@nomicfoundation/hardhat-toolbox": "^6.1.0", + "@types/node": "^24.9.1", + "dotenv": "^17.2.3", + "ethers": "^6.15.0", + "forge-std": "^1.1.2", + "hardhat": "^3.0.8" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/edr": { + "version": "0.12.0-next.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.12.0-next.7.tgz", + "integrity": "sha512-w8blgst1EHXuvjYNSEkTYRFNiqYWi7T2+OurJasQI8W+uOYKeIFY5m9GPTwbMgeS+5Q/8QW1vLyxiR8RDHEvqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@nomicfoundation/edr-darwin-arm64": "0.12.0-next.7", + "@nomicfoundation/edr-darwin-x64": "0.12.0-next.7", + "@nomicfoundation/edr-linux-arm64-gnu": "0.12.0-next.7", + "@nomicfoundation/edr-linux-arm64-musl": "0.12.0-next.7", + "@nomicfoundation/edr-linux-x64-gnu": "0.12.0-next.7", + "@nomicfoundation/edr-linux-x64-musl": "0.12.0-next.7", + "@nomicfoundation/edr-win32-x64-msvc": "0.12.0-next.7" + } + }, + "node_modules/@nomicfoundation/edr-darwin-arm64": { + "version": "0.12.0-next.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.7.tgz", + "integrity": "sha512-i3TVHIqZJAXqUh3nR9rlAx/fUrWQDXRtJhEtM9ZwgmKQMYO5+QmcmcA58qo/Yw3xb44hOk1TX9JgSkpjCIhgaQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-darwin-x64": { + "version": "0.12.0-next.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.7.tgz", + "integrity": "sha512-vvoBA5nowhd56iPbDtDsIq+ZBHHWP4pwUC34zi0Eq7SSofll7MVm6KKYcEPrUsrjPtCWqswv6dnuuVJYS8U+kg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { + "version": "0.12.0-next.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.7.tgz", + "integrity": "sha512-pXzAYhcVR+3udnylfNk4q/YUOMthhozUB/KxMV6V2oXX3X/SujB03m8JnoeUKsqVIVILbN9PVYz3V6rCjZg84g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-musl": { + "version": "0.12.0-next.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.7.tgz", + "integrity": "sha512-Ny463r0bZ97hfvCBpPZieDpPCuq9RXk3vrCTjCa8uHg+Tu8Prx3MvutbP1lJi5klO5qPVot+aikBgVZ+D0dG2g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-gnu": { + "version": "0.12.0-next.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.7.tgz", + "integrity": "sha512-ST676U0TDc1Jh6U237a/NgcoxOh828T5+zrVNz7IENdMw6liZ4F/ubBZc+3MVtOqPFzPpIItz02DDjr+KhEISw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-musl": { + "version": "0.12.0-next.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.7.tgz", + "integrity": "sha512-wCPFuf6bHH34fM0lClHuUoH57hJW/Rwh1TB0MqlZaiMhxPxdwVws28bAm4Rxr3OO7qNFn89pvG4yOhBcEqPdDg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-win32-x64-msvc": { + "version": "0.12.0-next.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.7.tgz", + "integrity": "sha512-nhyPbpnKoZcKRsAciE4DNF0IDltBh7cuAgWGdtJt/TTwQcWTYdEeb6iYRlXGI9eUsFdhrnvwIRN7bKfkOBDbCQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/hardhat-errors": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-errors/-/hardhat-errors-3.0.3.tgz", + "integrity": "sha512-qvVIyNE5yXFdwCD7G74fb3j+p5PjYSej/K2mhOuJBhxdGwzARpyoJbcDZrjkNyabytlt95iniZLHHWM9jvVXEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/hardhat-utils": "^3.0.1" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.0.tgz", + "integrity": "sha512-jx6fw3Ms7QBwFGT2MU6ICG292z0P81u6g54JjSV105+FbTZOF4FJqPksLfDybxkkOeq28eDxbqq7vpxRYyIlxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "ethers": "^6.14.0", + "hardhat": "^2.26.0" + } + }, + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-6.1.0.tgz", + "integrity": "sha512-iAIl6pIK3F4R3JXeq+b6tiShXUrp1sQRiPfqoCMUE7QLUzoFifzGV97IDRL6e73pWsMKpUQBsHBvTCsqn+ZdpA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.1.0", + "@nomicfoundation/hardhat-ethers": "^3.1.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.14", + "@nomicfoundation/hardhat-network-helpers": "^1.1.0", + "@nomicfoundation/hardhat-verify": "^2.1.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=20.0.0", + "chai": "^4.2.0", + "ethers": "^6.14.0", + "hardhat": "^2.26.0", + "hardhat-gas-reporter": "^2.3.0", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.3.0", + "typescript": ">=4.5.0" + } + }, + "node_modules/@nomicfoundation/hardhat-utils": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-utils/-/hardhat-utils-3.0.3.tgz", + "integrity": "sha512-XNoDJshvGR3l8/oQdNoLPLlcv+P+mGZBLixCyuO8Q0wTIyH/1+KYI77E+yvgTyw+GG4UmldFw9R3Hmnemk3KCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@streamparser/json-node": "^0.0.22", + "debug": "^4.3.2", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^2.2.1", + "fast-equals": "^5.0.1", + "json-stream-stringify": "^3.1.6", + "rfdc": "^1.3.1", + "undici": "^6.16.1" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/undici": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", + "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/@nomicfoundation/hardhat-zod-utils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-zod-utils/-/hardhat-zod-utils-3.0.1.tgz", + "integrity": "sha512-I6/pyYiS9p2lLkzQuedr1ScMocH+ew8l233xTi+LP92gjEiviJDxselpkzgU01MUM0t6BPpfP8yMO958LDEJVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/hardhat-errors": "^3.0.0", + "@nomicfoundation/hardhat-utils": "^3.0.2" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", + "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", + "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", + "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", + "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz", + "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz", + "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz", + "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz", + "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@openzeppelin/contracts": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.4.0.tgz", + "integrity": "sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==", + "license": "MIT" + }, + "node_modules/@pythnetwork/entropy-sdk-solidity": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@pythnetwork/entropy-sdk-solidity/-/entropy-sdk-solidity-2.1.0.tgz", + "integrity": "sha512-V6Xjrvr1/5rURA1A4YikwRGSpva0irKETTeUD3iP0KYuZUaS1K3TadMj2onPyxnMiMjaGorC6THQH+AGfFwcWQ==", + "license": "Apache-2.0" + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sentry/core": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.46.0.tgz", + "integrity": "sha512-it7JMFqxVproAgEtbLgCVBYtQ9fIb+Bu0JD+cEplTN/Ukpe6GaolyYib5geZqslVxhp2sQgT+58aGvfd/k0N8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@streamparser/json": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@streamparser/json/-/json-0.0.22.tgz", + "integrity": "sha512-b6gTSBjJ8G8SuO3Gbbj+zXbVx8NSs1EbpbMKpzGLWMdkR+98McH9bEjSz3+0mPJf68c5nxa3CrJHp5EQNXM6zQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@streamparser/json-node": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@streamparser/json-node/-/json-node-0.0.22.tgz", + "integrity": "sha512-sJT2ptNRwqB1lIsQrQlCoWk5rF4tif9wDh+7yluAGijJamAhrHGYpFB/Zg3hJeceoZypi74ftXk8DHzwYpbZSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@streamparser/json": "^0.0.22" + } + }, + "node_modules/@types/node": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", + "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esbuild": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" + } + }, + "node_modules/ethers": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz", + "integrity": "sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.2.tgz", + "integrity": "sha512-6rxyATwPCkaFIL3JLqw8qXqMpIZ942pTX/tbQFkRsDGblS8tNGtlUauA/+mt6RUfqn/4MoEr+WDkYoIQbibWuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/forge-std": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/forge-std/-/forge-std-1.1.2.tgz", + "integrity": "sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", + "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/hardhat": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-3.0.8.tgz", + "integrity": "sha512-OebUJWdqnYtcDtmuhMc8bnuTrMOMxVyPkl1kUX0YgwiMui37fzSv2qjmbVgE9LCuIyuGxBKkor6CQmvOheSygA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/edr": "0.12.0-next.7", + "@nomicfoundation/hardhat-errors": "^3.0.3", + "@nomicfoundation/hardhat-utils": "^3.0.3", + "@nomicfoundation/hardhat-zod-utils": "^3.0.1", + "@nomicfoundation/solidity-analyzer": "^0.1.1", + "@sentry/core": "^9.4.0", + "adm-zip": "^0.4.16", + "chalk": "^5.3.0", + "chokidar": "^4.0.3", + "debug": "^4.3.2", + "enquirer": "^2.3.0", + "ethereum-cryptography": "^2.2.1", + "micro-eth-signer": "^0.14.0", + "p-map": "^7.0.2", + "resolve.exports": "^2.0.3", + "semver": "^7.6.3", + "tsx": "^4.19.3", + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "bin": { + "hardhat": "dist/src/cli.js" + } + }, + "node_modules/hardhat/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/hardhat/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hardhat/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/json-stream-stringify": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", + "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=7.10.1" + } + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/micro-eth-signer": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz", + "integrity": "sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "micro-packed": "~0.7.2" + } + }, + "node_modules/micro-eth-signer/node_modules/@noble/curves": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", + "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.2" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-eth-signer/node_modules/@noble/hashes": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-packed": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz", + "integrity": "sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.20.6", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", + "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/entropy/AleaArt/package.json b/entropy/AleaArt/package.json new file mode 100644 index 0000000..2fc5f7b --- /dev/null +++ b/entropy/AleaArt/package.json @@ -0,0 +1,18 @@ +{ + "name": "AleaArt", + "version": "1.0.0", + "type": "module", + "dependencies": { + "@openzeppelin/contracts": "^5.4.0", + "@pythnetwork/entropy-sdk-solidity": "^2.1.0" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.1.0", + "@nomicfoundation/hardhat-toolbox": "^6.1.0", + "@types/node": "^24.9.1", + "dotenv": "^17.2.3", + "ethers": "^6.15.0", + "forge-std": "^1.1.2", + "hardhat": "^3.0.8" + } +} diff --git a/entropy/AleaArt/python_backend.py b/entropy/AleaArt/python_backend.py new file mode 100644 index 0000000..b74f6bf --- /dev/null +++ b/entropy/AleaArt/python_backend.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python3 +""" +AleaArt Python Backend for Image Generation +Generates images using Stable Diffusion with art parameters from blockchain +""" + +from flask import Flask, request, jsonify, send_file +from flask_cors import CORS +import torch +from diffusers import StableDiffusionPipeline +import os +import uuid +from PIL import Image +import io +import base64 + +app = Flask(__name__) +CORS(app) + +# Global variables for the model +pipe = None +model_id = "prompthero/midjourney-v4-diffusion" + +def load_model(): + """Load the Stable Diffusion model""" + global pipe + if pipe is None: + print("Loading Stable Diffusion model...") + pipe = StableDiffusionPipeline.from_pretrained( + model_id, + torch_dtype=torch.float16, + safety_checker=None, + requires_safety_checker=False + ) + + # Use GPU if available, otherwise CPU + if torch.cuda.is_available(): + pipe = pipe.to("cuda") + print("Model loaded on GPU") + else: + pipe = pipe.to("cpu") + print("Model loaded on CPU") + + # Enable memory efficient attention (if available) + try: + pipe.enable_attention_slicing() + print("Memory efficient attention enabled") + except Exception as e: + print(f"Could not enable attention slicing: {e}") + + print("Model loaded successfully!") + +def get_sampler_by_name(sampler_name): + """Get the appropriate scheduler based on sampler name""" + from diffusers import ( + DPMSolverMultistepScheduler, + DPMSolverSDEScheduler, + EulerAncestralDiscreteScheduler, + LMSDiscreteScheduler + ) + + samplers = { + "DPM++ 2M Karras": DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True), + "DPM++ SDE Karras": DPMSolverSDEScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True), + "Euler a": EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config), + "DPM++ 2M": DPMSolverMultistepScheduler.from_config(pipe.scheduler.config), + "DPM++ SDE": DPMSolverSDEScheduler.from_config(pipe.scheduler.config), + "LMS": LMSDiscreteScheduler.from_config(pipe.scheduler.config) + } + + return samplers.get(sampler_name, samplers["DPM++ 2M Karras"]) + +@app.route('/generate-image', methods=['POST']) +def generate_image(): + """Generate image using Stable Diffusion with art parameters""" + try: + data = request.json + + # Extract parameters + prompt = data.get('prompt', '') + steps = data.get('steps', 20) + cfg_scale = data.get('cfg_scale', 7.5) + seed = data.get('seed', None) + sampler = data.get('sampler', 'DPM++ 2M Karras') + width = data.get('width', 512) + height = data.get('height', 512) + token_id = data.get('tokenId', 'unknown') + + print(f"Generating image for token {token_id}") + print(f"Prompt: {prompt}") + print(f"Steps: {steps}, CFG: {cfg_scale}, Seed: {seed}") + print(f"Size: {width}x{height}, Sampler: {sampler}") + + # Load model if not already loaded + load_model() + + # Set the scheduler + pipe.scheduler = get_sampler_by_name(sampler) + + # Generate image + with torch.autocast("cuda" if torch.cuda.is_available() else "cpu"): + result = pipe( + prompt=prompt, + num_inference_steps=steps, + guidance_scale=cfg_scale, + width=width, + height=height, + generator=torch.Generator().manual_seed(seed) if seed else None + ) + + image = result.images[0] + + # Save image + image_filename = f"art_token_{token_id}_{uuid.uuid4().hex[:8]}.png" + image_path = os.path.join("generated_images", image_filename) + + # Create directory if it doesn't exist + os.makedirs("generated_images", exist_ok=True) + + # Save image + image.save(image_path) + + # Convert to base64 for response + buffer = io.BytesIO() + image.save(buffer, format='PNG') + img_str = base64.b64encode(buffer.getvalue()).decode() + + return jsonify({ + 'success': True, + 'imageUrl': f'/generated_images/{image_filename}', + 'imageBase64': f'data:image/png;base64,{img_str}', + 'tokenId': token_id, + 'prompt': prompt, + 'parameters': { + 'steps': steps, + 'cfg_scale': cfg_scale, + 'seed': seed, + 'sampler': sampler, + 'width': width, + 'height': height + } + }) + + except Exception as e: + print(f"Error generating image: {str(e)}") + return jsonify({ + 'success': False, + 'error': str(e) + }), 500 + +@app.route('/generated_images/') +def serve_image(filename): + """Serve generated images""" + try: + return send_file(f'generated_images/{filename}') + except FileNotFoundError: + return jsonify({'error': 'Image not found'}), 404 + +@app.route('/health', methods=['GET']) +def health_check(): + """Health check endpoint""" + return jsonify({ + 'status': 'healthy', + 'model_loaded': pipe is not None, + 'cuda_available': torch.cuda.is_available() + }) + +@app.route('/', methods=['GET']) +def index(): + """Root endpoint""" + return jsonify({ + 'message': 'AleaArt Python Backend', + 'endpoints': [ + '/generate-image', + '/health', + '/generated_images/' + ] + }) + +if __name__ == '__main__': + print("Starting AleaArt Python Backend...") + print("Installing required packages...") + + # Install required packages + import subprocess + import sys + + packages = [ + 'torch', + 'diffusers', + 'transformers', + 'scipy', + 'flask', + 'flask-cors', + 'pillow' + ] + + for package in packages: + try: + subprocess.check_call([sys.executable, '-m', 'pip', 'install', package]) + except subprocess.CalledProcessError: + print(f"Warning: Could not install {package}") + + print("Starting Flask server...") + app.run(host='0.0.0.0', port=8000, debug=True) diff --git a/entropy/AleaArt/python_backend_macos.py b/entropy/AleaArt/python_backend_macos.py new file mode 100644 index 0000000..9294087 --- /dev/null +++ b/entropy/AleaArt/python_backend_macos.py @@ -0,0 +1,235 @@ +#!/usr/bin/env python3 +""" +AleaArt Python Backend for Image Generation (macOS Compatible) +Generates images using Stable Diffusion with art parameters from blockchain +""" + +from flask import Flask, request, jsonify, send_file +from flask_cors import CORS +import torch +from diffusers import StableDiffusionPipeline +import os +import uuid +from PIL import Image +import io +import base64 + +app = Flask(__name__) +CORS(app) + +# Global variables for the model +pipe = None +model_id = "runwayml/stable-diffusion-v1-5" # More compatible model + +def load_model(): + """Load the Stable Diffusion model""" + global pipe + if pipe is None: + print("Loading Stable Diffusion model...") + try: + # Load model with proper device handling + pipe = StableDiffusionPipeline.from_pretrained( + model_id, + torch_dtype=torch.float32, # Use float32 for better compatibility + safety_checker=None, + requires_safety_checker=False, + device_map="auto" if torch.cuda.is_available() else None + ) + + # Move to device after loading + if torch.cuda.is_available(): + pipe = pipe.to("cuda") + print("Model loaded on GPU") + else: + pipe = pipe.to("cpu") + print("Model loaded on CPU") + + # Enable memory efficient attention (if available) + try: + pipe.enable_attention_slicing() + print("Memory efficient attention enabled") + except Exception as e: + print(f"Could not enable attention slicing: {e}") + + print("Model loaded successfully!") + except Exception as e: + print(f"Error loading model: {e}") + print("Trying alternative loading method...") + try: + # Alternative loading method + pipe = StableDiffusionPipeline.from_pretrained( + model_id, + torch_dtype=torch.float32, + safety_checker=None, + requires_safety_checker=False, + low_cpu_mem_usage=True + ) + pipe = pipe.to("cpu") + print("Model loaded on CPU (alternative method)") + except Exception as e2: + print(f"Alternative loading also failed: {e2}") + raise e2 + +def get_sampler_by_name(sampler_name): + """Get the appropriate scheduler based on sampler name""" + from diffusers import ( + DPMSolverMultistepScheduler, + DPMSolverSDEScheduler, + EulerAncestralDiscreteScheduler, + LMSDiscreteScheduler + ) + + samplers = { + "DPM++ 2M Karras": DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True), + "DPM++ SDE Karras": DPMSolverSDEScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True), + "Euler a": EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config), + "DPM++ 2M": DPMSolverMultistepScheduler.from_config(pipe.scheduler.config), + "DPM++ SDE": DPMSolverSDEScheduler.from_config(pipe.scheduler.config), + "LMS": LMSDiscreteScheduler.from_config(pipe.scheduler.config) + } + + return samplers.get(sampler_name, samplers["DPM++ 2M Karras"]) + +@app.route('/generate-image', methods=['POST']) +def generate_image(): + """Generate image using Stable Diffusion with art parameters""" + try: + data = request.json + + # Extract parameters + prompt = data.get('prompt', '') + steps = data.get('steps', 20) + cfg_scale = data.get('cfg_scale', 7.5) + seed = data.get('seed', None) + sampler = data.get('sampler', 'DPM++ 2M Karras') + width = data.get('width', 512) + height = data.get('height', 512) + token_id = data.get('tokenId', 'unknown') + + print(f"Generating image for token {token_id}") + print(f"Prompt: {prompt}") + print(f"Steps: {steps}, CFG: {cfg_scale}, Seed: {seed}") + print(f"Size: {width}x{height}, Sampler: {sampler}") + + # Load model if not already loaded + load_model() + + # Set the scheduler + pipe.scheduler = get_sampler_by_name(sampler) + + # Generate image + if torch.cuda.is_available(): + with torch.autocast("cuda"): + result = pipe( + prompt=prompt, + num_inference_steps=steps, + guidance_scale=cfg_scale, + width=width, + height=height, + generator=torch.Generator().manual_seed(seed) if seed else None + ) + else: + result = pipe( + prompt=prompt, + num_inference_steps=steps, + guidance_scale=cfg_scale, + width=width, + height=height, + generator=torch.Generator().manual_seed(seed) if seed else None + ) + + image = result.images[0] + + # Save image + image_filename = f"art_token_{token_id}_{uuid.uuid4().hex[:8]}.png" + image_path = os.path.join("generated_images", image_filename) + + # Create directory if it doesn't exist + os.makedirs("generated_images", exist_ok=True) + + # Save image + image.save(image_path) + + # Convert to base64 for response + buffer = io.BytesIO() + image.save(buffer, format='PNG') + img_str = base64.b64encode(buffer.getvalue()).decode() + + return jsonify({ + 'success': True, + 'imageUrl': f'/generated_images/{image_filename}', + 'imageBase64': f'data:image/png;base64,{img_str}', + 'tokenId': token_id, + 'prompt': prompt, + 'parameters': { + 'steps': steps, + 'cfg_scale': cfg_scale, + 'seed': seed, + 'sampler': sampler, + 'width': width, + 'height': height + } + }) + + except Exception as e: + print(f"Error generating image: {str(e)}") + return jsonify({ + 'success': False, + 'error': str(e) + }), 500 + +@app.route('/generated_images/') +def serve_image(filename): + """Serve generated images""" + try: + return send_file(f'generated_images/{filename}') + except FileNotFoundError: + return jsonify({'error': 'Image not found'}), 404 + +@app.route('/health', methods=['GET']) +def health_check(): + """Health check endpoint""" + return jsonify({ + 'status': 'healthy', + 'model_loaded': pipe is not None, + 'cuda_available': torch.cuda.is_available() + }) + +@app.route('/', methods=['GET']) +def index(): + """Root endpoint""" + return jsonify({ + 'message': 'AleaArt Python Backend (macOS Compatible)', + 'endpoints': [ + '/generate-image', + '/health', + '/generated_images/' + ] + }) + +if __name__ == '__main__': + print("Starting AleaArt Python Backend (macOS Compatible)...") + print("Installing required packages...") + + # Install required packages + import subprocess + import sys + + packages = [ + 'torch', + 'diffusers', + 'transformers', + 'scipy', + 'flask', + 'flask-cors', + 'pillow' + ] + + for package in packages: + try: + subprocess.check_call([sys.executable, '-m', 'pip', 'install', package]) + except subprocess.CalledProcessError: + print(f"Warning: Could not install {package}") + + print("Starting Flask server...") + app.run(host='0.0.0.0', port=8001, debug=True) diff --git a/entropy/AleaArt/python_backend_simple.py b/entropy/AleaArt/python_backend_simple.py new file mode 100644 index 0000000..a83fbf5 --- /dev/null +++ b/entropy/AleaArt/python_backend_simple.py @@ -0,0 +1,331 @@ +#!/usr/bin/env python3 +""" +AleaArt Python Backend for Image Generation (Simplified Version) +Generates images using Stable Diffusion with art parameters from blockchain +""" + +from flask import Flask, request, jsonify, send_file +from flask_cors import CORS +import torch +from diffusers import StableDiffusionPipeline +import os +import uuid +from PIL import Image +import io +import base64 +import pymongo +from datetime import datetime +import requests +import json + +app = Flask(__name__) +CORS(app) + +# Global variables for the model +pipe = None +model_id = "runwayml/stable-diffusion-v1-5" + +# MongoDB connection (for metadata only) +mongo_client = None +db = None + +# Pinata IPFS configuration +PINATA_API_KEY = os.getenv('PINATA_API_KEY') +PINATA_API_SECRET = os.getenv('PINATA_API_SECRET') +PINATA_JWT = os.getenv('PINATA_JWT') + +def connect_mongodb(): + """Connect to MongoDB""" + global mongo_client, db + try: + # MongoDB connection string from environment variable + mongodb_uri = os.getenv('MONGODB_URI') + if not mongodb_uri: + print("โŒ MONGODB_URI environment variable not set") + return False + + mongo_client = pymongo.MongoClient(mongodb_uri) + db = mongo_client['aleart'] + print("โœ… Connected to MongoDB") + return True + except Exception as e: + print(f"โŒ Failed to connect to MongoDB: {e}") + return False + +def upload_to_pinata(image_data, filename, metadata=None): + """Upload image to Pinata IPFS""" + try: + if not PINATA_JWT: + print("โŒ Pinata JWT not configured") + return None + + # Prepare the file data + files = { + 'file': (filename, image_data, 'image/png') + } + + # Prepare metadata + pinata_metadata = { + 'name': filename, + 'keyvalues': metadata or {} + } + + headers = { + 'Authorization': f'Bearer {PINATA_JWT}' + } + + data = { + 'pinataMetadata': json.dumps(pinata_metadata), + 'pinataOptions': json.dumps({ + 'cidVersion': 1 + }) + } + + # Upload to Pinata + response = requests.post( + 'https://api.pinata.cloud/pinning/pinFileToIPFS', + files=files, + data=data, + headers=headers + ) + + if response.status_code == 200: + result = response.json() + ipfs_hash = result['IpfsHash'] + print(f"โœ… Image uploaded to IPFS: {ipfs_hash}") + return ipfs_hash + else: + print(f"โŒ Failed to upload to Pinata: {response.status_code} - {response.text}") + return None + + except Exception as e: + print(f"โŒ Error uploading to Pinata: {e}") + return None + +def load_model(): + """Load the Stable Diffusion model""" + global pipe + if pipe is None: + print("Loading Stable Diffusion model...") + + # Use a simpler loading approach + pipe = StableDiffusionPipeline.from_pretrained( + model_id, + torch_dtype=torch.float32, + safety_checker=None, + requires_safety_checker=False, + use_safetensors=True + ) + + # Move to CPU first, then to GPU if available + pipe = pipe.to("cpu") + print("Model loaded on CPU") + + # Try to move to GPU if available + if torch.cuda.is_available(): + try: + pipe = pipe.to("cuda") + print("Model moved to GPU") + except Exception as e: + print(f"Could not move to GPU: {e}") + print("Staying on CPU") + + # Enable memory efficient attention + try: + pipe.enable_attention_slicing() + print("Memory efficient attention enabled") + except Exception as e: + print(f"Could not enable attention slicing: {e}") + + print("Model loaded successfully!") + +def save_image_metadata_to_mongodb(user_id, token_id, ipfs_hash, prompt, parameters): + """Save image metadata to MongoDB (IPFS hash instead of base64 data)""" + global db + try: + if db is None: + print("โŒ MongoDB not connected") + return False + + # Create the image document with IPFS hash + image_doc = { + 'userId': user_id, + 'tokenId': token_id, + 'ipfsHash': ipfs_hash, + 'ipfsUrl': f'https://gateway.pinata.cloud/ipfs/{ipfs_hash}', + 'prompt': prompt, + 'parameters': parameters, + 'status': 'completed', + 'createdAt': datetime.utcnow() + } + + # Insert into generatedImages collection + result = db.generatedImages.insert_one(image_doc) + print(f"โœ… Image metadata saved to MongoDB with ID: {result.inserted_id}") + return True + + except Exception as e: + print(f"โŒ Failed to save image metadata to MongoDB: {e}") + return False + +@app.route('/generate-image', methods=['POST']) +def generate_image(): + """Generate image using Stable Diffusion with art parameters""" + try: + data = request.json + + # Extract parameters + prompt = data.get('prompt', '') + steps = 4 + cfg_scale = data.get('cfg_scale', 7.5) + seed = data.get('seed', None) + width = data.get('width', 512) + height = data.get('height', 512) + token_id = data.get('tokenId', 'unknown') + user_id = data.get('userId', None) # Add user ID + + print(f"Generating image for token {token_id}") + print(f"Prompt: {prompt}") + print(f"Steps: {steps}, CFG: {cfg_scale}, Seed: {seed}") + print(f"Size: {width}x{height}") + + # Check if model is loaded + if pipe is None: + print("Model not loaded, loading now...") + load_model() + + # Generate image + result = pipe( + prompt=prompt, + num_inference_steps=steps, + guidance_scale=cfg_scale, + width=width, + height=height, + generator=torch.Generator().manual_seed(seed) if seed else None + ) + + image = result.images[0] + + # Prepare image data for IPFS upload + image_filename = f"art_token_{token_id}_{uuid.uuid4().hex[:8]}.png" + + # Convert image to bytes for IPFS upload + buffer = io.BytesIO() + image.save(buffer, format='PNG') + image_bytes = buffer.getvalue() + + print(f"โœ… Image generated successfully for token {token_id}") + print(f"๐Ÿ“ Image size: {len(image_bytes)} bytes") + + # Upload to IPFS via Pinata + ipfs_hash = None + ipfs_url = None + + if PINATA_JWT: + metadata = { + 'tokenId': str(token_id), + 'userId': str(user_id) if user_id else 'anonymous', + 'prompt': prompt[:50] + '...' if len(prompt) > 50 else prompt + } + + ipfs_hash = upload_to_pinata(image_bytes, image_filename, metadata) + if ipfs_hash: + ipfs_url = f'https://gateway.pinata.cloud/ipfs/{ipfs_hash}' + print(f"๐ŸŒ IPFS URL: {ipfs_url}") + else: + print("โš ๏ธ Pinata JWT not configured, skipping IPFS upload") + + # Save metadata to MongoDB if user_id is provided + parameters = { + 'steps': steps, + 'cfg_scale': cfg_scale, + 'seed': seed, + 'width': width, + 'height': height + } + + if user_id and ipfs_hash: + save_image_metadata_to_mongodb(user_id, token_id, ipfs_hash, prompt, parameters) + + return jsonify({ + 'success': True, + 'ipfsHash': ipfs_hash, + 'ipfsUrl': ipfs_url, + 'imageBase64': f'data:image/png;base64,{base64.b64encode(image_bytes).decode()}', + 'tokenId': token_id, + 'prompt': prompt, + 'parameters': parameters + }) + + except Exception as e: + print(f"โŒ Error generating image: {str(e)}") + return jsonify({ + 'success': False, + 'error': str(e) + }), 500 + +@app.route('/generated_images/') +def serve_image(filename): + """Serve generated images (legacy endpoint - images now stored on IPFS)""" + try: + return send_file(f'generated_images/{filename}') + except FileNotFoundError: + return jsonify({'error': 'Image not found'}), 404 + +@app.route('/health', methods=['GET']) +def health_check(): + """Health check endpoint""" + return jsonify({ + 'status': 'healthy', + 'model_loaded': pipe is not None, + 'cuda_available': torch.cuda.is_available() + }) + +@app.route('/', methods=['GET']) +def index(): + """Root endpoint""" + return jsonify({ + 'message': 'AleaArt Python Backend (Simplified)', + 'endpoints': [ + '/generate-image', + '/health', + '/generated_images/' + ] + }) + +if __name__ == '__main__': + print("Starting AleaArt Python Backend (Simplified)...") + print("Installing required packages...") + + # Install required packages + import subprocess + import sys + + packages = [ + 'torch', + 'diffusers', + 'transformers', + 'scipy', + 'flask', + 'flask-cors', + 'pillow', + 'pymongo', + 'requests' + ] + + for package in packages: + try: + subprocess.check_call([sys.executable, '-m', 'pip', 'install', package]) + except subprocess.CalledProcessError: + print(f"Warning: Could not install {package}") + + # Connect to MongoDB + print("Connecting to MongoDB...") + connect_mongodb() + + # Load the model at startup + print("Loading Stable Diffusion model at startup...") + load_model() + + print("Starting Flask server...") + app.run(host='0.0.0.0', port=8000, debug=True) diff --git a/entropy/AleaArt/requirements.txt b/entropy/AleaArt/requirements.txt new file mode 100644 index 0000000..ab1a4b2 --- /dev/null +++ b/entropy/AleaArt/requirements.txt @@ -0,0 +1,11 @@ +torch>=2.0.0 +diffusers>=0.21.0 +transformers>=4.30.0 +scipy>=1.10.0 +flask>=2.3.0 +flask-cors>=4.0.0 +pillow>=9.5.0 +accelerate>=0.20.0 +# xformers>=0.0.20 # Commented out due to macOS compatibility issues +pymongo +python-dotenv \ No newline at end of file diff --git a/entropy/AleaArt/requirements_macos.txt b/entropy/AleaArt/requirements_macos.txt new file mode 100644 index 0000000..0209fe2 --- /dev/null +++ b/entropy/AleaArt/requirements_macos.txt @@ -0,0 +1,11 @@ +torch>=2.0.0 +diffusers>=0.21.0 +transformers>=4.30.0 +scipy>=1.10.0 +flask>=2.3.0 +flask-cors>=4.0.0 +pillow>=9.5.0 +accelerate>=0.20.0 + +python-dotenv +pymongo \ No newline at end of file diff --git a/entropy/AleaArt/scripts/deploy-artParams.ts b/entropy/AleaArt/scripts/deploy-artParams.ts new file mode 100644 index 0000000..68b36f6 --- /dev/null +++ b/entropy/AleaArt/scripts/deploy-artParams.ts @@ -0,0 +1,87 @@ +import * as dotenv from "dotenv"; +import { ethers } from "ethers"; +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +// Load environment variables +dotenv.config(); + +// Fix __dirname for ES modules +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +async function main() { + console.log("Deploying EntropyArtParamsV2 to Arbitrum Sepolia..."); + + // Check environment variables + if (!process.env.SEPOLIA_RPC_URL) { + throw new Error("SEPOLIA_RPC_URL not set in environment variables"); + } + if (!process.env.SEPOLIA_PRIVATE_KEY) { + throw new Error("SEPOLIA_PRIVATE_KEY not set in environment variables"); + } + + // Connect to Arbitrum Sepolia network + const provider = new ethers.JsonRpcProvider(process.env.SEPOLIA_RPC_URL); + + // Ensure private key has 0x prefix + const privateKey = process.env.SEPOLIA_PRIVATE_KEY.startsWith('0x') + ? process.env.SEPOLIA_PRIVATE_KEY + : '0x' + process.env.SEPOLIA_PRIVATE_KEY; + + const wallet = new ethers.Wallet(privateKey, provider); + + console.log("Deploying from address:", wallet.address); + + // Read compiled contract artifacts + const artifactsPath = path.join(__dirname, "../artifacts/contracts/EntropyArtParamsV2.sol/EntropyArtParamsV2.json"); + const artifacts = JSON.parse(fs.readFileSync(artifactsPath, "utf8")); + + // Create contract factory from artifacts + const factory = new ethers.ContractFactory(artifacts.abi, artifacts.bytecode, wallet); + + // Generate a unique collection salt + const collectionSalt = ethers.keccak256(ethers.toUtf8Bytes("AleaArt Collection " + Date.now())); + + console.log("Collection Salt:", collectionSalt); + + // Deploy the contract + const contract = await factory.deploy(collectionSalt); + + await contract.waitForDeployment(); + + const contractAddress = await contract.getAddress(); + console.log("Contract deployed to:", contractAddress); + + // Verify deployment + console.log("Verifying deployment..."); + const entropy = "0x549Ebba8036Ab746611B4fFA1423eb0A4Df61440"; // We know this from the contract + console.log("Entropy address:", entropy); + + // Test the fee function + try { + const fee = await contract.quoteEntropyFee(); + console.log("Required fee:", ethers.formatEther(fee), "ETH"); + } catch (error) { + console.log("Fee check failed:", error.message); + } + + console.log("\n๐ŸŽจ EntropyArtParamsV2 Deployment successful!"); + console.log("Contract Address:", contractAddress); + console.log("Network: Arbitrum Sepolia"); + console.log("Entropy Address:", entropy); + console.log("Collection Salt:", collectionSalt); + console.log("\n๐Ÿ“‹ Contract Features:"); + console.log("- Generates art parameters from randomness"); + console.log("- Uses Pyth Entropy v2 for verifiable randomness"); + console.log("- Creates unique tokens with deterministic parameters"); + console.log("- Supports prompt, style, sampler, aspect ratio, and more"); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/entropy/AleaArt/scripts/deploy-nft-arbitrum.ts b/entropy/AleaArt/scripts/deploy-nft-arbitrum.ts new file mode 100644 index 0000000..f88096e --- /dev/null +++ b/entropy/AleaArt/scripts/deploy-nft-arbitrum.ts @@ -0,0 +1,84 @@ +import * as dotenv from "dotenv"; +import { ethers } from "ethers"; +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +// Load environment variables +dotenv.config(); + +// Fix __dirname for ES modules +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +async function main() { + console.log("Deploying AleaArt NFT Contract to Arbitrum Sepolia..."); + + // Check environment variables + if (!process.env.SEPOLIA_RPC_URL) { + throw new Error("SEPOLIA_RPC_URL not set in environment variables"); + } + if (!process.env.SEPOLIA_PRIVATE_KEY) { + throw new Error("SEPOLIA_PRIVATE_KEY not set in environment variables"); + } + + // Connect to Arbitrum Sepolia network + const provider = new ethers.JsonRpcProvider(process.env.SEPOLIA_RPC_URL); + + // Ensure private key has 0x prefix + const privateKey = process.env.SEPOLIA_PRIVATE_KEY.startsWith('0x') + ? process.env.SEPOLIA_PRIVATE_KEY + : '0x' + process.env.SEPOLIA_PRIVATE_KEY; + + const wallet = new ethers.Wallet(privateKey, provider); + + console.log("Deploying from address:", wallet.address); + + // Read compiled contract artifacts + const artifactsPath = path.join(__dirname, "../artifacts/contracts/AleaArtNFT.sol/AleaArtNFT.json"); + const artifacts = JSON.parse(fs.readFileSync(artifactsPath, "utf8")); + + // Create contract factory from artifacts + const factory = new ethers.ContractFactory(artifacts.abi, artifacts.bytecode, wallet); + + // Deploy the contract + const contract = await factory.deploy(); + + await contract.waitForDeployment(); + + const contractAddress = await contract.getAddress(); + console.log("โœ… Contract deployed to:", contractAddress); + + // Verify deployment + console.log("Verifying deployment..."); + const owner = await contract.owner(); + console.log("Contract owner:", owner); + + // Save contract address to environment files + const envContent = `NEXT_PUBLIC_NFT_CONTRACT_ADDRESS=${contractAddress}\n`; + + try { + // Update .env.local + fs.writeFileSync('.env.local', envContent); + console.log("Contract address saved to .env.local"); + + // Also update the frontend .env.local + fs.writeFileSync('frontend-aleart/.env.local', envContent); + console.log("Contract address saved to frontend-aleart/.env.local"); + } catch (error) { + console.log("Could not save to .env.local files, please add manually:"); + console.log(`NEXT_PUBLIC_NFT_CONTRACT_ADDRESS=${contractAddress}`); + } + + console.log("\n๐ŸŽ‰ Deployment successful!"); + console.log("Contract Address:", contractAddress); + console.log("Network: Arbitrum Sepolia"); + console.log("Explorer: https://sepolia.arbiscan.io/address/" + contractAddress); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/entropy/AleaArt/scripts/deploy-spotlight-arbitrum.ts b/entropy/AleaArt/scripts/deploy-spotlight-arbitrum.ts new file mode 100644 index 0000000..cdd4633 --- /dev/null +++ b/entropy/AleaArt/scripts/deploy-spotlight-arbitrum.ts @@ -0,0 +1,93 @@ +import * as dotenv from "dotenv"; +import { ethers } from "ethers"; +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +dotenv.config(); + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +async function main() { + console.log("Deploying SpotlightSelector Contract to Arbitrum Sepolia..."); + + if (!process.env.SEPOLIA_RPC_URL) { + throw new Error("SEPOLIA_RPC_URL not set in environment variables"); + } + if (!process.env.SEPOLIA_PRIVATE_KEY) { + throw new Error("SEPOLIA_PRIVATE_KEY not set in environment variables"); + } + + const provider = new ethers.JsonRpcProvider(process.env.SEPOLIA_RPC_URL); + + const privateKey = process.env.SEPOLIA_PRIVATE_KEY.startsWith('0x') + ? process.env.SEPOLIA_PRIVATE_KEY + : '0x' + process.env.SEPOLIA_PRIVATE_KEY; + + const wallet = new ethers.Wallet(privateKey, provider); + + console.log("Deploying from address:", wallet.address); + + // Contract addresses + const ALEA_ART_NFT_ADDRESS = "0x806019F8a33A01a4A3fea93320601cC77B6Dcb79"; + + // Read contract artifacts + const artifactsPath = path.join(__dirname, "../artifacts/contracts/SpotlightSelector.sol/SpotlightSelector.json"); + const artifacts = JSON.parse(fs.readFileSync(artifactsPath, "utf8")); + + const factory = new ethers.ContractFactory(artifacts.abi, artifacts.bytecode, wallet); + + // Deploy with constructor arguments + const contract = await factory.deploy(ALEA_ART_NFT_ADDRESS); + + await contract.waitForDeployment(); + + const contractAddress = await contract.getAddress(); + console.log("โœ… Contract deployed to:", contractAddress); + + console.log("Verifying deployment..."); + const owner = await contract.owner(); + console.log("Contract owner:", owner); + + const aleaArtNFT = await contract.aleaArtNFT(); + console.log("Connected AleaArtNFT:", aleaArtNFT); + + const spotlightDuration = await contract.spotlightDuration(); + console.log("Spotlight duration:", spotlightDuration.toString(), "seconds"); + + const spotlightFee = await contract.spotlightFee(); + console.log("Spotlight fee:", ethers.formatEther(spotlightFee), "ETH"); + + // Save contract address to environment files + const envContent = `NEXT_PUBLIC_SPOTLIGHT_CONTRACT_ADDRESS=${contractAddress}\n`; + + try { + fs.writeFileSync('.env.local', envContent, { flag: 'a' }); + console.log("Contract address saved to .env.local"); + + fs.writeFileSync('frontend-aleart/.env.local', envContent, { flag: 'a' }); + console.log("Contract address saved to frontend-aleart/.env.local"); + } catch (error) { + console.log("Could not save to .env.local files, please add manually:"); + console.log(`NEXT_PUBLIC_SPOTLIGHT_CONTRACT_ADDRESS=${contractAddress}`); + } + + console.log("\n๐ŸŽ‰ Deployment successful!"); + console.log("Contract Address:", contractAddress); + console.log("Network: Arbitrum Sepolia"); + console.log("Explorer: https://sepolia.arbiscan.io/address/" + contractAddress); + console.log("\nContract Details:"); + console.log("- AleaArtNFT Address:", ALEA_ART_NFT_ADDRESS); + console.log("- Pyth Entropy Contract: 0x549Ebba8036Ab746611B4fFA1423eb0A4Df61440"); + console.log("- Pyth Entropy Provider: 0x6CC14824Ea2918f5De5C2f75A9Da968ad4BD6344"); + console.log("- Spotlight Duration: 24 hours"); + console.log("- Spotlight Fee: 0.001 ETH"); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/entropy/AleaArt/start_python_backend.sh b/entropy/AleaArt/start_python_backend.sh new file mode 100755 index 0000000..6358a43 --- /dev/null +++ b/entropy/AleaArt/start_python_backend.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +echo "๐ŸŽจ Starting AleaArt Python Backend..." + +# Check if Python is installed +if ! command -v python3 &> /dev/null; then + echo "โŒ Python 3 is not installed. Please install Python 3 first." + exit 1 +fi + +# Check if pip is installed +if ! command -v pip3 &> /dev/null; then + echo "โŒ pip3 is not installed. Please install pip3 first." + exit 1 +fi + +# Create virtual environment if it doesn't exist +if [ ! -d "venv" ]; then + echo "๐Ÿ“ฆ Creating virtual environment..." + python3 -m venv venv +fi + +# Activate virtual environment +echo "๐Ÿ”ง Activating virtual environment..." +source venv/bin/activate + +# Install requirements +echo "๐Ÿ“ฅ Installing Python dependencies..." +pip install -r requirements.txt + +# Check if installation was successful +if [ $? -ne 0 ]; then + echo "โš ๏ธ Some packages failed to install. Trying individual installation..." + pip install torch diffusers transformers scipy flask flask-cors pillow accelerate +fi + +# Create generated_images directory +mkdir -p generated_images + +# Start the Flask server +echo "๐Ÿš€ Starting Flask server on http://localhost:8000" +echo "๐Ÿ“‹ Available endpoints:" +echo " - POST /generate-image - Generate image from art parameters" +echo " - GET /health - Health check" +echo " - GET /generated_images/ - Serve generated images" +echo "" +echo "Press Ctrl+C to stop the server" + +python python_backend.py diff --git a/entropy/AleaArt/start_python_backend_global.sh b/entropy/AleaArt/start_python_backend_global.sh new file mode 100644 index 0000000..1dcb45d --- /dev/null +++ b/entropy/AleaArt/start_python_backend_global.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +echo "๐ŸŽจ Starting AleaArt Python Backend (Global Installation)..." + +# Check if Python is installed +if ! command -v python3 &> /dev/null; then + echo "โŒ Python 3 is not installed. Please install Python 3 first." + exit 1 +fi + +# Check if pip is installed +if ! command -v pip3 &> /dev/null; then + echo "โŒ pip3 is not installed. Please install pip3 first." + exit 1 +fi + +# Install requirements with better error handling +echo "๐Ÿ“ฅ Installing Python dependencies globally..." +pip3 install --upgrade pip + +# Install packages individually to handle errors better +packages=("torch" "diffusers" "transformers" "scipy" "flask" "flask-cors" "pillow" "pymongo" "python-dotenv") + +for package in "${packages[@]}"; do + echo "Installing $package..." + pip3 install "$package" || echo "โš ๏ธ Failed to install $package, continuing..." +done + +# Create generated_images directory +mkdir -p generated_images + +# Start the Flask server with simplified backend +echo "๐Ÿš€ Starting Flask server on http://localhost:8000" +echo "๐Ÿ“‹ Available endpoints:" +echo " - POST /generate-image - Generate image from art parameters" +echo " - GET /health - Health check" +echo " - GET /generated_images/ - Serve generated images" +echo "" +echo "Using simplified backend (runwayml/stable-diffusion-v1-5)" +echo "Press Ctrl+C to stop the server" + +python3 python_backend_simple.py diff --git a/entropy/AleaArt/start_python_backend_macos.sh b/entropy/AleaArt/start_python_backend_macos.sh new file mode 100755 index 0000000..bc75771 --- /dev/null +++ b/entropy/AleaArt/start_python_backend_macos.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +echo "๐ŸŽจ Starting AleaArt Python Backend (macOS Compatible)..." + +# Check if Python is installed +if ! command -v python3 &> /dev/null; then + echo "โŒ Python 3 is not installed. Please install Python 3 first." + exit 1 +fi + +# Check if pip is installed +if ! command -v pip3 &> /dev/null; then + echo "โŒ pip3 is not installed. Please install pip3 first." + exit 1 +fi + +# Create virtual environment if it doesn't exist +if [ ! -d "venv" ]; then + echo "๐Ÿ“ฆ Creating virtual environment..." + python3 -m venv venv +fi + +# Activate virtual environment +echo "๐Ÿ”ง Activating virtual environment..." +source venv/bin/activate + +# Install requirements with better error handling +echo "๐Ÿ“ฅ Installing Python dependencies..." +pip install --upgrade pip + +# Install packages individually to handle errors better +packages=("torch" "diffusers" "transformers" "scipy" "flask" "flask-cors" "pillow" "accelerate") + +for package in "${packages[@]}"; do + echo "Installing $package..." + pip install "$package" || echo "โš ๏ธ Failed to install $package, continuing..." +done + +# Create generated_images directory +mkdir -p generated_images + +# Start the Flask server with macOS-compatible backend +echo "๐Ÿš€ Starting Flask server on http://localhost:8000" +echo "๐Ÿ“‹ Available endpoints:" +echo " - POST /generate-image - Generate image from art parameters" +echo " - GET /health - Health check" +echo " - GET /generated_images/ - Serve generated images" +echo "" +echo "Using macOS-compatible backend (runwayml/stable-diffusion-v1-5)" +echo "Press Ctrl+C to stop the server" + +python python_backend_macos.py + diff --git a/entropy/AleaArt/start_python_backend_simple.sh b/entropy/AleaArt/start_python_backend_simple.sh new file mode 100755 index 0000000..4351d4b --- /dev/null +++ b/entropy/AleaArt/start_python_backend_simple.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +echo "๐ŸŽจ Starting AleaArt Python Backend (Simplified Version)..." + +# Check if Python is installed +if ! command -v python3 &> /dev/null; then + echo "โŒ Python 3 is not installed. Please install Python 3 first." + exit 1 +fi + +# Check if pip is installed +if ! command -v pip3 &> /dev/null; then + echo "โŒ pip3 is not installed. Please install pip3 first." + exit 1 +fi + +# Create virtual environment if it doesn't exist +if [ ! -d "venv" ]; then + echo "๐Ÿ“ฆ Creating virtual environment..." + python3 -m venv venv +fi + +# Activate virtual environment +echo "๐Ÿ”ง Activating virtual environment..." +source venv/bin/activate + +# Install requirements with better error handling +echo "๐Ÿ“ฅ Installing Python dependencies..." +pip install --upgrade pip + +# Install packages individually to handle errors better +packages=("torch" "diffusers" "transformers" "scipy" "flask" "flask-cors" "pillow" "pymongo" "python-dotenv") + +for package in "${packages[@]}"; do + echo "Installing $package..." + pip install "$package" || echo "โš ๏ธ Failed to install $package, continuing..." +done + +# Create generated_images directory +mkdir -p generated_images + +# Start the Flask server with simplified backend +echo "๐Ÿš€ Starting Flask server on http://localhost:8000" +echo "๐Ÿ“‹ Available endpoints:" +echo " - POST /generate-image - Generate image from art parameters" +echo " - GET /health - Health check" +echo " - GET /generated_images/ - Serve generated images" +echo "" +echo "Using simplified backend (runwayml/stable-diffusion-v1-5)" +echo "Press Ctrl+C to stop the server" + +python python_backend_simple.py + diff --git a/entropy/AleaArt/test/Counter.ts b/entropy/AleaArt/test/Counter.ts new file mode 100644 index 0000000..f8c3898 --- /dev/null +++ b/entropy/AleaArt/test/Counter.ts @@ -0,0 +1,36 @@ +import { expect } from "chai"; +import { network } from "hardhat"; + +const { ethers } = await network.connect(); + +describe("Counter", function () { + it("Should emit the Increment event when calling the inc() function", async function () { + const counter = await ethers.deployContract("Counter"); + + await expect(counter.inc()).to.emit(counter, "Increment").withArgs(1n); + }); + + it("The sum of the Increment events should match the current value", async function () { + const counter = await ethers.deployContract("Counter"); + const deploymentBlockNumber = await ethers.provider.getBlockNumber(); + + // run a series of increments + for (let i = 1; i <= 10; i++) { + await counter.incBy(i); + } + + const events = await counter.queryFilter( + counter.filters.Increment(), + deploymentBlockNumber, + "latest", + ); + + // check that the aggregated events match the current value + let total = 0n; + for (const event of events) { + total += event.args.by; + } + + expect(await counter.x()).to.equal(total); + }); +}); diff --git a/entropy/AleaArt/test_async_api.py b/entropy/AleaArt/test_async_api.py new file mode 100644 index 0000000..80fe067 --- /dev/null +++ b/entropy/AleaArt/test_async_api.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +""" +Test the async image generation API directly +""" + +import requests +import json + +def test_async_api(): + """Test the async image generation API""" + print("๐Ÿงช Testing Async Image Generation API...") + + # Test data + test_data = { + "parameters": { + "promptIndex": 1, + "styleIndex": 0, + "samplerIndex": 3, + "aspectIndex": 2, + "steps": 20, + "cfg": 75, + "latentSeed": 12345, + "paletteId": 5 + }, + "tokenId": 999 + } + + try: + print("๐Ÿ“ค Sending request to async API...") + response = requests.post( + "http://localhost:3000/api/generate-image-async", + json=test_data, + headers={"Content-Type": "application/json"}, + timeout=10 + ) + + print(f"๐Ÿ“ฅ Response status: {response.status_code}") + print(f"๐Ÿ“ฅ Response body: {response.text}") + + if response.status_code == 200: + result = response.json() + if result.get('success'): + print("โœ… Async image generation started successfully!") + print(f" Message: {result.get('message')}") + print(f" Token ID: {result.get('tokenId')}") + print(f" Status: {result.get('status')}") + return True + else: + print(f"โŒ API returned error: {result.get('error')}") + return False + else: + print(f"โŒ HTTP error: {response.status_code}") + return False + + except Exception as e: + print(f"โŒ Request failed: {e}") + return False + +if __name__ == "__main__": + success = test_async_api() + if success: + print("\n๐ŸŽ‰ Async API test passed!") + else: + print("\n๐Ÿ’ฅ Test failed.") + diff --git a/entropy/AleaArt/test_async_generation.py b/entropy/AleaArt/test_async_generation.py new file mode 100644 index 0000000..b7bd737 --- /dev/null +++ b/entropy/AleaArt/test_async_generation.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +""" +Test script for async image generation +""" + +import requests +import json +import time + +def test_async_generation(): + """Test the async image generation""" + base_url = "http://localhost:8000" + + print("๐Ÿงช Testing Async Image Generation...") + + # Test data with art parameters + test_data = { + "prompt": "a beautiful landscape, digital art, detailed", + "steps": 10, # Reduced for faster testing + "cfg_scale": 7.5, + "seed": 12345, + "width": 512, + "height": 512, + "tokenId": "test_async" + } + + print("๐ŸŽจ Starting async image generation...") + try: + response = requests.post( + f"{base_url}/generate-image", + json=test_data, + timeout=30 + ) + + if response.status_code == 200: + result = response.json() + if result.get('success'): + print("โœ… Async image generation started successfully!") + print(f" Token ID: {result.get('tokenId')}") + print(f" Image URL: {result.get('imageUrl')}") + return True + else: + print(f"โŒ Async generation failed: {result.get('error')}") + return False + else: + print(f"โŒ Request failed: {response.status_code}") + print(f" Response: {response.text}") + return False + + except Exception as e: + print(f"โŒ Error: {e}") + return False + +if __name__ == "__main__": + success = test_async_generation() + if success: + print("\n๐ŸŽ‰ Async image generation test passed!") + else: + print("\n๐Ÿ’ฅ Test failed.") + diff --git a/entropy/AleaArt/test_backend.py b/entropy/AleaArt/test_backend.py new file mode 100755 index 0000000..e6a25c6 --- /dev/null +++ b/entropy/AleaArt/test_backend.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +""" +Test script for AleaArt Python Backend +""" + +import requests +import json +import time + +def test_backend(): + """Test the Python backend""" + base_url = "http://localhost:8000" + + print("๐Ÿงช Testing AleaArt Python Backend...") + + # Test health endpoint + try: + response = requests.get(f"{base_url}/health", timeout=10) + if response.status_code == 200: + print("โœ… Health check passed") + print(f" Response: {response.json()}") + else: + print(f"โŒ Health check failed: {response.status_code}") + return False + except Exception as e: + print(f"โŒ Health check error: {e}") + return False + + # Test image generation + test_data = { + "prompt": "a beautiful landscape, digital art, detailed", + "steps": 10, # Reduced for faster testing + "cfg_scale": 7.5, + "seed": 12345, + "width": 512, + "height": 512, + "tokenId": "test" + } + + print("๐ŸŽจ Testing image generation...") + try: + response = requests.post( + f"{base_url}/generate-image", + json=test_data, + timeout=60 # Longer timeout for image generation + ) + + if response.status_code == 200: + result = response.json() + if result.get('success'): + print("โœ… Image generation successful!") + print(f" Token ID: {result.get('tokenId')}") + print(f" Image URL: {result.get('imageUrl')}") + return True + else: + print(f"โŒ Image generation failed: {result.get('error')}") + return False + else: + print(f"โŒ Image generation request failed: {response.status_code}") + print(f" Response: {response.text}") + return False + + except Exception as e: + print(f"โŒ Image generation error: {e}") + return False + +if __name__ == "__main__": + print("Waiting for server to start...") + time.sleep(10) # Wait for server to start + + success = test_backend() + if success: + print("\n๐ŸŽ‰ All tests passed! Backend is working correctly.") + else: + print("\n๐Ÿ’ฅ Tests failed. Check the server logs for errors.") + diff --git a/entropy/AleaArt/tsconfig.json b/entropy/AleaArt/tsconfig.json new file mode 100644 index 0000000..9b1380c --- /dev/null +++ b/entropy/AleaArt/tsconfig.json @@ -0,0 +1,13 @@ +/* Based on https://github.com/tsconfig/bases/blob/501da2bcd640cf95c95805783e1012b992338f28/bases/node22.json */ +{ + "compilerOptions": { + "lib": ["es2023"], + "module": "node16", + "target": "es2022", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "moduleResolution": "node16", + "outDir": "dist" + } +}