diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b7faf40..0000000 --- a/.gitignore +++ /dev/null @@ -1,207 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[codz] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py.cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# UV -# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -#uv.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock -#poetry.toml - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. -# https://pdm-project.org/en/latest/usage/project/#working-with-version-control -#pdm.lock -#pdm.toml -.pdm-python -.pdm-build/ - -# pixi -# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. -#pixi.lock -# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one -# in the .venv directory. It is recommended not to include this directory in version control. -.pixi - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.envrc -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ - -# Abstra -# Abstra is an AI-powered process automation framework. -# Ignore directories containing user credentials, local state, and settings. -# Learn more at https://abstra.io/docs -.abstra/ - -# Visual Studio Code -# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore -# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore -# and can be added to the global gitignore or merged into this file. However, if you prefer, -# you could uncomment the following to ignore the entire vscode folder -# .vscode/ - -# Ruff stuff: -.ruff_cache/ - -# PyPI configuration file -.pypirc - -# Cursor -# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to -# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data -# refer to https://docs.cursor.com/context/ignore-files -.cursorignore -.cursorindexingignore - -# Marimo -marimo/_static/ -marimo/_lsp/ -__marimo__/ diff --git a/Quilt/.gitignore b/Quilt/.gitignore new file mode 100644 index 0000000..64666d5 --- /dev/null +++ b/Quilt/.gitignore @@ -0,0 +1,68 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual environments +venv/ +env/ +ENV/ +.venv/ + +# UV +.uv/ +# Note: uv.lock should be committed for reproducibility + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Jupyter +.ipynb_checkpoints/ +*.ipynb + +# Testing +.pytest_cache/ +.coverage +htmlcov/ +.tox/ + +# Generated files +*.png +*.jpg +*.jpeg +*.svg +*.pdf +*.txt +!README.txt +# Logs +*.log + +# OS +.DS_Store +Thumbs.db + +# Project specific +output/ +results/ +temp/ diff --git a/Quilt/.python-version b/Quilt/.python-version new file mode 100644 index 0000000..e0aad9e --- /dev/null +++ b/Quilt/.python-version @@ -0,0 +1,2 @@ +3.12 + diff --git a/Quilt/CONTRIBUTING.md b/Quilt/CONTRIBUTING.md new file mode 100644 index 0000000..767f4ce --- /dev/null +++ b/Quilt/CONTRIBUTING.md @@ -0,0 +1,134 @@ +# Contributing to Quilt + +Thank you for your interest in contributing! This document provides guidelines and instructions for contributing to the project. + +## Development Setup + +1. **Fork and clone the repository**: + ```bash + git clone + cd Quilt + ``` + +2. **Install uv** (if not already installed): + ```bash + curl -LsSf https://astral.sh/uv/install.sh | sh + ``` + +3. **Set up the development environment**: + ```bash + uv sync --dev + ``` + +4. **Activate the environment**: + ```bash + source .venv/bin/activate # or .venv\Scripts\activate on Windows + ``` + +## Code Style + +We use: +- **Black** for code formatting (line length: 100) +- **Ruff** for linting +- **Python 3.12+** syntax + +### Formatting + +```bash +# Format all code +uv run black macro_gate_detector/ tests/ examples/ + +# Check formatting +uv run black --check macro_gate_detector/ tests/ examples/ +``` + +### Linting + +```bash +# Run linter +uv run ruff check macro_gate_detector/ tests/ examples/ + +# Auto-fix issues +uv run ruff check --fix macro_gate_detector/ tests/ examples/ +``` + +## Testing + +1. **Run all tests**: + ```bash + uv run pytest macro_gate_detector/tests/ + ``` + +2. **Run with coverage**: + ```bash + uv run pytest macro_gate_detector/tests/ --cov=macro_gate_detector --cov-report=html + ``` + +3. **Run specific test**: + ```bash + uv run pytest macro_gate_detector/tests/test_3_qasm.py -v + ``` + +## Project Structure + +- `macro_gate_detector/` - Main package code +- `macro_gate_detector/tests/` - Test suite +- `examples/` - Example scripts demonstrating usage +- `output/` - Generated files (images, JSON) - not committed to git + +## Adding New Features + +1. Create a feature branch: + ```bash + git checkout -b feature/your-feature-name + ``` + +2. Make your changes following the code style guidelines + +3. Add tests for new functionality + +4. Update documentation if needed + +5. Run tests and ensure they pass: + ```bash + uv run pytest macro_gate_detector/tests/ + ``` + +6. Format and lint your code: + ```bash + uv run black macro_gate_detector/ + uv run ruff check macro_gate_detector/ + ``` + +7. Commit your changes: + ```bash + git add . + git commit -m "Add: description of your feature" + ``` + +## Adding Dependencies + +If you need to add a new dependency: + +```bash +# Runtime dependency +uv add package-name + +# Dev dependency +uv add --dev package-name +``` + +This automatically updates `pyproject.toml` and `uv.lock`. + +## Pull Request Process + +1. Ensure all tests pass +2. Update documentation if needed +3. Follow the commit message format: `Type: Description` + - Types: `Add`, `Fix`, `Update`, `Remove`, `Refactor`, `Docs` +4. Create a pull request with a clear description + +## Questions? + +Feel free to open an issue for questions or discussions! + diff --git a/Quilt/REACT_SETUP_GUIDE.md b/Quilt/REACT_SETUP_GUIDE.md new file mode 100644 index 0000000..9db0e94 --- /dev/null +++ b/Quilt/REACT_SETUP_GUIDE.md @@ -0,0 +1,66 @@ +# React Setup Guide + +## Step 1: Install Node.js + +You need to install Node.js first. Here's how: + +1. **Download Node.js:** + - Go to https://nodejs.org/ + - Download the LTS (Long Term Support) version (recommended for beginners) + - Run the installer and follow the setup wizard + - Make sure to check "Add to PATH" during installation + +2. **Verify Installation:** + After installation, open a new terminal and run: + ```powershell + node --version + npm --version + ``` + Both commands should show version numbers. + +## Step 2: Create Your React Project + +Once Node.js is installed, you can create a React project using one of these methods: + +### Option A: Using Vite (Recommended - Fast & Modern) +```powershell +npm create vite@latest my-react-app -- --template react +cd my-react-app +npm install +npm run dev +``` + +### Option B: Using Create React App (Traditional) +```powershell +npx create-react-app my-react-app +cd my-react-app +npm start +``` + +## Step 3: Start Coding! + +After running `npm run dev` (Vite) or `npm start` (Create React App): +- Your app will be available at http://localhost:5173 (Vite) or http://localhost:3000 (Create React App) +- Edit `src/App.jsx` (or `src/App.js`) to start coding +- The page will automatically reload when you save changes + +## Project Structure + +``` +my-react-app/ +├── src/ +│ ├── App.jsx # Main component (start here!) +│ ├── main.jsx # Entry point +│ └── index.css # Styles +├── public/ # Static files +├── package.json # Dependencies +└── vite.config.js # Vite configuration +``` + +## Next Steps + +1. Open `src/App.jsx` and start editing +2. Learn React basics: Components, JSX, Props, State +3. Check out the React documentation: https://react.dev/ + + diff --git a/Quilt/README.md b/Quilt/README.md new file mode 100644 index 0000000..a81ff72 --- /dev/null +++ b/Quilt/README.md @@ -0,0 +1,253 @@ +# Quilt 🐻💻 + +**Quantum circuit macro-gate detection and hierarchical visualization tool** + +Bruno's professional quantum circuit analysis toolkit for detecting repeated gate patterns (macro-gates) and creating hierarchical circuit representations. + +## 🚀 Quick Start + +### Prerequisites + +- **Python ≥ 3.12** (required by Professor CNOTworthy!) +- **uv** package manager ([install uv](https://github.com/astral-sh/uv)) + +### Installation + +1. **Install uv** (if not already installed): + ```bash + # On macOS/Linux + curl -LsSf https://astral.sh/uv/install.sh | sh + + # On Windows (PowerShell) + powershell -c "irm https://astral.sh/uv/install.ps1 | iex" + ``` + +2. **Clone and setup the repository**: + ```bash + git clone + cd Quilt + uv sync + ``` + +3. **Activate the environment**: + ```bash + # On macOS/Linux + source .venv/bin/activate + + # On Windows + .venv\Scripts\activate + ``` + +### Verify Installation + +```bash +python -c "import qiskit; print(f'Qiskit version: {qiskit.__version__}')" +# Should show Qiskit >= 2.2.3 +``` + +## 📦 Project Structure + +``` +Quilt/ +├── macro_gate_detector/ # Main package +│ ├── __init__.py +│ ├── macro_gate_detector.py # Core module +│ ├── big_circuit/ # Large test circuits +│ │ └── 3.qasm +│ └── MACRO_GATE_DETECTOR_README.md +├── examples/ # Example scripts +│ ├── example_usage.py +│ └── circuit_3.py +├── tests/ # Test suite +│ └── test_3_qasm.py +├── output/ # Generated files (images, JSON) +├── pyproject.toml # Project configuration (uv) +├── uv.lock # Locked dependencies +└── README.md # This file +``` + +## 💡 Usage + +### Basic Example + +```python +from macro_gate_detector import analyze_circuit, create_macro_gate_circuit +from qiskit import QuantumCircuit + +# Create your circuit +qc = QuantumCircuit(4) +for layer in range(3): + for i in range(3): + qc.cx(i, i+1) + for i in range(4): + qc.ry(0.5, i) + +# Analyze it +result = analyze_circuit(qc) + +# Create macro-compiled circuit +macro_circuit = create_macro_gate_circuit(qc, result) + +# Save results +import json +with open('output/analysis.json', 'w') as f: + json.dump(result, f, indent=2) +``` + +### Run Examples + +```bash +# Basic example +uv run python examples/example_usage.py + +# Circuit 3 example +uv run python examples/circuit_3.py + +# Comprehensive test on large circuit +cd macro_gate_detector/big_circuit +uv run python -m macro_gate_detector.tests.test_3_qasm +``` + +## 📊 Output Structure + +The `analyze_circuit()` function returns a JSON-serializable dictionary: + +```python +{ + "dag_flat": [...], # Flat DAG (all operations) + "dag_hierarchical": [...], # Hierarchical DAG (with macro-gates) + "macros": [...], # Detected macro-gates + "statistics": {...} # Analysis statistics +} +``` + +### Converting to App Circuit Format + +You can convert the analysis result to the `app-circuit.json` format for use in the React visualization app: + +```python +from macro_gate_detector import analyze_circuit, convert_to_app_circuit_format + +result = analyze_circuit(qc) +app_circuit = convert_to_app_circuit_format(result) + +# Save as circuit_graph.json - THIS FILE GOES INTO THE REACT APP +import json +with open('circuit_graph.json', 'w') as f: + json.dump(app_circuit, f, indent=2) +``` + +The `circuit_graph.json` file (in `app-circuit.json` format) includes: +- `nodes`: All circuit nodes (init, gates, end) with layers +- `edges`: Dependencies between nodes +- `macros`: Macro definitions with `gate_ids` referencing specific gate nodes + +**React Visualization Workflow:** +1. Analyze your circuit and generate `circuit_graph.json` +2. **Upload `circuit_graph.json` to the React visualization app** (`my-react-app/`) +3. The app will render the circuit with macro-gates highlighted + +**Important:** The `circuit_graph.json` file is the output that goes into the React app. This is the file you upload/use in the React visualization. + +See [macro_gate_detector/MACRO_GATE_DETECTOR_README.md](macro_gate_detector/MACRO_GATE_DETECTOR_README.md) for detailed documentation. + +## 🧪 Testing + +### Quick Start +```bash +# Check your environment setup +python setup_env.py + +# Run all tests +uv run pytest macro_gate_detector/tests/ + +# Run specific test +uv run python -m macro_gate_detector.tests.test_small # Quick basic tests +uv run python -m macro_gate_detector.tests.test_1_qasm # Test 1.qasm circuit +uv run python -m macro_gate_detector.tests.test_3_qasm # Test 3.qasm circuit +``` + +### Test Structure +- **`test_small.py`** - Basic functionality tests (fast, no output files) +- **`test_1_qasm.py`** - Comprehensive test for 1.qasm (output in `macro_gate_detector/tests/output_test_1/`) +- **`test_3_qasm.py`** - Comprehensive test for 3.qasm (output in `macro_gate_detector/tests/output_test_3/`) + +### Test Output +Each large circuit test generates: +- `original.pdf` - Original circuit visualization +- `macro.pdf` - Macro circuit visualization +- `original_dag.png` - Original circuit DAG +- `macro_dag.png` - Macro circuit DAG +- `analysis_result.json` - Raw analysis output (full analysis result from `analyze_circuit()`) +- **`circuit_graph.json`** - **THIS FILE GOES INTO THE REACT APP** - Processed circuit graph in `app-circuit.json` format + +**Note:** For circuits with >50 qubits, only the first 50 qubits are shown in visualizations. + +**Using the JSON Output:** +- **`circuit_graph.json`** is the file you upload to the React visualization app (`my-react-app/`) +- This file contains the circuit graph in the exact format expected by the React app +- Upload `circuit_graph.json` to visualize the circuit with macro-gates highlighted + +### More Information +- **Quick Start**: See `QUICK_START.md` +- **Detailed Setup**: See `SETUP.md` +- **Test Details**: See `tests/RUN_TESTS.md` + +## 🔧 Development + +### Adding Dependencies + +```bash +# Add a new dependency +uv add package-name + +# Add a dev dependency +uv add --dev package-name + +# Update all dependencies +uv sync +``` + +### Code Quality + +```bash +# Format code +uv run black macro_gate_detector/ tests/ examples/ + +# Lint code +uv run ruff check macro_gate_detector/ tests/ examples/ +``` + +## 📋 Requirements + +- **Python**: ≥ 3.12 +- **Qiskit**: ≥ 2.2.3 +- **Dependencies**: See `pyproject.toml` + +All dependencies are managed through `uv` and locked in `uv.lock` for reproducibility. + +## 🎯 Features + +- ✅ Detects repeated gate patterns (macro-gates) +- ✅ Semantic labeling (e.g., "AnsatzLayer A", "CNOT Ladder") +- ✅ Creates hierarchical circuit representations +- ✅ Generates macro-compiled circuits +- ✅ JSON-serializable output (raw analysis + app-circuit.json format) +- ✅ Works with large circuits (tested on 156-qubit circuits) +- ✅ No consecutive CNOT gates in macro circuits +- ✅ Fully reproducible with uv +- ✅ Generates visualization-ready JSON files for React frontend integration +- ✅ Direct integration with React visualization app + +## 📝 License + +MIT License + +## 🙏 Acknowledgments + +Thanks to Professor CNOTworthy for insisting on proper package management and reproducibility! 🕰️ + +--- + +**Made with ❤️ by Bruno the Quantum Bear** + diff --git a/Quilt/REORGANIZATION_SUMMARY.md b/Quilt/REORGANIZATION_SUMMARY.md new file mode 100644 index 0000000..fff7117 --- /dev/null +++ b/Quilt/REORGANIZATION_SUMMARY.md @@ -0,0 +1,119 @@ +# Repository Reorganization Summary + +This document summarizes the reorganization and updates made to the Quilt repository to meet Professor CNOTworthy's requirements for reproducibility. + +## ✅ Completed Tasks + +### 1. Package Management with uv +- ✅ Created `pyproject.toml` with proper project metadata +- ✅ Configured dependencies (Python ≥ 3.12, Qiskit ≥ 2.2.3) +- ✅ Set up uv for dependency management +- ✅ Created `SETUP.md` with detailed uv installation instructions + +### 2. File Reorganization +- ✅ Created proper directory structure: + - `macro_gate_detector/` - Main package + - `examples/` - Example scripts + - `tests/` - Test suite + - `output/` - Generated files +- ✅ Moved example scripts to `examples/` +- ✅ Moved test files to `tests/` +- ✅ Moved generated files (PNG, JSON, TXT) to `output/` +- ✅ Created `__init__.py` for proper package structure + +### 3. Documentation +- ✅ Updated `README.md` with uv setup instructions +- ✅ Created `SETUP.md` with detailed setup guide +- ✅ Created `CONTRIBUTING.md` for contributors +- ✅ Created `PROJECT_STRUCTURE.md` documenting the organization +- ✅ Updated import paths in all scripts + +### 4. Git Configuration +- ✅ Created `.gitignore` for Python projects +- ✅ Excluded generated files from version control +- ✅ Kept `uv.lock` for reproducibility (as required) + +## 📁 New Structure + +``` +Quilt/ +├── macro_gate_detector/ # Main package +│ ├── __init__.py +│ ├── macro_gate_detector.py +│ ├── big_circuit/ +│ └── MACRO_GATE_DETECTOR_README.md +├── examples/ # Example scripts +│ ├── example_usage.py +│ └── circuit_3.py +├── tests/ # Test suite +│ └── test_3_qasm.py +├── output/ # Generated files (gitignored) +├── pyproject.toml # Project config +├── uv.lock # Locked dependencies +├── .gitignore # Git ignore rules +└── Documentation files +``` + +## 🔧 Key Changes + +### Dependencies +- **Python**: Now requires ≥ 3.12 (was flexible) +- **Qiskit**: Now requires ≥ 2.2.3 (was flexible) +- **Package Manager**: Now uses `uv` (was `pip`) + +### File Paths +- All examples now save output to `output/` directory +- Test files updated to work from new locations +- Import paths fixed for new structure + +### Documentation +- Comprehensive README with quick start +- Detailed setup guide for uv +- Contributing guidelines +- Project structure documentation + +## 🚀 Next Steps for Users + +1. **Install uv**: + ```bash + curl -LsSf https://astral.sh/uv/install.sh | sh + ``` + +2. **Setup project**: + ```bash + uv sync + source .venv/bin/activate # or .venv\Scripts\activate on Windows + ``` + +3. **Run examples**: + ```bash + uv run python examples/example_usage.py + ``` + +4. **Run tests**: + ```bash + uv run pytest tests/ + ``` + +## 📋 Requirements Met + +✅ Python ≥ 3.12 +✅ Qiskit ≥ 2.2.3 +✅ uv package manager +✅ pyproject.toml configuration +✅ uv.lock for reproducibility +✅ Proper project structure +✅ Comprehensive documentation + +## 🎯 Benefits + +1. **Reproducibility**: Locked dependencies ensure consistent environments +2. **Professional Structure**: Clean, organized codebase +3. **Easy Setup**: Simple `uv sync` command sets up everything +4. **Clear Documentation**: Multiple guides for different use cases +5. **Version Control**: Proper .gitignore keeps repo clean + +--- + +**Repository is now fully organized and ready for professional quantum bear development!** 🐻💻 + diff --git a/Quilt/circuit_json_processing/circuit_graph.json b/Quilt/circuit_json_processing/circuit_graph.json new file mode 100644 index 0000000..abc1496 --- /dev/null +++ b/Quilt/circuit_json_processing/circuit_graph.json @@ -0,0 +1,308 @@ +{ + "nodes": [ + { + "id": "q_start_0", + "name": "q0_init", + "type": "init", + "position": -1, + "qubits": [ + "0" + ], + "layer": -1 + }, + { + "id": "q_start_1", + "name": "q1_init", + "type": "init", + "position": -1, + "qubits": [ + "1" + ], + "layer": -1 + }, + { + "id": "q_start_2", + "name": "q2_init", + "type": "init", + "position": -1, + "qubits": [ + "2" + ], + "layer": -1 + }, + { + "id": "gate_0", + "name": "h", + "type": "gate", + "position": 0, + "qubits": [ + "2" + ], + "layer": 0 + }, + { + "id": "gate_1", + "name": "cx", + "type": "gate", + "position": 1, + "qubits": [ + "1", + "2" + ], + "layer": 1 + }, + { + "id": "gate_2", + "name": "u3", + "type": "gate", + "position": 2, + "qubits": [ + "2" + ], + "layer": 2 + }, + { + "id": "gate_3", + "name": "cx", + "type": "gate", + "position": 3, + "qubits": [ + "1", + "2" + ], + "layer": 3 + }, + { + "id": "gate_4", + "name": "h", + "type": "gate", + "position": 4, + "qubits": [ + "1" + ], + "layer": 4 + }, + { + "id": "gate_9", + "name": "cx", + "type": "gate", + "position": 9, + "qubits": [ + "0", + "1" + ], + "layer": 5 + }, + { + "id": "gate_10", + "name": "u3", + "type": "gate", + "position": 10, + "qubits": [ + "1" + ], + "layer": 6 + }, + { + "id": "gate_11", + "name": "cx", + "type": "gate", + "position": 11, + "qubits": [ + "0", + "1" + ], + "layer": 7 + }, + { + "id": "gate_12", + "name": "h", + "type": "gate", + "position": 12, + "qubits": [ + "0" + ], + "layer": 8 + }, + { + "id": "gate_13", + "name": "u3", + "type": "gate", + "position": 13, + "qubits": [ + "1" + ], + "layer": 8 + }, + { + "id": "gate_14", + "name": "u3", + "type": "gate", + "position": 14, + "qubits": [ + "2" + ], + "layer": 4 + }, + { + "id": "q_end_0", + "name": "q0_end", + "type": "end", + "position": 15, + "qubits": [ + "0" + ], + "layer": 9 + }, + { + "id": "q_end_1", + "name": "q1_end", + "type": "end", + "position": 15, + "qubits": [ + "1" + ], + "layer": 9 + }, + { + "id": "q_end_2", + "name": "q2_end", + "type": "end", + "position": 15, + "qubits": [ + "2" + ], + "layer": 9 + } + ], + "edges": [ + { + "name": "q2", + "from-node": "q_start_2", + "to-node": "gate_0", + "qubit": "2" + }, + { + "name": "q1", + "from-node": "q_start_1", + "to-node": "gate_1", + "qubit": "1" + }, + { + "name": "q2", + "from-node": "gate_0", + "to-node": "gate_1", + "qubit": "2" + }, + { + "name": "q2", + "from-node": "gate_1", + "to-node": "gate_2", + "qubit": "2" + }, + { + "name": "q1", + "from-node": "gate_1", + "to-node": "gate_3", + "qubit": "1" + }, + { + "name": "q2", + "from-node": "gate_2", + "to-node": "gate_3", + "qubit": "2" + }, + { + "name": "q1", + "from-node": "gate_3", + "to-node": "gate_4", + "qubit": "1" + }, + { + "name": "q0", + "from-node": "q_start_0", + "to-node": "gate_9", + "qubit": "0" + }, + { + "name": "q1", + "from-node": "gate_4", + "to-node": "gate_9", + "qubit": "1" + }, + { + "name": "q1", + "from-node": "gate_9", + "to-node": "gate_10", + "qubit": "1" + }, + { + "name": "q0", + "from-node": "gate_9", + "to-node": "gate_11", + "qubit": "0" + }, + { + "name": "q1", + "from-node": "gate_10", + "to-node": "gate_11", + "qubit": "1" + }, + { + "name": "q0", + "from-node": "gate_11", + "to-node": "gate_12", + "qubit": "0" + }, + { + "name": "q1", + "from-node": "gate_11", + "to-node": "gate_13", + "qubit": "1" + }, + { + "name": "q2", + "from-node": "gate_3", + "to-node": "gate_14", + "qubit": "2" + }, + { + "name": "q0", + "from-node": "gate_12", + "to-node": "q_end_0", + "qubit": "0" + }, + { + "name": "q1", + "from-node": "gate_13", + "to-node": "q_end_1", + "qubit": "1" + }, + { + "name": "q2", + "from-node": "gate_14", + "to-node": "q_end_2", + "qubit": "2" + } + ], + "macros": [ + { + "name": "EntanglingLayer(2<->0)", + "nodes": [ + { + "name": "u3", + "qubits": [ + "2" + ] + }, + { + "name": "cx", + "qubits": [ + "0", + "2" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/Quilt/circuit_json_processing/circuit_json_parsing.py b/Quilt/circuit_json_processing/circuit_json_parsing.py new file mode 100644 index 0000000..52725f2 --- /dev/null +++ b/Quilt/circuit_json_processing/circuit_json_parsing.py @@ -0,0 +1,278 @@ +import json + +def parse_circuit_dag(input_data): + """ + Parses a quantum circuit's hierarchical DAG into a graph structure + with nodes, edges, and macro definitions, calculating the + dependency layer for each node. + + This version adds conceptual 'init' nodes at layer -1 + and 'end' nodes at layer (max_layer + 1). + + Macros are ignored as graph nodes/edges; they only appear in the + output 'macros' section with their name and constituent nodes. + """ + + # These will be the components of our final JSON + output_nodes = [] + output_edges = [] + output_macros = [] + + # Helper dicts to build the graph + last_node_on_qubit = {} # Tracks the most recent node ID on each qubit line + node_layers = {} # Stores the calculated layer for each node ID + + # --- 0. Add "Init" Nodes (NEW) --- + # Create start nodes for each qubit at layer -1 + + # Get the number of qubits from statistics + num_qubits = input_data.get("statistics", {}).get("num_qubits", 0) + if num_qubits == 0: + print("Warning: 'num_qubits' not found in statistics. Graph may be incomplete.") + # As a fallback, we could try to infer from the gates, + # but for this problem, we'll rely on the statistics. + + qubit_list = [str(i) for i in range(num_qubits)] + start_layer = -1 + + for q in qubit_list: + node_id = f"q_start_{q}" + node_data = { + "id": node_id, + "name": f"q{q}_init", + "type": "init", + "position": -1, # Use -1 for position + "qubits": [q], + "layer": start_layer + } + output_nodes.append(node_data) + + # Pre-populate the trackers. This ensures the first + # *real* gate on this qubit will connect to this 'init' node. + last_node_on_qubit[q] = node_id + node_layers[node_id] = start_layer + + + # --- 0.5. Build position-to-ID mapping from dag_flat --- + # This ensures ALL gates have IDs, even those inside macros + # We need this for gate_ids in macro definitions + gate_position_to_id = {} + for item in input_data.get("dag_flat", []): + pos = item.get("position", item.get("pos", -1)) + if pos >= 0: + gate_position_to_id[pos] = f"gate_{pos}" + + # --- 1. Build Node List --- + # Iterate through the hierarchical DAG to create our + # base list of gate nodes. Macros are skipped here and + # reported only in the 'macros' section below. + + hierarchical_nodes = [] + for item in input_data.get("dag_hierarchical", []): + if item.get("type") == "gate": + pos = item["position"] + node_id = f"gate_{pos}" + qubits = item["qubits"] + + node_data = { + "id": node_id, + "name": item["name"], + "type": "gate", + "position": pos, + "qubits": qubits + } + hierarchical_nodes.append(node_data) + # Macros are intentionally ignored here. + + # --- 2. Calculate Layers and Build Edges --- + # Now, iterate through our ordered list of nodes to build + # dependencies (edges) and calculate layers. + + max_gate_layer = 0 # Track the highest layer number + + for node in hierarchical_nodes: + node_id = node["id"] + qubits = node["qubits"] + + predecessor_layers = [] + predecessor_nodes = [] # To build edges + + # Check dependencies for each qubit this node touches + for q in qubits: + if q in last_node_on_qubit: + pred_id = last_node_on_qubit[q] + + if (pred_id, q) not in predecessor_nodes: + predecessor_nodes.append((pred_id, q)) + # Fetch the layer of the predecessor + predecessor_layers.append(node_layers[pred_id]) + else: + # This should not happen if our 'init' step is correct + print(f"Warning: Qubit {q} for node {node_id} has no predecessor.") + + # Calculate the layer for the current node + current_layer = 0 + if predecessor_layers: + # Layer is 1 + the maximum layer of all its parents + current_layer = 1 + max(predecessor_layers) + + # Track the highest layer number we've seen + max_gate_layer = max(max_gate_layer, current_layer) + + # Add layer data to the node + node["layer"] = current_layer + node_layers[node_id] = current_layer + + # Add the node to our final output list + output_nodes.append(node) + + # Create edge objects + for pred_id, q in predecessor_nodes: + edge = { + "name": f"q{q}", + "from-node": pred_id, + "to-node": node_id, + "qubit": q + } + output_edges.append(edge) + + # Finally, update the 'last_node' tracker for all qubits + # this node just operated on. + for q in qubits: + last_node_on_qubit[q] = node_id + + # --- 2.5 Add "End" Nodes (NEW) --- + # Create end nodes for each qubit at (max_layer + 1) + + end_layer = max_gate_layer + 1 + # Find the maximum position to place end nodes after + positions = [n.get('position', 0) for n in hierarchical_nodes] + max_pos = (max(positions) if positions else 0) + 1 + + for q in qubit_list: + node_id = f"q_end_{q}" + node_data = { + "id": node_id, + "name": f"q{q}_end", + "type": "end", # You can call this 'measure' or 'end' + "position": max_pos, # Give it a high position number + "qubits": [q], + "layer": end_layer + } + output_nodes.append(node_data) + + # Add the final edge from the last *real* gate to this end node + pred_id = last_node_on_qubit[q] + + edge = { + "name": f"q{q}", + "from-node": pred_id, + "to-node": node_id, + "qubit": q + } + output_edges.append(edge) + + # --- 3. Define Macro Patterns --- + # Macros are reported only here and are not included as nodes. + # Each macro instance gets its own entry with gate_ids, matching app-circuit.json format + + for macro_def in input_data.get("macros", []): + # Build the nodes definition (same for all instances) + constituent_nodes = [] + for gate in macro_def.get("gates", []): + constituent_nodes.append({ + "name": gate["name"], + "qubits": gate["qubits"] + }) + + # Create a separate macro entry for each position range (instance) + # This matches the app-circuit.json format where each instance has its own entry + for pos_info in macro_def.get("positions", []): + start = pos_info.get("start", pos_info.get("start_position", 0)) + end = pos_info.get("end", pos_info.get("end_position", start + 1)) + + # Collect gate_ids for this instance + gate_ids = [] + for pos in range(start, end): + if pos in gate_position_to_id: + gate_ids.append(gate_position_to_id[pos]) + + # Add macro instance with gate_ids + output_macros.append({ + "name": macro_def["label"], + "gate_ids": gate_ids, + "nodes": constituent_nodes + }) + + # --- 4. Assemble Final JSON --- + final_output = { + "nodes": output_nodes, + "edges": output_edges, + "macros": output_macros + } + + return final_output + + +# --- Main execution --- +if __name__ == "__main__": + + # Your provided JSON data + input_data = { + "dag_flat": [ + {"position": 0, "gate": "h", "qubits": ["2"]}, + {"position": 1, "gate": "cx", "qubits": ["1", "2"]}, + {"position": 2, "gate": "u3", "qubits": ["2"]}, + {"position": 3, "gate": "cx", "qubits": ["1", "2"]}, + {"position": 4, "gate": "h", "qubits": ["1"]}, + {"position": 5, "gate": "u3", "qubits": ["2"]}, + {"position": 6, "gate": "cx", "qubits": ["0", "2"]}, + {"position": 7, "gate": "u3", "qubits": ["2"]}, + {"position": 8, "gate": "cx", "qubits": ["0", "2"]}, + {"position": 9, "gate": "cx", "qubits": ["0", "1"]}, + {"position": 10, "gate": "u3", "qubits": ["1"]}, + {"position": 11, "gate": "cx", "qubits": ["0", "1"]}, + {"position": 12, "gate": "h", "qubits": ["0"]}, + {"position": 13, "gate": "u3", "qubits": ["1"]}, + {"position": 14, "gate": "u3", "qubits": ["2"]} + ], + "dag_hierarchical": [ + {"type": "gate", "name": "h", "qubits": ["2"], "position": 0}, + {"type": "gate", "name": "cx", "qubits": ["1", "2"], "position": 1}, + {"type": "gate", "name": "u3", "qubits": ["2"], "position": 2}, + {"type": "gate", "name": "cx", "qubits": ["1", "2"], "position": 3}, + {"type": "gate", "name": "h", "qubits": ["1"], "position": 4}, + {"type": "macro", "label": "EntanglingLayer(2<->0)", "size": 2, "gates": [{"name": "u3", "qubits": ["2"]}, {"name": "cx", "qubits": ["0", "2"]}], "start_position": 5, "end_position": 7}, + {"type": "macro", "label": "EntanglingLayer(2<->0)", "size": 2, "gates": [{"name": "u3", "qubits": ["2"]}, {"name": "cx", "qubits": ["0", "2"]}], "start_position": 7, "end_position": 9}, + {"type": "gate", "name": "cx", "qubits": ["0", "1"], "position": 9}, + {"type": "gate", "name": "u3", "qubits": ["1"], "position": 10}, + {"type": "gate", "name": "cx", "qubits": ["0", "1"], "position": 11}, + {"type": "gate", "name": "h", "qubits": ["0"], "position": 12}, + {"type": "gate", "name": "u3", "qubits": ["1"], "position": 13}, + {"type": "gate", "name": "u3", "qubits": ["2"], "position": 14} + ], + "macros": [ + {"label": "EntanglingLayer(2<->0)", "count": 2, "window_size": 2, "gates": [{"name": "u3", "qubits": ["2"]}, {"name": "cx", "qubits": ["0", "2"]}], "positions": [{"start": 5, "end": 7}, {"start": 7, "end": 9}]} + ], + "statistics": {"original_gates": 15, "transpiled_gates": 15, "circuit_depth": 12, "num_qubits": 3, "num_macros": 1, "total_macro_instances": 2, "hierarchical_items": 13, "compression_ratio": 1.15, "dag_nodes": 21, "dag_edges": 24} + } + + # Process the data + graph_data = parse_circuit_dag(input_data) + + # Save the output to a file + output_filename = "circuit_graph.json" # New filename + with open(output_filename, 'w') as f: + json.dump(graph_data, f, indent=2) + + print(f"Successfully processed circuit and saved to {output_filename}") + + # Print a preview + print("\n--- Output JSON Preview (showing new nodes) ---") + + # Create a small preview showing just the new nodes and edges + preview = { + "nodes": [n for n in graph_data["nodes"] if n["type"] in ("init", "end")], + "edges": [e for e in graph_data["edges"] if "start" in e["from-node"] or "end" in e["to-node"]] + } + print(json.dumps(preview, indent=2)) \ No newline at end of file diff --git a/Quilt/circuit_json_processing/quantum_circuit_visualization.py b/Quilt/circuit_json_processing/quantum_circuit_visualization.py new file mode 100644 index 0000000..3f0464d --- /dev/null +++ b/Quilt/circuit_json_processing/quantum_circuit_visualization.py @@ -0,0 +1,148 @@ +import json +import networkx as nx +import matplotlib.pyplot as plt + +def visualize_circuit_graph(json_filepath): + """ + Loads the circuit graph JSON and visualizes it using + networkx and matplotlib, arranging nodes by layer and qubit. + """ + + # --- 1. Load Data --- + try: + with open(json_filepath, 'r') as f: + graph_data = json.load(f) + except FileNotFoundError: + print(f"Error: The file {json_filepath} was not found.") + print("Please make sure it's in the same directory as this script.") + return + + nodes = graph_data.get('nodes', []) + edges = graph_data.get('edges', []) + + if not nodes: + print("No nodes found in the JSON data.") + return + + # --- 2. Create NetworkX Graph --- + G = nx.DiGraph() + + # Add nodes and store their data + for node in nodes: + G.add_node(node['id'], **node) + + # Add edges + for edge in edges: + G.add_edge(edge['from-node'], edge['to-node'], **edge) + + # --- 3. Prepare for Plotting --- + + # Create a layout (position) for each node. + # x-position = layer + # y-position = -qubit_id (negative to put qubit 0 at the top) + pos = {} + for node_id, data in G.nodes(data=True): + layer = data.get('layer', 0) + + # We'll use the *first* qubit in the list for Y-positioning + # This keeps multi-qubit gates anchored to a line. + try: + # Qubit IDs are strings, convert to int + y_pos = -int(data['qubits'][0]) + except (IndexError, ValueError, TypeError): + y_pos = 0 # Fallback for any unusual nodes + + pos[node_id] = (layer, y_pos) + + # Create color map for nodes + color_map = [] + for node_id, data in G.nodes(data=True): + if data.get('type') == 'macro': + color_map.append('skyblue') # Macros + else: + color_map.append('salmon') # Gates + + # Create labels from node names + labels = {node_id: data['name'] for node_id, data in G.nodes(data=True)} + + # Create labels for edges (showing the qubit) + edge_labels = { + (u, v): d['name'] for u, v, d in G.edges(data=True) + } + + # --- 4. Draw the Graph --- + print("Drawing graph...") + + plt.figure(figsize=(18, 10)) # Make the plot larger + + # Draw the nodes + nx.draw_networkx_nodes( + G, + pos, + node_size=3000, + node_color=color_map, + alpha=0.9 + ) + + # Draw the edges + nx.draw_networkx_edges( + G, + pos, + node_size=3000, + arrowstyle='-|>', + arrowsize=20, + edge_color='gray', + connectionstyle='arc3,rad=0.1' #Slightly curve parallel edges + ) + + # Draw node labels + nx.draw_networkx_labels( + G, + pos, + labels, + font_size=10, + font_weight='bold' + ) + + # Draw edge labels + nx.draw_networkx_edge_labels( + G, + pos, + edge_labels=edge_labels, + font_color='black', + font_size=8 + ) + + plt.title("Quantum Circuit Dependency Graph", size=20) + plt.xlabel("Circuit Layer (Depth)", size=15) + plt.ylabel("Qubit Index", size=15) + + # Set Y-axis labels to be positive qubit numbers + ax = plt.gca() + # Get all unique Y positions + y_ticks = sorted(list(set(p[1] for p in pos.values()))) + if y_ticks: + ax.set_yticks(y_ticks) + ax.set_yticklabels([str(abs(y)) for y in y_ticks]) + + # Turn off the axis box + plt.box(False) + # Ensure all layers are shown on x-axis + max_layer = max(d.get('layer', 0) for _, d in G.nodes(data=True)) + plt.xticks(range(max_layer + 1)) + + plt.grid(axis='x', linestyle='--', alpha=0.5) # Add gridlines for layers + plt.tight_layout() + + # Save the figure + output_filename = "circuit_graph.png" + plt.savefig(output_filename) + print(f"Graph saved to {output_filename}") + + # Show the plot + plt.show() + + +# --- Main execution --- +if __name__ == "__main__": + visualize_circuit_graph("circuit_graph.json") \ No newline at end of file diff --git a/Quilt/macro_gate_detector/MACRO_GATE_DETECTOR_README.md b/Quilt/macro_gate_detector/MACRO_GATE_DETECTOR_README.md new file mode 100644 index 0000000..5979c6f --- /dev/null +++ b/Quilt/macro_gate_detector/MACRO_GATE_DETECTOR_README.md @@ -0,0 +1,140 @@ +# Macro-Gate Detector + +A Python module that analyzes quantum circuits, builds DAGs, and extracts macro-gates (repeated patterns) into easily transferable data structures. + +## Quick Start + +```python +from macro_gate_detector import analyze_circuit +from qiskit import QuantumCircuit + +# Create your circuit +qc = QuantumCircuit(4) +# ... add gates ... + +# Analyze it +result = analyze_circuit(qc) + +# Result contains: +# - result['dag_flat']: Flat DAG (all operations) +# - result['dag_hierarchical']: Hierarchical DAG (with macro-gates) +# - result['macros']: List of detected macro-gates +# - result['statistics']: Analysis statistics +``` + +## Output Data Structure + +The `analyze_circuit()` function returns a dictionary with the following structure: + +### 1. `dag_flat` - Flat DAG Representation +List of all operations in topological order: +```json +[ + { + "position": 0, + "gate": "cx", + "qubits": ["0", "1"] + }, + { + "position": 1, + "gate": "ry", + "qubits": ["0"] + }, + ... +] +``` + +### 2. `dag_hierarchical` - Hierarchical DAG with Macro-Gates +List where macro-gates are collapsed into single items: +```json +[ + { + "type": "macro", + "label": "AnsatzLayer A", + "size": 8, + "gates": [{"name": "cx", "qubits": ["0", "1"]}, ...], + "start_position": 0, + "end_position": 8 + }, + { + "type": "gate", + "name": "cx", + "qubits": ["1", "3"], + "position": 8 + }, + ... +] +``` + +### 3. `macros` - Detected Macro-Gates +List of all detected macro-gates with their properties: +```json +[ + { + "label": "AnsatzLayer A", + "count": 3, + "window_size": 8, + "gates": [{"name": "cx", "qubits": ["0", "1"]}, ...], + "positions": [ + {"start": 0, "end": 8}, + {"start": 9, "end": 17}, + {"start": 18, "end": 26} + ] + }, + ... +] +``` + +### 4. `statistics` - Analysis Statistics +```json +{ + "original_gates": 27, + "transpiled_gates": 27, + "circuit_depth": 15, + "num_qubits": 4, + "num_macros": 2, + "total_macro_instances": 6, + "hierarchical_items": 6, + "compression_ratio": 4.5, + "dag_nodes": 35, + "dag_edges": 46 +} +``` + +## Saving to JSON + +The entire result is JSON-serializable: + +```python +import json + +result = analyze_circuit(qc) + +with open('circuit_analysis.json', 'w') as f: + json.dump(result, f, indent=2) +``` + +## Parameters + +```python +analyze_circuit( + circuit: QuantumCircuit, + optimization_level: int = 1, # Qiskit transpilation level (0-3) + min_repetitions: int = 2, # Min repetitions to detect pattern + max_window_size: int = 8 # Max pattern window size +) +``` + +## Example + +See `example_usage.py` for a complete example. + +## Features + +- ✅ Builds DAG from Qiskit circuit +- ✅ Detects repeated gate patterns (macro-gates) +- ✅ Semantic labeling (e.g., "AnsatzLayer A", "CNOT Ladder") +- ✅ Returns both flat and hierarchical representations +- ✅ JSON-serializable output +- ✅ Easy to transfer/share between systems + diff --git a/Quilt/macro_gate_detector/__init__.py b/Quilt/macro_gate_detector/__init__.py new file mode 100644 index 0000000..18dd6f4 --- /dev/null +++ b/Quilt/macro_gate_detector/__init__.py @@ -0,0 +1,24 @@ +""" +Quilt - Quantum circuit macro-gate detection and hierarchical visualization + +A Python module that analyzes quantum circuits, builds DAGs, and extracts +macro-gates (repeated patterns) into easily transferable data structures. +""" + +from .macro_gate_detector import ( + analyze_circuit, + create_macro_gate_circuit, + convert_to_app_circuit_format, + MacroGateDetector, + SemanticLabeler, +) + +__version__ = "0.1.0" +__all__ = [ + "analyze_circuit", + "create_macro_gate_circuit", + "convert_to_app_circuit_format", + "MacroGateDetector", + "SemanticLabeler", +] + diff --git a/Quilt/macro_gate_detector/macro_gate_detector.py b/Quilt/macro_gate_detector/macro_gate_detector.py new file mode 100644 index 0000000..33e91aa --- /dev/null +++ b/Quilt/macro_gate_detector/macro_gate_detector.py @@ -0,0 +1,1316 @@ +""" +Bruno Learns to See Quantum Circuits +Macro-Gate Detection and Hierarchical Visualization Tool + +This module extracts macro-gates from quantum circuits and returns +structured data that can be easily serialized (JSON-compatible). +""" + +from collections import defaultdict, Counter +from typing import List, Dict, Tuple, Optional, Any +import hashlib +import re + +try: + from qiskit import QuantumCircuit + from qiskit.converters import circuit_to_dag + from qiskit import transpile +except ImportError: + raise ImportError("Qiskit is required. Install with: pip install qiskit") + + +class MacroGateDetector: + """Detects repeated gate sequences using rolling hash pattern matching""" + + def __init__(self, min_repetitions=2, max_window_size=8): + self.min_repetitions = min_repetitions + self.max_window_size = max_window_size + + def hash_sequence(self, seq: List[Tuple]) -> str: + """ + Create a parameter-aware hash of a gate sequence. + Ignores exact qubit indices for pattern matching, but includes gate parameters. + + Assumes seq items are: (gate_name, qubits, params) + """ + normalized = [] + for item in seq: + gate_name = item[0] + qubits = item[1] if len(item) > 1 else tuple() + params = item[2] if len(item) > 2 else tuple() + + # 1. Normalize Qubits (qubit-agnostic hash, but sorted for consistency) + qubit_set = tuple(sorted(qubits)) if qubits else tuple() + + # 2. Normalize Parameters (crucial for rotation gates) + # Parameters are already normalized in extract_operations_from_dag, + # but we ensure they're in a consistent format here + normalized_params = tuple(params) if params else tuple() + + normalized.append((gate_name, qubit_set, normalized_params)) + + return hashlib.md5(str(normalized).encode()).hexdigest() + + def detect_patterns(self, ops_sequence: List[Tuple]) -> Dict: + """ + Detect repeated patterns using rolling hash with polynomial hashing. + Uses a true rolling hash (Rabin-Karp style) for O(1) hash updates per window. + """ + all_patterns = {} + + for window_size in range(2, min(self.max_window_size + 1, len(ops_sequence) // 2 + 1)): + window_patterns = defaultdict(list) + + # For small sequences or when window_size is large, use direct hashing + # For larger sequences, we could implement true rolling hash, but the + # current approach with hash_sequence is already reasonably efficient + # since we're hashing normalized tuples, not full gate objects + + # Pre-compute hashes for all windows of this size + for i in range(len(ops_sequence) - window_size + 1): + window = ops_sequence[i:i+window_size] + pattern_hash = self.hash_sequence(window) + window_patterns[pattern_hash].append((i, i + window_size)) + + # Filter patterns that meet minimum repetition threshold + for pattern_hash, positions in window_patterns.items(): + if len(positions) >= self.min_repetitions: + if pattern_hash not in all_patterns: + all_patterns[pattern_hash] = { + 'sequence': ops_sequence[positions[0][0]:positions[0][1]], + 'positions': positions, + 'window_size': window_size, + 'count': len(positions) + } + + sorted_patterns = sorted( + all_patterns.items(), + key=lambda x: (x[1]['count'], x[1]['window_size']), + reverse=True + ) + + return dict(sorted_patterns) + + def find_non_overlapping_macros(self, patterns: Dict, ops_sequence: List = None) -> List[Dict]: + """ + Select best non-overlapping macro-gates. + + Note: ops_sequence parameter kept for API compatibility but not currently used. + """ + # First, collect all potential macros with their positions + all_macro_candidates = [] + for pattern_hash, pattern_info in patterns.items(): + for start, end in pattern_info['positions']: + all_macro_candidates.append({ + 'hash': pattern_hash, + 'sequence': pattern_info['sequence'], + 'start': start, + 'end': end, + 'window_size': pattern_info['window_size'], + 'size': end - start + }) + + # Sort by size (larger first) and then by start position + all_macro_candidates.sort(key=lambda x: (x['size'], -x['start']), reverse=True) + + # Greedily select non-overlapping macros + selected_macros = [] + used_ranges = [] # List of (start, end) tuples + + def ranges_overlap(start1, end1, start2, end2): + """Check if two ranges [start, end) overlap""" + return not (end1 <= start2 or end2 <= start1) + + for candidate in all_macro_candidates: + # Check if this candidate overlaps with any already selected macro + overlaps = False + for used_start, used_end in used_ranges: + if ranges_overlap(candidate['start'], candidate['end'], used_start, used_end): + overlaps = True + break + + if not overlaps: + # Add this macro + used_ranges.append((candidate['start'], candidate['end'])) + selected_macros.append(candidate) + + # Group selected macros by hash + macros_by_hash = {} + for macro in selected_macros: + hash_key = macro['hash'] + if hash_key not in macros_by_hash: + macros_by_hash[hash_key] = { + 'hash': hash_key, + 'sequence': macro['sequence'], + 'positions': [], + 'window_size': macro['window_size'] + } + macros_by_hash[hash_key]['positions'].append((macro['start'], macro['end'])) + + # Convert to final format and filter by min_repetitions + macros = [] + for hash_key, macro_info in macros_by_hash.items(): + if len(macro_info['positions']) >= self.min_repetitions: + macros.append({ + 'hash': hash_key, + 'sequence': macro_info['sequence'], + 'positions': macro_info['positions'], + 'count': len(macro_info['positions']), + 'window_size': macro_info['window_size'] + }) + + return sorted(macros, key=lambda x: (x['count'], x['window_size']), reverse=True) + + +class SemanticLabeler: + """Labels macro-gates with meaningful semantic names""" + + def __init__(self): + self.pattern_templates = { + 'qft_phase_ladder': {'pattern': [('h',), ('cp',)], 'name': 'QFT Phase Ladder'}, + 'cnot_ladder': {'pattern': [('cx',), ('cx',)], 'name': 'CNOT Ladder'}, + 'swap_network': {'pattern': [('swap',)], 'name': 'Swap Network'}, + 'hadamard_ladder': {'pattern': [('h',), ('h',)], 'name': 'Hadamard Ladder'} + } + + def _extract_rotation_parameters(self, sequence: List[Tuple]) -> Dict: + """Extract rotation gate parameters from sequence""" + rotation_params = {} + for gate in sequence: + gate_name = gate[0] + if gate_name in ['ry', 'rz', 'rx']: + # Try to extract parameter from gate object if available + # For now, we'll detect the rotation type + if gate_name not in rotation_params: + rotation_params[gate_name] = [] + # If we have access to gate parameters, extract them + # This is a simplified version - in practice, you'd extract actual params + rotation_params[gate_name].append('param') + return rotation_params + + def analyze_gate_sequence(self, sequence: List[Tuple]) -> Dict: + """Analyze a gate sequence to determine its characteristics""" + gate_names = [gate[0] for gate in sequence] + all_qubits = set() + for gate in sequence: + # Extract qubit indices properly (handle both string and int qubit indices) + qubits = gate[1] if len(gate) > 1 else tuple() + for q in qubits: + try: + if isinstance(q, int): + all_qubits.add(q) + elif isinstance(q, str) and q.isdigit(): + all_qubits.add(int(q)) + elif hasattr(q, '_index'): + all_qubits.add(q._index) + elif hasattr(q, 'index') and not callable(getattr(q, 'index', None)): + all_qubits.add(q.index) + else: + # Try extract_qubit_index as fallback + idx_str = extract_qubit_index(q) + if idx_str and idx_str.isdigit(): + all_qubits.add(int(idx_str)) + except (ValueError, TypeError, AttributeError): + continue + + num_qubits = len(all_qubits) + num_gates = len(sequence) + gate_counts = Counter(gate_names) + + # Analyze connectivity pattern + connectivity = self._analyze_connectivity(sequence) + + return { + 'num_qubits': num_qubits, + 'num_gates': num_gates, + 'gate_counts': dict(gate_counts), + 'has_entanglement': any(g in ['cx', 'cz', 'cy', 'swap'] for g in gate_names), + 'has_rotations': any(g in ['ry', 'rz', 'rx', 'u1', 'u2', 'u3'] for g in gate_names), + 'has_hadamard': any(g == 'h' for g in gate_names), + 'is_single_qubit': num_qubits == 1, + 'is_two_qubit': num_qubits == 2, + 'connectivity': connectivity, + 'qubits': sorted(list(all_qubits)), + 'gate_sequence': gate_names + } + + def _analyze_connectivity(self, sequence: List[Tuple]) -> Dict: + """Analyze the connectivity pattern of gates""" + # Build a graph of qubit connections + connections = [] + for gate in sequence: + qubits = list(gate[1]) if len(gate) > 1 else [] + if len(qubits) >= 2: + # Extract integer indices from qubits + qubit_indices = [] + for q in qubits: + try: + if isinstance(q, int): + qubit_indices.append(q) + elif isinstance(q, str) and q.isdigit(): + qubit_indices.append(int(q)) + else: + idx = int(extract_qubit_index(q)) + qubit_indices.append(idx) + except (ValueError, TypeError, AttributeError): + # Skip invalid qubits + continue + + # For multi-qubit gates, record all pairs + for i in range(len(qubit_indices)): + for j in range(i + 1, len(qubit_indices)): + # Sort to ensure consistent ordering (both should be ints now) + q1, q2 = qubit_indices[i], qubit_indices[j] + # Use built-in min/max explicitly + from builtins import min as builtin_min, max as builtin_max + conn = (builtin_min(q1, q2), builtin_max(q1, q2)) + connections.append(conn) + + # Count connection frequencies + connection_counts = Counter(connections) + + # Determine topology + all_qubits = set() + for conn in connections: + all_qubits.update(conn) + + qubit_list = sorted(list(all_qubits)) + + # Check for linear chain (each qubit connects to at most 2 others) + qubit_degree = Counter() + for conn in connections: + qubit_degree[conn[0]] += 1 + qubit_degree[conn[1]] += 1 + + max_degree = max(qubit_degree.values()) if qubit_degree else 0 + is_linear = max_degree <= 2 and len(qubit_list) > 2 + + # Check for star topology (one qubit connects to many) + is_star = False + if qubit_degree and len(qubit_list) > 2: + max_degree_qubit = max(qubit_degree.items(), key=lambda x: x[1]) + if max_degree_qubit[1] >= len(qubit_list) - 1: + is_star = True + + # Check for ring (all qubits have degree 2) + is_ring = len(qubit_list) >= 3 and all(qubit_degree.get(q, 0) == 2 for q in qubit_list) + + # Calculate qubit range safely + qubit_range = None + if qubit_list: + try: + q_min = min(qubit_list) + q_max = max(qubit_list) + qubit_range = (q_min, q_max) + except (TypeError, ValueError): + # If comparison fails, use first and last + qubit_range = (qubit_list[0], qubit_list[-1]) if len(qubit_list) > 1 else (qubit_list[0], qubit_list[0]) + + return { + 'connections': list(connection_counts.keys()), + 'connection_counts': dict(connection_counts), + 'is_linear': is_linear, + 'is_star': is_star, + 'is_ring': is_ring, + 'max_degree': max_degree, + 'qubit_range': qubit_range + } + + def match_known_pattern(self, sequence: List[Tuple], analysis: Dict, + earliest_position: Optional[int] = None, + total_circuit_length: Optional[int] = None) -> Optional[str]: + """ + Try to match against known algorithm patterns (QFT, Grover's, VQA, etc.) + Enhanced with sophisticated pattern recognition for quantum algorithms. + + Args: + sequence: Gate sequence to analyze + analysis: Analysis dictionary from analyze_gate_sequence + earliest_position: Earliest position in circuit where this pattern appears (unused, kept for API compatibility) + total_circuit_length: Total length of the circuit (unused, kept for API compatibility) + """ + gate_names = [gate[0] for gate in sequence] + gate_counts = analysis['gate_counts'] + num_gates = len(sequence) + num_qubits = analysis['num_qubits'] + + # 1. QFT Recognition (Primary Motif: H + Controlled Phase Cascade) + if 'h' in gate_counts and num_qubits >= 2: + cp_count = sum(gate_counts.get(g, 0) for g in ['cp', 'crz', 'cu1', 'cz', 'p']) + # Check for characteristic H -> Controlled Phase structure + if gate_counts.get('h', 0) >= 1 and cp_count > 0: + # QFT typically has a high ratio of controlled phase gates + cp_ratio = cp_count / num_gates if num_gates > 0 else 0 + if cp_ratio > 0.3: # At least 30% controlled phase gates + has_swaps = gate_counts.get('swap', 0) > 0 + # Check if H gates appear early in sequence (typical QFT pattern) + early_h = any(gate_names[i] == 'h' for i in range(min(3, len(gate_names)))) + if early_h: + return 'QFT Circuit Segment' + (' (with SWAP Layer)' if has_swaps else '') + + # 2. Grover's/Amplitude Amplification (Oracle + Diffusion) + # Look for the characteristic structure: H layer, followed by CNOT/Controlled-Z structure, ending with H + if num_qubits >= 2 and len(sequence) >= 3: + h_count = gate_counts.get('h', 0) + cnot_count = gate_counts.get('cx', 0) + cz_count = gate_counts.get('cz', 0) + + # Grover's diffusion operator: H layer, phase gate (often implemented with CNOTs), H layer + if h_count >= 2 and (cnot_count > 0 or cz_count > 0): + h_ratio = h_count / num_gates if num_gates > 0 else 0 + # Check if sequence starts and/or ends with H (diffusion operator pattern) + starts_with_h = gate_names[0] == 'h' + ends_with_h = gate_names[-1] == 'h' + + if (starts_with_h or ends_with_h) and h_ratio > 0.2: + # Check for phase gate pattern (often Z or controlled-Z in the middle) + has_phase = any(g in ['z', 'cz', 'cp', 'crz'] for g in gate_names) + if has_phase or cnot_count >= num_qubits: + return 'Grover Diffusion/Oracle Block' + + # 3. Pure CNOT patterns + if all(gate[0] == 'cx' for gate in sequence) and len(sequence) >= 2: + if num_qubits == 2: + return 'CNOT Pair' + elif analysis['connectivity'].get('is_linear'): + return 'CNOT Chain' + else: + return 'CNOT Ladder' + + # 4. Swap Network + if all(gate[0] == 'swap' for gate in sequence): + return 'Swap Network' + + # 5. Hadamard Layer + if all(gate[0] == 'h' for gate in sequence) and len(sequence) >= 2: + if len(sequence) == num_qubits: + return 'Hadamard Layer' + else: + return 'Hadamard Ladder' + + # 6. CNOT + Rotation combinations + cnot_count = gate_counts.get('cx', 0) + rotation_count = sum(gate_counts.get(g, 0) for g in ['ry', 'rz', 'rx', 'u1', 'u2', 'u3']) + + if cnot_count > 0 and rotation_count > 0: + # Check if rotations are all the same type + rotation_types = [g[0] for g in sequence if g[0] in ['ry', 'rz', 'rx']] + if rotation_types: + rot_type = rotation_types[0].upper() + # Determine pattern + if cnot_count == 1 and rotation_count == 1: + return f'{rot_type} Rotation Block' + elif cnot_count == 2 and rotation_count == 1: + return f'{rot_type} Rotation with CNOT Pair' + elif cnot_count >= 2 and rotation_count >= 1: + return f'{rot_type} Rotation with Entangling Layer' + else: + return 'Rotation-Entangling Block' + + # 7. Pure rotation blocks + if rotation_count > 0 and cnot_count == 0: + rotation_types = [g[0] for g in sequence if g[0] in ['ry', 'rz', 'rx']] + if rotation_types: + rot_type = rotation_types[0].upper() + if len(set(rotation_types)) == 1: + return f'{rot_type} Rotation Block' + else: + return 'Mixed Rotation Block' + + # 8. CZ patterns + cz_count = gate_counts.get('cz', 0) + if cz_count > 0 and cnot_count == 0: + if cz_count >= 2: + return 'CZ Ladder' + else: + return 'CZ Gate' + + return None + + def _describe_multi_qubit_pattern(self, analysis: Dict, sequence: List[Tuple]) -> str: + """Generate a descriptive name for multi-qubit patterns""" + gate_counts = analysis['gate_counts'] + connectivity = analysis['connectivity'] + num_qubits = analysis['num_qubits'] + + # Count different gate types + cnot_count = gate_counts.get('cx', 0) + rotation_count = sum(gate_counts.get(g, 0) for g in ['ry', 'rz', 'rx', 'u1', 'u2', 'u3']) + hadamard_count = gate_counts.get('h', 0) + + # Determine topology-based names + is_linear = connectivity.get('is_linear', False) + is_star = connectivity.get('is_star', False) + is_ring = connectivity.get('is_ring', False) + + # Pure entangling patterns + if cnot_count > 0 and rotation_count == 0 and hadamard_count == 0: + if num_qubits == 2: + return 'Entangling Pair' + elif is_linear: + return 'Linear Entangling Chain' + elif is_star: + return 'Star Entangling Pattern' + elif is_ring: + return 'Ring Entangling Pattern' + else: + return 'Entangling Block' + + # Mixed patterns with rotations + if rotation_count > 0: + rotation_types = [g[0] for g in sequence if g[0] in ['ry', 'rz', 'rx']] + if rotation_types: + rot_type = rotation_types[0].upper() + if cnot_count > 0: + if is_linear: + return f'{rot_type} Rotation with Linear Entangling' + else: + return f'{rot_type} Rotation with Entangling' + else: + return f'{rot_type} Rotation Block' + + # Hadamard + entangling + if hadamard_count > 0 and cnot_count > 0: + return 'Hadamard-Entangling Block' + + # Generic multi-qubit pattern + if num_qubits >= 3: + return 'Multi-Qubit Block' + elif num_qubits == 2: + return 'Two-Qubit Block' + else: + return 'Gate Block' + + def label_macro(self, macro: Dict, sequence: List[Tuple], all_macros: List[Dict] = None, + total_circuit_length: Optional[int] = None) -> str: + """Generate a semantic label for a macro-gate + + Args: + macro: Macro dictionary with positions + sequence: Gate sequence for this macro + all_macros: All detected macros (for context) + total_circuit_length: Total length of the circuit (unused, kept for API compatibility) + """ + analysis = self.analyze_gate_sequence(sequence) + + # Get earliest position of this macro in the circuit + earliest_position = None + if macro.get('positions'): + earliest_position = min(pos[0] for pos in macro['positions']) + + # Try to match known patterns first + known_pattern = self.match_known_pattern(sequence, analysis, earliest_position, total_circuit_length) + if known_pattern: + return known_pattern + + # Single qubit patterns + if analysis['is_single_qubit']: + if analysis['has_rotations']: + rotation_gates = [g for g in sequence if g[0] in ['ry', 'rz', 'rx', 'u1', 'u2', 'u3']] + if rotation_gates: + rot_type = rotation_gates[0][0].upper() + return f'{rot_type} Rotation Block' + elif analysis['has_hadamard']: + return 'Hadamard Block' + else: + return 'Single Qubit Layer' + + # Two-qubit patterns + elif analysis['is_two_qubit']: + if analysis['has_entanglement']: + gate_type = analysis['gate_sequence'][0] if analysis['gate_sequence'] else 'ent' + if gate_type == 'cx': + return 'CNOT Pair' + elif gate_type == 'cz': + return 'CZ Pair' + else: + return 'Entangling Pair' + elif analysis['has_rotations']: + rotation_gates = [g for g in sequence if g[0] in ['ry', 'rz', 'rx']] + if rotation_gates: + rot_type = rotation_gates[0][0].upper() + return f'{rot_type} Rotation Pair' + return 'Two-Qubit Block' + + # Multi-qubit patterns + elif analysis['num_qubits'] > 2: + pattern_name = self._describe_multi_qubit_pattern(analysis, sequence) + + return pattern_name + + # Rotation-only patterns + elif analysis['has_rotations'] and not analysis['has_entanglement']: + rotation_gates = [g for g in sequence if g[0] in ['ry', 'rz', 'rx']] + if rotation_gates: + rot_type = rotation_gates[0][0].upper() + if len(set([g[0] for g in rotation_gates])) == 1: + return f'{rot_type} Rotation Block' + else: + return 'Mixed Rotation Block' + return 'Rotation Block' + + # Generic fallback + return 'Macro Block' + + +def extract_qubit_index(qubit) -> str: + """Extract qubit index from Qubit object""" + if hasattr(qubit, 'index'): + return str(qubit.index) + elif hasattr(qubit, '_index'): + return str(qubit._index) + else: + q_str = str(qubit) + match = re.search(r'index[=\s]+(\d+)', q_str) + if match: + return match.group(1) + return q_str + + +def extract_operations_from_dag(dag) -> List[Tuple[str, Tuple[str, ...], Tuple]]: + """Extract flat gate sequence from DAG in topological order with parameters""" + ops_sequence = [] + for node in dag.topological_nodes(): + if hasattr(node, 'op') and node.op: + gate_name = node.op.name + if hasattr(node, 'qargs') and node.qargs: + qubit_indices = [extract_qubit_index(q) for q in node.qargs] + qubits = tuple(qubit_indices) + else: + qubits = tuple() + + # Extract parameters if they exist + params = tuple() + if hasattr(node.op, 'params') and node.op.params: + normalized_params = [] + for p in node.op.params: + try: + # Round floating point parameters for robust matching + normalized_params.append(round(float(p), 6)) + except (ValueError, TypeError, AttributeError): + # Keep symbolic parameters as strings + normalized_params.append(str(p)) + params = tuple(normalized_params) + + ops_sequence.append((gate_name, qubits, params)) + return ops_sequence + + +def extract_operations_with_details_from_dag(dag) -> List[Dict]: + """Extract operations with full details (including parameters) from DAG""" + ops_list = [] + for node in dag.topological_nodes(): + if hasattr(node, 'op') and node.op: + op = node.op + gate_name = op.name + qubits = [] + if hasattr(node, 'qargs') and node.qargs: + qubits = [extract_qubit_index(q) for q in node.qargs] + + op_dict = { + 'name': gate_name, + 'qubits': qubits, + 'op': op # Keep reference to original operation + } + + # Extract parameters if they exist + if hasattr(op, 'params') and op.params: + op_dict['params'] = [float(p) if hasattr(p, '__float__') else p for p in op.params] + + ops_list.append(op_dict) + return ops_list + + +def create_hierarchical_view(ops_sequence: List[Tuple], macros: List[Dict]) -> List[Dict]: + """Create hierarchical representation with macro-gates collapsed""" + start_to_macro = {} + for macro in macros: + for start, end in macro['positions']: + if start not in start_to_macro or (end - start) > (start_to_macro[start][1] - start): + start_to_macro[start] = (macro, end) + + view = [] + i = 0 + while i < len(ops_sequence): + if i in start_to_macro: + macro, macro_end = start_to_macro[i] + view.append({ + 'type': 'macro', + 'label': macro['label'], + 'size': macro_end - i, + 'gates': [{'name': g[0], 'qubits': list(g[1])} for g in macro['sequence']], + 'start_position': i, + 'end_position': macro_end + }) + i = macro_end + else: + gate_name = ops_sequence[i][0] + qubits = ops_sequence[i][1] if len(ops_sequence[i]) > 1 else tuple() + view.append({ + 'type': 'gate', + 'name': gate_name, + 'qubits': list(qubits), + 'position': i + }) + i += 1 + + return view + + +def create_macro_gate_circuit( + circuit: QuantumCircuit, + analysis_result: Dict[str, Any], + optimization_level: int = 1 +) -> QuantumCircuit: + """ + Create a new circuit where macro-gates replace the original gate sequences. + The macro-gates are visual only (not functional). + + Args: + circuit: Original Qiskit QuantumCircuit + analysis_result: Result dictionary from analyze_circuit() + optimization_level: Qiskit transpilation optimization level (0-3) + + Returns: + New QuantumCircuit with macro-gates as custom visual gates + """ + # Transpile the original circuit to match the analysis + transpiled_qc = transpile(circuit, optimization_level=optimization_level) + dag = circuit_to_dag(transpiled_qc) + + # Extract operations with full details (including parameters) from DAG + # This preserves all gate information needed for perfect reconstruction + dag_nodes = list(dag.topological_nodes()) + ops_with_details = [] + for node in dag_nodes: + if hasattr(node, 'op') and node.op: + op = node.op + gate_name = op.name + qubits = [] + if hasattr(node, 'qargs') and node.qargs: + qubits = [extract_qubit_index(q) for q in node.qargs] + + ops_with_details.append({ + 'op': op, + 'name': gate_name, + 'qubits': qubits, + 'node': node + }) + + # Get macros from analysis result + macros = analysis_result['macros'] + + # Create a mapping from macro hash to custom gate + macro_gates = {} + for macro in macros: + # Determine all qubits used in this macro from the gate sequence + all_qubits_in_macro = set() + for gate_info in macro['gates']: + all_qubits_in_macro.update(gate_info['qubits']) + + num_qubits = len(all_qubits_in_macro) + if num_qubits == 0: + continue + + # Create a simple placeholder circuit for visualization + # We just need a circuit with the right number of qubits + macro_qc = QuantumCircuit(num_qubits) + + # Add a simple identity-like operation to make it a valid gate + # This is just for visualization, so we don't need actual functionality + if num_qubits == 1: + macro_qc.id(0) # Identity gate + else: + # For multi-qubit gates, add identity to all qubits + for q in range(num_qubits): + macro_qc.id(q) + + # Convert the macro circuit to a custom gate + macro_gate = macro_qc.to_gate() + # Clean the label to make a valid gate name + gate_name = macro['label'].replace(' ', '_').replace('(', '').replace(')', '').replace(',', '_').replace('<->', '_to_') + macro_gate.name = gate_name[:50] # Limit name length + + # Store the gate with its info + macro_gates[macro.get('hash', macro['label'])] = { + 'gate': macro_gate, + 'num_qubits': num_qubits + } + + # Now build the new circuit with macro-gates + new_circuit = QuantumCircuit(transpiled_qc.num_qubits) + + # Create a mapping of positions to macros + # Track which positions are covered by macros to avoid duplicates + position_to_macro = {} + positions_covered_by_macros = set() + + for macro in macros: + for pos_info in macro['positions']: + start = pos_info['start'] + end = pos_info['end'] + # Mark all positions in this range as covered + positions_covered_by_macros.update(range(start, end)) + + if start not in position_to_macro: + position_to_macro[start] = (macro, end) + elif (end - start) > (position_to_macro[start][1] - start): + # Prefer longer macros + position_to_macro[start] = (macro, end) + + # Build the circuit by iterating through operations + i = 0 + while i < len(ops_with_details): + if i in position_to_macro: + # This position starts a macro - replace with macro gate + macro, macro_end = position_to_macro[i] + macro_hash = macro.get('hash', macro['label']) + + if macro_hash in macro_gates: + macro_info = macro_gates[macro_hash] + macro_gate = macro_info['gate'] + + # Get the actual qubits used in this occurrence + occurrence_qubits = set() + for j in range(i, min(macro_end, len(ops_with_details))): + occurrence_qubits.update(ops_with_details[j]['qubits']) + + # Map qubits to the order expected by the macro gate + sorted_qubits = sorted(occurrence_qubits, key=lambda x: int(x)) + qubit_list = [int(q) for q in sorted_qubits] + + # Append the macro gate to the circuit + if len(qubit_list) == macro_info['num_qubits']: + new_circuit.append(macro_gate, qubit_list) + else: + # If qubit count doesn't match, add gates individually with full details + for j in range(i, min(macro_end, len(ops_with_details))): + op_detail = ops_with_details[j] + _add_operation_to_circuit(new_circuit, op_detail) + + # Skip to the end of the macro + i = macro_end + elif i in positions_covered_by_macros: + # This position is inside a macro (but not the start) - skip it + # It's already been replaced by the macro gate + i += 1 + else: + # Add the individual gate with full details (including parameters) + op_detail = ops_with_details[i] + _add_operation_to_circuit(new_circuit, op_detail) + i += 1 + + # Post-process to merge consecutive CNOT gates + new_circuit = _merge_consecutive_cnots(new_circuit) + + return new_circuit + + +def _merge_consecutive_cnots(circuit: QuantumCircuit) -> QuantumCircuit: + """ + Merge consecutive CNOT gates into a CNOT Pair macro gate. + This ensures that consecutive CNOT gates never appear in the final circuit. + """ + if len(circuit.data) < 2: + return circuit + + # Create a new circuit with the same number of qubits + merged_circuit = QuantumCircuit(circuit.num_qubits) + + i = 0 + while i < len(circuit.data): + current_instruction = circuit.data[i] + current_op = current_instruction.operation + + # Check if current gate is a CNOT + if current_op.name == 'cx' and i < len(circuit.data) - 1: + # Check if next gate is also a CNOT + next_instruction = circuit.data[i + 1] + next_op = next_instruction.operation + + if next_op.name == 'cx': + # Found consecutive CNOTs - merge them into a macro + # Get qubits from both CNOTs + current_qubits = [] + for q in current_instruction.qubits: + if hasattr(q, '_index'): + current_qubits.append(q._index) + elif hasattr(q, 'index'): + current_qubits.append(q.index) + else: + current_qubits.append(int(extract_qubit_index(q))) + + next_qubits = [] + for q in next_instruction.qubits: + if hasattr(q, '_index'): + next_qubits.append(q._index) + elif hasattr(q, 'index'): + next_qubits.append(q.index) + else: + next_qubits.append(int(extract_qubit_index(q))) + + # Create a CNOT Pair macro gate + all_qubits = set(current_qubits + next_qubits) + num_qubits = len(all_qubits) + + if num_qubits > 0: + # Create macro circuit + macro_qc = QuantumCircuit(num_qubits) + for q in range(num_qubits): + macro_qc.id(q) # Identity for visualization + + macro_gate = macro_qc.to_gate() + macro_gate.name = 'CNOT_Pair' + + # Add the macro gate + qubit_list = sorted([int(q) for q in all_qubits]) + if len(qubit_list) == num_qubits: + merged_circuit.append(macro_gate, qubit_list) + else: + # Fallback: add gates individually using append + merged_circuit.append(current_op, current_instruction.qubits) + merged_circuit.append(next_op, next_instruction.qubits) + + # Skip both CNOTs + i += 2 + continue + + # Not consecutive CNOTs - add the gate normally using append + merged_circuit.append(current_op, current_instruction.qubits) + i += 1 + + return merged_circuit + + +def _add_operation_to_circuit(circuit: QuantumCircuit, op_detail: Dict): + """ + Add an operation to a circuit using the full operation object. + This preserves parameters and handles all gate types correctly. + """ + op = op_detail['op'] + gate_name = op_detail['name'] + qubit_indices = [int(q) for q in op_detail['qubits']] + + # Get the actual qubit objects from the circuit + qubits = [circuit.qubits[i] for i in qubit_indices] + + # Use the operation's append method to preserve all parameters + # This is the most robust way to add gates with parameters + try: + circuit.append(op, qubits) + return + except Exception: + # Fallback to manual gate addition if append fails + pass + + # Fallback: manually add gates with parameters + if hasattr(op, 'params') and op.params: + params = [float(p) if hasattr(p, '__float__') else p for p in op.params] + + if gate_name == 'u3' and len(qubit_indices) == 1 and len(params) >= 3: + circuit.u3(params[0], params[1], params[2], qubit_indices[0]) + elif gate_name == 'u2' and len(qubit_indices) == 1 and len(params) >= 2: + circuit.u2(params[0], params[1], qubit_indices[0]) + elif gate_name == 'u1' and len(qubit_indices) == 1 and len(params) >= 1: + circuit.u1(params[0], qubit_indices[0]) + elif gate_name == 'ry' and len(qubit_indices) == 1 and len(params) >= 1: + circuit.ry(params[0], qubit_indices[0]) + elif gate_name == 'rz' and len(qubit_indices) == 1 and len(params) >= 1: + circuit.rz(params[0], qubit_indices[0]) + elif gate_name == 'rx' and len(qubit_indices) == 1 and len(params) >= 1: + circuit.rx(params[0], qubit_indices[0]) + elif gate_name == 'rzz' and len(qubit_indices) == 2 and len(params) >= 1: + circuit.rzz(params[0], qubit_indices[0], qubit_indices[1]) + elif gate_name == 'rxx' and len(qubit_indices) == 2 and len(params) >= 1: + circuit.rxx(params[0], qubit_indices[0], qubit_indices[1]) + elif gate_name == 'ryy' and len(qubit_indices) == 2 and len(params) >= 1: + circuit.ryy(params[0], qubit_indices[0], qubit_indices[1]) + elif gate_name == 'cp' and len(qubit_indices) == 2 and len(params) >= 1: + circuit.cp(params[0], qubit_indices[0], qubit_indices[1]) + elif gate_name == 'crz' and len(qubit_indices) == 2 and len(params) >= 1: + circuit.crz(params[0], qubit_indices[0], qubit_indices[1]) + elif gate_name == 'cry' and len(qubit_indices) == 2 and len(params) >= 1: + circuit.cry(params[0], qubit_indices[0], qubit_indices[1]) + elif gate_name == 'crx' and len(qubit_indices) == 2 and len(params) >= 1: + circuit.crx(params[0], qubit_indices[0], qubit_indices[1]) + else: + # Try to get the gate method dynamically with parameters + try: + gate_method = getattr(circuit, gate_name.lower()) + if len(qubit_indices) == 1: + gate_method(params[0] if len(params) > 0 else None, qubit_indices[0]) + elif len(qubit_indices) == 2: + gate_method(params[0] if len(params) > 0 else None, qubit_indices[0], qubit_indices[1]) + elif len(qubit_indices) == 3: + gate_method(params[0] if len(params) > 0 else None, qubit_indices[0], qubit_indices[1], qubit_indices[2]) + except (AttributeError, TypeError): + # Last resort: try to append the operation directly with qubit objects + try: + qubit_objs = [circuit.qubits[i] for i in qubit_indices] + circuit.append(op, qubit_objs) + except Exception: + pass + else: + # No parameters - use simple gate methods + if gate_name == 'cx' and len(qubit_indices) == 2: + circuit.cx(qubit_indices[0], qubit_indices[1]) + elif gate_name == 'cy' and len(qubit_indices) == 2: + circuit.cy(qubit_indices[0], qubit_indices[1]) + elif gate_name == 'cz' and len(qubit_indices) == 2: + circuit.cz(qubit_indices[0], qubit_indices[1]) + elif gate_name == 'swap' and len(qubit_indices) == 2: + circuit.swap(qubit_indices[0], qubit_indices[1]) + elif gate_name == 'h' and len(qubit_indices) == 1: + circuit.h(qubit_indices[0]) + elif gate_name == 'x' and len(qubit_indices) == 1: + circuit.x(qubit_indices[0]) + elif gate_name == 'y' and len(qubit_indices) == 1: + circuit.y(qubit_indices[0]) + elif gate_name == 'z' and len(qubit_indices) == 1: + circuit.z(qubit_indices[0]) + elif gate_name == 's' and len(qubit_indices) == 1: + circuit.s(qubit_indices[0]) + elif gate_name == 't' and len(qubit_indices) == 1: + circuit.t(qubit_indices[0]) + elif gate_name == 'id' and len(qubit_indices) == 1: + circuit.id(qubit_indices[0]) + else: + # Try to get the gate method dynamically + try: + gate_method = getattr(circuit, gate_name.lower()) + if len(qubit_indices) == 1: + gate_method(qubit_indices[0]) + elif len(qubit_indices) == 2: + gate_method(qubit_indices[0], qubit_indices[1]) + elif len(qubit_indices) == 3: + gate_method(qubit_indices[0], qubit_indices[1], qubit_indices[2]) + except AttributeError: + # Last resort: try to append the operation with qubit objects + try: + qubit_objs = [circuit.qubits[i] for i in qubit_indices] + circuit.append(op, qubit_objs) + except Exception: + pass + + +def analyze_circuit( + circuit: QuantumCircuit, + optimization_level: int = 1, + min_repetitions: int = 2, + max_window_size: int = 8 +) -> Dict[str, Any]: + """ + Analyze a quantum circuit and extract macro-gates. + + Args: + circuit: Qiskit QuantumCircuit to analyze + optimization_level: Qiskit transpilation optimization level (0-3) + min_repetitions: Minimum number of repetitions to consider a pattern + max_window_size: Maximum window size for pattern detection + + Returns: + Dictionary with: + - 'dag_flat': Flat DAG representation (list of operations) + - 'dag_hierarchical': Hierarchical DAG with macro-gates collapsed + - 'macros': List of detected macro-gates with labels + - 'statistics': Analysis statistics + """ + # Step 1: Transpile and get DAG + transpiled_qc = transpile(circuit, optimization_level=optimization_level) + dag = circuit_to_dag(transpiled_qc) + + # Step 2: Extract operations sequence + ops_sequence = extract_operations_from_dag(dag) + + # Step 3: Detect patterns + detector = MacroGateDetector(min_repetitions=min_repetitions, max_window_size=max_window_size) + patterns = detector.detect_patterns(ops_sequence) + macros = detector.find_non_overlapping_macros(patterns, ops_sequence) + + # Step 4: Label macros + labeler = SemanticLabeler() + total_circuit_length = len(ops_sequence) + for macro in macros: + macro['label'] = labeler.label_macro(macro, macro['sequence'], macros, total_circuit_length) + + # Step 5: Create hierarchical view + hierarchical_view = create_hierarchical_view(ops_sequence, macros) + + # Step 6: Build flat DAG representation + dag_flat = [ + { + 'position': i, + 'gate': ops_sequence[i][0], + 'qubits': list(ops_sequence[i][1]) if len(ops_sequence[i]) > 1 else [] + } + for i in range(len(ops_sequence)) + ] + + # Step 7: Build macro-gate list (serializable) + macros_serializable = [ + { + 'label': m['label'], + 'count': m['count'], + 'window_size': m['window_size'], + 'gates': [{'name': g[0], 'qubits': list(g[1])} for g in m['sequence']], + 'positions': [{'start': start, 'end': end} for start, end in m['positions']] + } + for m in macros + ] + + # Step 8: Calculate statistics + original_gates = len(ops_sequence) + collapsed_items = len(hierarchical_view) + compression_ratio = original_gates / collapsed_items if collapsed_items > 0 else 1 + + statistics = { + 'original_gates': original_gates, + 'transpiled_gates': len(transpiled_qc.data), + 'circuit_depth': transpiled_qc.depth(), + 'num_qubits': transpiled_qc.num_qubits, + 'num_macros': len(macros), + 'total_macro_instances': sum(m['count'] for m in macros), + 'hierarchical_items': collapsed_items, + 'compression_ratio': round(compression_ratio, 2), + 'dag_nodes': len(list(dag.nodes())), + 'dag_edges': len(list(dag.edges())) + } + + return { + 'dag_flat': dag_flat, + 'dag_hierarchical': hierarchical_view, + 'macros': macros_serializable, + 'statistics': statistics + } + + +def convert_to_app_circuit_format(analysis_result: Dict[str, Any]) -> Dict[str, Any]: + """ + Convert the analysis result to the app-circuit.json format. + + Args: + analysis_result: Result dictionary from analyze_circuit() + + Returns: + Dictionary with 'nodes', 'edges', and 'macros' in app-circuit.json format + """ + output_nodes = [] + output_edges = [] + output_macros = [] + + # Get number of qubits + num_qubits = analysis_result.get('statistics', {}).get('num_qubits', 0) + qubit_list = [str(i) for i in range(num_qubits)] + + # Track last node on each qubit and node layers + last_node_on_qubit = {} + node_layers = {} + + # --- 1. Add Init Nodes --- + start_layer = -1 + for q in qubit_list: + node_id = f"q_start_{q}" + node_data = { + "id": node_id, + "name": f"q{q}_init", + "type": "init", + "position": -1, + "qubits": [q], + "layer": start_layer + } + output_nodes.append(node_data) + last_node_on_qubit[q] = node_id + node_layers[node_id] = start_layer + + # --- 2. Build Gate Nodes from dag_flat --- + # Use dag_flat to get all gates (not collapsed in hierarchical view) + hierarchical_nodes = [] + gate_position_to_id = {} # Map position to gate ID + + for item in analysis_result.get('dag_flat', []): + pos = item['position'] + node_id = f"gate_{pos}" + gate_position_to_id[pos] = node_id + + node_data = { + "id": node_id, + "name": item['gate'], + "type": "gate", + "position": pos, + "qubits": item['qubits'], + "layer": 0 # Will be calculated below + } + hierarchical_nodes.append(node_data) + + # --- 3. Calculate Layers and Build Edges --- + max_gate_layer = 0 + + for node in hierarchical_nodes: + node_id = node['id'] + qubits = node['qubits'] + + predecessor_layers = [] + predecessor_nodes = [] + + # Check dependencies for each qubit + for q in qubits: + if q in last_node_on_qubit: + pred_id = last_node_on_qubit[q] + if (pred_id, q) not in predecessor_nodes: + predecessor_nodes.append((pred_id, q)) + predecessor_layers.append(node_layers[pred_id]) + + # Calculate layer + current_layer = 0 + if predecessor_layers: + current_layer = 1 + max(predecessor_layers) + + max_gate_layer = max(max_gate_layer, current_layer) + node['layer'] = current_layer + node_layers[node_id] = current_layer + output_nodes.append(node) + + # Create edges + for pred_id, q in predecessor_nodes: + edge = { + "name": f"q{q}", + "from-node": pred_id, + "to-node": node_id, + "qubit": q + } + output_edges.append(edge) + + # Update last node tracker + for q in qubits: + last_node_on_qubit[q] = node_id + + # --- 4. Add End Nodes --- + end_layer = max_gate_layer + 1 + positions = [n.get('position', 0) for n in hierarchical_nodes] + max_pos = (max(positions) if positions else 0) + 1 + + for q in qubit_list: + node_id = f"q_end_{q}" + node_data = { + "id": node_id, + "name": f"q{q}_end", + "type": "end", + "position": max_pos, + "qubits": [q], + "layer": end_layer + } + output_nodes.append(node_data) + + pred_id = last_node_on_qubit[q] + edge = { + "name": f"q{q}", + "from-node": pred_id, + "to-node": node_id, + "qubit": q + } + output_edges.append(edge) + + # --- 5. Build Macros with gate_ids --- + for macro_def in analysis_result.get('macros', []): + # For each position where this macro appears, collect the gate IDs + macro_instances = [] + for pos_info in macro_def.get('positions', []): + start = pos_info['start'] + end = pos_info['end'] + + # Collect gate IDs for this instance + gate_ids = [] + for pos in range(start, end): + if pos in gate_position_to_id: + gate_ids.append(gate_position_to_id[pos]) + + if gate_ids: + macro_instances.append({ + "name": macro_def['label'], + "gate_ids": gate_ids, + "nodes": [ + { + "name": gate['name'], + "qubits": gate['qubits'] + } + for gate in macro_def.get('gates', []) + ] + }) + + # If no instances found, still add the macro definition + if not macro_instances: + output_macros.append({ + "name": macro_def['label'], + "gate_ids": [], + "nodes": [ + { + "name": gate['name'], + "qubits": gate['qubits'] + } + for gate in macro_def.get('gates', []) + ] + }) + else: + # Add each instance separately (as shown in app-circuit.json) + output_macros.extend(macro_instances) + + return { + "nodes": output_nodes, + "edges": output_edges, + "macros": output_macros + } + + +# # Example usage +# if __name__ == "__main__": +# # Create a test circuit +# qc = QuantumCircuit(4) + +# # Create a repeating ansatz-like pattern +# for layer in range(3): +# for i in range(3): +# qc.cx(i, i+1) +# for i in range(4): +# qc.ry(0.5, i) +# qc.cx(0, 2) +# qc.cx(1, 3) + +# # Analyze the circuit +# result = analyze_circuit(qc) + +# # Print results +# print("="*70) +# print("MACRO-GATE DETECTION RESULTS") +# print("="*70) +# print(f"\nStatistics:") +# for key, value in result['statistics'].items(): +# print(f" {key}: {value}") + +# print(f"\nDetected {len(result['macros'])} macro-gates:") +# for i, macro in enumerate(result['macros'][:5], 1): +# print(f"\n {i}. {macro['label']} (appears {macro['count']} times)") +# print(f" Gates: {[g['name'] for g in macro['gates']]}") + +# print(f"\nHierarchical view has {len(result['dag_hierarchical'])} items") +# print(f" (vs {len(result['dag_flat'])} in flat view)") + +# # Create a new circuit with macro-gates as custom gates +# print("\n" + "="*70) +# print("Creating circuit with macro-gates...") +# print("="*70) +# macro_circuit = create_macro_gate_circuit(qc, result) + +# print("\nOriginal circuit:") +# print(qc.draw(output='text')) + +# print("\nCircuit with macro-gates (visual only):") +# print(macro_circuit.draw(output='text')) + +# # The result dictionary is JSON-serializable +# print("\n" + "="*70) +# print("Result is JSON-serializable:") +# print(f" Flat DAG: {len(result['dag_flat'])} operations") +# print(f" Hierarchical DAG: {len(result['dag_hierarchical'])} items") +# print(f" Macros: {len(result['macros'])} macro-gates") +# print("="*70) + diff --git a/Quilt/macro_gate_detector/tests/README.md b/Quilt/macro_gate_detector/tests/README.md new file mode 100644 index 0000000..fa6fdad --- /dev/null +++ b/Quilt/macro_gate_detector/tests/README.md @@ -0,0 +1,107 @@ +# Test Suite for Macro Gate Detector + +This directory contains comprehensive tests for the macro gate detector. + +## Test Structure + +### Test Files + +- **`test_small.py`** - Basic functionality tests on simple circuits + - Tests basic ansatz pattern detection + - Tests QFT pattern recognition + - Tests CNOT ladder detection + +- **`test_1_qasm.py`** - Comprehensive test suite for `1.qasm` + - Full analysis and macro detection + - Macro circuit creation and verification + - JSON serialization tests + - Output saved to `output_test_1/` + +- **`test_3_qasm.py`** - Comprehensive test suite for `3.qasm` + - Full analysis and macro detection + - Robustness tests across optimization levels + - Macro consistency checks + - Output saved to `output_test_3/` + +### Shared Utilities + +- **`test_utils.py`** - Shared test utilities + - `TestResults` - Test result tracking + - `load_circuit_from_qasm()` - QASM file loading + - `save_circuit_images()` - Visualization saving (automatically limits to 50 qubits for large circuits) + - `create_reduced_circuit()` - Circuit reduction for visualization + - Other helper functions + +## Output Organization + +Each test suite saves its output to a separate folder: + +- **`output_test_1/`** - Output from `test_1_qasm.py` + - `original.pdf` - Original circuit visualization + - `macro.pdf` - Macro circuit visualization + - `original_dag.png` - Original circuit DAG + - `macro_dag.png` - Macro circuit DAG + - `analysis_result.json` - Raw analysis output (full result from `analyze_circuit()`) + - `circuit_graph.json` - Processed circuit graph in `app-circuit.json` format + +- **`output_test_3/`** - Output from `test_3_qasm.py` + - Same structure as `output_test_1/` + +### JSON Output Files + +- **`analysis_result.json`**: Contains the complete analysis result including: + - `dag_flat`: Flat DAG representation with all operations + - `dag_hierarchical`: Hierarchical DAG with macro-gates collapsed + - `macros`: Detected macro-gates with labels, counts, and positions + - `statistics`: Analysis statistics (gate counts, compression ratio, etc.) + +- **`circuit_graph.json`**: **THIS FILE GOES INTO THE REACT APP** - Processed graph in `app-circuit.json` format: + - `nodes`: All circuit nodes (init nodes, gate nodes, end nodes) with layer information + - `edges`: Dependencies between nodes showing qubit flow + - `macros`: Macro definitions with `gate_ids` arrays referencing specific gate nodes + - **Usage**: Upload `circuit_graph.json` to the React visualization app (`my-react-app/`) to visualize the circuit with macro-gates highlighted + - **Important**: This is the file that goes into the React app - not `analysis_result.json` + +## Running Tests + +### Run all tests: +```bash +uv run pytest macro_gate_detector/tests/ +``` + +### Run specific test: +```bash +# Small tests +uv run pytest macro_gate_detector/tests/test_small.py +# or +uv run python -m macro_gate_detector.tests.test_small + +# Test 1 +uv run pytest macro_gate_detector/tests/test_1_qasm.py +# or +uv run python -m macro_gate_detector.tests.test_1_qasm + +# Test 3 +uv run pytest macro_gate_detector/tests/test_3_qasm.py +# or +uv run python -m macro_gate_detector.tests.test_3_qasm +``` + +## Circuit Visualization + +For circuits with more than 50 qubits, visualizations automatically show only the first 50 qubits to keep the output manageable. The `create_reduced_circuit()` function handles this reduction. + +## Requirements + +- Qiskit +- matplotlib (for PDF generation) +- Graphviz (for DAG visualization) +- pydot (for Graphviz integration) + +Install with: +```bash +uv add qiskit matplotlib pydot +``` + +Graphviz must be installed separately from https://graphviz.org/download/ + diff --git a/Quilt/macro_gate_detector/tests/RUN_TESTS.md b/Quilt/macro_gate_detector/tests/RUN_TESTS.md new file mode 100644 index 0000000..206c1e9 --- /dev/null +++ b/Quilt/macro_gate_detector/tests/RUN_TESTS.md @@ -0,0 +1,171 @@ +# How to Run Tests + +## Quick Start + +### Using UV (Recommended) + +```bash +# Run all tests +uv run pytest macro_gate_detector/tests/ + +# Run specific test +uv run python -m macro_gate_detector.tests.test_small +uv run python -m macro_gate_detector.tests.test_1_qasm +uv run python -m macro_gate_detector.tests.test_3_qasm +``` + +### Using Traditional venv + +```bash +# Activate venv first +.\venv\Scripts\Activate.ps1 # Windows PowerShell +# or +source venv/bin/activate # Linux/Mac + +# Then run tests +pytest macro_gate_detector/tests/ +python -m macro_gate_detector.tests.test_small +``` + +## Test Files Explained + +### 1. `test_small.py` - Basic Functionality Tests +**Purpose:** Quick tests to verify core functionality works +**Duration:** Fast (< 1 minute) +**Output:** Console output only, no files + +**Run:** +```bash +uv run python -m macro_gate_detector.tests.test_small +``` + +**Tests:** +- Basic ansatz pattern detection +- QFT pattern recognition +- CNOT ladder detection + +### 2. `test_1_qasm.py` - Comprehensive Test for 1.qasm +**Purpose:** Full test suite for the 1.qasm circuit file +**Duration:** Medium (1-5 minutes depending on circuit size) +**Output:** Saved to `tests/output_test_1/` + +**Run:** +```bash +uv run python -m macro_gate_detector.tests.test_1_qasm +``` + +**What it does:** +- Loads `tests/big_circuit/1.qasm` +- Analyzes circuit for macro patterns +- Creates macro circuit +- Verifies macro substitution +- Tests JSON serialization +- Generates visualizations (PDFs and DAGs) +- Saves all output to `tests/output_test_1/` + +### 3. `test_3_qasm.py` - Comprehensive Test for 3.qasm +**Purpose:** Full test suite for the 3.qasm circuit file +**Duration:** Medium (1-5 minutes depending on circuit size) +**Output:** Saved to `tests/output_test_3/` + +**Run:** +```bash +uv run python -m macro_gate_detector.tests.test_3_qasm +``` + +**What it does:** +- Loads `tests/big_circuit/3.qasm` +- Analyzes circuit for macro patterns +- Creates macro circuit +- Tests robustness across optimization levels +- Verifies macro consistency +- Generates visualizations (PDFs and DAGs) +- Saves all output to `tests/output_test_3/` + +## Understanding Test Output + +### Console Output + +Each test prints: +- `[PASS]` - Test passed +- `[FAIL]` - Test failed +- `[WARN]` - Warning (non-critical issue) + +At the end, you'll see a summary: +``` +TEST SUMMARY +====================================================================== +Passed: 15 +Failed: 0 +Warnings: 2 +``` + +### File Output + +For large circuit tests (1.qasm and 3.qasm), files are saved: + +**Location:** `tests/output_test_X/` (where X is 1 or 3) + +**Files:** +- `original.pdf` - Visual representation of original circuit +- `macro.pdf` - Visual representation with macro gates +- `original_dag.png` - DAG (Directed Acyclic Graph) of original circuit +- `macro_dag.png` - DAG with macro gates collapsed + +**Note:** For circuits with >50 qubits, only the first 50 qubits are shown in visualizations. + +## Running All Tests + +```bash +# Run all tests with pytest +uv run pytest macro_gate_detector/tests/ -v + +# Run all tests and show coverage +uv run pytest macro_gate_detector/tests/ --cov=macro_gate_detector --cov-report=html + +# Run tests in parallel (faster) +uv run pytest macro_gate_detector/tests/ -n auto +``` + +## Common Issues + +### "Python version not supported" +- Ensure Python 3.12+ is installed +- If using UV: `uv python install 3.12` then `uv sync` +- If using venv: Recreate with Python 3.12+ + +### "Module not found" errors +- Run `uv sync` (if using UV) +- Or `pip install -e .` (if using venv) + +### "Graphviz not found" warnings +- Install Graphviz from https://graphviz.org/download/ +- Tests will still run, but DAG visualizations won't be generated + +### "File not found" for QASM files +- Ensure `macro_gate_detector/tests/big_circuit/1.qasm` and `macro_gate_detector/tests/big_circuit/3.qasm` exist +- Check you're running from the project root directory + +## Test Structure + +``` +macro_gate_detector/tests/ +├── test_utils.py # Shared utilities +├── test_small.py # Quick basic tests +├── test_1_qasm.py # Test for 1.qasm +├── test_3_qasm.py # Test for 3.qasm +├── big_circuit/ # QASM circuit files +│ ├── 1.qasm +│ └── 3.qasm +├── output_test_1/ # Output from test_1_qasm.py +│ ├── original.pdf +│ ├── macro.pdf +│ ├── original_dag.png +│ └── macro_dag.png +└── output_test_3/ # Output from test_3_qasm.py + ├── original.pdf + ├── macro.pdf + ├── original_dag.png + └── macro_dag.png +``` + diff --git a/Quilt/macro_gate_detector/tests/__init__.py b/Quilt/macro_gate_detector/tests/__init__.py new file mode 100644 index 0000000..b5e4c96 --- /dev/null +++ b/Quilt/macro_gate_detector/tests/__init__.py @@ -0,0 +1,4 @@ +""" +Test suite for macro_gate_detector +""" + diff --git a/Quilt/macro_gate_detector/tests/big_circuit/1.qasm b/Quilt/macro_gate_detector/tests/big_circuit/1.qasm new file mode 100644 index 0000000..6a13904 --- /dev/null +++ b/Quilt/macro_gate_detector/tests/big_circuit/1.qasm @@ -0,0 +1,103 @@ +OPENQASM 3.0; +include "stdgates.inc"; +qubit[44] q; +x q[43]; +x q[42]; +x q[41]; +x q[40]; +x q[39]; +x q[38]; +x q[37]; +x q[36]; +x q[35]; +x q[34]; +x q[33]; +x q[32]; +x q[31]; +x q[30]; +x q[29]; +x q[28]; +x q[27]; +x q[26]; +x q[25]; +x q[24]; +x q[23]; +x q[22]; +x q[21]; +x q[20]; +x q[19]; +x q[18]; +x q[17]; +x q[16]; +x q[15]; +x q[14]; +x q[13]; +x q[12]; +cx q[28], q[29]; +cx q[34], q[35]; +x q[29]; +x q[35]; +cx q[28], q[34]; +ry(-0.013102677756855547) q[28]; +h q[29]; +cx q[28], q[29]; +h q[35]; +ry(0.013102677756855547) q[28]; +cx q[28], q[35]; +ry(-0.013102677756855547) q[28]; +cx q[28], q[29]; +h q[34]; +ry(0.013102677756855547) q[28]; +cx q[28], q[34]; +ry(-0.013102677756855547) q[28]; +cx q[28], q[29]; +ry(0.013102677756855547) q[28]; +cx q[28], q[35]; +ry(-0.013102677756855547) q[28]; +cx q[28], q[29]; +ry(0.013102677756855547) q[28]; +h q[35]; +h q[29]; +rz(pi/2) q[34]; +cx q[28], q[34]; +rz(-pi/2) q[28]; +rz(pi/2) q[34]; +ry(pi/2) q[34]; +x q[29]; +x q[35]; +cx q[28], q[29]; +cx q[34], q[35]; +cx q[34], q[29]; +cx q[28], q[35]; +x q[29]; +x q[35]; +cx q[34], q[28]; +ry(-0.013102677756855547) q[34]; +h q[29]; +cx q[34], q[29]; +h q[35]; +ry(0.013102677756855547) q[34]; +cx q[34], q[35]; +ry(-0.013102677756855547) q[34]; +cx q[34], q[29]; +h q[28]; +ry(0.013102677756855547) q[34]; +cx q[34], q[28]; +ry(-0.013102677756855547) q[34]; +cx q[34], q[29]; +ry(0.013102677756855547) q[34]; +cx q[34], q[35]; +ry(-0.013102677756855547) q[34]; +cx q[34], q[29]; +ry(0.013102677756855547) q[34]; +h q[35]; +h q[29]; +rz(pi/2) q[28]; +cx q[34], q[28]; +rz(-pi/2) q[34]; +rz(pi/2) q[28]; +ry(pi/2) q[28]; +x q[29]; +x q[35]; +cx q[34], q[29]; +cx q[28], q[35]; diff --git a/Quilt/macro_gate_detector/tests/big_circuit/3.qasm b/Quilt/macro_gate_detector/tests/big_circuit/3.qasm new file mode 100644 index 0000000..16f850a --- /dev/null +++ b/Quilt/macro_gate_detector/tests/big_circuit/3.qasm @@ -0,0 +1,7111 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[156]; +x q[50]; +x q[64]; +rz(-pi) q[86]; +sx q[86]; +rz(-pi) q[86]; +x q[87]; +rz(pi/2) q[88]; +sx q[88]; +rz(pi) q[88]; +cz q[87],q[88]; +sx q[88]; +rz(pi) q[88]; +rz(pi/2) q[89]; +sx q[89]; +rz(pi/2) q[90]; +sx q[90]; +rz(pi) q[90]; +x q[91]; +cz q[91],q[90]; +sx q[90]; +rz(pi) q[90]; +rz(pi/2) q[95]; +sx q[95]; +rz(pi) q[95]; +cz q[94],q[95]; +sx q[95]; +rz(pi) q[95]; +x q[97]; +rz(-pi) q[98]; +sx q[98]; +rz(-pi) q[98]; +rz(pi/2) q[99]; +sx q[99]; +rz(pi) q[99]; +cz q[95],q[99]; +sx q[99]; +rz(pi) q[99]; +rz(pi/2) q[105]; +sx q[105]; +rz(pi) q[105]; +x q[106]; +cz q[106],q[105]; +sx q[105]; +rz(pi) q[105]; +rz(pi/2) q[107]; +sx q[107]; +rz(pi/2) q[107]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +rz(pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.129629504234968) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(3.1535558029446182) q[87]; +sx q[87]; +rz(3*pi) q[87]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.129629504234968) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(3.1535558029446182) q[87]; +sx q[87]; +rz(3*pi) q[87]; +sx q[97]; +rz(pi/2) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.129629504234968) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(1.5827594761497217) q[87]; +sx q[87]; +sx q[97]; +rz(-3*pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +rz(-pi) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(pi/2) q[87]; +rz(-pi/2) q[97]; +sx q[97]; +rz(-pi) q[97]; +rz(pi/2) q[107]; +sx q[107]; +rz(pi) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(-0.01196314935482512) q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +cz q[87],q[88]; +sx q[87]; +rz(3.1535558029446182) q[87]; +sx q[87]; +rz(5*pi/2) q[87]; +sx q[88]; +rz(pi) q[88]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +cz q[87],q[88]; +sx q[87]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +rz(pi/2) q[107]; +cz q[97],q[107]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +cz q[87],q[88]; +sx q[88]; +rz(pi) q[88]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +rz(pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.129629504234968) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(3.1535558029446182) q[87]; +sx q[87]; +rz(3*pi) q[87]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.129629504234968) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(3.1535558029446182) q[87]; +sx q[87]; +rz(3*pi) q[87]; +sx q[97]; +rz(pi/2) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.129629504234968) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(1.5827594761497217) q[87]; +sx q[87]; +sx q[97]; +rz(-3*pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +rz(-pi) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(pi/2) q[87]; +rz(-pi/2) q[97]; +sx q[97]; +rz(-pi) q[97]; +rz(pi/2) q[107]; +sx q[107]; +rz(pi) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(-0.01196314935482512) q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +cz q[87],q[88]; +sx q[87]; +rz(3.1535558029446182) q[87]; +sx q[87]; +rz(5*pi/2) q[87]; +sx q[88]; +rz(pi) q[88]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +cz q[87],q[88]; +sx q[87]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +rz(2.9633253471348127) q[107]; +cz q[97],q[107]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +cz q[87],q[88]; +sx q[88]; +rz(pi) q[88]; +rz(2.3364249418501) q[97]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(-pi) q[97]; +sx q[97]; +sx q[107]; +rz(pi) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(1.7490636332498752) q[97]; +sx q[97]; +sx q[107]; +rz(-0.7656286150552045) q[107]; +sx q[107]; +rz(pi/2) q[107]; +cz q[106],q[107]; +sx q[106]; +rz(3.1286372512834957) q[106]; +sx q[106]; +rz(3*pi) q[106]; +cz q[106],q[105]; +sx q[106]; +rz(3.1545480558960906) q[106]; +sx q[106]; +rz(3*pi) q[106]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +rz(pi/2) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +cz q[106],q[107]; +sx q[106]; +rz(3.1286372512834957) q[106]; +sx q[106]; +rz(3*pi) q[106]; +cz q[106],q[105]; +sx q[106]; +rz(3.1545480558960906) q[106]; +sx q[106]; +rz(3*pi) q[106]; +sx q[107]; +rz(pi/2) q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +rz(pi/2) q[97]; +sx q[97]; +rz(pi) q[97]; +rz(pi/2) q[107]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +rz(3.1286372512834957) q[106]; +sx q[106]; +rz(3*pi) q[106]; +cz q[106],q[105]; +sx q[106]; +rz(1.583751729101194) q[106]; +sx q[106]; +sx q[107]; +rz(-3*pi/2) q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +rz(-pi) q[106]; +sx q[106]; +rz(-pi/2) q[106]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +rz(pi/2) q[106]; +rz(-pi/2) q[107]; +sx q[107]; +rz(-pi) q[107]; +cz q[107],q[97]; +sx q[97]; +rz(pi/2) q[97]; +sx q[107]; +rz(-0.012955402306298325) q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +cz q[106],q[105]; +sx q[105]; +rz(pi) q[105]; +sx q[106]; +rz(3.1545480558960906) q[106]; +sx q[106]; +rz(5*pi/2) q[106]; +rz(pi/2) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +cz q[106],q[107]; +cz q[106],q[105]; +sx q[106]; +sx q[107]; +rz(-pi) q[107]; +cz q[107],q[97]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +cz q[106],q[105]; +sx q[105]; +rz(pi) q[105]; +cz q[107],q[97]; +sx q[97]; +rz(pi/2) q[107]; +sx q[107]; +rz(pi/2) q[107]; +cz q[106],q[107]; +sx q[106]; +rz(3.1286372512834957) q[106]; +sx q[106]; +rz(3*pi) q[106]; +cz q[106],q[105]; +sx q[106]; +rz(3.1545480558960906) q[106]; +sx q[106]; +rz(3*pi) q[106]; +sx q[107]; +rz(pi/2) q[108]; +sx q[108]; +sx q[109]; +rz(-3*pi/2) q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +rz(-pi) q[108]; +sx q[108]; +rz(-pi) q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +rz(pi/2) q[108]; +x q[109]; +rz(-pi/2) q[109]; +rz(-pi) q[110]; +sx q[110]; +rz(-pi) q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +rz(pi/2) q[110]; +sx q[110]; +rz(pi/2) q[110]; +cz q[109],q[110]; +sx q[109]; +sx q[110]; +sx q[111]; +rz(-pi) q[112]; +sx q[112]; +rz(-pi) q[112]; +rz(pi/2) q[113]; +sx q[113]; +rz(pi/2) q[114]; +sx q[114]; +rz(pi/2) q[115]; +sx q[115]; +cz q[99],q[115]; +sx q[115]; +rz(-pi) q[115]; +cz q[114],q[115]; +sx q[114]; +sx q[115]; +cz q[114],q[115]; +rz(-pi) q[114]; +sx q[114]; +sx q[115]; +cz q[114],q[115]; +sx q[114]; +rz(-pi) q[114]; +cz q[113],q[114]; +sx q[113]; +sx q[114]; +cz q[113],q[114]; +rz(-pi) q[113]; +sx q[113]; +rz(-3*pi/2) q[113]; +sx q[114]; +cz q[113],q[114]; +rz(pi/2) q[114]; +sx q[114]; +rz(pi/2) q[115]; +sx q[115]; +rz(pi/2) q[117]; +sx q[117]; +rz(-pi) q[117]; +rz(-pi) q[118]; +sx q[118]; +rz(-pi) q[118]; +sx q[119]; +rz(-3*pi/2) q[119]; +cz q[113],q[119]; +sx q[113]; +sx q[119]; +cz q[113],q[119]; +rz(-pi) q[113]; +sx q[113]; +sx q[119]; +cz q[113],q[119]; +sx q[113]; +rz(pi/2) q[113]; +cz q[113],q[114]; +sx q[113]; +sx q[114]; +cz q[113],q[114]; +sx q[113]; +sx q[114]; +cz q[113],q[114]; +rz(pi/2) q[113]; +sx q[113]; +rz(pi) q[113]; +rz(-pi) q[114]; +x q[114]; +rz(-pi) q[119]; +sx q[119]; +rz(-pi) q[123]; +sx q[123]; +rz(-pi) q[123]; +rz(pi/2) q[124]; +sx q[124]; +x q[125]; +cz q[125],q[117]; +sx q[117]; +rz(-pi) q[117]; +rz(-pi) q[125]; +x q[125]; +rz(pi/2) q[126]; +sx q[126]; +cz q[127],q[126]; +sx q[126]; +rz(pi) q[126]; +x q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(pi/2) q[129]; +cz q[128],q[129]; +rz(pi/2) q[128]; +sx q[128]; +rz(pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.135375409451838) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(3.147809897727748) q[127]; +sx q[127]; +rz(3*pi) q[127]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +rz(pi/2) q[128]; +sx q[128]; +rz(-pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.135375409451838) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(3.147809897727748) q[127]; +sx q[127]; +rz(3*pi) q[127]; +sx q[128]; +rz(pi/2) q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +rz(pi/2) q[128]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.135375409451838) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(1.5770135709328512) q[127]; +sx q[127]; +sx q[128]; +rz(-3*pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +rz(-pi) q[127]; +sx q[127]; +rz(-pi/2) q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(pi/2) q[127]; +rz(-pi/2) q[128]; +sx q[128]; +rz(-pi) q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(pi) q[129]; +cz q[128],q[129]; +sx q[128]; +rz(-0.0062172441379555465) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +cz q[127],q[126]; +sx q[126]; +rz(pi) q[126]; +sx q[127]; +rz(3.147809897727748) q[127]; +sx q[127]; +rz(5*pi/2) q[127]; +rz(pi/2) q[128]; +sx q[128]; +rz(-pi/2) q[128]; +cz q[127],q[128]; +cz q[127],q[126]; +sx q[127]; +sx q[128]; +rz(-pi) q[128]; +sx q[129]; +rz(pi/2) q[129]; +cz q[128],q[129]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +cz q[127],q[126]; +sx q[126]; +rz(-pi/2) q[126]; +cz q[128],q[129]; +rz(pi/2) q[128]; +sx q[128]; +rz(pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.135375409451838) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(3.147809897727748) q[127]; +sx q[127]; +rz(3*pi) q[127]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +rz(pi/2) q[128]; +sx q[128]; +rz(-pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.135375409451838) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(3.147809897727748) q[127]; +sx q[127]; +rz(3*pi) q[127]; +sx q[128]; +rz(pi/2) q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +rz(pi/2) q[128]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.135375409451838) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[126]; +rz(pi/2) q[126]; +sx q[127]; +rz(1.5770135709328512) q[127]; +sx q[127]; +sx q[128]; +rz(-3*pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +rz(-pi) q[127]; +sx q[127]; +rz(-pi/2) q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(pi/2) q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +rz(pi/2) q[127]; +sx q[127]; +rz(pi/2) q[127]; +rz(-pi/2) q[128]; +sx q[128]; +rz(-pi) q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(pi) q[129]; +cz q[128],q[129]; +sx q[128]; +rz(3.135375409451838) q[128]; +sx q[128]; +rz(7.00673726901983) q[128]; +cz q[128],q[127]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +rz(pi/2) q[126]; +sx q[126]; +rz(pi) q[126]; +rz(-pi/2) q[127]; +sx q[127]; +rz(1.1881630266360999) q[127]; +sx q[127]; +sx q[128]; +rz(-1.5754559219527131) q[128]; +sx q[128]; +rz(1.5666802096617873) q[128]; +cz q[127],q[128]; +rz(-pi) q[127]; +sx q[127]; +sx q[128]; +rz(pi) q[128]; +cz q[127],q[128]; +sx q[127]; +rz(2.41805028150017) q[127]; +cz q[127],q[126]; +sx q[127]; +sx q[128]; +rz(0.38263330015879715) q[128]; +sx q[128]; +sx q[129]; +rz(-0.9855558135775961) q[129]; +cz q[128],q[129]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +cz q[127],q[126]; +sx q[126]; +rz(pi) q[126]; +rz(-2.1560368400121983) q[128]; +sx q[128]; +sx q[129]; +rz(-pi) q[129]; +cz q[128],q[129]; +sx q[128]; +rz(pi) q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +rz(2.556352140372492) q[128]; +sx q[128]; +sx q[129]; +rz(-0.9855558135775944) q[129]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.139673429823723) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.1435118773558632) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[98]; +sx q[111]; +sx q[118]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +rz(-pi/2) q[128]; +sx q[128]; +rz(1.9942639750444124) q[128]; +sx q[128]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.139673429823723) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.1435118773558632) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[98]; +rz(pi/2) q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.139673429823723) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(1.5727155505609662) q[91]; +sx q[91]; +sx q[98]; +rz(-3*pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +rz(-pi/2) q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(pi/2) q[91]; +rz(-pi/2) q[98]; +sx q[98]; +rz(-pi) q[98]; +rz(pi/2) q[111]; +sx q[111]; +rz(pi) q[111]; +cz q[98],q[111]; +sx q[98]; +rz(-0.0019192237660696776) q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +cz q[91],q[90]; +sx q[90]; +rz(pi) q[90]; +sx q[91]; +rz(3.1435118773558632) q[91]; +sx q[91]; +rz(5*pi/2) q[91]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[91],q[98]; +cz q[91],q[90]; +sx q[91]; +sx q[98]; +rz(-pi) q[98]; +sx q[111]; +rz(pi/2) q[111]; +cz q[98],q[111]; +sx q[98]; +cz q[98],q[91]; +sx q[91]; +sx q[98]; +cz q[98],q[91]; +sx q[91]; +sx q[98]; +cz q[98],q[91]; +cz q[91],q[90]; +sx q[90]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.139673429823723) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.1435118773558632) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.139673429823723) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.1435118773558632) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[98]; +rz(pi/2) q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.139673429823723) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.1435118773558632) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.139673429823723) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[90]; +rz(1.8746915859972422) q[90]; +sx q[90]; +sx q[91]; +rz(3.1435118773558632) q[91]; +sx q[91]; +rz(9.092641127518839) q[91]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +cz q[90],q[91]; +rz(-pi) q[90]; +sx q[90]; +rz(pi) q[90]; +sx q[91]; +rz(pi) q[91]; +cz q[90],q[91]; +sx q[90]; +rz(-0.332136833250539) q[90]; +sx q[90]; +sx q[91]; +rz(-1.8746915859972404) q[91]; +sx q[91]; +rz(-3*pi/2) q[91]; +sx q[98]; +rz(pi/2) q[111]; +sx q[111]; +rz(-pi/2) q[111]; +cz q[98],q[111]; +x q[98]; +sx q[111]; +rz(pi/2) q[111]; +cz q[111],q[112]; +sx q[111]; +sx q[112]; +cz q[111],q[112]; +sx q[111]; +sx q[112]; +cz q[111],q[112]; +rz(-pi) q[112]; +x q[112]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.139249807682908) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(1.5731391727017812) q[87]; +sx q[87]; +x q[97]; +cz q[87],q[97]; +sx q[87]; +rz(-pi/2) q[97]; +sx q[97]; +cz q[87],q[97]; +rz(-pi) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(pi/2) q[87]; +rz(-pi/2) q[97]; +sx q[97]; +rz(-pi) q[97]; +rz(pi/2) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +cz q[106],q[107]; +sx q[106]; +rz(3.1286372512834957) q[106]; +sx q[106]; +rz(3*pi) q[106]; +cz q[106],q[105]; +sx q[106]; +rz(3.1545480558960906) q[106]; +sx q[106]; +rz(3*pi) q[106]; +sx q[107]; +rz(pi/2) q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(pi/2) q[107]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +rz(3.1286372512834957) q[106]; +sx q[106]; +rz(3*pi) q[106]; +cz q[106],q[105]; +sx q[106]; +rz(3.1545480558960906) q[106]; +sx q[106]; +rz(3*pi) q[106]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(pi/2) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +cz q[106],q[107]; +sx q[106]; +rz(3.1286372512834957) q[106]; +sx q[106]; +rz(3*pi) q[106]; +cz q[106],q[105]; +sx q[105]; +rz(-pi/2) q[105]; +sx q[106]; +rz(3.1545480558960906) q[106]; +sx q[106]; +sx q[107]; +rz(-pi) q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(pi/2) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +cz q[106],q[107]; +cz q[106],q[105]; +cz q[105],q[117]; +sx q[105]; +sx q[106]; +rz(1.9942639750444124) q[106]; +sx q[106]; +sx q[107]; +rz(-pi) q[107]; +rz(pi/2) q[108]; +sx q[108]; +rz(-pi/2) q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +rz(pi/2) q[108]; +sx q[109]; +sx q[117]; +cz q[105],q[117]; +rz(-pi) q[105]; +sx q[105]; +sx q[117]; +cz q[105],q[117]; +sx q[105]; +rz(0.6471564173362685) q[105]; +sx q[105]; +rz(pi/2) q[117]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +rz(pi/2) q[107]; +sx q[107]; +rz(pi) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(-0.0023428459068846053) q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +cz q[87],q[88]; +sx q[87]; +rz(3.143935499496678) q[87]; +sx q[87]; +rz(3*pi) q[87]; +rz(pi/2) q[97]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.139249807682908) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(1.5731391727017812) q[87]; +sx q[87]; +sx q[97]; +rz(-3*pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +rz(-pi) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(pi/2) q[87]; +rz(-pi/2) q[97]; +sx q[97]; +rz(-pi) q[97]; +cz q[97],q[107]; +sx q[97]; +rz(-0.0023428459068846053) q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +cz q[87],q[88]; +sx q[87]; +rz(3.143935499496678) q[87]; +sx q[87]; +rz(5*pi/2) q[87]; +sx q[88]; +rz(pi) q[88]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +cz q[87],q[88]; +sx q[87]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +rz(pi/2) q[107]; +cz q[97],q[107]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +cz q[87],q[88]; +sx q[88]; +rz(pi) q[88]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +rz(pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.139249807682908) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(3.143935499496678) q[87]; +sx q[87]; +rz(3*pi) q[87]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.139249807682908) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(3.143935499496678) q[87]; +sx q[87]; +rz(3*pi) q[87]; +sx q[97]; +rz(pi/2) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.139249807682908) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(3.143935499496678) q[87]; +sx q[87]; +rz(3*pi) q[87]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +rz(3.139249807682908) q[87]; +sx q[87]; +rz(3*pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(3.143935499496678) q[87]; +sx q[87]; +rz(3*pi) q[87]; +sx q[88]; +rz(-pi) q[88]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +cz q[87],q[88]; +sx q[87]; +rz(pi/2) q[87]; +sx q[88]; +rz(-pi) q[88]; +sx q[97]; +rz(pi/2) q[107]; +sx q[107]; +cz q[97],q[107]; +x q[97]; +cz q[87],q[97]; +sx q[87]; +rz(-pi/2) q[97]; +sx q[97]; +cz q[87],q[97]; +rz(-pi) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(pi/2) q[87]; +cz q[87],q[86]; +sx q[86]; +sx q[87]; +cz q[87],q[86]; +sx q[86]; +sx q[87]; +cz q[87],q[86]; +sx q[86]; +rz(pi/2) q[87]; +sx q[87]; +rz(pi/2) q[87]; +rz(-pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[97],q[107]; +sx q[97]; +rz(pi/2) q[97]; +sx q[107]; +rz(-0.423467648249515) q[107]; +sx q[107]; +cz q[106],q[107]; +rz(-pi) q[106]; +sx q[106]; +rz(pi) q[106]; +sx q[107]; +rz(pi) q[107]; +cz q[106],q[107]; +sx q[106]; +rz(1.1473286785453807) q[106]; +sx q[107]; +rz(-1.9942639750444116) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +rz(pi/2) q[108]; +sx q[108]; +rz(pi/2) q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[109]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +rz(-pi) q[109]; +x q[109]; +cz q[108],q[109]; +sx q[108]; +rz(-pi/2) q[109]; +sx q[109]; +cz q[108],q[109]; +rz(-pi) q[108]; +sx q[108]; +rz(-pi/2) q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +rz(pi/2) q[108]; +rz(-pi/2) q[109]; +sx q[109]; +rz(-pi) q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(-pi/2) q[110]; +cz q[111],q[110]; +sx q[110]; +rz(pi/2) q[111]; +sx q[111]; +rz(pi/2) q[111]; +cz q[111],q[112]; +sx q[111]; +rz(-pi/2) q[112]; +sx q[112]; +cz q[111],q[112]; +rz(-pi) q[111]; +sx q[111]; +sx q[112]; +cz q[111],q[112]; +sx q[111]; +rz(-pi) q[111]; +rz(pi/2) q[112]; +rz(pi/2) q[118]; +sx q[118]; +rz(-pi/2) q[118]; +cz q[109],q[118]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +rz(pi/2) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +sx q[118]; +rz(pi/2) q[118]; +sx q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +rz(pi/2) q[118]; +sx q[118]; +rz(pi) q[118]; +rz(-1.1473286785453807) q[129]; +sx q[129]; +rz(-pi) q[129]; +cz q[128],q[129]; +rz(-pi) q[128]; +sx q[128]; +rz(pi) q[128]; +sx q[129]; +rz(pi) q[129]; +cz q[128],q[129]; +sx q[128]; +rz(-2.518971146897159) q[128]; +sx q[128]; +sx q[129]; +rz(-1.9942639750444116) q[129]; +sx q[129]; +rz(-pi) q[129]; +cz q[129],q[118]; +sx q[118]; +rz(pi) q[118]; +cz q[118],q[109]; +sx q[109]; +rz(pi/2) q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(-pi) q[107]; +x q[107]; +cz q[97],q[107]; +sx q[97]; +rz(-pi/2) q[107]; +sx q[107]; +cz q[97],q[107]; +rz(-pi) q[97]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +rz(pi) q[97]; +cz q[97],q[87]; +cz q[87],q[88]; +sx q[87]; +sx q[88]; +cz q[87],q[88]; +rz(-pi) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +sx q[88]; +cz q[87],q[88]; +sx q[87]; +rz(pi/2) q[87]; +rz(-pi/2) q[88]; +sx q[88]; +rz(-pi) q[88]; +cz q[88],q[89]; +sx q[89]; +rz(pi) q[89]; +cz q[89],q[90]; +sx q[90]; +rz(pi) q[90]; +cz q[90],q[91]; +sx q[91]; +rz(-pi) q[91]; +cz q[91],q[98]; +sx q[91]; +rz(-pi/2) q[98]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +rz(-pi/2) q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(pi/2) q[91]; +sx q[98]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(0.005130189532220886) q[98]; +sx q[98]; +rz(pi/2) q[107]; +sx q[107]; +rz(-3*pi/2) q[107]; +rz(-pi) q[108]; +x q[108]; +sx q[109]; +sx q[111]; +rz(3.1364624640575727) q[111]; +sx q[111]; +cz q[98],q[111]; +x q[98]; +rz(pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +cz q[90],q[91]; +sx q[90]; +rz(-pi/2) q[90]; +cz q[89],q[90]; +sx q[89]; +rz(pi) q[89]; +cz q[88],q[89]; +sx q[88]; +cz q[87],q[88]; +sx q[87]; +sx q[88]; +cz q[87],q[88]; +sx q[87]; +sx q[88]; +cz q[87],q[88]; +rz(pi/2) q[87]; +sx q[87]; +rz(pi/2) q[87]; +rz(-pi) q[88]; +x q[88]; +rz(pi/2) q[91]; +sx q[91]; +rz(-pi/2) q[91]; +cz q[97],q[87]; +sx q[97]; +rz(pi/2) q[97]; +cz q[97],q[107]; +sx q[97]; +cz q[98],q[91]; +sx q[91]; +rz(-pi) q[98]; +x q[98]; +sx q[107]; +cz q[97],q[107]; +rz(-pi) q[97]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +rz(pi) q[97]; +rz(-pi) q[107]; +sx q[107]; +cz q[107],q[108]; +sx q[107]; +rz(-pi/2) q[108]; +sx q[108]; +cz q[107],q[108]; +rz(-pi) q[107]; +sx q[107]; +rz(-pi) q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +rz(pi) q[107]; +rz(pi/2) q[108]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +rz(pi/2) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +rz(-pi/2) q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +rz(pi/2) q[110]; +sx q[110]; +rz(pi/2) q[110]; +sx q[111]; +cz q[111],q[112]; +sx q[111]; +sx q[112]; +cz q[111],q[112]; +sx q[111]; +sx q[112]; +cz q[111],q[112]; +rz(pi/2) q[112]; +sx q[112]; +rz(pi) q[112]; +cz q[118],q[109]; +sx q[109]; +rz(pi/2) q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +rz(pi/2) q[109]; +sx q[109]; +rz(pi/2) q[109]; +sx q[118]; +cz q[129],q[118]; +sx q[118]; +rz(-pi) q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +rz(-pi) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +rz(pi/2) q[109]; +rz(-pi/2) q[118]; +sx q[118]; +rz(-pi) q[118]; +sx q[129]; +rz(-0.5247071718527465) q[129]; +sx q[129]; +cz q[128],q[129]; +rz(-pi) q[128]; +sx q[128]; +rz(pi) q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +rz(-2.5889009099742575) q[128]; +sx q[128]; +sx q[129]; +rz(-2.095503498647643) q[129]; +sx q[129]; +rz(-pi) q[129]; +cz q[118],q[129]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +rz(pi/2) q[108]; +sx q[108]; +rz(-pi/2) q[108]; +cz q[107],q[108]; +sx q[107]; +rz(-pi/2) q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +rz(pi/2) q[107]; +sx q[108]; +rz(pi/2) q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +rz(pi/2) q[106]; +sx q[106]; +rz(-2.310509041077781) q[106]; +sx q[106]; +cz q[105],q[106]; +rz(-pi) q[105]; +sx q[105]; +rz(pi) q[105]; +sx q[106]; +rz(pi) q[106]; +cz q[105],q[106]; +sx q[105]; +rz(-0.7397127142828843) q[105]; +sx q[105]; +rz(-pi/2) q[105]; +sx q[106]; +rz(0.335637305911046) q[106]; +sx q[106]; +rz(pi/2) q[107]; +sx q[107]; +rz(-3*pi/2) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(pi/2) q[97]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +rz(pi/2) q[108]; +sx q[108]; +cz q[109],q[110]; +rz(pi/2) q[109]; +sx q[109]; +rz(pi/2) q[109]; +sx q[110]; +cz q[117],q[105]; +sx q[105]; +sx q[117]; +cz q[117],q[105]; +sx q[105]; +sx q[117]; +cz q[117],q[105]; +sx q[105]; +rz(pi/2) q[117]; +sx q[117]; +rz(pi/2) q[117]; +cz q[117],q[125]; +sx q[117]; +rz(pi/2) q[118]; +sx q[118]; +rz(-pi/2) q[125]; +sx q[125]; +cz q[117],q[125]; +rz(-pi) q[117]; +sx q[117]; +rz(-pi/2) q[117]; +sx q[125]; +cz q[117],q[125]; +sx q[117]; +rz(pi/2) q[117]; +rz(-pi/2) q[125]; +sx q[125]; +rz(-pi) q[125]; +sx q[129]; +rz(2.648195242263178) q[129]; +sx q[129]; +cz q[128],q[129]; +rz(-pi) q[128]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +rz(-2.648195242263178) q[128]; +sx q[128]; +rz(-3*pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.137412196762528) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(1.5749767836221613) q[127]; +sx q[127]; +x q[128]; +cz q[127],q[128]; +sx q[127]; +rz(-pi/2) q[128]; +sx q[128]; +cz q[127],q[128]; +rz(-pi) q[127]; +sx q[127]; +rz(-pi/2) q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(pi/2) q[127]; +rz(-pi/2) q[128]; +sx q[128]; +rz(-pi) q[128]; +sx q[129]; +rz(-2.064193738121512) q[129]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +rz(-0.004180456827265644) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +cz q[127],q[126]; +sx q[127]; +rz(3.1457731104170583) q[127]; +sx q[127]; +rz(3*pi) q[127]; +rz(pi/2) q[128]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.137412196762528) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(1.5749767836221613) q[127]; +sx q[127]; +sx q[128]; +rz(-3*pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +rz(-pi) q[127]; +sx q[127]; +rz(-pi/2) q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(pi/2) q[127]; +rz(-pi/2) q[128]; +sx q[128]; +rz(-pi) q[128]; +cz q[128],q[129]; +sx q[128]; +rz(-0.004180456827265644) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +cz q[127],q[126]; +sx q[126]; +rz(pi) q[126]; +sx q[127]; +rz(3.1457731104170583) q[127]; +sx q[127]; +rz(5*pi/2) q[127]; +rz(pi/2) q[128]; +sx q[128]; +rz(-pi/2) q[128]; +cz q[127],q[128]; +cz q[127],q[126]; +sx q[127]; +sx q[128]; +rz(-pi) q[128]; +sx q[129]; +rz(pi/2) q[129]; +cz q[128],q[129]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +cz q[127],q[126]; +sx q[126]; +cz q[128],q[129]; +rz(pi/2) q[128]; +sx q[128]; +rz(pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.137412196762528) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(3.1457731104170583) q[127]; +sx q[127]; +rz(3*pi) q[127]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +rz(pi/2) q[128]; +sx q[128]; +rz(-pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.137412196762528) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(3.1457731104170583) q[127]; +sx q[127]; +rz(3*pi) q[127]; +sx q[128]; +rz(pi/2) q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +rz(pi/2) q[128]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(3.137412196762528) q[127]; +sx q[127]; +rz(3*pi) q[127]; +cz q[127],q[126]; +sx q[127]; +rz(1.5749767836221613) q[127]; +sx q[127]; +sx q[128]; +rz(-3*pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +rz(-pi) q[127]; +sx q[127]; +rz(-pi/2) q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(pi/2) q[127]; +rz(-pi/2) q[128]; +sx q[128]; +rz(-pi) q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(pi) q[129]; +cz q[128],q[129]; +sx q[128]; +rz(-0.004180456827265644) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +cz q[127],q[126]; +sx q[126]; +rz(-3.065111128172216) q[126]; +sx q[126]; +sx q[127]; +rz(3.1457731104170583) q[127]; +sx q[127]; +rz(10.701165781624242) q[127]; +rz(pi/2) q[128]; +sx q[128]; +rz(-pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +cz q[126],q[127]; +rz(-pi) q[126]; +sx q[126]; +sx q[127]; +cz q[126],q[127]; +sx q[126]; +rz(-1.276387820854863) q[126]; +sx q[126]; +rz(-pi/2) q[126]; +cz q[125],q[126]; +sx q[126]; +rz(pi/2) q[126]; +sx q[127]; +rz(-1.4943148013773202) q[127]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +cz q[128],q[127]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +rz(pi/2) q[127]; +sx q[127]; +rz(pi/2) q[127]; +x q[128]; +cz q[127],q[128]; +sx q[127]; +rz(-pi/2) q[128]; +sx q[128]; +cz q[127],q[128]; +rz(-pi) q[127]; +sx q[127]; +rz(-pi/2) q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(pi/2) q[127]; +rz(-pi/2) q[128]; +sx q[128]; +rz(-pi) q[128]; +cz q[128],q[129]; +sx q[129]; +rz(pi) q[129]; +cz q[129],q[118]; +sx q[118]; +rz(-pi) q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +rz(-pi) q[109]; +sx q[109]; +rz(-pi) q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +rz(pi) q[109]; +cz q[109],q[108]; +sx q[108]; +rz(-pi) q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(-pi) q[107]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +rz(-pi) q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(-pi) q[97]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +rz(pi/2) q[97]; +cz q[97],q[87]; +cz q[87],q[88]; +sx q[87]; +rz(-pi/2) q[88]; +sx q[88]; +cz q[87],q[88]; +rz(-pi) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +sx q[88]; +cz q[87],q[88]; +sx q[87]; +rz(pi/2) q[87]; +rz(-pi/2) q[88]; +sx q[88]; +rz(-pi) q[88]; +cz q[88],q[89]; +sx q[89]; +rz(pi/2) q[89]; +cz q[89],q[90]; +sx q[89]; +sx q[90]; +rz(pi/2) q[90]; +cz q[91],q[90]; +sx q[90]; +sx q[91]; +cz q[91],q[90]; +sx q[90]; +sx q[91]; +cz q[91],q[90]; +sx q[90]; +cz q[90],q[89]; +sx q[89]; +sx q[90]; +cz q[90],q[89]; +sx q[89]; +sx q[90]; +cz q[90],q[89]; +sx q[89]; +rz(pi/2) q[90]; +sx q[90]; +rz(pi/2) q[90]; +rz(pi/2) q[91]; +sx q[91]; +rz(pi/2) q[91]; +cz q[91],q[98]; +sx q[91]; +rz(-pi/2) q[98]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(-pi) q[91]; +cz q[90],q[91]; +sx q[90]; +sx q[91]; +cz q[90],q[91]; +rz(-pi) q[90]; +sx q[90]; +rz(-3*pi/2) q[90]; +sx q[91]; +cz q[90],q[91]; +rz(-pi/2) q[91]; +sx q[91]; +rz(-pi/2) q[98]; +sx q[98]; +cz q[98],q[111]; +rz(pi/2) q[107]; +rz(pi/2) q[108]; +sx q[109]; +rz(pi/2) q[109]; +rz(pi/2) q[118]; +sx q[118]; +rz(-3*pi/2) q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +rz(-pi) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +rz(pi/2) q[109]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(pi/2) q[110]; +cz q[111],q[110]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(-pi/2) q[110]; +sx q[111]; +rz(3.1382320090212956) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[112]; +sx q[111]; +rz(3.1449532981582906) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[110]; +sx q[110]; +rz(pi/2) q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[110]; +sx q[110]; +sx q[111]; +rz(3.1382320090212956) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[112]; +sx q[111]; +rz(3.1449532981582906) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(pi/2) q[110]; +sx q[111]; +rz(3.1382320090212956) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[112]; +sx q[111]; +rz(3.1449532981582906) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[110]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +rz(pi/2) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(-pi/2) q[110]; +sx q[111]; +rz(3.1382320090212956) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[112]; +sx q[111]; +rz(3.1449532981582906) q[111]; +sx q[111]; +rz(5*pi/2) q[111]; +cz q[111],q[110]; +sx q[110]; +rz(-pi/2) q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[109]; +sx q[110]; +rz(-pi/2) q[110]; +sx q[112]; +cz q[111],q[112]; +cz q[98],q[111]; +rz(-pi/2) q[98]; +cz q[111],q[110]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +rz(pi/2) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +rz(pi/2) q[110]; +sx q[110]; +rz(pi/2) q[110]; +rz(pi/2) q[111]; +sx q[111]; +rz(-pi/2) q[111]; +sx q[112]; +rz(pi) q[112]; +cz q[112],q[111]; +x q[111]; +cz q[110],q[111]; +sx q[110]; +rz(-pi/2) q[111]; +sx q[111]; +cz q[110],q[111]; +rz(-pi) q[110]; +sx q[110]; +rz(-pi/2) q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +rz(pi/2) q[110]; +rz(-pi/2) q[111]; +sx q[111]; +rz(-pi) q[111]; +cz q[98],q[111]; +sx q[112]; +rz(pi) q[112]; +cz q[111],q[112]; +sx q[111]; +rz(-0.07432811350271962) q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +cz q[110],q[109]; +sx q[110]; +rz(3.215920767092513) q[110]; +sx q[110]; +rz(3*pi) q[110]; +rz(pi/2) q[111]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +rz(3.067264540087073) q[110]; +sx q[110]; +rz(3*pi) q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[109]; +sx q[110]; +rz(1.6451244402976162) q[110]; +sx q[110]; +sx q[111]; +rz(-pi) q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +rz(-pi) q[110]; +sx q[110]; +rz(-pi/2) q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +rz(pi/2) q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(-pi/2) q[110]; +rz(-pi/2) q[111]; +sx q[111]; +rz(-pi) q[111]; +sx q[112]; +rz(pi/2) q[112]; +cz q[111],q[112]; +sx q[111]; +rz(3.067264540087073) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[110]; +sx q[110]; +rz(pi/2) q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(pi/2) q[110]; +sx q[111]; +rz(3.215920767092513) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[110]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(pi) q[110]; +sx q[111]; +rz(3.067264540087073) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[110]; +sx q[110]; +rz(-3*pi/2) q[110]; +sx q[111]; +rz(3.215920767092513) q[111]; +sx q[111]; +rz(5*pi/2) q[111]; +sx q[112]; +cz q[111],q[112]; +cz q[111],q[110]; +cz q[98],q[111]; +sx q[98]; +rz(pi) q[98]; +cz q[91],q[98]; +x q[91]; +cz q[90],q[91]; +sx q[90]; +rz(-pi/2) q[91]; +sx q[91]; +cz q[90],q[91]; +rz(-pi) q[90]; +sx q[90]; +rz(-pi/2) q[90]; +sx q[91]; +cz q[90],q[91]; +sx q[90]; +rz(pi/2) q[90]; +cz q[89],q[90]; +sx q[89]; +sx q[90]; +cz q[89],q[90]; +sx q[89]; +sx q[90]; +cz q[89],q[90]; +rz(pi/2) q[89]; +sx q[89]; +cz q[88],q[89]; +sx q[88]; +cz q[87],q[88]; +sx q[87]; +sx q[88]; +cz q[87],q[88]; +sx q[87]; +sx q[88]; +cz q[87],q[88]; +rz(pi/2) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +rz(pi/2) q[88]; +sx q[88]; +rz(pi/2) q[88]; +sx q[89]; +rz(-pi) q[89]; +rz(pi/2) q[90]; +sx q[90]; +rz(pi) q[90]; +rz(-pi/2) q[91]; +sx q[91]; +rz(-pi) q[91]; +cz q[97],q[87]; +sx q[87]; +rz(pi/2) q[87]; +cz q[87],q[86]; +sx q[86]; +sx q[87]; +cz q[87],q[86]; +sx q[86]; +sx q[87]; +cz q[87],q[86]; +sx q[86]; +rz(pi/2) q[87]; +sx q[87]; +rz(pi) q[87]; +sx q[97]; +sx q[98]; +rz(-2.3759640385345895) q[98]; +sx q[98]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +rz(pi/2) q[97]; +sx q[97]; +rz(pi/2) q[97]; +sx q[107]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +sx q[110]; +rz(pi/2) q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +rz(pi/2) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(-0.8266436400901966) q[110]; +sx q[110]; +sx q[111]; +cz q[112],q[111]; +sx q[111]; +sx q[112]; +cz q[112],q[111]; +sx q[111]; +sx q[112]; +cz q[112],q[111]; +rz(-2.3149490134995965) q[111]; +sx q[111]; +rz(-pi) q[111]; +cz q[110],q[111]; +rz(-pi) q[110]; +sx q[110]; +rz(pi) q[110]; +sx q[111]; +rz(pi) q[111]; +cz q[110],q[111]; +sx q[110]; +rz(-0.8266436400901949) q[110]; +sx q[110]; +sx q[111]; +rz(0.6483763336352162) q[111]; +sx q[111]; +cz q[98],q[111]; +rz(-pi) q[98]; +sx q[98]; +sx q[111]; +rz(pi) q[111]; +cz q[98],q[111]; +sx q[98]; +rz(1.7490636332498752) q[98]; +sx q[98]; +sx q[111]; +rz(-0.7656286150552045) q[111]; +sx q[111]; +rz(pi/2) q[111]; +cz q[112],q[113]; +cz q[112],q[111]; +sx q[111]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +sx q[98]; +rz(pi/2) q[111]; +sx q[111]; +rz(-pi/2) q[111]; +sx q[112]; +rz(3.1400230496197783) q[112]; +sx q[112]; +rz(3*pi) q[112]; +sx q[113]; +rz(pi) q[113]; +cz q[112],q[113]; +sx q[112]; +rz(3.143162257559808) q[112]; +sx q[112]; +rz(3*pi) q[112]; +cz q[112],q[111]; +sx q[111]; +rz(pi/2) q[111]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +sx q[98]; +rz(pi/2) q[111]; +sx q[111]; +sx q[112]; +rz(3.1400230496197783) q[112]; +sx q[112]; +rz(3*pi) q[112]; +cz q[112],q[113]; +sx q[112]; +rz(3.143162257559808) q[112]; +sx q[112]; +rz(3*pi) q[112]; +cz q[112],q[111]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +rz(pi/2) q[111]; +sx q[111]; +rz(pi) q[111]; +sx q[112]; +rz(3.1400230496197783) q[112]; +sx q[112]; +rz(3*pi) q[112]; +cz q[112],q[113]; +sx q[112]; +rz(3.143162257559808) q[112]; +sx q[112]; +rz(3*pi) q[112]; +cz q[112],q[111]; +sx q[111]; +rz(pi/2) q[111]; +sx q[112]; +rz(3.1400230496197783) q[112]; +sx q[112]; +rz(3*pi) q[112]; +cz q[112],q[113]; +sx q[112]; +rz(0.0015696039700148212) q[112]; +sx q[112]; +rz(-3*pi/2) q[112]; +cz q[111],q[112]; +sx q[111]; +sx q[112]; +cz q[111],q[112]; +rz(-pi) q[111]; +sx q[111]; +rz(-pi) q[111]; +sx q[112]; +cz q[111],q[112]; +sx q[111]; +cz q[111],q[98]; +sx q[98]; +rz(-pi/2) q[98]; +sx q[111]; +rz(pi/2) q[112]; +cz q[112],q[111]; +sx q[111]; +sx q[112]; +cz q[112],q[111]; +sx q[111]; +sx q[112]; +cz q[112],q[111]; +rz(pi/2) q[111]; +sx q[111]; +rz(-pi/2) q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +rz(pi/2) q[111]; +sx q[113]; +cz q[112],q[113]; +sx q[112]; +cz q[112],q[111]; +sx q[111]; +sx q[112]; +cz q[112],q[111]; +sx q[111]; +sx q[112]; +cz q[112],q[111]; +cz q[111],q[98]; +sx q[98]; +rz(pi) q[98]; +rz(pi/2) q[112]; +sx q[112]; +rz(-2.4898979842738616) q[112]; +sx q[112]; +sx q[113]; +rz(2.7807502672355078) q[113]; +sx q[113]; +cz q[112],q[113]; +rz(-pi) q[112]; +sx q[112]; +sx q[113]; +rz(pi) q[113]; +cz q[112],q[113]; +sx q[112]; +rz(-2.780750267235507) q[112]; +sx q[112]; +rz(pi/2) q[112]; +cz q[111],q[112]; +sx q[111]; +rz(3.2710095704626982) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[98]; +sx q[111]; +rz(3.012175736716888) q[111]; +sx q[111]; +rz(3*pi) q[111]; +sx q[112]; +sx q[113]; +rz(-2.222490996110828) q[113]; +sx q[113]; +cz q[112],q[113]; +sx q[112]; +sx q[113]; +cz q[112],q[113]; +sx q[112]; +sx q[113]; +cz q[112],q[113]; +rz(pi/2) q[112]; +sx q[112]; +rz(-pi/2) q[112]; +cz q[111],q[112]; +sx q[111]; +rz(3.2710095704626982) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[98]; +sx q[111]; +rz(3.012175736716888) q[111]; +sx q[111]; +rz(3*pi) q[111]; +sx q[112]; +rz(pi/2) q[112]; +sx q[113]; +cz q[112],q[113]; +sx q[112]; +sx q[113]; +cz q[112],q[113]; +sx q[112]; +sx q[113]; +cz q[112],q[113]; +rz(pi/2) q[112]; +sx q[112]; +cz q[111],q[112]; +sx q[111]; +rz(3.2710095704626982) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[98]; +sx q[111]; +rz(3.012175736716888) q[111]; +sx q[111]; +rz(3*pi) q[111]; +sx q[113]; +cz q[112],q[113]; +sx q[112]; +sx q[113]; +cz q[112],q[113]; +sx q[112]; +sx q[113]; +cz q[112],q[113]; +rz(pi/2) q[112]; +sx q[112]; +rz(-pi/2) q[112]; +cz q[111],q[112]; +sx q[111]; +rz(3.2710095704626982) q[111]; +sx q[111]; +rz(3*pi) q[111]; +cz q[111],q[98]; +sx q[98]; +rz(-3*pi/2) q[98]; +sx q[111]; +rz(3.012175736716888) q[111]; +sx q[111]; +rz(3*pi) q[111]; +sx q[112]; +rz(-pi) q[112]; +sx q[113]; +cz q[112],q[113]; +sx q[112]; +sx q[113]; +cz q[112],q[113]; +sx q[112]; +sx q[113]; +cz q[112],q[113]; +rz(pi/2) q[112]; +sx q[112]; +rz(-pi/2) q[112]; +cz q[111],q[112]; +cz q[111],q[98]; +sx q[98]; +rz(pi/2) q[98]; +sx q[111]; +rz(-pi/2) q[111]; +sx q[112]; +rz(pi/2) q[113]; +sx q[113]; +rz(pi/2) q[113]; +cz q[112],q[113]; +cz q[112],q[111]; +sx q[111]; +x q[112]; +rz(-pi/2) q[118]; +sx q[118]; +rz(-pi/2) q[118]; +cz q[118],q[109]; +sx q[118]; +rz(pi) q[118]; +cz q[129],q[118]; +sx q[118]; +rz(pi) q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +rz(pi/2) q[118]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +rz(pi/2) q[126]; +sx q[126]; +rz(pi) q[126]; +cz q[125],q[126]; +sx q[125]; +cz q[117],q[125]; +sx q[117]; +sx q[125]; +cz q[117],q[125]; +sx q[117]; +sx q[125]; +cz q[117],q[125]; +sx q[117]; +cz q[105],q[117]; +sx q[105]; +sx q[117]; +cz q[105],q[117]; +sx q[105]; +sx q[117]; +cz q[105],q[117]; +rz(pi/2) q[105]; +sx q[105]; +rz(-0.5880026035475829) q[105]; +sx q[105]; +cz q[105],q[106]; +rz(-pi) q[105]; +sx q[105]; +rz(pi) q[105]; +sx q[106]; +cz q[105],q[106]; +sx q[105]; +rz(-0.5880026035475829) q[105]; +sx q[105]; +rz(-pi/2) q[105]; +sx q[106]; +rz(-2.1587989303424795) q[106]; +sx q[106]; +rz(-pi/2) q[106]; +sx q[117]; +cz q[117],q[105]; +sx q[105]; +sx q[117]; +cz q[117],q[105]; +sx q[105]; +sx q[117]; +cz q[117],q[105]; +sx q[105]; +rz(pi/2) q[117]; +sx q[117]; +rz(pi) q[117]; +rz(pi/2) q[125]; +sx q[125]; +rz(pi/2) q[125]; +sx q[126]; +rz(-pi/2) q[126]; +sx q[127]; +rz(pi/2) q[128]; +sx q[128]; +rz(pi/2) q[128]; +sx q[129]; +rz(-pi) q[129]; +cz q[128],q[129]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +rz(-pi) q[128]; +sx q[128]; +rz(-pi/2) q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +rz(pi/2) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +rz(pi/2) q[127]; +sx q[127]; +rz(-pi/2) q[127]; +cz q[126],q[127]; +x q[126]; +cz q[125],q[126]; +sx q[125]; +rz(-pi/2) q[126]; +sx q[126]; +cz q[125],q[126]; +rz(-pi) q[125]; +sx q[125]; +sx q[126]; +cz q[125],q[126]; +sx q[125]; +rz(-pi) q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +rz(-pi) q[124]; +sx q[124]; +rz(-pi/2) q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +rz(pi/2) q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi/2) q[123]; +sx q[124]; +rz(pi/2) q[125]; +sx q[125]; +rz(pi/2) q[126]; +sx q[127]; +cz q[126],q[127]; +sx q[126]; +sx q[127]; +cz q[126],q[127]; +sx q[126]; +sx q[127]; +cz q[126],q[127]; +sx q[126]; +cz q[125],q[126]; +sx q[125]; +sx q[126]; +cz q[125],q[126]; +sx q[125]; +sx q[126]; +cz q[125],q[126]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +sx q[126]; +cz q[126],q[125]; +sx q[125]; +sx q[126]; +cz q[126],q[125]; +sx q[125]; +sx q[126]; +cz q[126],q[125]; +rz(pi/2) q[125]; +sx q[125]; +rz(pi) q[125]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +rz(-pi) q[126]; +x q[126]; +rz(pi/2) q[127]; +sx q[127]; +rz(pi) q[127]; +rz(pi/2) q[128]; +sx q[128]; +rz(pi) q[128]; +rz(-pi/2) q[129]; +sx q[129]; +rz(-pi) q[129]; +cz q[129],q[118]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +rz(pi/2) q[118]; +sx q[118]; +rz(-pi/2) q[118]; +sx q[129]; +rz(3.1395502640065955) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[128]; +sx q[129]; +rz(3.1436350431729907) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[118]; +sx q[118]; +rz(pi/2) q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +rz(pi/2) q[109]; +sx q[109]; +rz(pi) q[109]; +rz(pi/2) q[118]; +sx q[118]; +rz(pi/2) q[118]; +sx q[129]; +rz(3.1395502640065955) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[128]; +sx q[129]; +rz(3.1436350431729907) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +rz(3.1395502640065955) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[128]; +sx q[129]; +rz(0.002042389583197579) q[129]; +sx q[129]; +rz(-3*pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +rz(-pi) q[118]; +sx q[118]; +rz(-pi) q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +rz(pi/2) q[118]; +cz q[118],q[109]; +sx q[109]; +rz(pi/2) q[109]; +sx q[118]; +rz(-0.002042389583197135) q[118]; +rz(pi/2) q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +rz(pi/2) q[118]; +sx q[118]; +rz(-pi/2) q[118]; +cz q[129],q[128]; +sx q[128]; +rz(pi) q[128]; +sx q[129]; +rz(3.1436350431729907) q[129]; +sx q[129]; +rz(5*pi/2) q[129]; +cz q[129],q[118]; +sx q[118]; +rz(-pi) q[118]; +cz q[118],q[109]; +sx q[118]; +cz q[129],q[128]; +sx q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +cz q[118],q[109]; +sx q[109]; +rz(pi/2) q[118]; +sx q[118]; +rz(pi/2) q[118]; +cz q[129],q[128]; +sx q[128]; +rz(-pi/2) q[128]; +cz q[129],q[118]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +rz(pi/2) q[118]; +sx q[118]; +rz(-pi/2) q[118]; +sx q[129]; +rz(3.1395502640065955) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[128]; +sx q[129]; +rz(3.1436350431729907) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[118]; +sx q[118]; +rz(pi/2) q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +rz(pi/2) q[109]; +sx q[109]; +rz(pi) q[109]; +rz(pi/2) q[118]; +sx q[118]; +rz(pi/2) q[118]; +sx q[129]; +rz(3.1395502640065955) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[128]; +sx q[129]; +rz(3.1436350431729907) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +rz(3.1395502640065955) q[129]; +sx q[129]; +rz(3*pi) q[129]; +cz q[129],q[128]; +sx q[128]; +rz(pi/2) q[128]; +sx q[129]; +rz(0.002042389583197579) q[129]; +sx q[129]; +rz(-3*pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +rz(-pi) q[118]; +sx q[118]; +rz(-pi) q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +rz(pi/2) q[118]; +cz q[118],q[109]; +sx q[109]; +rz(-1.4728303074793825) q[109]; +sx q[118]; +rz(3.1395502640065955) q[118]; +sx q[118]; +rz(7.483338780471105) q[118]; +rz(pi/2) q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(-pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +rz(-1.571536111233244) q[118]; +sx q[118]; +rz(-1.5727000271010008) q[118]; +sx q[129]; +rz(-pi) q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +rz(pi/2) q[128]; +sx q[128]; +rz(pi) q[128]; +rz(-pi/2) q[129]; +sx q[129]; +rz(-0.3706435576675524) q[129]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +rz(pi) q[129]; +cz q[118],q[129]; +sx q[118]; +rz(-1.2001527691273441) q[118]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +sx q[129]; +rz(-1.2001527691273437) q[129]; +cz q[129],q[128]; +sx q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +rz(0.15478854528378072) q[118]; +sx q[118]; +cz q[109],q[118]; +rz(-pi) q[109]; +sx q[109]; +sx q[118]; +rz(pi) q[118]; +cz q[109],q[118]; +sx q[109]; +rz(2.9868041083060115) q[109]; +sx q[109]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.137750663362948) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.145434643816638) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[98]; +sx q[111]; +sx q[118]; +rz(3.043626634274278) q[118]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +rz(pi/2) q[110]; +sx q[110]; +rz(pi/2) q[110]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.137750663362948) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.145434643816638) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[98]; +rz(pi/2) q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.137750663362948) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(1.5746383170217415) q[91]; +sx q[91]; +sx q[98]; +rz(-3*pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +rz(-pi/2) q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(pi/2) q[91]; +rz(-pi/2) q[98]; +sx q[98]; +rz(-pi) q[98]; +rz(pi/2) q[111]; +sx q[111]; +rz(pi) q[111]; +cz q[98],q[111]; +sx q[98]; +rz(-0.0038419902268458372) q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +cz q[91],q[90]; +sx q[90]; +rz(pi) q[90]; +sx q[91]; +rz(3.145434643816638) q[91]; +sx q[91]; +rz(5*pi/2) q[91]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[91],q[98]; +cz q[91],q[90]; +sx q[91]; +sx q[98]; +rz(-pi) q[98]; +sx q[111]; +rz(pi/2) q[111]; +cz q[98],q[111]; +sx q[98]; +cz q[98],q[91]; +sx q[91]; +sx q[98]; +cz q[98],q[91]; +sx q[91]; +sx q[98]; +cz q[98],q[91]; +cz q[91],q[90]; +sx q[90]; +rz(pi) q[90]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.137750663362948) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.145434643816638) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.137750663362948) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.145434643816638) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[98]; +rz(pi/2) q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.137750663362948) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[91]; +rz(3.145434643816638) q[91]; +sx q[91]; +rz(3*pi) q[91]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(3.137750663362948) q[91]; +sx q[91]; +rz(3*pi) q[91]; +cz q[91],q[90]; +sx q[90]; +rz(-3*pi/2) q[90]; +sx q[91]; +rz(3.145434643816638) q[91]; +sx q[91]; +rz(5*pi/2) q[91]; +sx q[98]; +rz(-pi) q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[91],q[98]; +cz q[91],q[90]; +sx q[90]; +rz(pi/2) q[90]; +x q[91]; +sx q[98]; +rz(-pi) q[98]; +rz(pi/2) q[111]; +sx q[111]; +rz(-pi/2) q[111]; +cz q[98],q[111]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +cz q[90],q[91]; +sx q[90]; +sx q[91]; +cz q[90],q[91]; +sx q[90]; +sx q[91]; +cz q[90],q[91]; +rz(pi/2) q[90]; +sx q[90]; +rz(pi) q[90]; +rz(pi/2) q[91]; +sx q[91]; +rz(-pi/2) q[91]; +sx q[98]; +sx q[111]; +rz(pi/2) q[111]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +cz q[105],q[106]; +sx q[105]; +sx q[106]; +cz q[105],q[106]; +sx q[105]; +sx q[106]; +cz q[105],q[106]; +rz(pi/2) q[105]; +sx q[105]; +rz(pi) q[105]; +rz(pi/2) q[106]; +sx q[106]; +rz(-pi/2) q[106]; +sx q[107]; +sx q[108]; +sx q[109]; +sx q[118]; +rz(pi/2) q[129]; +sx q[129]; +rz(pi) q[129]; +rz(pi/2) q[130]; +sx q[130]; +rz(pi) q[130]; +rz(pi/2) q[131]; +sx q[131]; +rz(pi) q[131]; +sx q[132]; +sx q[133]; +rz(-3*pi/2) q[133]; +cz q[119],q[133]; +sx q[119]; +sx q[133]; +cz q[119],q[133]; +rz(-pi) q[119]; +sx q[119]; +rz(-pi) q[119]; +sx q[133]; +cz q[119],q[133]; +rz(pi/2) q[133]; +cz q[132],q[133]; +sx q[132]; +sx q[133]; +cz q[132],q[133]; +sx q[132]; +sx q[133]; +cz q[132],q[133]; +cz q[132],q[131]; +sx q[131]; +rz(pi) q[131]; +cz q[131],q[130]; +sx q[130]; +rz(pi) q[130]; +cz q[130],q[129]; +sx q[129]; +rz(pi) q[129]; +cz q[129],q[128]; +sx q[128]; +rz(pi) q[128]; +cz q[128],q[127]; +sx q[127]; +rz(pi) q[127]; +rz(-pi) q[133]; +x q[133]; +rz(pi/2) q[137]; +sx q[137]; +cz q[127],q[137]; +sx q[137]; +rz(pi) q[137]; +rz(-1.4707364723223781) q[142]; +sx q[142]; +rz(pi/2) q[143]; +sx q[143]; +cz q[136],q[143]; +cz q[136],q[123]; +sx q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(pi/2) q[123]; +sx q[123]; +rz(-pi/2) q[123]; +sx q[124]; +sx q[136]; +rz(3.1380381576330154) q[136]; +sx q[136]; +rz(3*pi) q[136]; +sx q[143]; +rz(pi) q[143]; +cz q[136],q[143]; +sx q[136]; +rz(3.145147149546571) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[123]; +sx q[123]; +rz(pi/2) q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi/2) q[123]; +rz(pi/2) q[124]; +sx q[124]; +rz(pi) q[124]; +sx q[136]; +rz(3.1380381576330154) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[143]; +sx q[136]; +rz(3.145147149546571) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +rz(3.1380381576330154) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[143]; +sx q[136]; +rz(0.0035544959567772594) q[136]; +sx q[136]; +rz(-3*pi/2) q[136]; +cz q[123],q[136]; +sx q[123]; +sx q[136]; +cz q[123],q[136]; +rz(-pi) q[123]; +sx q[123]; +rz(-pi) q[123]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +rz(pi/2) q[123]; +cz q[123],q[124]; +sx q[123]; +rz(-0.0035544959567772594) q[123]; +sx q[124]; +rz(pi/2) q[124]; +rz(pi/2) q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +rz(pi/2) q[123]; +sx q[123]; +rz(-pi/2) q[123]; +cz q[136],q[143]; +sx q[136]; +rz(3.145147149546571) q[136]; +sx q[136]; +rz(5*pi/2) q[136]; +cz q[136],q[123]; +sx q[123]; +rz(-pi) q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[143]; +rz(pi) q[143]; +cz q[136],q[143]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +cz q[123],q[124]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi/2) q[123]; +sx q[124]; +cz q[136],q[143]; +cz q[136],q[123]; +sx q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(pi/2) q[123]; +sx q[123]; +rz(-pi/2) q[123]; +sx q[124]; +sx q[136]; +rz(3.1380381576330154) q[136]; +sx q[136]; +rz(3*pi) q[136]; +sx q[143]; +rz(pi) q[143]; +cz q[136],q[143]; +sx q[136]; +rz(3.145147149546571) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[123]; +sx q[123]; +rz(pi/2) q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(pi/2) q[123]; +sx q[123]; +sx q[124]; +sx q[136]; +rz(3.1380381576330154) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[143]; +sx q[136]; +rz(3.145147149546571) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi/2) q[123]; +sx q[124]; +sx q[136]; +rz(3.1380381576330154) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[143]; +sx q[136]; +rz(3.145147149546571) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[123]; +sx q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(pi/2) q[123]; +sx q[123]; +rz(-pi/2) q[123]; +rz(pi/2) q[124]; +sx q[124]; +rz(-pi/2) q[124]; +sx q[136]; +rz(3.1380381576330154) q[136]; +sx q[136]; +rz(3*pi) q[136]; +cz q[136],q[143]; +sx q[136]; +rz(3.145147149546571) q[136]; +sx q[136]; +rz(3*pi/2) q[136]; +cz q[136],q[123]; +sx q[123]; +rz(-pi/2) q[123]; +cz q[123],q[124]; +sx q[123]; +rz(pi/2) q[123]; +sx q[143]; +rz(4.61232912591217) q[143]; +cz q[136],q[143]; +x q[136]; +cz q[123],q[136]; +sx q[123]; +rz(-pi/2) q[136]; +sx q[136]; +cz q[123],q[136]; +rz(-pi) q[123]; +sx q[123]; +rz(-pi) q[123]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +rz(pi/2) q[123]; +cz q[123],q[124]; +sx q[123]; +x q[124]; +rz(pi/2) q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi/2) q[123]; +cz q[123],q[124]; +sx q[123]; +rz(-pi/2) q[124]; +sx q[124]; +cz q[123],q[124]; +rz(-pi) q[123]; +sx q[123]; +rz(-pi/2) q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +rz(pi/2) q[123]; +rz(pi/2) q[124]; +sx q[124]; +rz(-3*pi/2) q[124]; +rz(pi/2) q[136]; +sx q[136]; +rz(pi/2) q[136]; +sx q[143]; +rz(-pi) q[143]; +cz q[142],q[143]; +rz(-pi) q[142]; +sx q[142]; +rz(pi) q[142]; +sx q[143]; +cz q[142],q[143]; +sx q[142]; +rz(-1.4707364723223781) q[142]; +sx q[142]; +rz(pi) q[142]; +sx q[143]; +rz(-1.4707364723223781) q[143]; +rz(pi/2) q[144]; +sx q[144]; +rz(pi/2) q[145]; +sx q[145]; +rz(pi/2) q[146]; +sx q[146]; +rz(pi/2) q[147]; +sx q[147]; +cz q[137],q[147]; +sx q[147]; +rz(pi) q[147]; +cz q[147],q[146]; +sx q[146]; +rz(pi) q[146]; +cz q[146],q[145]; +sx q[145]; +rz(pi) q[145]; +cz q[145],q[144]; +sx q[144]; +rz(pi) q[144]; +cz q[144],q[143]; +cz q[143],q[136]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +rz(pi/2) q[136]; +sx q[136]; +rz(-pi/2) q[136]; +sx q[143]; +rz(3.1434613512159255) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[142]; +sx q[143]; +rz(3.1397239559636607) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[136]; +sx q[136]; +rz(pi/2) q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +rz(pi/2) q[136]; +sx q[136]; +sx q[143]; +rz(3.1434613512159255) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[142]; +sx q[143]; +rz(3.1397239559636607) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +rz(pi/2) q[136]; +sx q[136]; +rz(pi/2) q[136]; +sx q[143]; +rz(3.1434613512159255) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[142]; +sx q[143]; +rz(3.1397239559636607) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[136]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi/2) q[123]; +rz(pi/2) q[136]; +sx q[136]; +rz(-pi/2) q[136]; +sx q[143]; +rz(3.1434613512159255) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[142]; +sx q[142]; +rz(pi) q[142]; +sx q[143]; +rz(3.1397239559636607) q[143]; +sx q[143]; +rz(5*pi/2) q[143]; +cz q[143],q[136]; +sx q[136]; +rz(-pi) q[136]; +cz q[136],q[123]; +sx q[136]; +cz q[143],q[142]; +cz q[144],q[143]; +sx q[143]; +cz q[143],q[136]; +sx q[136]; +sx q[143]; +cz q[143],q[136]; +sx q[136]; +sx q[143]; +cz q[143],q[136]; +cz q[136],q[123]; +sx q[123]; +rz(pi/2) q[136]; +sx q[136]; +rz(pi/2) q[136]; +cz q[143],q[142]; +sx q[142]; +rz(pi) q[142]; +cz q[144],q[143]; +cz q[143],q[136]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +rz(pi/2) q[136]; +sx q[136]; +rz(-pi/2) q[136]; +sx q[143]; +rz(3.1434613512159255) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[142]; +sx q[143]; +rz(3.1397239559636607) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[136]; +sx q[136]; +rz(pi/2) q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +rz(pi/2) q[136]; +sx q[136]; +sx q[143]; +rz(3.1434613512159255) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[142]; +sx q[143]; +rz(3.1397239559636607) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +rz(pi/2) q[136]; +sx q[136]; +rz(pi/2) q[136]; +sx q[143]; +rz(3.1434613512159255) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[142]; +sx q[143]; +rz(3.1397239559636607) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[136]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +sx q[123]; +sx q[136]; +cz q[136],q[123]; +rz(pi/2) q[123]; +sx q[123]; +rz(-0.8266436400901966) q[123]; +sx q[123]; +rz(pi/2) q[136]; +sx q[136]; +rz(pi/2) q[136]; +sx q[143]; +rz(3.1434613512159255) q[143]; +sx q[143]; +rz(3*pi) q[143]; +cz q[143],q[142]; +sx q[142]; +sx q[143]; +rz(3.1397239559636607) q[143]; +sx q[143]; +rz(8.008770179258264) q[143]; +cz q[143],q[136]; +sx q[136]; +rz(-0.8266436400901966) q[136]; +sx q[136]; +cz q[123],q[136]; +rz(-pi) q[123]; +sx q[123]; +sx q[136]; +rz(pi) q[136]; +cz q[123],q[136]; +sx q[123]; +rz(-0.7441526867047017) q[123]; +sx q[123]; +rz(-pi/2) q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(-pi) q[123]; +sx q[123]; +rz(-pi/2) q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +rz(pi/2) q[123]; +rz(-pi/2) q[124]; +sx q[124]; +rz(-pi) q[124]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +rz(pi/2) q[125]; +cz q[125],q[126]; +sx q[125]; +rz(-pi/2) q[126]; +sx q[126]; +cz q[125],q[126]; +rz(-pi) q[125]; +sx q[125]; +rz(-pi) q[125]; +sx q[126]; +cz q[125],q[126]; +sx q[125]; +rz(pi/2) q[125]; +rz(pi/2) q[126]; +sx q[136]; +rz(2.4954059862006073) q[136]; +sx q[136]; +cz q[143],q[142]; +sx q[142]; +rz(pi/2) q[142]; +cz q[144],q[143]; +sx q[143]; +cz q[136],q[143]; +rz(-pi) q[136]; +sx q[136]; +sx q[143]; +cz q[136],q[143]; +sx q[136]; +rz(2.9868041083060115) q[136]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +cz q[124],q[123]; +sx q[123]; +sx q[124]; +cz q[124],q[123]; +sx q[123]; +sx q[124]; +cz q[124],q[123]; +sx q[123]; +rz(pi/2) q[124]; +sx q[124]; +rz(pi) q[124]; +cz q[125],q[124]; +sx q[124]; +rz(pi/2) q[124]; +sx q[125]; +rz(3.138753765439878) q[125]; +sx q[125]; +rz(3*pi) q[125]; +cz q[125],q[117]; +sx q[125]; +rz(0.00283888814991462) q[125]; +sx q[125]; +rz(-3*pi/2) q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +rz(-pi) q[124]; +sx q[124]; +rz(-pi) q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +rz(pi/2) q[124]; +rz(pi/2) q[125]; +rz(pi/2) q[136]; +sx q[136]; +rz(pi/2) q[136]; +sx q[143]; +rz(-4.614422961069174) q[143]; +cz q[136],q[143]; +sx q[136]; +sx q[143]; +cz q[136],q[143]; +rz(-pi) q[136]; +sx q[136]; +rz(-pi/2) q[136]; +sx q[143]; +cz q[136],q[143]; +sx q[136]; +rz(pi/2) q[136]; +cz q[123],q[136]; +sx q[123]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +sx q[136]; +cz q[123],q[136]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi) q[123]; +cz q[124],q[123]; +sx q[124]; +rz(-0.0028388881499150642) q[124]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +cz q[125],q[124]; +rz(pi/2) q[124]; +sx q[124]; +rz(pi/2) q[124]; +cz q[125],q[117]; +sx q[125]; +rz(3.144431541739708) q[125]; +sx q[125]; +rz(3*pi) q[125]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +rz(3.138753765439878) q[125]; +sx q[125]; +rz(3*pi) q[125]; +cz q[125],q[117]; +sx q[125]; +rz(0.00283888814991462) q[125]; +sx q[125]; +rz(-3*pi/2) q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +rz(-pi) q[124]; +sx q[124]; +rz(-pi) q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +rz(pi/2) q[124]; +cz q[124],q[123]; +sx q[123]; +rz(pi) q[123]; +sx q[124]; +rz(-0.0028388881499150642) q[124]; +rz(pi/2) q[125]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +cz q[125],q[124]; +rz(pi/2) q[124]; +sx q[124]; +rz(-pi/2) q[124]; +cz q[125],q[117]; +sx q[117]; +rz(pi) q[117]; +sx q[125]; +rz(3.144431541739708) q[125]; +sx q[125]; +rz(5*pi/2) q[125]; +cz q[125],q[124]; +sx q[124]; +rz(-pi) q[124]; +cz q[124],q[123]; +sx q[124]; +cz q[125],q[117]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +cz q[124],q[123]; +sx q[123]; +rz(pi) q[123]; +rz(pi/2) q[124]; +sx q[124]; +rz(pi) q[124]; +cz q[125],q[117]; +sx q[117]; +rz(-pi/2) q[117]; +cz q[125],q[124]; +sx q[124]; +rz(pi/2) q[124]; +sx q[125]; +rz(3.138753765439878) q[125]; +sx q[125]; +rz(3*pi) q[125]; +cz q[125],q[117]; +sx q[117]; +rz(pi/2) q[117]; +sx q[125]; +rz(0.00283888814991462) q[125]; +sx q[125]; +rz(-3*pi/2) q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +rz(-pi) q[124]; +sx q[124]; +rz(-pi) q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +rz(pi/2) q[124]; +cz q[124],q[123]; +sx q[124]; +rz(3.138753765439878) q[124]; +sx q[124]; +rz(3*pi) q[124]; +rz(pi/2) q[125]; +cz q[125],q[117]; +sx q[117]; +sx q[125]; +cz q[125],q[117]; +sx q[117]; +sx q[125]; +cz q[125],q[117]; +sx q[117]; +rz(pi/2) q[125]; +sx q[125]; +rz(-pi/2) q[125]; +cz q[124],q[125]; +sx q[124]; +rz(3.144431541739708) q[124]; +sx q[124]; +rz(3*pi) q[124]; +sx q[125]; +rz(pi/2) q[125]; +cz q[125],q[117]; +sx q[117]; +sx q[125]; +cz q[125],q[117]; +sx q[117]; +sx q[125]; +cz q[125],q[117]; +sx q[117]; +rz(pi/2) q[125]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +rz(3.138753765439878) q[124]; +sx q[124]; +rz(3*pi) q[124]; +cz q[125],q[117]; +sx q[117]; +sx q[125]; +cz q[125],q[117]; +sx q[117]; +sx q[125]; +cz q[125],q[117]; +sx q[117]; +rz(pi/2) q[125]; +sx q[125]; +rz(-pi/2) q[125]; +cz q[124],q[125]; +sx q[124]; +rz(3.144431541739708) q[124]; +sx q[124]; +rz(3*pi) q[124]; +cz q[124],q[123]; +sx q[123]; +rz(pi/2) q[123]; +sx q[124]; +rz(3.138753765439878) q[124]; +sx q[124]; +rz(7.483339436790455) q[124]; +cz q[124],q[125]; +sx q[124]; +rz(-1.5718246144979169) q[124]; +sx q[124]; +rz(-1.5734424395656275) q[124]; +sx q[125]; +rz(-pi) q[125]; +cz q[125],q[117]; +sx q[117]; +sx q[125]; +cz q[125],q[117]; +sx q[117]; +sx q[125]; +cz q[125],q[117]; +rz(pi/2) q[117]; +sx q[117]; +rz(pi) q[117]; +rz(-pi/2) q[125]; +sx q[125]; +rz(-0.3706435576675524) q[125]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +rz(pi) q[125]; +cz q[124],q[125]; +sx q[124]; +rz(-1.2001527691273441) q[124]; +sx q[124]; +cz q[124],q[123]; +sx q[124]; +sx q[125]; +rz(-1.2001527691273437) q[125]; +cz q[125],q[117]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +cz q[124],q[123]; +sx q[123]; +rz(pi/2) q[124]; +sx q[124]; +rz(pi/2) q[124]; +cz q[125],q[117]; +sx q[117]; +rz(pi) q[117]; +cz q[117],q[105]; +sx q[105]; +rz(pi) q[105]; +cz q[105],q[106]; +sx q[106]; +rz(pi/2) q[106]; +cz q[107],q[106]; +sx q[106]; +sx q[107]; +cz q[107],q[106]; +sx q[106]; +sx q[107]; +cz q[107],q[106]; +rz(-pi/2) q[106]; +sx q[106]; +rz(1.9942639750444124) q[106]; +sx q[106]; +rz(-pi) q[107]; +x q[107]; +cz q[97],q[107]; +sx q[97]; +rz(-pi/2) q[107]; +sx q[107]; +cz q[97],q[107]; +rz(-pi) q[97]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[97],q[87]; +sx q[87]; +rz(pi) q[87]; +cz q[87],q[88]; +sx q[87]; +rz(pi/2) q[87]; +cz q[88],q[89]; +sx q[88]; +sx q[89]; +cz q[88],q[89]; +rz(-pi) q[88]; +sx q[88]; +sx q[89]; +cz q[88],q[89]; +sx q[88]; +rz(-pi) q[88]; +cz q[87],q[88]; +sx q[87]; +sx q[88]; +cz q[87],q[88]; +rz(-pi) q[87]; +sx q[87]; +rz(-3*pi/2) q[87]; +sx q[88]; +cz q[87],q[88]; +rz(-pi/2) q[88]; +sx q[88]; +rz(-pi/2) q[88]; +rz(-pi/2) q[89]; +sx q[89]; +rz(-pi/2) q[89]; +cz q[89],q[90]; +sx q[90]; +rz(pi/2) q[90]; +cz q[90],q[91]; +sx q[90]; +sx q[91]; +rz(pi/2) q[91]; +x q[97]; +cz q[87],q[97]; +sx q[87]; +rz(-pi/2) q[97]; +sx q[97]; +cz q[87],q[97]; +rz(-pi) q[87]; +sx q[87]; +rz(-pi) q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(pi/2) q[87]; +rz(pi/2) q[97]; +cz q[98],q[91]; +sx q[91]; +sx q[98]; +cz q[98],q[91]; +sx q[91]; +sx q[98]; +cz q[98],q[91]; +sx q[91]; +cz q[91],q[90]; +sx q[90]; +sx q[91]; +cz q[91],q[90]; +sx q[90]; +sx q[91]; +cz q[91],q[90]; +sx q[90]; +rz(pi/2) q[91]; +sx q[91]; +rz(pi/2) q[91]; +sx q[98]; +rz(pi/2) q[107]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +rz(pi/2) q[107]; +sx q[107]; +rz(pi/2) q[108]; +sx q[108]; +rz(pi) q[108]; +rz(pi/2) q[109]; +sx q[109]; +rz(pi) q[109]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +rz(-pi) q[98]; +x q[98]; +cz q[91],q[98]; +sx q[91]; +rz(-pi/2) q[98]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +rz(-3*pi/2) q[91]; +sx q[98]; +cz q[91],q[98]; +rz(-pi/2) q[98]; +sx q[98]; +rz(-pi) q[111]; +x q[111]; +cz q[110],q[111]; +sx q[110]; +rz(-pi/2) q[111]; +sx q[111]; +cz q[110],q[111]; +rz(-pi) q[110]; +sx q[110]; +rz(-pi) q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +rz(pi) q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi) q[109]; +cz q[109],q[108]; +sx q[108]; +rz(pi/2) q[108]; +cz q[108],q[107]; +sx q[107]; +rz(-0.423467648249515) q[107]; +sx q[107]; +cz q[106],q[107]; +rz(-pi) q[106]; +sx q[106]; +rz(pi) q[106]; +sx q[107]; +rz(pi) q[107]; +cz q[106],q[107]; +sx q[106]; +rz(-2.518971146897159) q[106]; +sx q[106]; +sx q[107]; +rz(-1.9942639750444116) q[107]; +sx q[107]; +rz(-pi) q[107]; +sx q[108]; +sx q[109]; +rz(pi/2) q[109]; +sx q[110]; +rz(pi/2) q[110]; +rz(-pi) q[111]; +sx q[111]; +cz q[111],q[112]; +sx q[111]; +rz(-pi/2) q[112]; +sx q[112]; +cz q[111],q[112]; +rz(-pi) q[111]; +sx q[111]; +sx q[112]; +cz q[111],q[112]; +sx q[111]; +rz(-pi) q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +rz(-pi) q[110]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +rz(-pi) q[110]; +cz q[109],q[110]; +sx q[109]; +sx q[110]; +cz q[109],q[110]; +rz(-pi) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +sx q[110]; +cz q[109],q[110]; +sx q[109]; +rz(pi/2) q[109]; +rz(-pi/2) q[110]; +sx q[110]; +rz(-pi/2) q[110]; +rz(-pi/2) q[111]; +sx q[111]; +rz(-pi/2) q[111]; +rz(-pi/2) q[112]; +sx q[112]; +rz(-pi) q[112]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +rz(pi/2) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +sx q[125]; +cz q[125],q[126]; +sx q[125]; +sx q[126]; +cz q[125],q[126]; +sx q[125]; +sx q[126]; +cz q[125],q[126]; +sx q[125]; +sx q[126]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +sx q[136]; +cz q[123],q[136]; +cz q[123],q[124]; +sx q[123]; +rz(3.140100373886323) q[123]; +sx q[123]; +rz(3*pi) q[123]; +sx q[124]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +rz(pi/2) q[124]; +sx q[124]; +rz(-pi/2) q[124]; +cz q[123],q[124]; +sx q[123]; +rz(3.143084933293263) q[123]; +sx q[123]; +rz(3*pi) q[123]; +sx q[125]; +rz(pi/2) q[136]; +sx q[136]; +rz(pi) q[136]; +cz q[123],q[136]; +sx q[123]; +rz(3.140100373886323) q[123]; +sx q[123]; +rz(7.01156687654101) q[123]; +cz q[123],q[124]; +sx q[123]; +rz(-1.5719099449312903) q[123]; +sx q[123]; +rz(-4.713382335189172) q[123]; +sx q[124]; +rz(pi/2) q[124]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +rz(-pi/2) q[124]; +sx q[124]; +rz(-0.8424153105425365) q[124]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +rz(pi) q[123]; +sx q[124]; +rz(1.5717896815993804) q[124]; +cz q[123],q[124]; +sx q[123]; +rz(0.7283810162523596) q[123]; +sx q[123]; +sx q[124]; +rz(-1.5719099449312912) q[124]; +sx q[124]; +rz(2.413211084228368) q[124]; +rz(pi/2) q[125]; +sx q[125]; +rz(pi) q[125]; +cz q[124],q[125]; +sx q[124]; +rz(0.0014922797034699897) q[124]; +sx q[124]; +rz(-3*pi/2) q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(-pi) q[123]; +sx q[123]; +rz(-pi) q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +rz(pi/2) q[123]; +cz q[123],q[136]; +sx q[123]; +rz(-0.0014922797034699897) q[123]; +rz(pi/2) q[124]; +cz q[124],q[123]; +sx q[123]; +sx q[124]; +cz q[124],q[123]; +sx q[123]; +sx q[124]; +cz q[124],q[123]; +rz(pi/2) q[123]; +sx q[123]; +rz(-pi/2) q[123]; +cz q[124],q[125]; +sx q[124]; +rz(3.143084933293263) q[124]; +sx q[124]; +rz(5*pi/2) q[124]; +cz q[124],q[123]; +sx q[123]; +rz(-pi) q[123]; +sx q[125]; +rz(pi) q[125]; +cz q[124],q[125]; +sx q[124]; +sx q[136]; +rz(pi/2) q[136]; +cz q[123],q[136]; +sx q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +cz q[123],q[136]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi/2) q[123]; +cz q[124],q[125]; +cz q[124],q[123]; +sx q[123]; +sx q[124]; +rz(3.140100373886323) q[124]; +sx q[124]; +rz(3*pi) q[124]; +sx q[125]; +rz(pi) q[125]; +cz q[124],q[125]; +sx q[124]; +rz(3.143084933293263) q[124]; +sx q[124]; +rz(3*pi) q[124]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +sx q[136]; +cz q[123],q[136]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi/2) q[123]; +cz q[124],q[123]; +sx q[124]; +rz(3.140100373886323) q[124]; +sx q[124]; +rz(3*pi) q[124]; +cz q[124],q[125]; +sx q[124]; +rz(0.0014922797034699897) q[124]; +sx q[124]; +rz(-3*pi/2) q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(-pi) q[123]; +sx q[123]; +rz(-pi) q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +rz(pi/2) q[123]; +rz(pi/2) q[124]; +rz(pi/2) q[136]; +sx q[136]; +rz(pi/2) q[136]; +cz q[123],q[136]; +sx q[123]; +rz(-0.0014922797034699897) q[123]; +cz q[124],q[123]; +sx q[123]; +sx q[124]; +cz q[124],q[123]; +sx q[123]; +sx q[124]; +cz q[124],q[123]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi) q[123]; +cz q[124],q[125]; +sx q[124]; +rz(3.143084933293263) q[124]; +sx q[124]; +rz(3*pi) q[124]; +cz q[124],q[123]; +sx q[123]; +rz(pi/2) q[123]; +sx q[124]; +rz(3.140100373886323) q[124]; +sx q[124]; +rz(3*pi) q[124]; +cz q[124],q[125]; +sx q[124]; +rz(0.0014922797034699897) q[124]; +sx q[124]; +rz(-3*pi/2) q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(-pi) q[123]; +sx q[123]; +rz(-pi) q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +rz(pi/2) q[124]; +sx q[125]; +rz(-pi) q[125]; +sx q[136]; +cz q[123],q[136]; +sx q[123]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(pi/2) q[123]; +sx q[123]; +rz(pi) q[123]; +cz q[124],q[125]; +sx q[125]; +rz(-pi) q[125]; +rz(-pi) q[136]; +sx q[136]; +rz(-pi) q[136]; +cz q[136],q[123]; +cz q[124],q[123]; +sx q[123]; +rz(pi/2) q[123]; +rz(pi/2) q[124]; +sx q[124]; +rz(pi/2) q[124]; +cz q[124],q[125]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +rz(-pi) q[124]; +sx q[124]; +sx q[125]; +cz q[124],q[125]; +sx q[124]; +rz(-pi) q[124]; +cz q[123],q[124]; +sx q[123]; +sx q[124]; +cz q[123],q[124]; +rz(-pi) q[123]; +sx q[123]; +rz(-pi) q[123]; +sx q[124]; +cz q[123],q[124]; +sx q[123]; +rz(pi/2) q[123]; +rz(pi/2) q[124]; +rz(pi/2) q[125]; +cz q[126],q[125]; +sx q[125]; +sx q[126]; +cz q[126],q[125]; +sx q[125]; +sx q[126]; +cz q[126],q[125]; +sx q[125]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +sx q[126]; +rz(-pi/2) q[143]; +sx q[143]; +rz(-pi) q[143]; +sx q[144]; +rz(pi) q[144]; +cz q[145],q[144]; +sx q[144]; +rz(pi/2) q[144]; +sx q[145]; +rz(pi) q[145]; +cz q[146],q[145]; +sx q[145]; +rz(pi/2) q[145]; +sx q[146]; +rz(pi) q[146]; +cz q[147],q[146]; +sx q[146]; +rz(pi/2) q[146]; +sx q[147]; +rz(pi) q[147]; +cz q[137],q[147]; +sx q[137]; +rz(pi) q[137]; +cz q[127],q[137]; +sx q[127]; +rz(-pi/2) q[127]; +cz q[128],q[127]; +sx q[127]; +rz(pi/2) q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +sx q[127]; +cz q[127],q[126]; +sx q[126]; +cz q[126],q[125]; +sx q[125]; +sx q[126]; +cz q[126],q[125]; +sx q[125]; +sx q[126]; +cz q[126],q[125]; +sx q[125]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +cz q[125],q[124]; +sx q[124]; +sx q[125]; +cz q[125],q[124]; +rz(pi/2) q[126]; +sx q[126]; +rz(pi/2) q[126]; +rz(pi/2) q[127]; +sx q[127]; +rz(pi/2) q[127]; +sx q[128]; +cz q[129],q[128]; +sx q[128]; +rz(-pi) q[128]; +cz q[127],q[128]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +rz(-pi) q[127]; +sx q[127]; +sx q[128]; +cz q[127],q[128]; +sx q[127]; +rz(-pi) q[127]; +cz q[126],q[127]; +sx q[126]; +sx q[127]; +cz q[126],q[127]; +rz(-pi) q[126]; +sx q[126]; +rz(-pi) q[126]; +sx q[127]; +cz q[126],q[127]; +sx q[126]; +rz(pi/2) q[126]; +rz(pi/2) q[127]; +rz(pi/2) q[128]; +sx q[129]; +rz(-pi/2) q[129]; +cz q[130],q[129]; +sx q[129]; +rz(pi/2) q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +cz q[128],q[127]; +sx q[127]; +sx q[128]; +cz q[128],q[127]; +sx q[127]; +sx q[128]; +cz q[128],q[127]; +rz(pi/2) q[128]; +sx q[128]; +rz(pi) q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(-pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +rz(3.139009369748788) q[118]; +sx q[118]; +rz(3*pi) q[118]; +cz q[118],q[109]; +sx q[118]; +rz(1.573379610635901) q[118]; +sx q[118]; +x q[129]; +cz q[118],q[129]; +sx q[118]; +rz(-pi/2) q[129]; +sx q[129]; +cz q[118],q[129]; +rz(-pi) q[118]; +sx q[118]; +rz(-pi/2) q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +rz(pi/2) q[118]; +rz(-pi/2) q[129]; +sx q[129]; +rz(-pi) q[129]; +cz q[129],q[128]; +sx q[129]; +rz(-0.0025832838410053682) q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +cz q[118],q[109]; +sx q[118]; +rz(3.144175937430798) q[118]; +sx q[118]; +rz(3*pi) q[118]; +rz(pi/2) q[129]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +rz(3.139009369748788) q[118]; +sx q[118]; +rz(3*pi) q[118]; +cz q[118],q[109]; +sx q[109]; +rz(pi/2) q[109]; +sx q[118]; +rz(1.573379610635901) q[118]; +sx q[118]; +sx q[129]; +rz(-3*pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +rz(-pi) q[118]; +sx q[118]; +rz(-pi/2) q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +rz(pi/2) q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +rz(pi/2) q[118]; +sx q[118]; +rz(pi/2) q[118]; +rz(-pi/2) q[129]; +sx q[129]; +rz(-pi) q[129]; +cz q[129],q[128]; +sx q[128]; +rz(pi/2) q[128]; +sx q[129]; +rz(3.139009369748788) q[129]; +sx q[129]; +rz(7.006729334859923) q[129]; +cz q[129],q[118]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +sx q[109]; +sx q[118]; +cz q[118],q[109]; +rz(pi/2) q[109]; +sx q[109]; +rz(pi) q[109]; +rz(-pi/2) q[118]; +sx q[118]; +rz(1.1881630266360999) q[118]; +sx q[118]; +sx q[129]; +rz(-1.57273240727221) q[129]; +sx q[129]; +rz(1.569086077853016) q[129]; +cz q[118],q[129]; +rz(-pi) q[118]; +sx q[118]; +sx q[129]; +rz(pi) q[129]; +cz q[118],q[129]; +sx q[118]; +rz(2.41805028150017) q[118]; +cz q[118],q[109]; +sx q[118]; +sx q[129]; +rz(0.38263330015879715) q[129]; +sx q[129]; +cz q[129],q[128]; +sx q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +sx q[118]; +sx q[129]; +cz q[129],q[118]; +cz q[118],q[109]; +sx q[109]; +rz(pi) q[109]; +cz q[129],q[128]; +sx q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +rz(3.139009369748788) q[118]; +sx q[118]; +rz(3*pi) q[118]; +cz q[118],q[109]; +sx q[118]; +rz(3.144175937430798) q[118]; +sx q[118]; +rz(3*pi) q[118]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(-pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +rz(3.139009369748788) q[118]; +sx q[118]; +rz(3*pi) q[118]; +cz q[118],q[109]; +sx q[118]; +rz(3.144175937430798) q[118]; +sx q[118]; +rz(3*pi) q[118]; +sx q[129]; +rz(pi/2) q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +rz(pi/2) q[129]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +rz(3.139009369748788) q[118]; +sx q[118]; +rz(3*pi) q[118]; +cz q[118],q[109]; +sx q[118]; +rz(3.144175937430798) q[118]; +sx q[118]; +rz(3*pi) q[118]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +rz(3.139009369748788) q[118]; +sx q[118]; +rz(3*pi) q[118]; +cz q[118],q[109]; +sx q[109]; +rz(-0.8428315352230378) q[109]; +sx q[109]; +sx q[118]; +rz(3.144175937430798) q[118]; +sx q[118]; +rz(8.696813169197519) q[118]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +sx q[128]; +sx q[129]; +cz q[129],q[128]; +rz(-pi/2) q[128]; +sx q[128]; +rz(3.0154191946054265) q[128]; +sx q[128]; +rz(pi/2) q[129]; +sx q[129]; +rz(pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +rz(-pi) q[118]; +cz q[109],q[118]; +rz(-pi) q[109]; +sx q[109]; +rz(pi) q[109]; +sx q[118]; +rz(pi) q[118]; +cz q[109],q[118]; +sx q[109]; +rz(2.298761118366757) q[109]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +rz(pi/2) q[108]; +sx q[108]; +rz(pi/2) q[108]; +cz q[107],q[108]; +rz(-pi) q[109]; +x q[109]; +cz q[108],q[109]; +sx q[108]; +rz(-pi/2) q[109]; +sx q[109]; +cz q[108],q[109]; +rz(-pi) q[108]; +sx q[108]; +rz(-pi/2) q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +rz(pi/2) q[108]; +rz(-pi/2) q[109]; +sx q[109]; +rz(-pi) q[109]; +sx q[118]; +rz(-2.2987611183667553) q[118]; +sx q[118]; +rz(pi/2) q[118]; +cz q[109],q[118]; +sx q[118]; +sx q[129]; +rz(1.2627208899083824) q[129]; +sx q[129]; +rz(-pi) q[129]; +cz q[128],q[129]; +rz(-pi) q[128]; +sx q[128]; +sx q[129]; +cz q[128],q[129]; +sx q[128]; +rz(-1.8788717636814107) q[128]; +sx q[129]; +rz(-0.12617345898439325) q[129]; +sx q[129]; +rz(-pi) q[129]; +cz q[118],q[129]; +rz(pi/2) q[118]; +sx q[118]; +rz(0.00654355771544024) q[118]; +sx q[118]; +sx q[129]; +rz(3.1350490958743533) q[129]; +sx q[129]; +cz q[118],q[129]; +rz(pi/2) q[118]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +rz(pi/2) q[108]; +sx q[108]; +rz(pi/2) q[108]; +cz q[107],q[108]; +sx q[107]; +rz(-0.5247071718527465) q[107]; +sx q[107]; +cz q[106],q[107]; +rz(-pi) q[106]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +rz(-0.05034598491279141) q[106]; +sx q[106]; +sx q[107]; +rz(-2.095503498647643) q[107]; +sx q[107]; +rz(-pi) q[109]; +x q[109]; +cz q[108],q[109]; +sx q[108]; +rz(-pi/2) q[109]; +sx q[109]; +cz q[108],q[109]; +rz(-pi) q[108]; +sx q[108]; +rz(-pi) q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +rz(pi/2) q[108]; +cz q[108],q[107]; +sx q[108]; +rz(pi/2) q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +rz(pi/2) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +cz q[110],q[109]; +sx q[110]; +rz(pi) q[110]; +cz q[111],q[110]; +sx q[111]; +rz(pi) q[111]; +cz q[98],q[111]; +x q[98]; +cz q[91],q[98]; +sx q[91]; +rz(-pi/2) q[98]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +rz(-pi/2) q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(pi/2) q[91]; +cz q[90],q[91]; +sx q[90]; +sx q[91]; +cz q[90],q[91]; +sx q[90]; +sx q[91]; +cz q[90],q[91]; +rz(pi/2) q[90]; +sx q[90]; +rz(-pi/2) q[90]; +cz q[89],q[90]; +sx q[89]; +rz(-pi/2) q[89]; +cz q[88],q[89]; +sx q[88]; +rz(pi) q[88]; +cz q[87],q[88]; +sx q[87]; +sx q[88]; +rz(pi) q[88]; +cz q[88],q[89]; +sx q[88]; +rz(pi/2) q[88]; +sx q[89]; +rz(pi/2) q[89]; +sx q[90]; +rz(pi/2) q[90]; +sx q[91]; +cz q[91],q[90]; +sx q[90]; +sx q[91]; +cz q[91],q[90]; +sx q[90]; +sx q[91]; +cz q[91],q[90]; +rz(pi/2) q[90]; +sx q[90]; +rz(pi/2) q[90]; +rz(pi/2) q[91]; +sx q[91]; +rz(pi/2) q[91]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +rz(pi/2) q[97]; +sx q[97]; +rz(pi/2) q[97]; +rz(pi/2) q[98]; +sx q[98]; +rz(-3*pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(-pi) q[91]; +cz q[90],q[91]; +sx q[90]; +sx q[91]; +cz q[90],q[91]; +rz(-pi) q[90]; +sx q[90]; +rz(-pi/2) q[90]; +sx q[91]; +cz q[90],q[91]; +sx q[90]; +rz(pi/2) q[90]; +cz q[90],q[89]; +sx q[89]; +sx q[90]; +cz q[90],q[89]; +sx q[89]; +sx q[90]; +cz q[90],q[89]; +rz(pi/2) q[89]; +sx q[89]; +rz(pi/2) q[91]; +sx q[91]; +rz(-pi/2) q[91]; +rz(-pi/2) q[98]; +sx q[98]; +rz(-pi) q[98]; +sx q[111]; +rz(-pi/2) q[111]; +cz q[111],q[110]; +sx q[110]; +rz(pi/2) q[110]; +cz q[110],q[109]; +sx q[109]; +rz(pi/2) q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +cz q[108],q[107]; +sx q[107]; +rz(1.478024404588627) q[107]; +sx q[107]; +cz q[106],q[107]; +rz(-pi) q[106]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +rz(0.09277192220626862) q[106]; +sx q[106]; +sx q[107]; +rz(-2.1458494835604363) q[107]; +rz(-pi) q[108]; +x q[108]; +cz q[107],q[108]; +sx q[107]; +rz(-pi/2) q[108]; +sx q[108]; +cz q[107],q[108]; +rz(-pi) q[107]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +rz(-pi) q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(-pi) q[97]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +rz(2.4054641871920017) q[97]; +sx q[97]; +rz(pi/2) q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +sx q[106]; +sx q[107]; +cz q[106],q[107]; +rz(pi/2) q[106]; +sx q[106]; +cz q[105],q[106]; +sx q[105]; +rz(pi) q[105]; +rz(pi/2) q[107]; +sx q[107]; +rz(pi/2) q[107]; +rz(-pi/2) q[108]; +sx q[108]; +rz(-pi/2) q[108]; +rz(pi/2) q[109]; +sx q[109]; +rz(pi) q[109]; +cz q[108],q[109]; +sx q[108]; +rz(pi/2) q[108]; +sx q[109]; +rz(2.4054641871920026) q[109]; +sx q[109]; +sx q[110]; +x q[111]; +cz q[117],q[105]; +sx q[105]; +rz(pi/2) q[105]; +sx q[117]; +rz(pi) q[117]; +sx q[118]; +cz q[125],q[117]; +sx q[117]; +rz(pi/2) q[117]; +rz(-pi/2) q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +sx q[118]; +sx q[129]; +cz q[118],q[129]; +rz(-pi/2) q[118]; +sx q[118]; +rz(-2.306924793192686) q[118]; +sx q[118]; +cz q[109],q[118]; +rz(-pi) q[109]; +sx q[109]; +rz(pi) q[109]; +sx q[118]; +cz q[109],q[118]; +sx q[109]; +rz(-0.7361284663977887) q[109]; +sx q[109]; +rz(pi/2) q[109]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +sx q[109]; +sx q[110]; +cz q[110],q[109]; +rz(pi/2) q[109]; +sx q[109]; +rz(pi/2) q[109]; +rz(pi/2) q[110]; +sx q[110]; +rz(pi/2) q[110]; +cz q[110],q[111]; +sx q[110]; +rz(-pi/2) q[111]; +sx q[111]; +cz q[110],q[111]; +rz(-pi) q[110]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +rz(-pi) q[110]; +rz(-pi/2) q[111]; +sx q[111]; +rz(-pi/2) q[111]; +cz q[111],q[98]; +sx q[98]; +rz(-3*pi/2) q[98]; +cz q[91],q[98]; +sx q[91]; +rz(0.0034297696302805214) q[91]; +sx q[91]; +sx q[98]; +rz(3.138162883959513) q[98]; +sx q[98]; +cz q[91],q[98]; +rz(-pi/2) q[91]; +rz(pi/2) q[98]; +sx q[98]; +rz(-pi) q[98]; +cz q[111],q[98]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +rz(pi/2) q[91]; +sx q[91]; +rz(-pi/2) q[91]; +cz q[90],q[91]; +rz(pi/2) q[90]; +sx q[90]; +rz(pi/2) q[90]; +sx q[91]; +rz(pi/2) q[91]; +sx q[98]; +cz q[98],q[91]; +sx q[91]; +sx q[98]; +cz q[98],q[91]; +sx q[91]; +sx q[98]; +cz q[98],q[91]; +rz(pi/2) q[91]; +sx q[91]; +sx q[111]; +rz(-pi/2) q[111]; +sx q[118]; +rz(-3.877721119987583) q[118]; +cz q[109],q[118]; +sx q[109]; +sx q[118]; +cz q[109],q[118]; +rz(-pi) q[109]; +sx q[109]; +rz(-3*pi/2) q[109]; +sx q[118]; +cz q[109],q[118]; +cz q[109],q[110]; +sx q[109]; +sx q[110]; +cz q[109],q[110]; +rz(-pi) q[109]; +sx q[109]; +sx q[110]; +cz q[109],q[110]; +sx q[109]; +rz(-pi) q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +rz(-pi) q[108]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +rz(-pi) q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(-pi) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +rz(pi/2) q[107]; +rz(-pi/2) q[108]; +sx q[108]; +rz(-pi) q[108]; +rz(-pi/2) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +rz(-pi/2) q[110]; +sx q[110]; +rz(-pi/2) q[110]; +cz q[110],q[111]; +sx q[110]; +rz(-pi/2) q[110]; +cz q[109],q[110]; +sx q[109]; +rz(-pi/2) q[109]; +cz q[108],q[109]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(-pi/2) q[107]; +sx q[107]; +rz(-2.306924793192686) q[107]; +sx q[107]; +cz q[97],q[107]; +rz(-pi) q[97]; +sx q[97]; +rz(pi) q[97]; +sx q[107]; +rz(pi) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(-0.7361284663977887) q[97]; +sx q[97]; +rz(pi/2) q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +cz q[87],q[86]; +sx q[86]; +sx q[87]; +cz q[87],q[86]; +sx q[86]; +sx q[87]; +cz q[87],q[86]; +rz(pi/2) q[87]; +sx q[87]; +rz(pi/2) q[87]; +rz(pi/2) q[97]; +sx q[97]; +rz(pi/2) q[97]; +sx q[107]; +rz(2.306924793192687) q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +sx q[109]; +rz(pi/2) q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +sx q[109]; +cz q[109],q[108]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +sx q[107]; +sx q[108]; +cz q[108],q[107]; +cz q[107],q[97]; +x q[97]; +sx q[107]; +rz(-pi/2) q[109]; +sx q[109]; +rz(-1.2669010675925527) q[109]; +sx q[109]; +sx q[110]; +rz(pi/2) q[110]; +sx q[111]; +rz(pi/2) q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +sx q[110]; +sx q[111]; +cz q[111],q[110]; +rz(-pi/2) q[110]; +sx q[110]; +rz(2.566539496824255) q[110]; +sx q[110]; +rz(pi/2) q[111]; +sx q[111]; +rz(pi) q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(pi/2) q[98]; +sx q[111]; +rz(1.478024404588627) q[111]; +sx q[111]; +cz q[110],q[111]; +rz(-pi) q[110]; +sx q[110]; +rz(pi) q[110]; +sx q[111]; +rz(pi) q[111]; +cz q[110],q[111]; +sx q[110]; +rz(-1.6635682490011652) q[110]; +sx q[110]; +rz(-pi/2) q[110]; +sx q[111]; +rz(-2.5665394968242534) q[111]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(-pi) q[98]; +sx q[98]; +rz(-pi) q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +rz(-pi/2) q[98]; +cz q[98],q[91]; +sx q[91]; +rz(-pi) q[91]; +cz q[90],q[91]; +sx q[90]; +sx q[91]; +cz q[90],q[91]; +rz(-pi) q[90]; +sx q[90]; +rz(-pi) q[90]; +sx q[91]; +cz q[90],q[91]; +sx q[90]; +rz(pi) q[90]; +cz q[90],q[89]; +sx q[89]; +rz(-pi) q[89]; +cz q[88],q[89]; +sx q[88]; +sx q[89]; +cz q[88],q[89]; +rz(-pi) q[88]; +sx q[88]; +rz(-pi) q[88]; +sx q[89]; +cz q[88],q[89]; +sx q[88]; +rz(pi) q[88]; +cz q[88],q[87]; +cz q[87],q[97]; +sx q[87]; +rz(-pi) q[89]; +sx q[89]; +x q[90]; +rz(-pi) q[90]; +cz q[89],q[90]; +sx q[89]; +sx q[90]; +cz q[89],q[90]; +rz(-pi) q[89]; +sx q[89]; +rz(-pi) q[89]; +sx q[90]; +cz q[89],q[90]; +sx q[89]; +rz(pi) q[89]; +rz(-pi) q[90]; +sx q[90]; +rz(-pi) q[91]; +sx q[91]; +rz(-pi/2) q[97]; +sx q[97]; +cz q[87],q[97]; +rz(-pi) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(pi/2) q[87]; +rz(-pi/2) q[97]; +sx q[97]; +rz(-pi) q[97]; +x q[98]; +cz q[91],q[98]; +sx q[91]; +rz(-pi/2) q[98]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(-pi) q[91]; +cz q[90],q[91]; +sx q[90]; +sx q[91]; +cz q[90],q[91]; +rz(-pi) q[90]; +sx q[90]; +rz(-pi) q[90]; +sx q[91]; +cz q[90],q[91]; +sx q[90]; +rz(pi) q[90]; +rz(-pi) q[91]; +sx q[91]; +rz(-pi) q[98]; +sx q[98]; +rz(pi/2) q[111]; +sx q[111]; +rz(-3*pi/2) q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +cz q[110],q[111]; +rz(-pi) q[110]; +sx q[110]; +rz(-pi) q[110]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +rz(pi) q[110]; +rz(pi/2) q[111]; +sx q[111]; +rz(-3*pi/2) q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(-pi) q[98]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +rz(-pi) q[98]; +cz q[91],q[98]; +sx q[91]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +rz(-pi) q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(pi) q[91]; +rz(pi/2) q[98]; +sx q[98]; +rz(-3*pi/2) q[98]; +rz(pi/2) q[111]; +rz(-pi/2) q[118]; +sx q[118]; +rz(-1.9029331600454364) q[118]; +sx q[118]; +cz q[109],q[118]; +rz(-pi) q[109]; +sx q[109]; +rz(pi) q[109]; +sx q[118]; +rz(pi) q[118]; +cz q[109],q[118]; +sx q[109]; +rz(-0.332136833250539) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +cz q[108],q[109]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +cz q[107],q[106]; +cz q[97],q[107]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +sx q[106]; +rz(pi) q[106]; +rz(pi/2) q[108]; +sx q[108]; +rz(pi) q[108]; +cz q[107],q[108]; +sx q[107]; +rz(3.136225631101508) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[106]; +sx q[107]; +rz(3.1469596760780782) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[97]; +sx q[107]; +rz(3.136225631101508) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[106]; +sx q[107]; +rz(3.1469596760780782) q[107]; +sx q[107]; +rz(3*pi) q[107]; +sx q[108]; +rz(pi/2) q[108]; +cz q[107],q[108]; +sx q[107]; +rz(3.136225631101508) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[106]; +sx q[107]; +rz(3.1469596760780782) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[97]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +rz(3.136225631101508) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[106]; +sx q[106]; +rz(pi) q[106]; +sx q[107]; +rz(3.1469596760780782) q[107]; +sx q[107]; +rz(5*pi/2) q[107]; +sx q[108]; +cz q[107],q[108]; +cz q[107],q[106]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +cz q[87],q[97]; +rz(pi/2) q[87]; +sx q[97]; +rz(pi/2) q[107]; +sx q[107]; +rz(pi) q[107]; +rz(-pi) q[108]; +sx q[108]; +rz(-pi/2) q[108]; +cz q[108],q[107]; +sx q[107]; +rz(pi/2) q[107]; +cz q[107],q[106]; +sx q[106]; +rz(pi) q[106]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +cz q[87],q[97]; +rz(0.03269067378860768) q[97]; +sx q[97]; +sx q[108]; +cz q[107],q[108]; +rz(pi/2) q[107]; +sx q[107]; +rz(1.5058401788003328) q[107]; +sx q[107]; +cz q[97],q[107]; +rz(-pi) q[97]; +sx q[97]; +sx q[107]; +rz(-1.4598113694520833) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(-1.5058401788003337) q[97]; +sx q[97]; +rz(pi/2) q[97]; +sx q[107]; +rz(-1.567174323093977) q[107]; +sx q[107]; +rz(1.5383068537577618) q[107]; +cz q[107],q[106]; +sx q[107]; +rz(3.2526364546689157) q[107]; +sx q[107]; +rz(3*pi) q[107]; +sx q[108]; +rz(pi) q[108]; +cz q[107],q[108]; +sx q[107]; +rz(3.0305488525106705) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[106]; +sx q[107]; +rz(3.2526364546689157) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +rz(3.0305488525106705) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[106]; +sx q[107]; +rz(3.2526364546689157) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[108]; +sx q[107]; +rz(3.0305488525106705) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[106]; +sx q[106]; +sx q[107]; +rz(3.2526364546689157) q[107]; +sx q[107]; +rz(5*pi/2) q[107]; +cz q[107],q[97]; +cz q[107],q[106]; +sx q[106]; +rz(pi/2) q[106]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +cz q[87],q[97]; +sx q[87]; +cz q[88],q[87]; +sx q[87]; +rz(2.814390668295103) q[87]; +sx q[87]; +sx q[88]; +rz(pi) q[88]; +cz q[89],q[88]; +sx q[88]; +rz(pi/2) q[88]; +sx q[89]; +rz(pi) q[89]; +cz q[90],q[89]; +sx q[89]; +rz(pi/2) q[89]; +sx q[90]; +rz(pi) q[90]; +cz q[91],q[90]; +sx q[90]; +rz(pi/2) q[90]; +sx q[91]; +rz(pi/2) q[91]; +cz q[91],q[98]; +sx q[91]; +rz(pi/2) q[97]; +sx q[97]; +rz(2.801186879136578) q[97]; +sx q[97]; +cz q[87],q[97]; +rz(-pi) q[87]; +sx q[87]; +sx q[97]; +cz q[87],q[97]; +sx q[87]; +rz(1.9112021012481106) q[87]; +sx q[87]; +sx q[97]; +rz(-0.3272019852946908) q[97]; +sx q[97]; +rz(pi/2) q[97]; +sx q[98]; +cz q[91],q[98]; +rz(-pi) q[91]; +sx q[91]; +rz(-pi) q[91]; +sx q[98]; +cz q[91],q[98]; +sx q[91]; +rz(pi/2) q[91]; +rz(pi/2) q[98]; +sx q[108]; +rz(-3*pi/2) q[108]; +cz q[107],q[108]; +sx q[108]; +rz(pi/2) q[108]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +sx q[98]; +sx q[111]; +cz q[111],q[98]; +rz(pi/2) q[98]; +sx q[98]; +rz(pi/2) q[98]; +rz(pi/2) q[111]; +sx q[111]; +cz q[110],q[111]; +sx q[110]; +sx q[111]; +rz(-pi) q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(-pi) q[98]; +sx q[98]; +rz(-pi/2) q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +rz(pi/2) q[98]; +rz(-pi/2) q[111]; +sx q[111]; +rz(-pi) q[111]; +cz q[111],q[110]; +sx q[110]; +rz(-pi) q[110]; +cz q[109],q[110]; +sx q[109]; +sx q[110]; +cz q[109],q[110]; +rz(-pi) q[109]; +sx q[109]; +rz(-pi/2) q[109]; +sx q[110]; +cz q[109],q[110]; +sx q[109]; +rz(pi/2) q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +sx q[108]; +sx q[109]; +cz q[108],q[109]; +rz(pi/2) q[108]; +sx q[108]; +cz q[107],q[108]; +cz q[107],q[97]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +sx q[107]; +rz(3.1383926043554906) q[107]; +sx q[107]; +rz(3*pi) q[107]; +sx q[108]; +rz(pi) q[108]; +cz q[107],q[108]; +sx q[107]; +rz(3.1447927028240956) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[97]; +sx q[97]; +rz(pi/2) q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +rz(pi/2) q[97]; +sx q[97]; +sx q[107]; +rz(3.1383926043554906) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[108]; +sx q[107]; +rz(3.1447927028240956) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +cz q[97],q[87]; +rz(pi/2) q[87]; +sx q[87]; +rz(-pi/2) q[87]; +rz(pi/2) q[97]; +sx q[97]; +rz(pi) q[97]; +sx q[107]; +rz(3.1383926043554906) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[108]; +sx q[107]; +rz(3.1447927028240956) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[97]; +sx q[97]; +rz(pi/2) q[97]; +sx q[107]; +rz(3.1383926043554906) q[107]; +sx q[107]; +rz(3*pi) q[107]; +cz q[107],q[108]; +sx q[107]; +rz(0.0032000492343025044) q[107]; +sx q[107]; +rz(-3*pi/2) q[107]; +cz q[97],q[107]; +sx q[97]; +sx q[107]; +cz q[97],q[107]; +rz(-pi) q[97]; +sx q[97]; +rz(-pi) q[97]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +cz q[97],q[87]; +sx q[87]; +rz(-pi/2) q[87]; +sx q[97]; +rz(pi/2) q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +rz(pi/2) q[97]; +sx q[97]; +rz(-pi/2) q[97]; +cz q[87],q[97]; +sx q[87]; +sx q[97]; +rz(pi/2) q[97]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +sx q[97]; +sx q[107]; +cz q[107],q[97]; +cz q[97],q[87]; +sx q[87]; +rz(pi) q[87]; +rz(pi/2) q[107]; +sx q[107]; +rz(-2.4898979842738616) q[107]; +sx q[107]; +sx q[108]; +rz(2.7807502672355078) q[108]; +sx q[108]; +cz q[107],q[108]; +rz(-pi) q[107]; +sx q[107]; +sx q[108]; +rz(pi) q[108]; +cz q[107],q[108]; +sx q[107]; +rz(-2.780750267235507) q[107]; +sx q[107]; +rz(pi/2) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(3.3553882831114983) q[97]; +sx q[97]; +rz(3*pi) q[97]; +cz q[97],q[87]; +sx q[97]; +rz(2.927797024068088) q[97]; +sx q[97]; +rz(3*pi) q[97]; +sx q[107]; +sx q[108]; +rz(-2.222490996110828) q[108]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(pi/2) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(3.3553882831114983) q[97]; +sx q[97]; +rz(3*pi) q[97]; +cz q[97],q[87]; +sx q[97]; +rz(2.927797024068088) q[97]; +sx q[97]; +rz(3*pi) q[97]; +sx q[107]; +rz(pi/2) q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(pi/2) q[107]; +sx q[107]; +cz q[97],q[107]; +sx q[97]; +rz(3.3553882831114983) q[97]; +sx q[97]; +rz(3*pi) q[97]; +cz q[97],q[87]; +sx q[97]; +rz(2.927797024068088) q[97]; +sx q[97]; +rz(3*pi) q[97]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(pi/2) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +cz q[97],q[107]; +sx q[97]; +rz(3.3553882831114983) q[97]; +sx q[97]; +rz(3*pi) q[97]; +cz q[97],q[87]; +sx q[87]; +sx q[97]; +rz(2.927797024068088) q[97]; +sx q[97]; +rz(5*pi/2) q[97]; +sx q[107]; +rz(-pi) q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +sx q[107]; +sx q[108]; +cz q[107],q[108]; +rz(pi/2) q[107]; +sx q[107]; +rz(-pi/2) q[107]; +cz q[97],q[107]; +cz q[97],q[87]; +sx q[87]; +rz(pi/2) q[87]; +sx q[107]; +rz(-pi) q[107]; +rz(pi/2) q[108]; +sx q[108]; +rz(pi) q[108]; +cz q[107],q[108]; +sx q[108]; +rz(pi/2) q[108]; +rz(-pi/2) q[110]; +sx q[110]; +rz(-pi) q[110]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +sx q[98]; +sx q[111]; +cz q[98],q[111]; +rz(pi/2) q[98]; +sx q[98]; +rz(pi) q[98]; +cz q[91],q[98]; +sx q[98]; +rz(pi/2) q[98]; +sx q[118]; +rz(-1.8746915859972404) q[118]; +sx q[118]; +rz(-pi/2) q[118]; +sx q[130]; +rz(pi) q[130]; +cz q[131],q[130]; +sx q[130]; +rz(pi/2) q[130]; +sx q[131]; +rz(pi) q[131]; +cz q[132],q[131]; +sx q[131]; +rz(pi/2) q[131]; +rz(pi/2) q[132]; +sx q[132]; +rz(pi/2) q[132]; +cz q[132],q[133]; +sx q[132]; +rz(-pi/2) q[133]; +sx q[133]; +cz q[132],q[133]; +rz(-pi) q[132]; +sx q[132]; +rz(-pi) q[132]; +sx q[133]; +cz q[132],q[133]; +sx q[132]; +rz(pi/2) q[132]; +rz(pi/2) q[133]; +sx q[133]; +rz(-3*pi/2) q[133]; +cz q[119],q[133]; +sx q[119]; +sx q[133]; +cz q[119],q[133]; +rz(-pi) q[119]; +sx q[119]; +sx q[133]; +cz q[119],q[133]; +sx q[119]; +rz(-pi) q[119]; +cz q[113],q[119]; +sx q[113]; +sx q[119]; +cz q[113],q[119]; +rz(-pi) q[113]; +sx q[113]; +rz(-3*pi/2) q[113]; +sx q[119]; +cz q[113],q[119]; +cz q[113],q[114]; +sx q[113]; +rz(-pi/2) q[114]; +sx q[114]; +cz q[113],q[114]; +rz(-pi) q[113]; +sx q[113]; +rz(-pi) q[113]; +sx q[114]; +cz q[113],q[114]; +sx q[113]; +rz(pi/2) q[113]; +rz(pi/2) q[114]; +cz q[115],q[114]; +sx q[114]; +sx q[115]; +cz q[115],q[114]; +sx q[114]; +sx q[115]; +cz q[115],q[114]; +rz(pi/2) q[115]; +sx q[115]; +rz(pi) q[115]; +cz q[99],q[115]; +sx q[99]; +rz(pi) q[99]; +cz q[95],q[99]; +sx q[95]; +rz(pi) q[95]; +cz q[94],q[95]; +sx q[95]; +rz(pi/2) q[95]; +sx q[99]; +rz(pi/2) q[99]; +sx q[115]; +rz(pi/2) q[115]; +rz(-pi/2) q[119]; +sx q[119]; +rz(-pi) q[119]; +rz(-pi/2) q[133]; +sx q[133]; +rz(-pi) q[133]; +sx q[137]; +rz(pi/2) q[137]; +sx q[147]; +rz(pi/2) q[147]; diff --git a/Quilt/macro_gate_detector/tests/output_test_1/analysis_result.json b/Quilt/macro_gate_detector/tests/output_test_1/analysis_result.json new file mode 100644 index 0000000..7a60326 --- /dev/null +++ b/Quilt/macro_gate_detector/tests/output_test_1/analysis_result.json @@ -0,0 +1,1637 @@ +{ + "dag_flat": [ + { + "position": 0, + "gate": "x", + "qubits": [ + "12" + ] + }, + { + "position": 1, + "gate": "x", + "qubits": [ + "13" + ] + }, + { + "position": 2, + "gate": "x", + "qubits": [ + "14" + ] + }, + { + "position": 3, + "gate": "x", + "qubits": [ + "15" + ] + }, + { + "position": 4, + "gate": "x", + "qubits": [ + "16" + ] + }, + { + "position": 5, + "gate": "x", + "qubits": [ + "17" + ] + }, + { + "position": 6, + "gate": "x", + "qubits": [ + "18" + ] + }, + { + "position": 7, + "gate": "x", + "qubits": [ + "19" + ] + }, + { + "position": 8, + "gate": "x", + "qubits": [ + "20" + ] + }, + { + "position": 9, + "gate": "x", + "qubits": [ + "21" + ] + }, + { + "position": 10, + "gate": "x", + "qubits": [ + "22" + ] + }, + { + "position": 11, + "gate": "x", + "qubits": [ + "23" + ] + }, + { + "position": 12, + "gate": "x", + "qubits": [ + "24" + ] + }, + { + "position": 13, + "gate": "x", + "qubits": [ + "25" + ] + }, + { + "position": 14, + "gate": "x", + "qubits": [ + "26" + ] + }, + { + "position": 15, + "gate": "x", + "qubits": [ + "27" + ] + }, + { + "position": 16, + "gate": "x", + "qubits": [ + "28" + ] + }, + { + "position": 17, + "gate": "x", + "qubits": [ + "29" + ] + }, + { + "position": 18, + "gate": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "position": 19, + "gate": "u2", + "qubits": [ + "29" + ] + }, + { + "position": 20, + "gate": "x", + "qubits": [ + "30" + ] + }, + { + "position": 21, + "gate": "x", + "qubits": [ + "31" + ] + }, + { + "position": 22, + "gate": "x", + "qubits": [ + "32" + ] + }, + { + "position": 23, + "gate": "x", + "qubits": [ + "33" + ] + }, + { + "position": 24, + "gate": "x", + "qubits": [ + "34" + ] + }, + { + "position": 25, + "gate": "x", + "qubits": [ + "35" + ] + }, + { + "position": 26, + "gate": "cx", + "qubits": [ + "34", + "35" + ] + }, + { + "position": 27, + "gate": "cx", + "qubits": [ + "28", + "34" + ] + }, + { + "position": 28, + "gate": "ry", + "qubits": [ + "28" + ] + }, + { + "position": 29, + "gate": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "position": 30, + "gate": "ry", + "qubits": [ + "28" + ] + }, + { + "position": 31, + "gate": "h", + "qubits": [ + "34" + ] + }, + { + "position": 32, + "gate": "u2", + "qubits": [ + "35" + ] + }, + { + "position": 33, + "gate": "cx", + "qubits": [ + "28", + "35" + ] + }, + { + "position": 34, + "gate": "ry", + "qubits": [ + "28" + ] + }, + { + "position": 35, + "gate": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "position": 36, + "gate": "ry", + "qubits": [ + "28" + ] + }, + { + "position": 37, + "gate": "cx", + "qubits": [ + "28", + "34" + ] + }, + { + "position": 38, + "gate": "ry", + "qubits": [ + "28" + ] + }, + { + "position": 39, + "gate": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "position": 40, + "gate": "ry", + "qubits": [ + "28" + ] + }, + { + "position": 41, + "gate": "cx", + "qubits": [ + "28", + "35" + ] + }, + { + "position": 42, + "gate": "ry", + "qubits": [ + "28" + ] + }, + { + "position": 43, + "gate": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "position": 44, + "gate": "ry", + "qubits": [ + "28" + ] + }, + { + "position": 45, + "gate": "u2", + "qubits": [ + "29" + ] + }, + { + "position": 46, + "gate": "rz", + "qubits": [ + "34" + ] + }, + { + "position": 47, + "gate": "cx", + "qubits": [ + "28", + "34" + ] + }, + { + "position": 48, + "gate": "rz", + "qubits": [ + "28" + ] + }, + { + "position": 49, + "gate": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "position": 50, + "gate": "u2", + "qubits": [ + "34" + ] + }, + { + "position": 51, + "gate": "u2", + "qubits": [ + "35" + ] + }, + { + "position": 52, + "gate": "cx", + "qubits": [ + "34", + "35" + ] + }, + { + "position": 53, + "gate": "cx", + "qubits": [ + "28", + "35" + ] + }, + { + "position": 54, + "gate": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "position": 55, + "gate": "u2", + "qubits": [ + "29" + ] + }, + { + "position": 56, + "gate": "cx", + "qubits": [ + "34", + "28" + ] + }, + { + "position": 57, + "gate": "h", + "qubits": [ + "28" + ] + }, + { + "position": 58, + "gate": "ry", + "qubits": [ + "34" + ] + }, + { + "position": 59, + "gate": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "position": 60, + "gate": "ry", + "qubits": [ + "34" + ] + }, + { + "position": 61, + "gate": "u2", + "qubits": [ + "35" + ] + }, + { + "position": 62, + "gate": "cx", + "qubits": [ + "34", + "35" + ] + }, + { + "position": 63, + "gate": "ry", + "qubits": [ + "34" + ] + }, + { + "position": 64, + "gate": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "position": 65, + "gate": "ry", + "qubits": [ + "34" + ] + }, + { + "position": 66, + "gate": "cx", + "qubits": [ + "34", + "28" + ] + }, + { + "position": 67, + "gate": "rz", + "qubits": [ + "28" + ] + }, + { + "position": 68, + "gate": "ry", + "qubits": [ + "34" + ] + }, + { + "position": 69, + "gate": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "position": 70, + "gate": "ry", + "qubits": [ + "34" + ] + }, + { + "position": 71, + "gate": "cx", + "qubits": [ + "34", + "35" + ] + }, + { + "position": 72, + "gate": "ry", + "qubits": [ + "34" + ] + }, + { + "position": 73, + "gate": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "position": 74, + "gate": "u2", + "qubits": [ + "29" + ] + }, + { + "position": 75, + "gate": "ry", + "qubits": [ + "34" + ] + }, + { + "position": 76, + "gate": "cx", + "qubits": [ + "34", + "28" + ] + }, + { + "position": 77, + "gate": "u2", + "qubits": [ + "28" + ] + }, + { + "position": 78, + "gate": "rz", + "qubits": [ + "34" + ] + }, + { + "position": 79, + "gate": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "position": 80, + "gate": "u2", + "qubits": [ + "35" + ] + }, + { + "position": 81, + "gate": "cx", + "qubits": [ + "28", + "35" + ] + }, + { + "position": 82, + "gate": "x", + "qubits": [ + "36" + ] + }, + { + "position": 83, + "gate": "x", + "qubits": [ + "37" + ] + }, + { + "position": 84, + "gate": "x", + "qubits": [ + "38" + ] + }, + { + "position": 85, + "gate": "x", + "qubits": [ + "39" + ] + }, + { + "position": 86, + "gate": "x", + "qubits": [ + "40" + ] + }, + { + "position": 87, + "gate": "x", + "qubits": [ + "41" + ] + }, + { + "position": 88, + "gate": "x", + "qubits": [ + "42" + ] + }, + { + "position": 89, + "gate": "x", + "qubits": [ + "43" + ] + } + ], + "dag_hierarchical": [ + { + "type": "gate", + "name": "x", + "qubits": [ + "12" + ], + "position": 0 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "13" + ], + "position": 1 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "14" + ], + "position": 2 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "15" + ], + "position": 3 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "16" + ], + "position": 4 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "17" + ], + "position": 5 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "18" + ], + "position": 6 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "19" + ], + "position": 7 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "20" + ], + "position": 8 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "21" + ], + "position": 9 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "22" + ], + "position": 10 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "23" + ], + "position": 11 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "24" + ], + "position": 12 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "25" + ], + "position": 13 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "26" + ], + "position": 14 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "27" + ], + "position": 15 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "28" + ], + "position": 16 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "29" + ], + "position": 17 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "28", + "29" + ], + "position": 18 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "29" + ], + "position": 19 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "30" + ], + "position": 20 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "31" + ], + "position": 21 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "32" + ], + "position": 22 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "33" + ], + "position": 23 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "34" + ], + "position": 24 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "35" + ], + "position": 25 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "34", + "35" + ], + "position": 26 + }, + { + "type": "macro", + "label": "RY Rotation with Entangling Layer", + "size": 4, + "gates": [ + { + "name": "cx", + "qubits": [ + "28", + "34" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ], + "start_position": 27, + "end_position": 31 + }, + { + "type": "gate", + "name": "h", + "qubits": [ + "34" + ], + "position": 31 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "35" + ], + "position": 32 + }, + { + "type": "macro", + "label": "RY Rotation with Entangling Layer", + "size": 4, + "gates": [ + { + "name": "cx", + "qubits": [ + "28", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ], + "start_position": 33, + "end_position": 37 + }, + { + "type": "macro", + "label": "RY Rotation with Entangling Layer", + "size": 4, + "gates": [ + { + "name": "cx", + "qubits": [ + "28", + "34" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ], + "start_position": 37, + "end_position": 41 + }, + { + "type": "macro", + "label": "RY Rotation with Entangling Layer", + "size": 4, + "gates": [ + { + "name": "cx", + "qubits": [ + "28", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ], + "start_position": 41, + "end_position": 45 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "29" + ], + "position": 45 + }, + { + "type": "gate", + "name": "rz", + "qubits": [ + "34" + ], + "position": 46 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "28", + "34" + ], + "position": 47 + }, + { + "type": "gate", + "name": "rz", + "qubits": [ + "28" + ], + "position": 48 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "28", + "29" + ], + "position": 49 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "34" + ], + "position": 50 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "35" + ], + "position": 51 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "34", + "35" + ], + "position": 52 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "28", + "35" + ], + "position": 53 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "34", + "29" + ], + "position": 54 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "29" + ], + "position": 55 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "34", + "28" + ], + "position": 56 + }, + { + "type": "gate", + "name": "h", + "qubits": [ + "28" + ], + "position": 57 + }, + { + "type": "macro", + "label": "Rotation-Entangling Block", + "size": 3, + "gates": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + } + ], + "start_position": 58, + "end_position": 61 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "35" + ], + "position": 61 + }, + { + "type": "macro", + "label": "RY Rotation with CNOT Pair", + "size": 3, + "gates": [ + { + "name": "cx", + "qubits": [ + "34", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + } + ], + "start_position": 62, + "end_position": 65 + }, + { + "type": "macro", + "label": "RY Rotation Block", + "size": 2, + "gates": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "28" + ] + } + ], + "start_position": 65, + "end_position": 67 + }, + { + "type": "gate", + "name": "rz", + "qubits": [ + "28" + ], + "position": 67 + }, + { + "type": "macro", + "label": "Rotation-Entangling Block", + "size": 3, + "gates": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + } + ], + "start_position": 68, + "end_position": 71 + }, + { + "type": "macro", + "label": "RY Rotation with CNOT Pair", + "size": 3, + "gates": [ + { + "name": "cx", + "qubits": [ + "34", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + } + ], + "start_position": 71, + "end_position": 74 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "29" + ], + "position": 74 + }, + { + "type": "macro", + "label": "RY Rotation Block", + "size": 2, + "gates": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "28" + ] + } + ], + "start_position": 75, + "end_position": 77 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "28" + ], + "position": 77 + }, + { + "type": "gate", + "name": "rz", + "qubits": [ + "34" + ], + "position": 78 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "34", + "29" + ], + "position": 79 + }, + { + "type": "gate", + "name": "u2", + "qubits": [ + "35" + ], + "position": 80 + }, + { + "type": "gate", + "name": "cx", + "qubits": [ + "28", + "35" + ], + "position": 81 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "36" + ], + "position": 82 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "37" + ], + "position": 83 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "38" + ], + "position": 84 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "39" + ], + "position": 85 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "40" + ], + "position": 86 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "41" + ], + "position": 87 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "42" + ], + "position": 88 + }, + { + "type": "gate", + "name": "x", + "qubits": [ + "43" + ], + "position": 89 + } + ], + "macros": [ + { + "label": "RY Rotation with Entangling Layer", + "count": 2, + "window_size": 4, + "gates": [ + { + "name": "cx", + "qubits": [ + "28", + "34" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ], + "positions": [ + { + "start": 27, + "end": 31 + }, + { + "start": 37, + "end": 41 + } + ] + }, + { + "label": "RY Rotation with Entangling Layer", + "count": 2, + "window_size": 4, + "gates": [ + { + "name": "cx", + "qubits": [ + "28", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ], + "positions": [ + { + "start": 33, + "end": 37 + }, + { + "start": 41, + "end": 45 + } + ] + }, + { + "label": "Rotation-Entangling Block", + "count": 2, + "window_size": 3, + "gates": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + } + ], + "positions": [ + { + "start": 58, + "end": 61 + }, + { + "start": 68, + "end": 71 + } + ] + }, + { + "label": "RY Rotation with CNOT Pair", + "count": 2, + "window_size": 3, + "gates": [ + { + "name": "cx", + "qubits": [ + "34", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + } + ], + "positions": [ + { + "start": 62, + "end": 65 + }, + { + "start": 71, + "end": 74 + } + ] + }, + { + "label": "RY Rotation Block", + "count": 2, + "window_size": 2, + "gates": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "28" + ] + } + ], + "positions": [ + { + "start": 65, + "end": 67 + }, + { + "start": 75, + "end": 77 + } + ] + } + ], + "statistics": { + "original_gates": 90, + "transpiled_gates": 90, + "circuit_depth": 41, + "num_qubits": 44, + "num_macros": 5, + "total_macro_instances": 10, + "hierarchical_items": 68, + "compression_ratio": 1.32, + "dag_nodes": 178, + "dag_edges": 160 + } +} \ No newline at end of file diff --git a/Quilt/macro_gate_detector/tests/output_test_1/circuit_graph.json b/Quilt/macro_gate_detector/tests/output_test_1/circuit_graph.json new file mode 100644 index 0000000..9342953 --- /dev/null +++ b/Quilt/macro_gate_detector/tests/output_test_1/circuit_graph.json @@ -0,0 +1,3084 @@ +{ + "nodes": [ + { + "id": "q_start_0", + "name": "q0_init", + "type": "init", + "position": -1, + "qubits": [ + "0" + ], + "layer": -1 + }, + { + "id": "q_start_1", + "name": "q1_init", + "type": "init", + "position": -1, + "qubits": [ + "1" + ], + "layer": -1 + }, + { + "id": "q_start_2", + "name": "q2_init", + "type": "init", + "position": -1, + "qubits": [ + "2" + ], + "layer": -1 + }, + { + "id": "q_start_3", + "name": "q3_init", + "type": "init", + "position": -1, + "qubits": [ + "3" + ], + "layer": -1 + }, + { + "id": "q_start_4", + "name": "q4_init", + "type": "init", + "position": -1, + "qubits": [ + "4" + ], + "layer": -1 + }, + { + "id": "q_start_5", + "name": "q5_init", + "type": "init", + "position": -1, + "qubits": [ + "5" + ], + "layer": -1 + }, + { + "id": "q_start_6", + "name": "q6_init", + "type": "init", + "position": -1, + "qubits": [ + "6" + ], + "layer": -1 + }, + { + "id": "q_start_7", + "name": "q7_init", + "type": "init", + "position": -1, + "qubits": [ + "7" + ], + "layer": -1 + }, + { + "id": "q_start_8", + "name": "q8_init", + "type": "init", + "position": -1, + "qubits": [ + "8" + ], + "layer": -1 + }, + { + "id": "q_start_9", + "name": "q9_init", + "type": "init", + "position": -1, + "qubits": [ + "9" + ], + "layer": -1 + }, + { + "id": "q_start_10", + "name": "q10_init", + "type": "init", + "position": -1, + "qubits": [ + "10" + ], + "layer": -1 + }, + { + "id": "q_start_11", + "name": "q11_init", + "type": "init", + "position": -1, + "qubits": [ + "11" + ], + "layer": -1 + }, + { + "id": "q_start_12", + "name": "q12_init", + "type": "init", + "position": -1, + "qubits": [ + "12" + ], + "layer": -1 + }, + { + "id": "q_start_13", + "name": "q13_init", + "type": "init", + "position": -1, + "qubits": [ + "13" + ], + "layer": -1 + }, + { + "id": "q_start_14", + "name": "q14_init", + "type": "init", + "position": -1, + "qubits": [ + "14" + ], + "layer": -1 + }, + { + "id": "q_start_15", + "name": "q15_init", + "type": "init", + "position": -1, + "qubits": [ + "15" + ], + "layer": -1 + }, + { + "id": "q_start_16", + "name": "q16_init", + "type": "init", + "position": -1, + "qubits": [ + "16" + ], + "layer": -1 + }, + { + "id": "q_start_17", + "name": "q17_init", + "type": "init", + "position": -1, + "qubits": [ + "17" + ], + "layer": -1 + }, + { + "id": "q_start_18", + "name": "q18_init", + "type": "init", + "position": -1, + "qubits": [ + "18" + ], + "layer": -1 + }, + { + "id": "q_start_19", + "name": "q19_init", + "type": "init", + "position": -1, + "qubits": [ + "19" + ], + "layer": -1 + }, + { + "id": "q_start_20", + "name": "q20_init", + "type": "init", + "position": -1, + "qubits": [ + "20" + ], + "layer": -1 + }, + { + "id": "q_start_21", + "name": "q21_init", + "type": "init", + "position": -1, + "qubits": [ + "21" + ], + "layer": -1 + }, + { + "id": "q_start_22", + "name": "q22_init", + "type": "init", + "position": -1, + "qubits": [ + "22" + ], + "layer": -1 + }, + { + "id": "q_start_23", + "name": "q23_init", + "type": "init", + "position": -1, + "qubits": [ + "23" + ], + "layer": -1 + }, + { + "id": "q_start_24", + "name": "q24_init", + "type": "init", + "position": -1, + "qubits": [ + "24" + ], + "layer": -1 + }, + { + "id": "q_start_25", + "name": "q25_init", + "type": "init", + "position": -1, + "qubits": [ + "25" + ], + "layer": -1 + }, + { + "id": "q_start_26", + "name": "q26_init", + "type": "init", + "position": -1, + "qubits": [ + "26" + ], + "layer": -1 + }, + { + "id": "q_start_27", + "name": "q27_init", + "type": "init", + "position": -1, + "qubits": [ + "27" + ], + "layer": -1 + }, + { + "id": "q_start_28", + "name": "q28_init", + "type": "init", + "position": -1, + "qubits": [ + "28" + ], + "layer": -1 + }, + { + "id": "q_start_29", + "name": "q29_init", + "type": "init", + "position": -1, + "qubits": [ + "29" + ], + "layer": -1 + }, + { + "id": "q_start_30", + "name": "q30_init", + "type": "init", + "position": -1, + "qubits": [ + "30" + ], + "layer": -1 + }, + { + "id": "q_start_31", + "name": "q31_init", + "type": "init", + "position": -1, + "qubits": [ + "31" + ], + "layer": -1 + }, + { + "id": "q_start_32", + "name": "q32_init", + "type": "init", + "position": -1, + "qubits": [ + "32" + ], + "layer": -1 + }, + { + "id": "q_start_33", + "name": "q33_init", + "type": "init", + "position": -1, + "qubits": [ + "33" + ], + "layer": -1 + }, + { + "id": "q_start_34", + "name": "q34_init", + "type": "init", + "position": -1, + "qubits": [ + "34" + ], + "layer": -1 + }, + { + "id": "q_start_35", + "name": "q35_init", + "type": "init", + "position": -1, + "qubits": [ + "35" + ], + "layer": -1 + }, + { + "id": "q_start_36", + "name": "q36_init", + "type": "init", + "position": -1, + "qubits": [ + "36" + ], + "layer": -1 + }, + { + "id": "q_start_37", + "name": "q37_init", + "type": "init", + "position": -1, + "qubits": [ + "37" + ], + "layer": -1 + }, + { + "id": "q_start_38", + "name": "q38_init", + "type": "init", + "position": -1, + "qubits": [ + "38" + ], + "layer": -1 + }, + { + "id": "q_start_39", + "name": "q39_init", + "type": "init", + "position": -1, + "qubits": [ + "39" + ], + "layer": -1 + }, + { + "id": "q_start_40", + "name": "q40_init", + "type": "init", + "position": -1, + "qubits": [ + "40" + ], + "layer": -1 + }, + { + "id": "q_start_41", + "name": "q41_init", + "type": "init", + "position": -1, + "qubits": [ + "41" + ], + "layer": -1 + }, + { + "id": "q_start_42", + "name": "q42_init", + "type": "init", + "position": -1, + "qubits": [ + "42" + ], + "layer": -1 + }, + { + "id": "q_start_43", + "name": "q43_init", + "type": "init", + "position": -1, + "qubits": [ + "43" + ], + "layer": -1 + }, + { + "id": "gate_0", + "name": "x", + "type": "gate", + "position": 0, + "qubits": [ + "12" + ], + "layer": 0 + }, + { + "id": "gate_1", + "name": "x", + "type": "gate", + "position": 1, + "qubits": [ + "13" + ], + "layer": 0 + }, + { + "id": "gate_2", + "name": "x", + "type": "gate", + "position": 2, + "qubits": [ + "14" + ], + "layer": 0 + }, + { + "id": "gate_3", + "name": "x", + "type": "gate", + "position": 3, + "qubits": [ + "15" + ], + "layer": 0 + }, + { + "id": "gate_4", + "name": "x", + "type": "gate", + "position": 4, + "qubits": [ + "16" + ], + "layer": 0 + }, + { + "id": "gate_5", + "name": "x", + "type": "gate", + "position": 5, + "qubits": [ + "17" + ], + "layer": 0 + }, + { + "id": "gate_6", + "name": "x", + "type": "gate", + "position": 6, + "qubits": [ + "18" + ], + "layer": 0 + }, + { + "id": "gate_7", + "name": "x", + "type": "gate", + "position": 7, + "qubits": [ + "19" + ], + "layer": 0 + }, + { + "id": "gate_8", + "name": "x", + "type": "gate", + "position": 8, + "qubits": [ + "20" + ], + "layer": 0 + }, + { + "id": "gate_9", + "name": "x", + "type": "gate", + "position": 9, + "qubits": [ + "21" + ], + "layer": 0 + }, + { + "id": "gate_10", + "name": "x", + "type": "gate", + "position": 10, + "qubits": [ + "22" + ], + "layer": 0 + }, + { + "id": "gate_11", + "name": "x", + "type": "gate", + "position": 11, + "qubits": [ + "23" + ], + "layer": 0 + }, + { + "id": "gate_12", + "name": "x", + "type": "gate", + "position": 12, + "qubits": [ + "24" + ], + "layer": 0 + }, + { + "id": "gate_13", + "name": "x", + "type": "gate", + "position": 13, + "qubits": [ + "25" + ], + "layer": 0 + }, + { + "id": "gate_14", + "name": "x", + "type": "gate", + "position": 14, + "qubits": [ + "26" + ], + "layer": 0 + }, + { + "id": "gate_15", + "name": "x", + "type": "gate", + "position": 15, + "qubits": [ + "27" + ], + "layer": 0 + }, + { + "id": "gate_16", + "name": "x", + "type": "gate", + "position": 16, + "qubits": [ + "28" + ], + "layer": 0 + }, + { + "id": "gate_17", + "name": "x", + "type": "gate", + "position": 17, + "qubits": [ + "29" + ], + "layer": 0 + }, + { + "id": "gate_18", + "name": "cx", + "type": "gate", + "position": 18, + "qubits": [ + "28", + "29" + ], + "layer": 1 + }, + { + "id": "gate_19", + "name": "u2", + "type": "gate", + "position": 19, + "qubits": [ + "29" + ], + "layer": 2 + }, + { + "id": "gate_20", + "name": "x", + "type": "gate", + "position": 20, + "qubits": [ + "30" + ], + "layer": 0 + }, + { + "id": "gate_21", + "name": "x", + "type": "gate", + "position": 21, + "qubits": [ + "31" + ], + "layer": 0 + }, + { + "id": "gate_22", + "name": "x", + "type": "gate", + "position": 22, + "qubits": [ + "32" + ], + "layer": 0 + }, + { + "id": "gate_23", + "name": "x", + "type": "gate", + "position": 23, + "qubits": [ + "33" + ], + "layer": 0 + }, + { + "id": "gate_24", + "name": "x", + "type": "gate", + "position": 24, + "qubits": [ + "34" + ], + "layer": 0 + }, + { + "id": "gate_25", + "name": "x", + "type": "gate", + "position": 25, + "qubits": [ + "35" + ], + "layer": 0 + }, + { + "id": "gate_26", + "name": "cx", + "type": "gate", + "position": 26, + "qubits": [ + "34", + "35" + ], + "layer": 1 + }, + { + "id": "gate_27", + "name": "cx", + "type": "gate", + "position": 27, + "qubits": [ + "28", + "34" + ], + "layer": 2 + }, + { + "id": "gate_28", + "name": "ry", + "type": "gate", + "position": 28, + "qubits": [ + "28" + ], + "layer": 3 + }, + { + "id": "gate_29", + "name": "cx", + "type": "gate", + "position": 29, + "qubits": [ + "28", + "29" + ], + "layer": 4 + }, + { + "id": "gate_30", + "name": "ry", + "type": "gate", + "position": 30, + "qubits": [ + "28" + ], + "layer": 5 + }, + { + "id": "gate_31", + "name": "h", + "type": "gate", + "position": 31, + "qubits": [ + "34" + ], + "layer": 3 + }, + { + "id": "gate_32", + "name": "u2", + "type": "gate", + "position": 32, + "qubits": [ + "35" + ], + "layer": 2 + }, + { + "id": "gate_33", + "name": "cx", + "type": "gate", + "position": 33, + "qubits": [ + "28", + "35" + ], + "layer": 6 + }, + { + "id": "gate_34", + "name": "ry", + "type": "gate", + "position": 34, + "qubits": [ + "28" + ], + "layer": 7 + }, + { + "id": "gate_35", + "name": "cx", + "type": "gate", + "position": 35, + "qubits": [ + "28", + "29" + ], + "layer": 8 + }, + { + "id": "gate_36", + "name": "ry", + "type": "gate", + "position": 36, + "qubits": [ + "28" + ], + "layer": 9 + }, + { + "id": "gate_37", + "name": "cx", + "type": "gate", + "position": 37, + "qubits": [ + "28", + "34" + ], + "layer": 10 + }, + { + "id": "gate_38", + "name": "ry", + "type": "gate", + "position": 38, + "qubits": [ + "28" + ], + "layer": 11 + }, + { + "id": "gate_39", + "name": "cx", + "type": "gate", + "position": 39, + "qubits": [ + "28", + "29" + ], + "layer": 12 + }, + { + "id": "gate_40", + "name": "ry", + "type": "gate", + "position": 40, + "qubits": [ + "28" + ], + "layer": 13 + }, + { + "id": "gate_41", + "name": "cx", + "type": "gate", + "position": 41, + "qubits": [ + "28", + "35" + ], + "layer": 14 + }, + { + "id": "gate_42", + "name": "ry", + "type": "gate", + "position": 42, + "qubits": [ + "28" + ], + "layer": 15 + }, + { + "id": "gate_43", + "name": "cx", + "type": "gate", + "position": 43, + "qubits": [ + "28", + "29" + ], + "layer": 16 + }, + { + "id": "gate_44", + "name": "ry", + "type": "gate", + "position": 44, + "qubits": [ + "28" + ], + "layer": 17 + }, + { + "id": "gate_45", + "name": "u2", + "type": "gate", + "position": 45, + "qubits": [ + "29" + ], + "layer": 17 + }, + { + "id": "gate_46", + "name": "rz", + "type": "gate", + "position": 46, + "qubits": [ + "34" + ], + "layer": 11 + }, + { + "id": "gate_47", + "name": "cx", + "type": "gate", + "position": 47, + "qubits": [ + "28", + "34" + ], + "layer": 18 + }, + { + "id": "gate_48", + "name": "rz", + "type": "gate", + "position": 48, + "qubits": [ + "28" + ], + "layer": 19 + }, + { + "id": "gate_49", + "name": "cx", + "type": "gate", + "position": 49, + "qubits": [ + "28", + "29" + ], + "layer": 20 + }, + { + "id": "gate_50", + "name": "u2", + "type": "gate", + "position": 50, + "qubits": [ + "34" + ], + "layer": 19 + }, + { + "id": "gate_51", + "name": "u2", + "type": "gate", + "position": 51, + "qubits": [ + "35" + ], + "layer": 15 + }, + { + "id": "gate_52", + "name": "cx", + "type": "gate", + "position": 52, + "qubits": [ + "34", + "35" + ], + "layer": 20 + }, + { + "id": "gate_53", + "name": "cx", + "type": "gate", + "position": 53, + "qubits": [ + "28", + "35" + ], + "layer": 21 + }, + { + "id": "gate_54", + "name": "cx", + "type": "gate", + "position": 54, + "qubits": [ + "34", + "29" + ], + "layer": 21 + }, + { + "id": "gate_55", + "name": "u2", + "type": "gate", + "position": 55, + "qubits": [ + "29" + ], + "layer": 22 + }, + { + "id": "gate_56", + "name": "cx", + "type": "gate", + "position": 56, + "qubits": [ + "34", + "28" + ], + "layer": 22 + }, + { + "id": "gate_57", + "name": "h", + "type": "gate", + "position": 57, + "qubits": [ + "28" + ], + "layer": 23 + }, + { + "id": "gate_58", + "name": "ry", + "type": "gate", + "position": 58, + "qubits": [ + "34" + ], + "layer": 23 + }, + { + "id": "gate_59", + "name": "cx", + "type": "gate", + "position": 59, + "qubits": [ + "34", + "29" + ], + "layer": 24 + }, + { + "id": "gate_60", + "name": "ry", + "type": "gate", + "position": 60, + "qubits": [ + "34" + ], + "layer": 25 + }, + { + "id": "gate_61", + "name": "u2", + "type": "gate", + "position": 61, + "qubits": [ + "35" + ], + "layer": 22 + }, + { + "id": "gate_62", + "name": "cx", + "type": "gate", + "position": 62, + "qubits": [ + "34", + "35" + ], + "layer": 26 + }, + { + "id": "gate_63", + "name": "ry", + "type": "gate", + "position": 63, + "qubits": [ + "34" + ], + "layer": 27 + }, + { + "id": "gate_64", + "name": "cx", + "type": "gate", + "position": 64, + "qubits": [ + "34", + "29" + ], + "layer": 28 + }, + { + "id": "gate_65", + "name": "ry", + "type": "gate", + "position": 65, + "qubits": [ + "34" + ], + "layer": 29 + }, + { + "id": "gate_66", + "name": "cx", + "type": "gate", + "position": 66, + "qubits": [ + "34", + "28" + ], + "layer": 30 + }, + { + "id": "gate_67", + "name": "rz", + "type": "gate", + "position": 67, + "qubits": [ + "28" + ], + "layer": 31 + }, + { + "id": "gate_68", + "name": "ry", + "type": "gate", + "position": 68, + "qubits": [ + "34" + ], + "layer": 31 + }, + { + "id": "gate_69", + "name": "cx", + "type": "gate", + "position": 69, + "qubits": [ + "34", + "29" + ], + "layer": 32 + }, + { + "id": "gate_70", + "name": "ry", + "type": "gate", + "position": 70, + "qubits": [ + "34" + ], + "layer": 33 + }, + { + "id": "gate_71", + "name": "cx", + "type": "gate", + "position": 71, + "qubits": [ + "34", + "35" + ], + "layer": 34 + }, + { + "id": "gate_72", + "name": "ry", + "type": "gate", + "position": 72, + "qubits": [ + "34" + ], + "layer": 35 + }, + { + "id": "gate_73", + "name": "cx", + "type": "gate", + "position": 73, + "qubits": [ + "34", + "29" + ], + "layer": 36 + }, + { + "id": "gate_74", + "name": "u2", + "type": "gate", + "position": 74, + "qubits": [ + "29" + ], + "layer": 37 + }, + { + "id": "gate_75", + "name": "ry", + "type": "gate", + "position": 75, + "qubits": [ + "34" + ], + "layer": 37 + }, + { + "id": "gate_76", + "name": "cx", + "type": "gate", + "position": 76, + "qubits": [ + "34", + "28" + ], + "layer": 38 + }, + { + "id": "gate_77", + "name": "u2", + "type": "gate", + "position": 77, + "qubits": [ + "28" + ], + "layer": 39 + }, + { + "id": "gate_78", + "name": "rz", + "type": "gate", + "position": 78, + "qubits": [ + "34" + ], + "layer": 39 + }, + { + "id": "gate_79", + "name": "cx", + "type": "gate", + "position": 79, + "qubits": [ + "34", + "29" + ], + "layer": 40 + }, + { + "id": "gate_80", + "name": "u2", + "type": "gate", + "position": 80, + "qubits": [ + "35" + ], + "layer": 35 + }, + { + "id": "gate_81", + "name": "cx", + "type": "gate", + "position": 81, + "qubits": [ + "28", + "35" + ], + "layer": 40 + }, + { + "id": "gate_82", + "name": "x", + "type": "gate", + "position": 82, + "qubits": [ + "36" + ], + "layer": 0 + }, + { + "id": "gate_83", + "name": "x", + "type": "gate", + "position": 83, + "qubits": [ + "37" + ], + "layer": 0 + }, + { + "id": "gate_84", + "name": "x", + "type": "gate", + "position": 84, + "qubits": [ + "38" + ], + "layer": 0 + }, + { + "id": "gate_85", + "name": "x", + "type": "gate", + "position": 85, + "qubits": [ + "39" + ], + "layer": 0 + }, + { + "id": "gate_86", + "name": "x", + "type": "gate", + "position": 86, + "qubits": [ + "40" + ], + "layer": 0 + }, + { + "id": "gate_87", + "name": "x", + "type": "gate", + "position": 87, + "qubits": [ + "41" + ], + "layer": 0 + }, + { + "id": "gate_88", + "name": "x", + "type": "gate", + "position": 88, + "qubits": [ + "42" + ], + "layer": 0 + }, + { + "id": "gate_89", + "name": "x", + "type": "gate", + "position": 89, + "qubits": [ + "43" + ], + "layer": 0 + }, + { + "id": "q_end_0", + "name": "q0_end", + "type": "end", + "position": 90, + "qubits": [ + "0" + ], + "layer": 41 + }, + { + "id": "q_end_1", + "name": "q1_end", + "type": "end", + "position": 90, + "qubits": [ + "1" + ], + "layer": 41 + }, + { + "id": "q_end_2", + "name": "q2_end", + "type": "end", + "position": 90, + "qubits": [ + "2" + ], + "layer": 41 + }, + { + "id": "q_end_3", + "name": "q3_end", + "type": "end", + "position": 90, + "qubits": [ + "3" + ], + "layer": 41 + }, + { + "id": "q_end_4", + "name": "q4_end", + "type": "end", + "position": 90, + "qubits": [ + "4" + ], + "layer": 41 + }, + { + "id": "q_end_5", + "name": "q5_end", + "type": "end", + "position": 90, + "qubits": [ + "5" + ], + "layer": 41 + }, + { + "id": "q_end_6", + "name": "q6_end", + "type": "end", + "position": 90, + "qubits": [ + "6" + ], + "layer": 41 + }, + { + "id": "q_end_7", + "name": "q7_end", + "type": "end", + "position": 90, + "qubits": [ + "7" + ], + "layer": 41 + }, + { + "id": "q_end_8", + "name": "q8_end", + "type": "end", + "position": 90, + "qubits": [ + "8" + ], + "layer": 41 + }, + { + "id": "q_end_9", + "name": "q9_end", + "type": "end", + "position": 90, + "qubits": [ + "9" + ], + "layer": 41 + }, + { + "id": "q_end_10", + "name": "q10_end", + "type": "end", + "position": 90, + "qubits": [ + "10" + ], + "layer": 41 + }, + { + "id": "q_end_11", + "name": "q11_end", + "type": "end", + "position": 90, + "qubits": [ + "11" + ], + "layer": 41 + }, + { + "id": "q_end_12", + "name": "q12_end", + "type": "end", + "position": 90, + "qubits": [ + "12" + ], + "layer": 41 + }, + { + "id": "q_end_13", + "name": "q13_end", + "type": "end", + "position": 90, + "qubits": [ + "13" + ], + "layer": 41 + }, + { + "id": "q_end_14", + "name": "q14_end", + "type": "end", + "position": 90, + "qubits": [ + "14" + ], + "layer": 41 + }, + { + "id": "q_end_15", + "name": "q15_end", + "type": "end", + "position": 90, + "qubits": [ + "15" + ], + "layer": 41 + }, + { + "id": "q_end_16", + "name": "q16_end", + "type": "end", + "position": 90, + "qubits": [ + "16" + ], + "layer": 41 + }, + { + "id": "q_end_17", + "name": "q17_end", + "type": "end", + "position": 90, + "qubits": [ + "17" + ], + "layer": 41 + }, + { + "id": "q_end_18", + "name": "q18_end", + "type": "end", + "position": 90, + "qubits": [ + "18" + ], + "layer": 41 + }, + { + "id": "q_end_19", + "name": "q19_end", + "type": "end", + "position": 90, + "qubits": [ + "19" + ], + "layer": 41 + }, + { + "id": "q_end_20", + "name": "q20_end", + "type": "end", + "position": 90, + "qubits": [ + "20" + ], + "layer": 41 + }, + { + "id": "q_end_21", + "name": "q21_end", + "type": "end", + "position": 90, + "qubits": [ + "21" + ], + "layer": 41 + }, + { + "id": "q_end_22", + "name": "q22_end", + "type": "end", + "position": 90, + "qubits": [ + "22" + ], + "layer": 41 + }, + { + "id": "q_end_23", + "name": "q23_end", + "type": "end", + "position": 90, + "qubits": [ + "23" + ], + "layer": 41 + }, + { + "id": "q_end_24", + "name": "q24_end", + "type": "end", + "position": 90, + "qubits": [ + "24" + ], + "layer": 41 + }, + { + "id": "q_end_25", + "name": "q25_end", + "type": "end", + "position": 90, + "qubits": [ + "25" + ], + "layer": 41 + }, + { + "id": "q_end_26", + "name": "q26_end", + "type": "end", + "position": 90, + "qubits": [ + "26" + ], + "layer": 41 + }, + { + "id": "q_end_27", + "name": "q27_end", + "type": "end", + "position": 90, + "qubits": [ + "27" + ], + "layer": 41 + }, + { + "id": "q_end_28", + "name": "q28_end", + "type": "end", + "position": 90, + "qubits": [ + "28" + ], + "layer": 41 + }, + { + "id": "q_end_29", + "name": "q29_end", + "type": "end", + "position": 90, + "qubits": [ + "29" + ], + "layer": 41 + }, + { + "id": "q_end_30", + "name": "q30_end", + "type": "end", + "position": 90, + "qubits": [ + "30" + ], + "layer": 41 + }, + { + "id": "q_end_31", + "name": "q31_end", + "type": "end", + "position": 90, + "qubits": [ + "31" + ], + "layer": 41 + }, + { + "id": "q_end_32", + "name": "q32_end", + "type": "end", + "position": 90, + "qubits": [ + "32" + ], + "layer": 41 + }, + { + "id": "q_end_33", + "name": "q33_end", + "type": "end", + "position": 90, + "qubits": [ + "33" + ], + "layer": 41 + }, + { + "id": "q_end_34", + "name": "q34_end", + "type": "end", + "position": 90, + "qubits": [ + "34" + ], + "layer": 41 + }, + { + "id": "q_end_35", + "name": "q35_end", + "type": "end", + "position": 90, + "qubits": [ + "35" + ], + "layer": 41 + }, + { + "id": "q_end_36", + "name": "q36_end", + "type": "end", + "position": 90, + "qubits": [ + "36" + ], + "layer": 41 + }, + { + "id": "q_end_37", + "name": "q37_end", + "type": "end", + "position": 90, + "qubits": [ + "37" + ], + "layer": 41 + }, + { + "id": "q_end_38", + "name": "q38_end", + "type": "end", + "position": 90, + "qubits": [ + "38" + ], + "layer": 41 + }, + { + "id": "q_end_39", + "name": "q39_end", + "type": "end", + "position": 90, + "qubits": [ + "39" + ], + "layer": 41 + }, + { + "id": "q_end_40", + "name": "q40_end", + "type": "end", + "position": 90, + "qubits": [ + "40" + ], + "layer": 41 + }, + { + "id": "q_end_41", + "name": "q41_end", + "type": "end", + "position": 90, + "qubits": [ + "41" + ], + "layer": 41 + }, + { + "id": "q_end_42", + "name": "q42_end", + "type": "end", + "position": 90, + "qubits": [ + "42" + ], + "layer": 41 + }, + { + "id": "q_end_43", + "name": "q43_end", + "type": "end", + "position": 90, + "qubits": [ + "43" + ], + "layer": 41 + } + ], + "edges": [ + { + "name": "q12", + "from-node": "q_start_12", + "to-node": "gate_0", + "qubit": "12" + }, + { + "name": "q13", + "from-node": "q_start_13", + "to-node": "gate_1", + "qubit": "13" + }, + { + "name": "q14", + "from-node": "q_start_14", + "to-node": "gate_2", + "qubit": "14" + }, + { + "name": "q15", + "from-node": "q_start_15", + "to-node": "gate_3", + "qubit": "15" + }, + { + "name": "q16", + "from-node": "q_start_16", + "to-node": "gate_4", + "qubit": "16" + }, + { + "name": "q17", + "from-node": "q_start_17", + "to-node": "gate_5", + "qubit": "17" + }, + { + "name": "q18", + "from-node": "q_start_18", + "to-node": "gate_6", + "qubit": "18" + }, + { + "name": "q19", + "from-node": "q_start_19", + "to-node": "gate_7", + "qubit": "19" + }, + { + "name": "q20", + "from-node": "q_start_20", + "to-node": "gate_8", + "qubit": "20" + }, + { + "name": "q21", + "from-node": "q_start_21", + "to-node": "gate_9", + "qubit": "21" + }, + { + "name": "q22", + "from-node": "q_start_22", + "to-node": "gate_10", + "qubit": "22" + }, + { + "name": "q23", + "from-node": "q_start_23", + "to-node": "gate_11", + "qubit": "23" + }, + { + "name": "q24", + "from-node": "q_start_24", + "to-node": "gate_12", + "qubit": "24" + }, + { + "name": "q25", + "from-node": "q_start_25", + "to-node": "gate_13", + "qubit": "25" + }, + { + "name": "q26", + "from-node": "q_start_26", + "to-node": "gate_14", + "qubit": "26" + }, + { + "name": "q27", + "from-node": "q_start_27", + "to-node": "gate_15", + "qubit": "27" + }, + { + "name": "q28", + "from-node": "q_start_28", + "to-node": "gate_16", + "qubit": "28" + }, + { + "name": "q29", + "from-node": "q_start_29", + "to-node": "gate_17", + "qubit": "29" + }, + { + "name": "q28", + "from-node": "gate_16", + "to-node": "gate_18", + "qubit": "28" + }, + { + "name": "q29", + "from-node": "gate_17", + "to-node": "gate_18", + "qubit": "29" + }, + { + "name": "q29", + "from-node": "gate_18", + "to-node": "gate_19", + "qubit": "29" + }, + { + "name": "q30", + "from-node": "q_start_30", + "to-node": "gate_20", + "qubit": "30" + }, + { + "name": "q31", + "from-node": "q_start_31", + "to-node": "gate_21", + "qubit": "31" + }, + { + "name": "q32", + "from-node": "q_start_32", + "to-node": "gate_22", + "qubit": "32" + }, + { + "name": "q33", + "from-node": "q_start_33", + "to-node": "gate_23", + "qubit": "33" + }, + { + "name": "q34", + "from-node": "q_start_34", + "to-node": "gate_24", + "qubit": "34" + }, + { + "name": "q35", + "from-node": "q_start_35", + "to-node": "gate_25", + "qubit": "35" + }, + { + "name": "q34", + "from-node": "gate_24", + "to-node": "gate_26", + "qubit": "34" + }, + { + "name": "q35", + "from-node": "gate_25", + "to-node": "gate_26", + "qubit": "35" + }, + { + "name": "q28", + "from-node": "gate_18", + "to-node": "gate_27", + "qubit": "28" + }, + { + "name": "q34", + "from-node": "gate_26", + "to-node": "gate_27", + "qubit": "34" + }, + { + "name": "q28", + "from-node": "gate_27", + "to-node": "gate_28", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_28", + "to-node": "gate_29", + "qubit": "28" + }, + { + "name": "q29", + "from-node": "gate_19", + "to-node": "gate_29", + "qubit": "29" + }, + { + "name": "q28", + "from-node": "gate_29", + "to-node": "gate_30", + "qubit": "28" + }, + { + "name": "q34", + "from-node": "gate_27", + "to-node": "gate_31", + "qubit": "34" + }, + { + "name": "q35", + "from-node": "gate_26", + "to-node": "gate_32", + "qubit": "35" + }, + { + "name": "q28", + "from-node": "gate_30", + "to-node": "gate_33", + "qubit": "28" + }, + { + "name": "q35", + "from-node": "gate_32", + "to-node": "gate_33", + "qubit": "35" + }, + { + "name": "q28", + "from-node": "gate_33", + "to-node": "gate_34", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_34", + "to-node": "gate_35", + "qubit": "28" + }, + { + "name": "q29", + "from-node": "gate_29", + "to-node": "gate_35", + "qubit": "29" + }, + { + "name": "q28", + "from-node": "gate_35", + "to-node": "gate_36", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_36", + "to-node": "gate_37", + "qubit": "28" + }, + { + "name": "q34", + "from-node": "gate_31", + "to-node": "gate_37", + "qubit": "34" + }, + { + "name": "q28", + "from-node": "gate_37", + "to-node": "gate_38", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_38", + "to-node": "gate_39", + "qubit": "28" + }, + { + "name": "q29", + "from-node": "gate_35", + "to-node": "gate_39", + "qubit": "29" + }, + { + "name": "q28", + "from-node": "gate_39", + "to-node": "gate_40", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_40", + "to-node": "gate_41", + "qubit": "28" + }, + { + "name": "q35", + "from-node": "gate_33", + "to-node": "gate_41", + "qubit": "35" + }, + { + "name": "q28", + "from-node": "gate_41", + "to-node": "gate_42", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_42", + "to-node": "gate_43", + "qubit": "28" + }, + { + "name": "q29", + "from-node": "gate_39", + "to-node": "gate_43", + "qubit": "29" + }, + { + "name": "q28", + "from-node": "gate_43", + "to-node": "gate_44", + "qubit": "28" + }, + { + "name": "q29", + "from-node": "gate_43", + "to-node": "gate_45", + "qubit": "29" + }, + { + "name": "q34", + "from-node": "gate_37", + "to-node": "gate_46", + "qubit": "34" + }, + { + "name": "q28", + "from-node": "gate_44", + "to-node": "gate_47", + "qubit": "28" + }, + { + "name": "q34", + "from-node": "gate_46", + "to-node": "gate_47", + "qubit": "34" + }, + { + "name": "q28", + "from-node": "gate_47", + "to-node": "gate_48", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_48", + "to-node": "gate_49", + "qubit": "28" + }, + { + "name": "q29", + "from-node": "gate_45", + "to-node": "gate_49", + "qubit": "29" + }, + { + "name": "q34", + "from-node": "gate_47", + "to-node": "gate_50", + "qubit": "34" + }, + { + "name": "q35", + "from-node": "gate_41", + "to-node": "gate_51", + "qubit": "35" + }, + { + "name": "q34", + "from-node": "gate_50", + "to-node": "gate_52", + "qubit": "34" + }, + { + "name": "q35", + "from-node": "gate_51", + "to-node": "gate_52", + "qubit": "35" + }, + { + "name": "q28", + "from-node": "gate_49", + "to-node": "gate_53", + "qubit": "28" + }, + { + "name": "q35", + "from-node": "gate_52", + "to-node": "gate_53", + "qubit": "35" + }, + { + "name": "q34", + "from-node": "gate_52", + "to-node": "gate_54", + "qubit": "34" + }, + { + "name": "q29", + "from-node": "gate_49", + "to-node": "gate_54", + "qubit": "29" + }, + { + "name": "q29", + "from-node": "gate_54", + "to-node": "gate_55", + "qubit": "29" + }, + { + "name": "q34", + "from-node": "gate_54", + "to-node": "gate_56", + "qubit": "34" + }, + { + "name": "q28", + "from-node": "gate_53", + "to-node": "gate_56", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_56", + "to-node": "gate_57", + "qubit": "28" + }, + { + "name": "q34", + "from-node": "gate_56", + "to-node": "gate_58", + "qubit": "34" + }, + { + "name": "q34", + "from-node": "gate_58", + "to-node": "gate_59", + "qubit": "34" + }, + { + "name": "q29", + "from-node": "gate_55", + "to-node": "gate_59", + "qubit": "29" + }, + { + "name": "q34", + "from-node": "gate_59", + "to-node": "gate_60", + "qubit": "34" + }, + { + "name": "q35", + "from-node": "gate_53", + "to-node": "gate_61", + "qubit": "35" + }, + { + "name": "q34", + "from-node": "gate_60", + "to-node": "gate_62", + "qubit": "34" + }, + { + "name": "q35", + "from-node": "gate_61", + "to-node": "gate_62", + "qubit": "35" + }, + { + "name": "q34", + "from-node": "gate_62", + "to-node": "gate_63", + "qubit": "34" + }, + { + "name": "q34", + "from-node": "gate_63", + "to-node": "gate_64", + "qubit": "34" + }, + { + "name": "q29", + "from-node": "gate_59", + "to-node": "gate_64", + "qubit": "29" + }, + { + "name": "q34", + "from-node": "gate_64", + "to-node": "gate_65", + "qubit": "34" + }, + { + "name": "q34", + "from-node": "gate_65", + "to-node": "gate_66", + "qubit": "34" + }, + { + "name": "q28", + "from-node": "gate_57", + "to-node": "gate_66", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_66", + "to-node": "gate_67", + "qubit": "28" + }, + { + "name": "q34", + "from-node": "gate_66", + "to-node": "gate_68", + "qubit": "34" + }, + { + "name": "q34", + "from-node": "gate_68", + "to-node": "gate_69", + "qubit": "34" + }, + { + "name": "q29", + "from-node": "gate_64", + "to-node": "gate_69", + "qubit": "29" + }, + { + "name": "q34", + "from-node": "gate_69", + "to-node": "gate_70", + "qubit": "34" + }, + { + "name": "q34", + "from-node": "gate_70", + "to-node": "gate_71", + "qubit": "34" + }, + { + "name": "q35", + "from-node": "gate_62", + "to-node": "gate_71", + "qubit": "35" + }, + { + "name": "q34", + "from-node": "gate_71", + "to-node": "gate_72", + "qubit": "34" + }, + { + "name": "q34", + "from-node": "gate_72", + "to-node": "gate_73", + "qubit": "34" + }, + { + "name": "q29", + "from-node": "gate_69", + "to-node": "gate_73", + "qubit": "29" + }, + { + "name": "q29", + "from-node": "gate_73", + "to-node": "gate_74", + "qubit": "29" + }, + { + "name": "q34", + "from-node": "gate_73", + "to-node": "gate_75", + "qubit": "34" + }, + { + "name": "q34", + "from-node": "gate_75", + "to-node": "gate_76", + "qubit": "34" + }, + { + "name": "q28", + "from-node": "gate_67", + "to-node": "gate_76", + "qubit": "28" + }, + { + "name": "q28", + "from-node": "gate_76", + "to-node": "gate_77", + "qubit": "28" + }, + { + "name": "q34", + "from-node": "gate_76", + "to-node": "gate_78", + "qubit": "34" + }, + { + "name": "q34", + "from-node": "gate_78", + "to-node": "gate_79", + "qubit": "34" + }, + { + "name": "q29", + "from-node": "gate_74", + "to-node": "gate_79", + "qubit": "29" + }, + { + "name": "q35", + "from-node": "gate_71", + "to-node": "gate_80", + "qubit": "35" + }, + { + "name": "q28", + "from-node": "gate_77", + "to-node": "gate_81", + "qubit": "28" + }, + { + "name": "q35", + "from-node": "gate_80", + "to-node": "gate_81", + "qubit": "35" + }, + { + "name": "q36", + "from-node": "q_start_36", + "to-node": "gate_82", + "qubit": "36" + }, + { + "name": "q37", + "from-node": "q_start_37", + "to-node": "gate_83", + "qubit": "37" + }, + { + "name": "q38", + "from-node": "q_start_38", + "to-node": "gate_84", + "qubit": "38" + }, + { + "name": "q39", + "from-node": "q_start_39", + "to-node": "gate_85", + "qubit": "39" + }, + { + "name": "q40", + "from-node": "q_start_40", + "to-node": "gate_86", + "qubit": "40" + }, + { + "name": "q41", + "from-node": "q_start_41", + "to-node": "gate_87", + "qubit": "41" + }, + { + "name": "q42", + "from-node": "q_start_42", + "to-node": "gate_88", + "qubit": "42" + }, + { + "name": "q43", + "from-node": "q_start_43", + "to-node": "gate_89", + "qubit": "43" + }, + { + "name": "q0", + "from-node": "q_start_0", + "to-node": "q_end_0", + "qubit": "0" + }, + { + "name": "q1", + "from-node": "q_start_1", + "to-node": "q_end_1", + "qubit": "1" + }, + { + "name": "q2", + "from-node": "q_start_2", + "to-node": "q_end_2", + "qubit": "2" + }, + { + "name": "q3", + "from-node": "q_start_3", + "to-node": "q_end_3", + "qubit": "3" + }, + { + "name": "q4", + "from-node": "q_start_4", + "to-node": "q_end_4", + "qubit": "4" + }, + { + "name": "q5", + "from-node": "q_start_5", + "to-node": "q_end_5", + "qubit": "5" + }, + { + "name": "q6", + "from-node": "q_start_6", + "to-node": "q_end_6", + "qubit": "6" + }, + { + "name": "q7", + "from-node": "q_start_7", + "to-node": "q_end_7", + "qubit": "7" + }, + { + "name": "q8", + "from-node": "q_start_8", + "to-node": "q_end_8", + "qubit": "8" + }, + { + "name": "q9", + "from-node": "q_start_9", + "to-node": "q_end_9", + "qubit": "9" + }, + { + "name": "q10", + "from-node": "q_start_10", + "to-node": "q_end_10", + "qubit": "10" + }, + { + "name": "q11", + "from-node": "q_start_11", + "to-node": "q_end_11", + "qubit": "11" + }, + { + "name": "q12", + "from-node": "gate_0", + "to-node": "q_end_12", + "qubit": "12" + }, + { + "name": "q13", + "from-node": "gate_1", + "to-node": "q_end_13", + "qubit": "13" + }, + { + "name": "q14", + "from-node": "gate_2", + "to-node": "q_end_14", + "qubit": "14" + }, + { + "name": "q15", + "from-node": "gate_3", + "to-node": "q_end_15", + "qubit": "15" + }, + { + "name": "q16", + "from-node": "gate_4", + "to-node": "q_end_16", + "qubit": "16" + }, + { + "name": "q17", + "from-node": "gate_5", + "to-node": "q_end_17", + "qubit": "17" + }, + { + "name": "q18", + "from-node": "gate_6", + "to-node": "q_end_18", + "qubit": "18" + }, + { + "name": "q19", + "from-node": "gate_7", + "to-node": "q_end_19", + "qubit": "19" + }, + { + "name": "q20", + "from-node": "gate_8", + "to-node": "q_end_20", + "qubit": "20" + }, + { + "name": "q21", + "from-node": "gate_9", + "to-node": "q_end_21", + "qubit": "21" + }, + { + "name": "q22", + "from-node": "gate_10", + "to-node": "q_end_22", + "qubit": "22" + }, + { + "name": "q23", + "from-node": "gate_11", + "to-node": "q_end_23", + "qubit": "23" + }, + { + "name": "q24", + "from-node": "gate_12", + "to-node": "q_end_24", + "qubit": "24" + }, + { + "name": "q25", + "from-node": "gate_13", + "to-node": "q_end_25", + "qubit": "25" + }, + { + "name": "q26", + "from-node": "gate_14", + "to-node": "q_end_26", + "qubit": "26" + }, + { + "name": "q27", + "from-node": "gate_15", + "to-node": "q_end_27", + "qubit": "27" + }, + { + "name": "q28", + "from-node": "gate_81", + "to-node": "q_end_28", + "qubit": "28" + }, + { + "name": "q29", + "from-node": "gate_79", + "to-node": "q_end_29", + "qubit": "29" + }, + { + "name": "q30", + "from-node": "gate_20", + "to-node": "q_end_30", + "qubit": "30" + }, + { + "name": "q31", + "from-node": "gate_21", + "to-node": "q_end_31", + "qubit": "31" + }, + { + "name": "q32", + "from-node": "gate_22", + "to-node": "q_end_32", + "qubit": "32" + }, + { + "name": "q33", + "from-node": "gate_23", + "to-node": "q_end_33", + "qubit": "33" + }, + { + "name": "q34", + "from-node": "gate_79", + "to-node": "q_end_34", + "qubit": "34" + }, + { + "name": "q35", + "from-node": "gate_81", + "to-node": "q_end_35", + "qubit": "35" + }, + { + "name": "q36", + "from-node": "gate_82", + "to-node": "q_end_36", + "qubit": "36" + }, + { + "name": "q37", + "from-node": "gate_83", + "to-node": "q_end_37", + "qubit": "37" + }, + { + "name": "q38", + "from-node": "gate_84", + "to-node": "q_end_38", + "qubit": "38" + }, + { + "name": "q39", + "from-node": "gate_85", + "to-node": "q_end_39", + "qubit": "39" + }, + { + "name": "q40", + "from-node": "gate_86", + "to-node": "q_end_40", + "qubit": "40" + }, + { + "name": "q41", + "from-node": "gate_87", + "to-node": "q_end_41", + "qubit": "41" + }, + { + "name": "q42", + "from-node": "gate_88", + "to-node": "q_end_42", + "qubit": "42" + }, + { + "name": "q43", + "from-node": "gate_89", + "to-node": "q_end_43", + "qubit": "43" + } + ], + "macros": [ + { + "name": "RY Rotation with Entangling Layer", + "gate_ids": [ + "gate_27", + "gate_28", + "gate_29", + "gate_30" + ], + "nodes": [ + { + "name": "cx", + "qubits": [ + "28", + "34" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ] + }, + { + "name": "RY Rotation with Entangling Layer", + "gate_ids": [ + "gate_37", + "gate_38", + "gate_39", + "gate_40" + ], + "nodes": [ + { + "name": "cx", + "qubits": [ + "28", + "34" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ] + }, + { + "name": "RY Rotation with Entangling Layer", + "gate_ids": [ + "gate_33", + "gate_34", + "gate_35", + "gate_36" + ], + "nodes": [ + { + "name": "cx", + "qubits": [ + "28", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ] + }, + { + "name": "RY Rotation with Entangling Layer", + "gate_ids": [ + "gate_41", + "gate_42", + "gate_43", + "gate_44" + ], + "nodes": [ + { + "name": "cx", + "qubits": [ + "28", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + }, + { + "name": "cx", + "qubits": [ + "28", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "28" + ] + } + ] + }, + { + "name": "Rotation-Entangling Block", + "gate_ids": [ + "gate_58", + "gate_59", + "gate_60" + ], + "nodes": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + } + ] + }, + { + "name": "Rotation-Entangling Block", + "gate_ids": [ + "gate_68", + "gate_69", + "gate_70" + ], + "nodes": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + } + ] + }, + { + "name": "RY Rotation with CNOT Pair", + "gate_ids": [ + "gate_62", + "gate_63", + "gate_64" + ], + "nodes": [ + { + "name": "cx", + "qubits": [ + "34", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + } + ] + }, + { + "name": "RY Rotation with CNOT Pair", + "gate_ids": [ + "gate_71", + "gate_72", + "gate_73" + ], + "nodes": [ + { + "name": "cx", + "qubits": [ + "34", + "35" + ] + }, + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "29" + ] + } + ] + }, + { + "name": "RY Rotation Block", + "gate_ids": [ + "gate_65", + "gate_66" + ], + "nodes": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "28" + ] + } + ] + }, + { + "name": "RY Rotation Block", + "gate_ids": [ + "gate_75", + "gate_76" + ], + "nodes": [ + { + "name": "ry", + "qubits": [ + "34" + ] + }, + { + "name": "cx", + "qubits": [ + "34", + "28" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/Quilt/macro_gate_detector/tests/test_1_qasm.py b/Quilt/macro_gate_detector/tests/test_1_qasm.py new file mode 100644 index 0000000..6ad9b45 --- /dev/null +++ b/Quilt/macro_gate_detector/tests/test_1_qasm.py @@ -0,0 +1,316 @@ +""" +Comprehensive test for macro gate detector on 1.qasm +Tests correctness, robustness, and proper macro gate substitution + +Usage: + uv run pytest macro_gate_detector/tests/test_1_qasm.py + # or + uv run python -m macro_gate_detector.tests.test_1_qasm +""" + +import os +import sys +import json + +# Add project root to path for imports +script_dir = os.path.dirname(os.path.abspath(__file__)) +project_root = os.path.dirname(os.path.dirname(script_dir)) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +# Import shared test utilities +from macro_gate_detector.tests.test_utils import ( + TestResults, load_circuit_from_qasm, analyze_circuit, create_macro_gate_circuit, + save_circuit_images, extract_gate_sequence, check_consecutive_gates, + create_reduced_circuit +) + + +def verify_macro_substitution( + original_circuit, macro_circuit, analysis_result, results: TestResults +): + """Verify that macro gates perfectly substitute for their sequences""" + print("\n" + "="*70) + print("VERIFYING MACRO SUBSTITUTION") + print("="*70) + + # Extract gate sequences + original_sequence = extract_gate_sequence(original_circuit) + macro_sequence = extract_gate_sequence(macro_circuit) + + # Get all macro positions + macros = analysis_result['macros'] + macro_positions = set() + total_gates_in_macros = 0 + for macro in macros: + for pos_info in macro['positions']: + start = pos_info['start'] + end = pos_info['end'] + macro_positions.update(range(start, end)) + total_gates_in_macros += (end - start) + + unique_positions_replaced = len(macro_positions) + macro_gate_count = sum(macro['count'] for macro in macros) + + original_gate_count = len(original_sequence) + actual_gate_count = len(macro_sequence) + + compression = original_gate_count / actual_gate_count if actual_gate_count > 0 else 1.0 + + if actual_gate_count < original_gate_count: + results.add_pass( + "Macro gate count", + f"Macro circuit has {actual_gate_count} gates vs {original_gate_count} original ({compression:.2f}x compression)" + ) + else: + results.add_warning( + "Macro gate count", + f"Macro circuit has {actual_gate_count} gates vs {original_gate_count} original (no compression)" + ) + + gates_removed = unique_positions_replaced + gates_added = macro_gate_count + net_reduction = gates_removed - gates_added + + if net_reduction > 0: + results.add_pass( + "Net gate reduction", + f"Removed {gates_removed} gates, added {gates_added} macros (net: -{net_reduction})" + ) + else: + results.add_warning( + "Net gate reduction", + f"Removed {gates_removed} gates, added {gates_added} macros (net: {net_reduction})" + ) + + # Verify no consecutive CNOT gates + consecutive_cnots = check_consecutive_gates(macro_circuit, 'cx') + if not consecutive_cnots: + results.add_pass("No consecutive CNOT gates", "Macro circuit has no consecutive CNOT gates") + else: + results.add_fail( + "No consecutive CNOT gates", + f"Found {len(consecutive_cnots)} pairs of consecutive CNOT gates" + ) + + +def test_circuit_analysis(circuit, results: TestResults): + """Test the circuit analysis functionality""" + print("\n" + "="*70) + print("TESTING CIRCUIT ANALYSIS") + print("="*70) + + try: + result = analyze_circuit(circuit, optimization_level=1) + results.add_pass("Analysis execution", "Circuit analyzed successfully") + except Exception as e: + results.add_fail("Analysis execution", f"Error: {str(e)}") + return None + + # Check result structure + required_keys = ['dag_flat', 'dag_hierarchical', 'macros', 'statistics'] + for key in required_keys: + if key in result: + results.add_pass(f"Result structure - {key}", "Key present") + else: + results.add_fail(f"Result structure - {key}", "Key missing") + + # Check statistics + stats = result['statistics'] + if stats['original_gates'] > 0: + results.add_pass("Statistics - original_gates", f"Found {stats['original_gates']} gates") + else: + results.add_fail("Statistics - original_gates", "No gates found") + + if stats['num_macros'] >= 0: + results.add_pass("Statistics - num_macros", f"Found {stats['num_macros']} macro patterns") + else: + results.add_fail("Statistics - num_macros", "Invalid macro count") + + if stats['compression_ratio'] >= 1.0: + results.add_pass( + "Statistics - compression_ratio", + f"Compression ratio: {stats['compression_ratio']:.2f}x" + ) + else: + results.add_warning( + "Statistics - compression_ratio", + f"Compression ratio < 1.0: {stats['compression_ratio']:.2f}x" + ) + + return result + + +def test_macro_circuit_creation(circuit, analysis_result, results: TestResults): + """Test macro circuit creation""" + print("\n" + "="*70) + print("TESTING MACRO CIRCUIT CREATION") + print("="*70) + + try: + macro_circuit = create_macro_gate_circuit(circuit, analysis_result) + results.add_pass("Macro circuit creation", "Circuit created successfully") + except Exception as e: + results.add_fail("Macro circuit creation", f"Error: {str(e)}") + return None + + if macro_circuit.num_qubits == circuit.num_qubits: + results.add_pass( + "Circuit qubit count", + f"Both circuits have {macro_circuit.num_qubits} qubits" + ) + else: + results.add_fail( + "Circuit qubit count", + f"Original: {circuit.num_qubits}, Macro: {macro_circuit.num_qubits}" + ) + + if len(macro_circuit.data) > 0: + results.add_pass("Circuit has gates", f"Macro circuit has {len(macro_circuit.data)} gates") + else: + results.add_fail("Circuit has gates", "Macro circuit is empty") + + return macro_circuit + + +def test_json_serialization(analysis_result, output_dir: str, results: TestResults): + """Test that analysis result is JSON serializable and save JSON files""" + print("\n" + "="*70) + print("TESTING JSON SERIALIZATION") + print("="*70) + + try: + json_str = json.dumps(analysis_result, indent=2) + results.add_pass("JSON serialization", "Result is JSON serializable") + + loaded = json.loads(json_str) + if 'macros' in loaded and 'statistics' in loaded: + results.add_pass("JSON deserialization", "Result can be deserialized") + else: + results.add_fail("JSON deserialization", "Missing keys after deserialization") + + # Save the raw analysis result JSON + analysis_json_path = os.path.join(output_dir, 'analysis_result.json') + with open(analysis_json_path, 'w', encoding='utf-8') as f: + f.write(json_str) + results.add_pass("Save analysis JSON", f"Saved to {analysis_json_path}") + print(f" Analysis result JSON saved to: {analysis_json_path}") + + except Exception as e: + results.add_fail("JSON serialization", f"Error: {str(e)}") + + +def save_circuit_graph_json(analysis_result, output_dir: str, results: TestResults): + """Save processed circuit graph JSON with nodes, edges, and macros in app-circuit.json format""" + print("\n" + "="*70) + print("SAVING CIRCUIT GRAPH JSON") + print("="*70) + + try: + # Import the conversion function from macro_gate_detector + from macro_gate_detector.macro_gate_detector import convert_to_app_circuit_format + + # Convert the analysis result to app-circuit.json format + graph_data = convert_to_app_circuit_format(analysis_result) + + # Save the processed graph JSON + graph_json_path = os.path.join(output_dir, 'circuit_graph.json') + with open(graph_json_path, 'w', encoding='utf-8') as f: + json.dump(graph_data, f, indent=2) + + results.add_pass("Save circuit graph JSON", f"Saved to {graph_json_path}") + print(f" Circuit graph JSON saved to: {graph_json_path}") + print(f" Nodes: {len(graph_data.get('nodes', []))}") + print(f" Edges: {len(graph_data.get('edges', []))}") + print(f" Macros: {len(graph_data.get('macros', []))}") + + except ImportError as e: + results.add_warning("Save circuit graph JSON", f"Could not import conversion function: {str(e)}") + print(f" Warning: Could not import convert_to_app_circuit_format: {str(e)}") + except Exception as e: + results.add_warning("Save circuit graph JSON", f"Error: {str(e)}") + print(f" Warning: Could not save circuit graph JSON: {str(e)}") + + +def main(): + """Run comprehensive tests on 1.qasm""" + print("="*70) + print("COMPREHENSIVE TEST SUITE FOR 1.QASM") + print("="*70) + + # Find the QASM file + script_dir = os.path.dirname(os.path.abspath(__file__)) + big_circuit_dir = os.path.join(script_dir, 'big_circuit') + qasm_file = os.path.join(big_circuit_dir, '1.qasm') + + if not os.path.exists(qasm_file): + print(f"ERROR: Could not find 1.qasm at {qasm_file}") + return False + + results = TestResults() + + # Create output directory for this test + output_dir = os.path.join(script_dir, 'output_test_1') + os.makedirs(output_dir, exist_ok=True) + print(f"Output directory: {output_dir}") + + # Load circuit + print(f"\nLoading circuit from {qasm_file}...") + try: + circuit = load_circuit_from_qasm(qasm_file) + results.add_pass("Circuit loading", f"Loaded circuit with {circuit.num_qubits} qubits, {len(circuit.data)} gates") + except Exception as e: + results.add_fail("Circuit loading", f"Error: {str(e)}") + return False + + # Test analysis + analysis_result = test_circuit_analysis(circuit, results) + if analysis_result is None: + return False + + # Test macro circuit creation + macro_circuit = test_macro_circuit_creation(circuit, analysis_result, results) + if macro_circuit is None: + return False + + # Verify macro substitution + verify_macro_substitution(circuit, macro_circuit, analysis_result, results) + + # Test JSON serialization and save JSON files + test_json_serialization(analysis_result, output_dir, results) + + # Save processed circuit graph JSON + save_circuit_graph_json(analysis_result, output_dir, results) + + # Save circuit images (will automatically limit to 50 qubits if needed) + save_circuit_images(circuit, macro_circuit, output_dir, results, max_qubits=50) + + # Print detailed statistics + print("\n" + "="*70) + print("DETAILED STATISTICS") + print("="*70) + stats = analysis_result['statistics'] + print(f"Original gates: {stats['original_gates']}") + print(f"Transpiled gates: {stats['transpiled_gates']}") + print(f"Circuit depth: {stats['circuit_depth']}") + print(f"Number of qubits: {stats['num_qubits']}") + print(f"Number of macros: {stats['num_macros']}") + print(f"Total macro instances: {stats['total_macro_instances']}") + print(f"Hierarchical items: {stats['hierarchical_items']}") + print(f"Compression ratio: {stats['compression_ratio']:.2f}x") + + if analysis_result['macros']: + print(f"\nTop 5 macro patterns:") + for i, macro in enumerate(analysis_result['macros'][:5], 1): + print(f" {i}. {macro['label']} - appears {macro['count']} times, size {macro['window_size']}") + + # Final summary + all_passed = results.summary() + + return all_passed + + +if __name__ == "__main__": + success = main() + exit(0 if success else 1) + diff --git a/Quilt/macro_gate_detector/tests/test_3_qasm.py b/Quilt/macro_gate_detector/tests/test_3_qasm.py new file mode 100644 index 0000000..53cb519 --- /dev/null +++ b/Quilt/macro_gate_detector/tests/test_3_qasm.py @@ -0,0 +1,347 @@ +""" +Comprehensive test for macro gate detector on 3.qasm +Tests correctness, robustness, and proper macro gate substitution + +Usage: + uv run pytest macro_gate_detector/tests/test_3_qasm.py + # or + uv run python -m macro_gate_detector.tests.test_3_qasm +""" + +import os +import sys +import json + +# Add project root to path for imports +script_dir = os.path.dirname(os.path.abspath(__file__)) +project_root = os.path.dirname(os.path.dirname(script_dir)) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +# Import shared test utilities +from macro_gate_detector.tests.test_utils import ( + TestResults, load_circuit_from_qasm, analyze_circuit, create_macro_gate_circuit, + extract_gate_sequence, check_consecutive_gates +) + + +def verify_macro_substitution( + original_circuit, macro_circuit, analysis_result, results: TestResults +): + """Verify that macro gates perfectly substitute for their sequences""" + print("\n" + "="*70) + print("VERIFYING MACRO SUBSTITUTION") + print("="*70) + + # Extract gate sequences + original_sequence = extract_gate_sequence(original_circuit) + macro_sequence = extract_gate_sequence(macro_circuit) + + # Get all macro positions + macros = analysis_result['macros'] + macro_positions = set() + total_gates_in_macros = 0 + for macro in macros: + for pos_info in macro['positions']: + start = pos_info['start'] + end = pos_info['end'] + macro_positions.update(range(start, end)) + total_gates_in_macros += (end - start) + + unique_positions_replaced = len(macro_positions) + macro_gate_count = sum(macro['count'] for macro in macros) + + original_gate_count = len(original_sequence) + actual_gate_count = len(macro_sequence) + + compression = original_gate_count / actual_gate_count if actual_gate_count > 0 else 1.0 + + if actual_gate_count < original_gate_count: + results.add_pass( + "Macro gate count", + f"Macro circuit has {actual_gate_count} gates vs {original_gate_count} original ({compression:.2f}x compression)" + ) + else: + results.add_warning( + "Macro gate count", + f"Macro circuit has {actual_gate_count} gates vs {original_gate_count} original (no compression)" + ) + + gates_removed = unique_positions_replaced + gates_added = macro_gate_count + net_reduction = gates_removed - gates_added + + if net_reduction > 0: + results.add_pass( + "Net gate reduction", + f"Removed {gates_removed} gates, added {gates_added} macros (net: -{net_reduction})" + ) + else: + results.add_warning( + "Net gate reduction", + f"Removed {gates_removed} gates, added {gates_added} macros (net: {net_reduction})" + ) + + # Verify no consecutive CNOT gates + consecutive_cnots = check_consecutive_gates(macro_circuit, 'cx') + if not consecutive_cnots: + results.add_pass("No consecutive CNOT gates", "Macro circuit has no consecutive CNOT gates") + else: + results.add_fail( + "No consecutive CNOT gates", + f"Found {len(consecutive_cnots)} pairs of consecutive CNOT gates" + ) + + +def test_circuit_analysis(circuit, results: TestResults): + """Test the circuit analysis functionality""" + print("\n" + "="*70) + print("TESTING CIRCUIT ANALYSIS") + print("="*70) + + try: + result = analyze_circuit(circuit, optimization_level=1) + results.add_pass("Analysis execution", "Circuit analyzed successfully") + except Exception as e: + results.add_fail("Analysis execution", f"Error: {str(e)}") + return None + + # Check result structure + required_keys = ['dag_flat', 'dag_hierarchical', 'macros', 'statistics'] + for key in required_keys: + if key in result: + results.add_pass(f"Result structure - {key}", "Key present") + else: + results.add_fail(f"Result structure - {key}", "Key missing") + + # Check statistics + stats = result['statistics'] + if stats['original_gates'] > 0: + results.add_pass("Statistics - original_gates", f"Found {stats['original_gates']} gates") + else: + results.add_fail("Statistics - original_gates", "No gates found") + + if stats['num_macros'] >= 0: + results.add_pass("Statistics - num_macros", f"Found {stats['num_macros']} macro patterns") + else: + results.add_fail("Statistics - num_macros", "Invalid macro count") + + if stats['compression_ratio'] >= 1.0: + results.add_pass( + "Statistics - compression_ratio", + f"Compression ratio: {stats['compression_ratio']:.2f}x" + ) + else: + results.add_warning( + "Statistics - compression_ratio", + f"Compression ratio < 1.0: {stats['compression_ratio']:.2f}x" + ) + + return result + + +def test_macro_circuit_creation(circuit, analysis_result, results: TestResults): + """Test macro circuit creation""" + print("\n" + "="*70) + print("TESTING MACRO CIRCUIT CREATION") + print("="*70) + + try: + macro_circuit = create_macro_gate_circuit(circuit, analysis_result) + results.add_pass("Macro circuit creation", "Circuit created successfully") + except Exception as e: + results.add_fail("Macro circuit creation", f"Error: {str(e)}") + return None + + if macro_circuit.num_qubits == circuit.num_qubits: + results.add_pass( + "Circuit qubit count", + f"Both circuits have {macro_circuit.num_qubits} qubits" + ) + else: + results.add_fail( + "Circuit qubit count", + f"Original: {circuit.num_qubits}, Macro: {macro_circuit.num_qubits}" + ) + + if len(macro_circuit.data) > 0: + results.add_pass("Circuit has gates", f"Macro circuit has {len(macro_circuit.data)} gates") + else: + results.add_fail("Circuit has gates", "Macro circuit is empty") + + return macro_circuit + + +def test_robustness(circuit, results: TestResults): + """Test robustness with different optimization levels""" + print("\n" + "="*70) + print("TESTING ROBUSTNESS") + print("="*70) + + for opt_level in [0, 1, 2, 3]: + try: + result = analyze_circuit(circuit, optimization_level=opt_level) + macro_circuit = create_macro_gate_circuit(circuit, result, optimization_level=opt_level) + + consecutive = check_consecutive_gates(macro_circuit, 'cx') + if not consecutive: + results.add_pass( + f"Robustness - opt_level_{opt_level}", + "No consecutive CNOT gates" + ) + else: + results.add_fail( + f"Robustness - opt_level_{opt_level}", + f"Found {len(consecutive)} consecutive CNOT gates" + ) + except Exception as e: + results.add_fail( + f"Robustness - opt_level_{opt_level}", + f"Error: {str(e)}" + ) + + +def test_json_serialization(analysis_result, results: TestResults): + """Test that analysis result is JSON serializable""" + print("\n" + "="*70) + print("TESTING JSON SERIALIZATION") + print("="*70) + + try: + json_str = json.dumps(analysis_result, indent=2) + results.add_pass("JSON serialization", "Result is JSON serializable") + + loaded = json.loads(json_str) + if 'macros' in loaded and 'statistics' in loaded: + results.add_pass("JSON deserialization", "Result can be deserialized") + else: + results.add_fail("JSON deserialization", "Missing keys after deserialization") + except Exception as e: + results.add_fail("JSON serialization", f"Error: {str(e)}") + + +def test_macro_consistency(analysis_result, results: TestResults): + """Test that macro definitions are consistent""" + print("\n" + "="*70) + print("TESTING MACRO CONSISTENCY") + print("="*70) + + macros = analysis_result['macros'] + + # Check that each macro has required fields + required_fields = ['label', 'count', 'window_size', 'gates', 'positions'] + for i, macro in enumerate(macros): + for field in required_fields: + if field not in macro: + results.add_fail(f"Macro {i} - {field}", "Missing required field") + return + + results.add_pass("Macro structure", f"All {len(macros)} macros have required fields") + + # Check that positions match count + for i, macro in enumerate(macros): + if len(macro['positions']) != macro['count']: + results.add_fail( + f"Macro {i} - position count", + f"Expected {macro['count']} positions, got {len(macro['positions'])}" + ) + return + + results.add_pass("Macro position count", "All macros have matching position counts") + + # Check that window_size matches gate count + for i, macro in enumerate(macros): + if len(macro['gates']) != macro['window_size']: + results.add_fail( + f"Macro {i} - window size", + f"Expected {macro['window_size']} gates, got {len(macro['gates'])}" + ) + return + + results.add_pass("Macro window size", "All macros have matching window sizes") + + +def main(): + """Run comprehensive tests on 3.qasm""" + print("="*70) + print("COMPREHENSIVE TEST SUITE FOR 3.QASM") + print("="*70) + + # Find the QASM file + script_dir = os.path.dirname(os.path.abspath(__file__)) + big_circuit_dir = os.path.join(script_dir, 'big_circuit') + qasm_file = os.path.join(big_circuit_dir, '3.qasm') + + if not os.path.exists(qasm_file): + print(f"ERROR: Could not find 3.qasm at {qasm_file}") + return False + + results = TestResults() + + # Create output directory for this test + output_dir = os.path.join(script_dir, 'output_test_3') + os.makedirs(output_dir, exist_ok=True) + print(f"Output directory: {output_dir}") + + # Load circuit + print(f"\nLoading circuit from {qasm_file}...") + try: + circuit = load_circuit_from_qasm(qasm_file) + results.add_pass("Circuit loading", f"Loaded circuit with {circuit.num_qubits} qubits, {len(circuit.data)} gates") + except Exception as e: + results.add_fail("Circuit loading", f"Error: {str(e)}") + return False + + # Test analysis + analysis_result = test_circuit_analysis(circuit, results) + if analysis_result is None: + return False + + # Test macro circuit creation + macro_circuit = test_macro_circuit_creation(circuit, analysis_result, results) + if macro_circuit is None: + return False + + # Verify macro substitution + verify_macro_substitution(circuit, macro_circuit, analysis_result, results) + + # Test robustness + test_robustness(circuit, results) + + # Test JSON serialization + test_json_serialization(analysis_result, results) + + # Test macro consistency + test_macro_consistency(analysis_result, results) + + # Save circuit images (will automatically limit to 50 qubits if needed) + # save_circuit_images(circuit, macro_circuit, output_dir, results, max_qubits=50) + + # Print detailed statistics + print("\n" + "="*70) + print("DETAILED STATISTICS") + print("="*70) + stats = analysis_result['statistics'] + print(f"Original gates: {stats['original_gates']}") + print(f"Transpiled gates: {stats['transpiled_gates']}") + print(f"Circuit depth: {stats['circuit_depth']}") + print(f"Number of qubits: {stats['num_qubits']}") + print(f"Number of macros: {stats['num_macros']}") + print(f"Total macro instances: {stats['total_macro_instances']}") + print(f"Hierarchical items: {stats['hierarchical_items']}") + print(f"Compression ratio: {stats['compression_ratio']:.2f}x") + + if analysis_result['macros']: + print(f"\nTop 5 macro patterns:") + for i, macro in enumerate(analysis_result['macros'][:5], 1): + print(f" {i}. {macro['label']} - appears {macro['count']} times, size {macro['window_size']}") + + # Final summary + all_passed = results.summary() + + return all_passed + + +if __name__ == "__main__": + success = main() + exit(0 if success else 1) diff --git a/Quilt/macro_gate_detector/tests/test_small.py b/Quilt/macro_gate_detector/tests/test_small.py new file mode 100644 index 0000000..953a1dd --- /dev/null +++ b/Quilt/macro_gate_detector/tests/test_small.py @@ -0,0 +1,187 @@ +""" +Small tests for macro gate detector - basic functionality tests +Tests on simple circuits to verify core functionality + +Usage: + uv run pytest macro_gate_detector/tests/test_small.py + # or + uv run python -m macro_gate_detector.tests.test_small +""" + +import os +import sys +from qiskit import QuantumCircuit + +# Add project root to path for imports +script_dir = os.path.dirname(os.path.abspath(__file__)) +project_root = os.path.dirname(os.path.dirname(script_dir)) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +# Import shared test utilities +from macro_gate_detector.tests.test_utils import ( + TestResults, analyze_circuit, create_macro_gate_circuit, + save_circuit_images, extract_gate_sequence, check_consecutive_gates +) + + +def test_basic_ansatz(): + """Test detection of a simple repeating ansatz pattern""" + print("\n" + "="*70) + print("TEST: Basic VQE Ansatz Pattern") + print("="*70) + + results = TestResults() + + # Create a simple repeating ansatz-like pattern + qc = QuantumCircuit(4) + for layer in range(3): + for i in range(3): + qc.cx(i, i+1) + for i in range(4): + qc.ry(0.5, i) + qc.cx(0, 2) + qc.cx(1, 3) + + print(f"Circuit has {len(qc.data)} gates on {qc.num_qubits} qubits") + + # Analyze + try: + result = analyze_circuit(qc, optimization_level=1) + results.add_pass("Analysis execution", "Circuit analyzed successfully") + except Exception as e: + results.add_fail("Analysis execution", f"Error: {str(e)}") + return results + + # Check for macros + if result['statistics']['num_macros'] > 0: + results.add_pass( + "Macro detection", + f"Found {result['statistics']['num_macros']} macro patterns" + ) + else: + results.add_warning("Macro detection", "No macros detected") + + # Create macro circuit + try: + macro_circuit = create_macro_gate_circuit(qc, result) + results.add_pass("Macro circuit creation", "Circuit created successfully") + + # Check compression + compression = len(qc.data) / len(macro_circuit.data) if len(macro_circuit.data) > 0 else 1.0 + if compression > 1.0: + results.add_pass("Compression", f"Compressed by {compression:.2f}x") + else: + results.add_warning("Compression", "No compression achieved") + except Exception as e: + results.add_fail("Macro circuit creation", f"Error: {str(e)}") + + return results + + +def test_qft_pattern(): + """Test detection of QFT-like patterns""" + print("\n" + "="*70) + print("TEST: QFT Pattern") + print("="*70) + + results = TestResults() + + # Create a simple QFT-like pattern + qc = QuantumCircuit(3) + # H on first qubit + qc.h(0) + # Controlled phase gates + qc.cp(0.5, 0, 1) + qc.cp(0.25, 0, 2) + qc.h(1) + qc.cp(0.5, 1, 2) + qc.h(2) + + print(f"Circuit has {len(qc.data)} gates on {qc.num_qubits} qubits") + + # Analyze + try: + result = analyze_circuit(qc, optimization_level=1) + results.add_pass("Analysis execution", "Circuit analyzed successfully") + + # Check if QFT pattern was detected + macros = result['macros'] + qft_detected = any('QFT' in macro['label'] for macro in macros) + if qft_detected: + results.add_pass("QFT detection", "QFT pattern detected") + else: + results.add_warning("QFT detection", "QFT pattern not detected (may be expected for small circuit)") + except Exception as e: + results.add_fail("Analysis execution", f"Error: {str(e)}") + + return results + + +def test_cnot_ladder(): + """Test detection of CNOT ladder patterns""" + print("\n" + "="*70) + print("TEST: CNOT Ladder Pattern") + print("="*70) + + results = TestResults() + + # Create a CNOT ladder + qc = QuantumCircuit(5) + for i in range(4): + qc.cx(i, i+1) + # Repeat the pattern + for i in range(4): + qc.cx(i, i+1) + + print(f"Circuit has {len(qc.data)} gates on {qc.num_qubits} qubits") + + # Analyze + try: + result = analyze_circuit(qc, optimization_level=1) + results.add_pass("Analysis execution", "Circuit analyzed successfully") + + # Check for CNOT ladder detection + macros = result['macros'] + cnot_detected = any('CNOT' in macro['label'] for macro in macros) + if cnot_detected: + results.add_pass("CNOT ladder detection", "CNOT ladder pattern detected") + else: + results.add_warning("CNOT ladder detection", "CNOT ladder not detected") + except Exception as e: + results.add_fail("Analysis execution", f"Error: {str(e)}") + + return results + + +def main(): + """Run all small tests""" + print("="*70) + print("SMALL TESTS - BASIC FUNCTIONALITY") + print("="*70) + + all_results = TestResults() + + # Run individual tests + test_results = [ + test_basic_ansatz(), + test_qft_pattern(), + test_cnot_ladder(), + ] + + # Aggregate results + for result in test_results: + all_results.passed.extend(result.passed) + all_results.failed.extend(result.failed) + all_results.warnings.extend(result.warnings) + + # Print summary + all_passed = all_results.summary() + + return all_passed + + +if __name__ == "__main__": + success = main() + exit(0 if success else 1) + diff --git a/Quilt/macro_gate_detector/tests/test_utils.py b/Quilt/macro_gate_detector/tests/test_utils.py new file mode 100644 index 0000000..086aa50 --- /dev/null +++ b/Quilt/macro_gate_detector/tests/test_utils.py @@ -0,0 +1,365 @@ +""" +Shared test utilities for macro gate detector tests +""" + +import json +import os +import sys +from typing import List, Dict, Tuple, Optional + +# Set up Graphviz path - must be set before any qiskit imports +def setup_graphviz(): + """Configure Graphviz path""" + graphviz_path = r"C:\Program Files\Graphviz\bin\dot.exe" + if os.path.exists(graphviz_path): + os.environ["GRAPHVIZ_DOT"] = graphviz_path + return graphviz_path + + # Try alternative common locations + alt_paths = [ + r"C:\Program Files (x86)\Graphviz\bin\dot.exe", + r"C:\Graphviz\bin\dot.exe", + ] + for alt_path in alt_paths: + if os.path.exists(alt_path): + os.environ["GRAPHVIZ_DOT"] = alt_path + return alt_path + + return None + +# Setup Graphviz early +graphviz_path = setup_graphviz() + +# Add project root to path to import macro_gate_detector +script_dir = os.path.dirname(os.path.abspath(__file__)) +# script_dir is macro_gate_detector/tests, so go up two levels to get project root +project_root = os.path.dirname(os.path.dirname(script_dir)) +if project_root not in sys.path: + sys.path.insert(0, project_root) + +from macro_gate_detector import analyze_circuit, create_macro_gate_circuit +from qiskit import QuantumCircuit +from qiskit.converters import circuit_to_dag +from qiskit.visualization import dag_drawer + + +class TestResults: + """Container for test results""" + def __init__(self): + self.passed = [] + self.failed = [] + self.warnings = [] + + def add_pass(self, test_name: str, message: str = ""): + self.passed.append((test_name, message)) + print(f"[PASS] {test_name}" + (f" - {message}" if message else "")) + + def add_fail(self, test_name: str, message: str): + self.failed.append((test_name, message)) + print(f"[FAIL] {test_name} - {message}") + + def add_warning(self, test_name: str, message: str): + self.warnings.append((test_name, message)) + print(f"[WARN] {test_name} - {message}") + + def summary(self): + print("\n" + "="*70) + print("TEST SUMMARY") + print("="*70) + print(f"Passed: {len(self.passed)}") + print(f"Failed: {len(self.failed)}") + print(f"Warnings: {len(self.warnings)}") + + if self.failed: + print("\nFailed Tests:") + for test_name, message in self.failed: + print(f" - {test_name}: {message}") + + if self.warnings: + print("\nWarnings:") + for test_name, message in self.warnings: + print(f" - {test_name}: {message}") + + return len(self.failed) == 0 + + +def load_circuit_from_qasm(filepath: str) -> QuantumCircuit: + """Load a circuit from a QASM file (supports both OpenQASM 2.0 and 3.0)""" + with open(filepath, 'r', encoding='utf-8') as f: + qasm_str = f.read() + + # Check if it's OpenQASM 3.0 + if qasm_str.strip().startswith('OPENQASM 3'): + try: + from qiskit import qasm3 + return qasm3.loads(qasm_str) + except (ImportError, AttributeError) as e: + raise ValueError(f"Could not load OpenQASM 3.0 file. Error: {str(e)}. " + f"Make sure qiskit>=2.2.3 is installed with OpenQASM 3.0 support.") + else: + # OpenQASM 2.0 + return QuantumCircuit.from_qasm_str(qasm_str) + + +def extract_gate_sequence(circuit: QuantumCircuit) -> List[Tuple[str, Tuple[int, ...]]]: + """Extract gate sequence from circuit""" + dag = circuit_to_dag(circuit) + sequence = [] + for node in dag.topological_nodes(): + if hasattr(node, 'op') and node.op: + gate_name = node.op.name + qubits = tuple(sorted([q._index for q in node.qargs if hasattr(q, '_index')])) + sequence.append((gate_name, qubits)) + return sequence + + +def check_consecutive_gates(circuit: QuantumCircuit, gate_type: str = 'cx') -> List[Tuple[int, int]]: + """Check for consecutive gates of the same type""" + consecutive = [] + for i in range(len(circuit.data) - 1): + gate1 = circuit.data[i] + gate2 = circuit.data[i + 1] + if gate1.operation.name == gate_type and gate2.operation.name == gate_type: + consecutive.append((i, i+1)) + return consecutive + + +def create_reduced_circuit(circuit: QuantumCircuit, max_qubits: int = 50) -> QuantumCircuit: + """ + Create a reduced circuit with only the first max_qubits qubits. + For circuits over max_qubits, only show the first max_qubits in visualizations. + """ + if circuit.num_qubits <= max_qubits: + return circuit + + # Create a new circuit with only the first max_qubits qubits + reduced = QuantumCircuit(max_qubits) + + # Copy gates that involve at least one qubit in the first max_qubits + gate_count = 0 + max_gates_to_keep = 2000 # Limit total gates to keep visualization manageable + + for instruction in circuit.data: + if gate_count >= max_gates_to_keep: + break + + qubits = [] + for q in instruction.qubits: + if hasattr(q, '_index'): + qubits.append(q._index) + elif hasattr(q, 'index'): + qubits.append(q.index) + + # Include gates that involve at least one qubit in our range + # For gates that span beyond, map the out-of-range qubits to the last qubit in range + if qubits and any(q < max_qubits for q in qubits): + try: + # Map qubits: keep in-range qubits, map out-of-range to max_qubits-1 + mapped_qubits = [] + for q in qubits: + if q < max_qubits: + mapped_qubits.append(q) + else: + # Map out-of-range qubits to the last qubit in range + mapped_qubits.append(max_qubits - 1) + + # Remove duplicates while preserving order + seen = set() + unique_mapped = [] + for q in mapped_qubits: + if q not in seen: + seen.add(q) + unique_mapped.append(q) + + if len(unique_mapped) == len(qubits): # Same number of qubits + reduced_qubits = [reduced.qubits[q] for q in unique_mapped] + reduced.append(instruction.operation, reduced_qubits) + gate_count += 1 + except Exception: + # Skip if we can't append + pass + + return reduced + + +def save_circuit_images( + original_circuit: QuantumCircuit, + macro_circuit: QuantumCircuit, + output_dir: str, + results: TestResults, + max_qubits: int = 50 +): + """ + Save DAG visualizations and circuit PDFs. + For circuits over max_qubits, only show the first max_qubits. + """ + print("\n" + "="*70) + print("SAVING CIRCUIT VISUALIZATIONS") + print("="*70) + + # Reduce circuits to first max_qubits for visualization if needed + if original_circuit.num_qubits > max_qubits: + print(f"Note: Circuit has {original_circuit.num_qubits} qubits, visualizing first {max_qubits} only") + original_reduced = create_reduced_circuit(original_circuit, max_qubits) + macro_reduced = create_reduced_circuit(macro_circuit, max_qubits) + print(f" Reduced original: {len(original_reduced.data)} gates (from {len(original_circuit.data)})") + print(f" Reduced macro: {len(macro_reduced.data)} gates (from {len(macro_circuit.data)})") + else: + original_reduced = original_circuit + macro_reduced = macro_circuit + + os.makedirs(output_dir, exist_ok=True) + + # Always save circuit PDFs (even if DAG fails) + print("\nSaving circuit PDFs...") + try: + import matplotlib.pyplot as plt + + # Save original circuit PDF + original_pdf = os.path.join(output_dir, 'original.pdf') + try: + print(f" Generating original circuit PDF...") + style = { + 'backgroundcolor': '#FFFFFF', + 'fold': 100, + 'cregbundle': True, + } + fig = original_reduced.draw( + output='mpl', + style=style, + fold=-1 if len(original_reduced.data) < 200 else 100 + ) + fig.savefig(original_pdf, format='pdf', bbox_inches='tight', dpi=150) + plt.close(fig) + results.add_pass( + "Save original PDF", + f"Saved to {original_pdf} ({len(original_reduced.data)} gates, {original_reduced.num_qubits} qubits)" + ) + print(f" Original circuit PDF saved to: {original_pdf}") + except Exception as e: + results.add_warning("Save original PDF", f"Error: {str(e)}") + print(f" Warning: Could not save original PDF: {str(e)}") + + # Save macro circuit PDF + macro_pdf = os.path.join(output_dir, 'macro.pdf') + try: + print(f" Generating macro circuit PDF...") + style = { + 'backgroundcolor': '#FFFFFF', + 'fold': 100, + 'cregbundle': True, + } + fig = macro_reduced.draw( + output='mpl', + style=style, + fold=-1 if len(macro_reduced.data) < 200 else 100 + ) + fig.savefig(macro_pdf, format='pdf', bbox_inches='tight', dpi=150) + plt.close(fig) + results.add_pass( + "Save macro PDF", + f"Saved to {macro_pdf} ({len(macro_reduced.data)} gates, {macro_reduced.num_qubits} qubits)" + ) + print(f" Macro circuit PDF saved to: {macro_pdf}") + except Exception as e: + results.add_warning("Save macro PDF", f"Error: {str(e)}") + print(f" Warning: Could not save macro PDF: {str(e)}") + + except ImportError: + results.add_warning("Save circuit PDFs", "matplotlib not available. Install with: pip install matplotlib") + print(" Warning: matplotlib not available. Circuit PDFs will not be saved.") + except Exception as e: + results.add_warning("Save circuit PDFs", f"Error: {str(e)}") + print(f" Error saving circuit PDFs: {str(e)}") + + # Try to save DAGs (optional, may fail) + print("\nSaving circuit DAGs...") + + # Verify Graphviz is available + graphviz_dot = os.environ.get('GRAPHVIZ_DOT', '') + if not graphviz_dot or not os.path.exists(graphviz_dot): + results.add_warning("Save circuit DAGs", "Graphviz not found. Install Graphviz from https://graphviz.org/download/") + print(" Warning: Graphviz not found. DAG visualizations will be skipped.") + return + + # Test if Graphviz can actually be executed + try: + import subprocess + result = subprocess.run( + [graphviz_dot, '-V'], + capture_output=True, + timeout=5, + text=True + ) + if result.returncode != 0: + raise Exception("Graphviz dot.exe returned non-zero exit code") + print(f" Using Graphviz at: {graphviz_dot}") + except Exception as e: + results.add_warning("Save circuit DAGs", f"Graphviz found but cannot be executed: {str(e)}") + print(f" Warning: Graphviz at {graphviz_dot} cannot be executed: {str(e)}") + return + + # Try to import pydot + try: + import pydot + # Test if pydot can create graphs + test_graph = pydot.Dot() + test_graph.set_graph_defaults() + print(f" pydot is available and can create graphs") + except ImportError: + print(f" Warning: pydot not found. Install with: uv add pydot") + results.add_warning("Save circuit DAGs", "pydot package not installed. Install with: uv add pydot") + return + except Exception as e: + print(f" pydot is available but may have issues: {str(e)}") + + try: + # Configure PATH and environment for Graphviz/pydot + graphviz_bin_dir = os.path.dirname(graphviz_dot) + current_path = os.environ.get('PATH', '') + if graphviz_bin_dir not in current_path: + os.environ['PATH'] = graphviz_bin_dir + os.pathsep + current_path + os.environ["GRAPHVIZ_DOT"] = graphviz_dot + + # Save original DAG + original_dag_file = os.path.join(output_dir, 'original_dag.png') + try: + print(f"Generating original circuit DAG...") + dag_original = circuit_to_dag(original_reduced) + dag_drawer(dag_original, scale=1.5, filename=original_dag_file) + results.add_pass("Save original DAG", f"Saved to {original_dag_file}") + print(f" Original DAG saved to: {original_dag_file}") + except Exception as e: + error_msg = str(e) + results.add_warning("Save original DAG", f"Error: {error_msg}") + print(f" Warning: Could not save original DAG: {error_msg}") + try: + print(f" Trying fallback method...") + dag_drawer(dag_original, filename=original_dag_file) + results.add_pass("Save original DAG (fallback)", f"Saved to {original_dag_file}") + except Exception as e2: + print(f" Fallback also failed: {str(e2)}") + + # Save macro DAG + macro_dag_file = os.path.join(output_dir, 'macro_dag.png') + try: + print(f"Generating macro circuit DAG...") + dag_macro = circuit_to_dag(macro_reduced) + dag_drawer(dag_macro, scale=1.5, filename=macro_dag_file) + results.add_pass("Save macro DAG", f"Saved to {macro_dag_file}") + print(f" Macro DAG saved to: {macro_dag_file}") + except Exception as e: + error_msg = str(e) + results.add_warning("Save macro DAG", f"Error: {error_msg}") + print(f" Warning: Could not save macro DAG: {error_msg}") + try: + print(f" Trying fallback method...") + dag_drawer(dag_macro, filename=macro_dag_file) + results.add_pass("Save macro DAG (fallback)", f"Saved to {macro_dag_file}") + except Exception as e2: + print(f" Fallback also failed: {str(e2)}") + + except Exception as e: + results.add_warning("Save circuit DAGs", f"Error: {str(e)}") + print(f" Error saving DAGs: {str(e)}") + diff --git a/Quilt/my-react-app/.gitignore b/Quilt/my-react-app/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/Quilt/my-react-app/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/Quilt/my-react-app/README.md b/Quilt/my-react-app/README.md new file mode 100644 index 0000000..18bc70e --- /dev/null +++ b/Quilt/my-react-app/README.md @@ -0,0 +1,16 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/Quilt/my-react-app/eslint.config.js b/Quilt/my-react-app/eslint.config.js new file mode 100644 index 0000000..cee1e2c --- /dev/null +++ b/Quilt/my-react-app/eslint.config.js @@ -0,0 +1,29 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + rules: { + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + }, + }, +]) diff --git a/Quilt/my-react-app/index.html b/Quilt/my-react-app/index.html new file mode 100644 index 0000000..1b17209 --- /dev/null +++ b/Quilt/my-react-app/index.html @@ -0,0 +1,13 @@ + + + + + + + my-react-app + + +
+ + + diff --git a/Quilt/my-react-app/package-lock.json b/Quilt/my-react-app/package-lock.json new file mode 100644 index 0000000..4500032 --- /dev/null +++ b/Quilt/my-react-app/package-lock.json @@ -0,0 +1,3065 @@ +{ + "name": "my-react-app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "my-react-app", + "version": "0.0.0", + "dependencies": { + "@xyflow/react": "^12.9.2", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.36.0", + "@types/react": "^19.1.16", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.4", + "eslint": "^9.36.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.22", + "globals": "^16.4.0", + "vite": "^7.1.7" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@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.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@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-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.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.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "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.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "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/eslintrc/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/@eslint/js": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "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.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.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/@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/@rolldown/pluginutils": { + "version": "1.0.0-beta.43", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz", + "integrity": "sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.1.tgz", + "integrity": "sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.1.tgz", + "integrity": "sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.1.tgz", + "integrity": "sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.1.tgz", + "integrity": "sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.1.tgz", + "integrity": "sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.1.tgz", + "integrity": "sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.1.tgz", + "integrity": "sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.1.tgz", + "integrity": "sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.1.tgz", + "integrity": "sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.1.tgz", + "integrity": "sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.1.tgz", + "integrity": "sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.1.tgz", + "integrity": "sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.1.tgz", + "integrity": "sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.1.tgz", + "integrity": "sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.1.tgz", + "integrity": "sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.1.tgz", + "integrity": "sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.1.tgz", + "integrity": "sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.1.tgz", + "integrity": "sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.1.tgz", + "integrity": "sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.1.tgz", + "integrity": "sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.1.tgz", + "integrity": "sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.1.tgz", + "integrity": "sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "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/react": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "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/@vitejs/plugin-react": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz", + "integrity": "sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.43", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@xyflow/react": { + "version": "12.9.2", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.9.2.tgz", + "integrity": "sha512-Xr+LFcysHCCoc5KRHaw+FwbqbWYxp9tWtk1mshNcqy25OAPuaKzXSdqIMNOA82TIXF/gFKo0Wgpa6PU7wUUVqw==", + "license": "MIT", + "dependencies": { + "@xyflow/system": "0.0.72", + "classcat": "^5.0.3", + "zustand": "^4.4.0" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.72", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.72.tgz", + "integrity": "sha512-WBI5Aau0fXTXwxHPzceLNS6QdXggSWnGjDtj/gG669crApN8+SCmEtkBth1m7r6pStNo/5fI9McEi7Dk0ymCLA==", + "license": "MIT", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-interpolate": "^3.0.4", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-interpolate": "^3.0.1", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, + "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", + "peer": true, + "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/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/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.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", + "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "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/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", + "peer": true, + "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/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.30001754", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", + "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", + "dev": true, + "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/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", + "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/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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "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/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/electron-to-chromium": { + "version": "1.5.249", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.249.tgz", + "integrity": "sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "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.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "dev": true, + "license": "MIT", + "peer": true, + "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.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@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-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "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-refresh": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz", + "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "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/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-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/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/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/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/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/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/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": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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-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/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/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/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/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/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/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/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/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/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/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/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "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/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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "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", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "peer": true, + "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", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/rollup": { + "version": "4.53.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.1.tgz", + "integrity": "sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.1", + "@rollup/rollup-android-arm64": "4.53.1", + "@rollup/rollup-darwin-arm64": "4.53.1", + "@rollup/rollup-darwin-x64": "4.53.1", + "@rollup/rollup-freebsd-arm64": "4.53.1", + "@rollup/rollup-freebsd-x64": "4.53.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.1", + "@rollup/rollup-linux-arm-musleabihf": "4.53.1", + "@rollup/rollup-linux-arm64-gnu": "4.53.1", + "@rollup/rollup-linux-arm64-musl": "4.53.1", + "@rollup/rollup-linux-loong64-gnu": "4.53.1", + "@rollup/rollup-linux-ppc64-gnu": "4.53.1", + "@rollup/rollup-linux-riscv64-gnu": "4.53.1", + "@rollup/rollup-linux-riscv64-musl": "4.53.1", + "@rollup/rollup-linux-s390x-gnu": "4.53.1", + "@rollup/rollup-linux-x64-gnu": "4.53.1", + "@rollup/rollup-linux-x64-musl": "4.53.1", + "@rollup/rollup-openharmony-arm64": "4.53.1", + "@rollup/rollup-win32-arm64-msvc": "4.53.1", + "@rollup/rollup-win32-ia32-msvc": "4.53.1", + "@rollup/rollup-win32-x64-gnu": "4.53.1", + "@rollup/rollup-win32-x64-msvc": "4.53.1", + "fsevents": "~2.3.2" + } + }, + "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/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/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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/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/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/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/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vite": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", + "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "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/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/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/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/Quilt/my-react-app/package.json b/Quilt/my-react-app/package.json new file mode 100644 index 0000000..7398fb1 --- /dev/null +++ b/Quilt/my-react-app/package.json @@ -0,0 +1,28 @@ +{ + "name": "my-react-app", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@xyflow/react": "^12.9.2", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.36.0", + "@types/react": "^19.1.16", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.4", + "eslint": "^9.36.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.22", + "globals": "^16.4.0", + "vite": "^7.1.7" + } +} diff --git a/Quilt/my-react-app/public/app-circuit.json b/Quilt/my-react-app/public/app-circuit.json new file mode 100644 index 0000000..7607114 --- /dev/null +++ b/Quilt/my-react-app/public/app-circuit.json @@ -0,0 +1,387 @@ +{ + "nodes": [ + { + "id": "q_start_0", + "name": "q0_init", + "type": "init", + "position": -1, + "qubits": ["0"], + "layer": -1 + }, + { + "id": "q_start_1", + "name": "q1_init", + "type": "init", + "position": -1, + "qubits": ["1"], + "layer": -1 + }, + { + "id": "q_start_2", + "name": "q2_init", + "type": "init", + "position": -1, + "qubits": ["2"], + "layer": -1 + }, + { + "id": "gate_0", + "name": "h", + "type": "gate", + "position": 0, + "qubits": ["2"], + "layer": 0 + }, + { + "id": "gate_1", + "name": "cx", + "type": "gate", + "position": 1, + "qubits": ["1", "2"], + "layer": 1 + }, + { + "id": "gate_2", + "name": "u3", + "type": "gate", + "position": 2, + "qubits": ["2"], + "layer": 2 + }, + { + "id": "gate_3", + "name": "cx", + "type": "gate", + "position": 3, + "qubits": ["1", "2"], + "layer": 3 + }, + { + "id": "gate_4", + "name": "u3", + "type": "gate", + "position": 4, + "qubits": ["2"], + "layer": 4 + }, + { + "id": "gate_5", + "name": "h", + "type": "gate", + "position": 5, + "qubits": ["1"], + "layer": 4 + }, + { + "id": "gate_6", + "name": "cx", + "type": "gate", + "position": 6, + "qubits": ["0", "2"], + "layer": 5 + }, + { + "id": "gate_7", + "name": "u3", + "type": "gate", + "position": 7, + "qubits": ["2"], + "layer": 6 + }, + { + "id": "gate_8", + "name": "cx", + "type": "gate", + "position": 8, + "qubits": ["0", "2"], + "layer": 7 + }, + { + "id": "gate_9", + "name": "u3", + "type": "gate", + "position": 9, + "qubits": ["2"], + "layer": 8 + }, + { + "id": "gate_10", + "name": "cx", + "type": "gate", + "position": 10, + "qubits": ["0", "1"], + "layer": 7 + }, + { + "id": "gate_11", + "name": "u3", + "type": "gate", + "position": 11, + "qubits": ["1"], + "layer": 8 + }, + { + "id": "gate_12", + "name": "cx", + "type": "gate", + "position": 12, + "qubits": ["0", "1"], + "layer": 9 + }, + { + "id": "gate_13", + "name": "u3", + "type": "gate", + "position": 13, + "qubits": ["1"], + "layer": 10 + }, + { + "id": "gate_14", + "name": "h", + "type": "gate", + "position": 14, + "qubits": ["0"], + "layer": 10 + }, + { + "id": "q_end_0", + "name": "q0_end", + "type": "end", + "position": 15, + "qubits": ["0"], + "layer": 11 + }, + { + "id": "q_end_1", + "name": "q1_end", + "type": "end", + "position": 15, + "qubits": ["1"], + "layer": 11 + }, + { + "id": "q_end_2", + "name": "q2_end", + "type": "end", + "position": 15, + "qubits": ["2"], + "layer": 11 + } + ], + "edges": [ + { + "name": "q2", + "from-node": "q_start_2", + "to-node": "gate_0", + "qubit": "2" + }, + { + "name": "q2", + "from-node": "gate_0", + "to-node": "gate_1", + "qubit": "2" + }, + { + "name": "q1", + "from-node": "q_start_1", + "to-node": "gate_1", + "qubit": "1" + }, + { + "name": "q2", + "from-node": "gate_1", + "to-node": "gate_2", + "qubit": "2" + }, + { + "name": "q1", + "from-node": "gate_1", + "to-node": "gate_3", + "qubit": "1" + }, + { + "name": "q2", + "from-node": "gate_2", + "to-node": "gate_3", + "qubit": "2" + }, + { + "name": "q2", + "from-node": "gate_3", + "to-node": "gate_4", + "qubit": "2" + }, + { + "name": "q1", + "from-node": "gate_3", + "to-node": "gate_5", + "qubit": "1" + }, + { + "name": "q2", + "from-node": "gate_4", + "to-node": "gate_6", + "qubit": "2" + }, + { + "name": "q0", + "from-node": "q_start_0", + "to-node": "gate_6", + "qubit": "0" + }, + { + "name": "q2", + "from-node": "gate_6", + "to-node": "gate_7", + "qubit": "2" + }, + { + "name": "q0", + "from-node": "gate_6", + "to-node": "gate_8", + "qubit": "0" + }, + { + "name": "q2", + "from-node": "gate_7", + "to-node": "gate_8", + "qubit": "2" + }, + { + "name": "q2", + "from-node": "gate_8", + "to-node": "gate_9", + "qubit": "2" + }, + { + "name": "q0", + "from-node": "gate_8", + "to-node": "gate_10", + "qubit": "0" + }, + { + "name": "q1", + "from-node": "gate_5", + "to-node": "gate_10", + "qubit": "1" + }, + { + "name": "q1", + "from-node": "gate_10", + "to-node": "gate_11", + "qubit": "1" + }, + { + "name": "q0", + "from-node": "gate_10", + "to-node": "gate_12", + "qubit": "0" + }, + { + "name": "q1", + "from-node": "gate_11", + "to-node": "gate_12", + "qubit": "1" + }, + { + "name": "q0", + "from-node": "gate_12", + "to-node": "gate_14", + "qubit": "0" + }, + { + "name": "q1", + "from-node": "gate_12", + "to-node": "gate_13", + "qubit": "1" + }, + { + "name": "q0", + "from-node": "gate_14", + "to-node": "q_end_0", + "qubit": "0" + }, + { + "name": "q1", + "from-node": "gate_13", + "to-node": "q_end_1", + "qubit": "1" + }, + { + "name": "q2", + "from-node": "gate_9", + "to-node": "q_end_2", + "qubit": "2" + } + ], + "macros": [ + { + "name": "CRZ(pi/2)", + "gate_ids": ["gate_1", "gate_2", "gate_3", "gate_4"], + "nodes": [ + { + "name": "cx", + "qubits": ["1", "2"] + }, + { + "name": "u3", + "qubits": ["2"] + }, + { + "name": "cx", + "qubits": ["1", "2"] + }, + { + "name": "u3", + "qubits": ["2"] + } + ] + }, + { + "name": "CRZ(pi/4)", + "gate_ids": ["gate_6", "gate_7", "gate_8", "gate_9"], + "nodes": [ + { + "name": "cx", + "qubits": ["0", "2"] + }, + { + "name": "u3", + "qubits": ["2"] + }, + { + "name": "cx", + "qubits": ["0", "2"] + }, + { + "name": "u3", + "qubits": ["2"] + } + ] + }, + { + "name": "CRZ(pi/2)", + "gate_ids": ["gate_10", "gate_11", "gate_12", "gate_13"], + "nodes": [ + { + "name": "cx", + "qubits": ["0", "1"] + }, + { + "name": "u3", + "qubits": ["1"] + }, + { + "name": "cx", + "qubits": ["0", "1"] + }, + { + "name": "u3", + "qubits": ["1"] + } + ] + } + ] +} + diff --git a/Quilt/my-react-app/public/circuit-data.json b/Quilt/my-react-app/public/circuit-data.json new file mode 100644 index 0000000..e04dbce --- /dev/null +++ b/Quilt/my-react-app/public/circuit-data.json @@ -0,0 +1,154 @@ +{ + "qubits": [ + { "id": "q0", "label": "q0" }, + { "id": "q1", "label": "q1" }, + { "id": "q2", "label": "q2" } + ], + "gates": [ + { "id": "h1", "label": "H", "type": "custom" }, + { "id": "cx1", "label": "CX", "type": "custom" }, + { "id": "u31", "label": "U3", "type": "custom" }, + { "id": "cx2", "label": "CX", "type": "custom" }, + { "id": "u32", "label": "U3", "type": "custom" }, + { "id": "h2", "label": "H", "type": "custom" }, + { "id": "cx3", "label": "CX", "type": "custom" }, + { "id": "u33", "label": "U3", "type": "custom" }, + { "id": "cx4", "label": "CX", "type": "custom" }, + { "id": "u34", "label": "U3", "type": "custom" }, + { "id": "cx5", "label": "CX", "type": "custom" }, + { "id": "u35", "label": "U3", "type": "custom" }, + { "id": "cx6", "label": "CX", "type": "custom" }, + { "id": "h3", "label": "H", "type": "custom" }, + { "id": "u36", "label": "U3", "type": "custom" } + ], + "connections": [ + { + "source": "q2", + "target": "h1", + "qubit": "q2" + }, + { + "source": "h1", + "target": "cx1", + "qubit": "q2" + }, + { + "source": "cx1", + "target": "u31", + "qubit": "q2" + }, + { + "source": "u31", + "target": "cx2", + "qubit": "q2" + }, + { + "source": "cx2", + "target": "u32", + "qubit": "q2" + }, + { + "source": "u32", + "target": "cx3", + "qubit": "q2" + }, + { + "source": "cx3", + "target": "u33", + "qubit": "q2" + }, + { + "source": "u33", + "target": "cx4", + "qubit": "q2" + }, + { + "source": "cx4", + "target": "u34", + "qubit": "q2" + }, + { + "source": "q1", + "target": "cx1", + "qubit": "q1" + }, + { + "source": "cx1", + "target": "cx2", + "qubit": "q1" + }, + { + "source": "cx2", + "target": "h2", + "qubit": "q1" + }, + { + "source": "h2", + "target": "cx5", + "qubit": "q1" + }, + { + "source": "cx5", + "target": "u35", + "qubit": "q1" + }, + { + "source": "u35", + "target": "cx6", + "qubit": "q1" + }, + { + "source": "cx6", + "target": "u36", + "qubit": "q1" + }, + { + "source": "q0", + "target": "cx3", + "qubit": "q0" + }, + { + "source": "cx3", + "target": "cx4", + "qubit": "q0" + }, + { + "source": "cx4", + "target": "cx5", + "qubit": "q0" + }, + { + "source": "cx5", + "target": "cx6", + "qubit": "q0" + }, + { + "source": "cx6", + "target": "h3", + "qubit": "q0" + } + ], + "subcircuits": [ + { + "id": "group1", + "label": "CRZ(pi/2)", + "gates": ["cx1", "u31", "cx2", "u32"] + }, + { + "id": "group2", + "label": "CRZ(pi/4)", + "gates": ["cx3", "u33", "cx4", "u34"] + }, + { + "id": "group3", + "label": "CRZ(pi/2)", + "gates": ["cx5", "u35", "cx6", "u36"] + } + ], + "colors": { + "q0": "#ffa500", + "q1": "#3498db", + "q2": "#2ecc71" + } +} + diff --git a/Quilt/my-react-app/src/App.css b/Quilt/my-react-app/src/App.css new file mode 100644 index 0000000..8a880de --- /dev/null +++ b/Quilt/my-react-app/src/App.css @@ -0,0 +1,42 @@ +#root { + width: 100%; + height: 100vh; + margin: 0; + padding: 0; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/Quilt/my-react-app/src/App.jsx b/Quilt/my-react-app/src/App.jsx new file mode 100644 index 0000000..081ee08 --- /dev/null +++ b/Quilt/my-react-app/src/App.jsx @@ -0,0 +1,433 @@ +import { useState, useCallback, useEffect } from 'react'; +import { ReactFlow, applyNodeChanges, applyEdgeChanges, addEdge, Handle, Position } from '@xyflow/react'; +import '@xyflow/react/dist/style.css'; + +// Custom node component to ensure labels are visible +function CustomNode({ data }) { + return ( +
+ {/* Three handles on top */} + + + + +
{data.label}
+ + {/* Three handles on bottom */} + + + + + {/* Also add source handles on top and target handles on bottom for flexibility */} + + + + + + +
+ ); +} + +// Circle node component - only one output at bottom +function CircleNode({ data }) { + return ( +
+ {/* Circle shape */} +
+
+ {data.label} +
+
+ + {/* Single output handle at bottom center */} + + {/* Single input handle at top center */} + +
+ ); +} + +// Custom group node component to display label +function GroupNode({ data, style }) { + return ( +
+ {data.label && ( +
+ {data.label} +
+ )} +
+ ); +} + +const nodeTypes = { + custom: CustomNode, + circle: CircleNode, + group: GroupNode, +}; + +const initialNodes = [ + // Top level: q0, q1, q2 + { id: 'q0', type: 'circle', position: { x: 0, y: 0 }, data: { label: 'q0' } }, + { id: 'q1', type: 'circle', position: { x: 150, y: 0 }, data: { label: 'q1' } }, + { id: 'q2', type: 'circle', position: { x: 300, y: 0 }, data: { label: 'q2' } }, + // Nodes flowing downwards + { id: 'h1', type: 'custom', position: { x: 0, y: 150 }, data: { label: 'H' } }, + // Group containing cx1, u31, cx2, u32 + { + id: 'group1', + type: 'group', + position: { x: 0, y: 250 }, + style: { width: 200, height: 480 }, + data: { label: 'CRZ(pi/2)' } + }, + { id: 'cx1', type: 'custom', position: { x: 10, y: 40 }, parentId: 'group1', extent: 'parent', data: { label: 'CX' } }, + { id: 'u31', type: 'custom', position: { x: 10, y: 140 }, parentId: 'group1', extent: 'parent', data: { label: 'U3' } }, + { id: 'cx2', type: 'custom', position: { x: 10, y: 240 }, parentId: 'group1', extent: 'parent', data: { label: 'CX' } }, + { id: 'u32', type: 'custom', position: { x: 10, y: 440 }, parentId: 'group1', extent: 'parent', data: { label: 'U3' } }, + { id: 'h2', type: 'custom', position: { x: 0, y: 700 }, data: { label: 'H' } }, + // Group containing cx3, u33, cx4, u34 + { + id: 'group2', + type: 'group', + position: { x: 0, y: 750 }, + style: { width: 200, height: 380 }, + data: { label: 'CRZ(pi/4)' } + }, + { id: 'cx3', type: 'custom', position: { x: 10, y: 40 }, parentId: 'group2', extent: 'parent', data: { label: 'CX' } }, + { id: 'u33', type: 'custom', position: { x: 10, y: 140 }, parentId: 'group2', extent: 'parent', data: { label: 'U3' } }, + { id: 'cx4', type: 'custom', position: { x: 10, y: 240 }, parentId: 'group2', extent: 'parent', data: { label: 'CX' } }, + { id: 'u34', type: 'custom', position: { x: 10, y: 340 }, parentId: 'group2', extent: 'parent', data: { label: 'U3' } }, + // Group containing cx5, u35, cx6, u36 + { + id: 'group3', + type: 'group', + position: { x: 0, y: 1150 }, + style: { width: 200, height: 480 }, + data: { label: 'CRZ(pi/2)' } + }, + { id: 'cx5', type: 'custom', position: { x: 10, y: 40 }, parentId: 'group3', extent: 'parent', data: { label: 'CX' } }, + { id: 'u35', type: 'custom', position: { x: 10, y: 140 }, parentId: 'group3', extent: 'parent', data: { label: 'U3' } }, + { id: 'cx6', type: 'custom', position: { x: 10, y: 240 }, parentId: 'group3', extent: 'parent', data: { label: 'CX' } }, + { id: 'u36', type: 'custom', position: { x: 10, y: 440 }, parentId: 'group3', extent: 'parent', data: { label: 'U3' } }, + { id: 'h3', type: 'custom', position: { x: 0, y: 1630 }, data: { label: 'H' } }, +]; + +const initialEdges = [ + // Directed edge chain from q2 through h1, cx1, u31, cx2, u32, cx3, u33, cx4, u34 + { + id: 'q2-h1', + source: 'q2', + sourceHandle: 'bottom-source', + target: 'h1', + targetHandle: 'top-target-2', + label: 'q2', + markerEnd: { type: 'arrowclosed', color: '#2ecc71' }, + style: { stroke: '#2ecc71', strokeWidth: 2 } + }, + { + id: 'h1-cx1', + source: 'h1', + sourceHandle: 'bottom-source-2', + target: 'cx1', + targetHandle: 'top-target-2', + label: 'q2', + markerEnd: { type: 'arrowclosed', color: '#2ecc71' }, + style: { stroke: '#2ecc71', strokeWidth: 2 } + }, + { + id: 'cx1-u31', + source: 'cx1', + sourceHandle: 'bottom-source-2', + target: 'u31', + targetHandle: 'top-target-2', + label: 'q2', + markerEnd: { type: 'arrowclosed', color: '#2ecc71' }, + style: { stroke: '#2ecc71', strokeWidth: 2 } + }, + { + id: 'u31-cx2', + source: 'u31', + sourceHandle: 'bottom-source-2', + target: 'cx2', + targetHandle: 'top-target-2', + label: 'q2', + markerEnd: { type: 'arrowclosed', color: '#2ecc71' }, + style: { stroke: '#2ecc71', strokeWidth: 2 } + }, + { + id: 'cx2-u32', + source: 'cx2', + sourceHandle: 'bottom-source-2', + target: 'u32', + targetHandle: 'top-target-2', + label: 'q2', + markerEnd: { type: 'arrowclosed', color: '#2ecc71' }, + style: { stroke: '#2ecc71', strokeWidth: 2 } + }, + { + id: 'u32-cx3', + source: 'u32', + sourceHandle: 'bottom-source-2', + target: 'cx3', + targetHandle: 'top-target-2', + label: 'q2', + markerEnd: { type: 'arrowclosed', color: '#2ecc71' }, + style: { stroke: '#2ecc71', strokeWidth: 2 } + }, + { + id: 'cx3-u33', + source: 'cx3', + sourceHandle: 'bottom-source-2', + target: 'u33', + targetHandle: 'top-target-2', + label: 'q2', + markerEnd: { type: 'arrowclosed', color: '#2ecc71' }, + style: { stroke: '#2ecc71', strokeWidth: 2 } + }, + { + id: 'u33-cx4', + source: 'u33', + sourceHandle: 'bottom-source-2', + target: 'cx4', + targetHandle: 'top-target-2', + label: 'q2', + markerEnd: { type: 'arrowclosed', color: '#2ecc71' }, + style: { stroke: '#2ecc71', strokeWidth: 2 } + }, + { + id: 'cx4-u34', + source: 'cx4', + sourceHandle: 'bottom-source-2', + target: 'u34', + targetHandle: 'top-target-2', + label: 'q2', + markerEnd: { type: 'arrowclosed', color: '#2ecc71' }, + style: { stroke: '#2ecc71', strokeWidth: 2 } + }, + // Directed edge chain from q1 through cx1, cx2, h2, cx5, u35, cx6, u36 + { + id: 'q1-cx1', + source: 'q1', + sourceHandle: 'bottom-source', + target: 'cx1', + targetHandle: 'top-target-1', + label: 'q1', + markerEnd: { type: 'arrowclosed', color: '#3a86ff' }, + style: { stroke: '#3a86ff', strokeWidth: 2 } + }, + { + id: 'cx1-cx2', + source: 'cx1', + sourceHandle: 'bottom-source-1', + target: 'cx2', + targetHandle: 'top-target-1', + label: 'q1', + markerEnd: { type: 'arrowclosed', color: '#3a86ff' }, + style: { stroke: '#3a86ff', strokeWidth: 2 } + }, + { + id: 'cx2-h2', + source: 'cx2', + sourceHandle: 'bottom-source-1', + target: 'h2', + targetHandle: 'top-target-2', + label: 'q1', + markerEnd: { type: 'arrowclosed', color: '#3a86ff' }, + style: { stroke: '#3a86ff', strokeWidth: 2 } + }, + { + id: 'h2-cx5', + source: 'h2', + sourceHandle: 'bottom-source-2', + target: 'cx5', + targetHandle: 'top-target-2', + label: 'q1', + markerEnd: { type: 'arrowclosed', color: '#3a86ff' }, + style: { stroke: '#3a86ff', strokeWidth: 2 } + }, + { + id: 'cx5-u35', + source: 'cx5', + sourceHandle: 'bottom-source-2', + target: 'u35', + targetHandle: 'top-target-2', + label: 'q1', + markerEnd: { type: 'arrowclosed', color: '#3a86ff' }, + style: { stroke: '#3a86ff', strokeWidth: 2 } + }, + { + id: 'u35-cx6', + source: 'u35', + sourceHandle: 'bottom-source-2', + target: 'cx6', + targetHandle: 'top-target-2', + label: 'q1', + markerEnd: { type: 'arrowclosed', color: '#3a86ff' }, + style: { stroke: '#3a86ff', strokeWidth: 2 } + }, + { + id: 'cx6-u36', + source: 'cx6', + sourceHandle: 'bottom-source-2', + target: 'u36', + targetHandle: 'top-target-2', + label: 'q1', + markerEnd: { type: 'arrowclosed', color: '#3a86ff' }, + style: { stroke: '#3a86ff', strokeWidth: 2 } + }, + // Directed edge chain from q0 through cx3, cx4, cx5, cx6, h3 + { + id: 'q0-cx3', + source: 'q0', + sourceHandle: 'bottom-source', + target: 'cx3', + targetHandle: 'top-target-1', + label: 'q0', + markerEnd: { type: 'arrowclosed', color: '#ffa500' }, + style: { stroke: '#ffa500', strokeWidth: 2 } + }, + { + id: 'cx3-cx4', + source: 'cx3', + sourceHandle: 'bottom-source-1', + target: 'cx4', + targetHandle: 'top-target-1', + label: 'q0', + markerEnd: { type: 'arrowclosed', color: '#ffa500' }, + style: { stroke: '#ffa500', strokeWidth: 2 } + }, + { + id: 'cx4-cx5', + source: 'cx4', + sourceHandle: 'bottom-source-1', + target: 'cx5', + targetHandle: 'top-target-1', + label: 'q0', + markerEnd: { type: 'arrowclosed', color: '#ffa500' }, + style: { stroke: '#ffa500', strokeWidth: 2 } + }, + { + id: 'cx5-cx6', + source: 'cx5', + sourceHandle: 'bottom-source-1', + target: 'cx6', + targetHandle: 'top-target-1', + label: 'q0', + markerEnd: { type: 'arrowclosed', color: '#ffa500' }, + style: { stroke: '#ffa500', strokeWidth: 2 } + }, + { + id: 'cx6-h3', + source: 'cx6', + sourceHandle: 'bottom-source-1', + target: 'h3', + targetHandle: 'top-target-2', + label: 'q0', + markerEnd: { type: 'arrowclosed', color: '#ffa500' }, + style: { stroke: '#ffa500', strokeWidth: 2 } + } +]; + +export default function App() { + const [nodes, setNodes] = useState(initialNodes); + const [edges, setEdges] = useState(initialEdges); + + // Sync state with initialNodes/initialEdges when they change (for development) + // Create a string representation that changes when nodes/edges change + const nodesKey = JSON.stringify(initialNodes.map(n => n.id).sort()); + const edgesKey = JSON.stringify(initialEdges.map(e => e.id).sort()); + + useEffect(() => { + setNodes(initialNodes); + setEdges(initialEdges); + }, [nodesKey, edgesKey]); + + // Debug: Log nodes to console (you can remove this later) + console.log('Current nodes:', nodes); + console.log('Number of nodes:', nodes.length); + + const onNodesChange = useCallback( + (changes) => setNodes((nodesSnapshot) => applyNodeChanges(changes, nodesSnapshot)), + [], + ); + const onEdgesChange = useCallback( + (changes) => setEdges((edgesSnapshot) => applyEdgeChanges(changes, edgesSnapshot)), + [], + ); + const onConnect = useCallback( + (params) => setEdges((edgesSnapshot) => addEdge({ + ...params, + markerEnd: { type: 'arrowclosed', color: '#06ffa5' }, + style: { stroke: '#06ffa5', strokeWidth: 2 } + }, edgesSnapshot)), + [], + ); + + return ( +
+ +
+ ); +} diff --git a/Quilt/my-react-app/src/Circuit2.jsx b/Quilt/my-react-app/src/Circuit2.jsx new file mode 100644 index 0000000..97923ff --- /dev/null +++ b/Quilt/my-react-app/src/Circuit2.jsx @@ -0,0 +1,890 @@ +import { useState, useCallback } from 'react'; +import { ReactFlow, applyNodeChanges, applyEdgeChanges, addEdge, Handle, Position } from '@xyflow/react'; +import '@xyflow/react/dist/style.css'; + +// Custom node component to ensure labels are visible +function CustomNode({ data }) { + return ( +
+ {/* Three handles on top */} + + + + +
{data.label}
+ + {/* Three handles on bottom */} + + + + + {/* Also add source handles on top and target handles on bottom for flexibility */} + + + + + + +
+ ); +} + +// Circle node component - only one output at bottom +function CircleNode({ data }) { + return ( +
+ {/* Circle shape */} +
+
+ {data.label} +
+
+ + {/* Single output handle at bottom center */} + + {/* Single input handle at top center */} + +
+ ); +} + +// Custom group node component to display label +function GroupNode({ data, style }) { + return ( +
+ {data.label && ( +
+ {data.label} +
+ )} +
+ ); +} + +const nodeTypes = { + custom: CustomNode, + circle: CircleNode, + group: GroupNode, +}; + +// Function to parse JSON and convert to React Flow format +function parseCircuitData(circuitData) { + const nodes = []; + const edges = []; + + // Color palette for qubits (supports up to 40 qubits with distinct colors) + // Generated to maximize visual distinction across the color spectrum + const colorPalette = [ + '#ff6b6b', // 0: coral red + '#4ecdc4', // 1: turquoise + '#45b7d1', // 2: sky blue + '#f9ca24', // 3: yellow + '#6c5ce7', // 4: purple + '#a29bfe', // 5: light purple + '#fd79a8', // 6: pink + '#fdcb6e', // 7: peach + '#e17055', // 8: salmon + '#00b894', // 9: mint green + '#00cec9', // 10: cyan + '#0984e3', // 11: blue + '#55efc4', // 12: aqua + '#74b9ff', // 13: light blue + '#ff7675', // 14: light red + '#ffa502', // 15: orange + '#2ed573', // 16: green + '#ff6348', // 17: tomato + '#5352ed', // 18: indigo + '#ff4757', // 19: red + '#5f27cd', // 20: violet + '#00d2d3', // 21: teal + '#ff9ff3', // 22: magenta + '#54a0ff', // 23: bright blue + '#c44569', // 24: rose + '#feca57', // 25: gold + '#48dbfb', // 26: cyan blue + '#1dd1a1', // 27: emerald + '#3742fa', // 28: royal blue + '#2f3542', // 29: dark gray-blue + '#ff3838', // 30: bright red + '#ff9f43', // 31: orange + '#10ac84', // 32: green + '#ee5a6f', // 33: rose red + '#0abde3', // 34: bright cyan + '#ffd32a', // 35: bright yellow + '#ff6b81', // 36: pink red + '#c7ecee', // 37: pale blue + '#ffa8b6', // 38: light pink + '#a8e6cf', // 39: light green + ]; + + const getQubitColor = (qubitId) => { + const index = parseInt(qubitId); + return colorPalette[index % colorPalette.length]; + }; + + // Step 1: Extract qubits and calculate dynamic positions + const initNodes = circuitData.nodes.filter(n => n.type === 'init'); + initNodes.sort((a, b) => parseInt(a.qubits[0]) - parseInt(b.qubits[0])); + + const qubitXPositions = {}; + const qubitSpacing = 400; // Increased from 250 to 400 for even more horizontal separation + const qubitColors = {}; + + // Create qubit nodes and calculate x positions + initNodes.forEach((initNode, index) => { + const qubitId = initNode.qubits[0]; + const x = index * qubitSpacing; + qubitXPositions[qubitId] = x; + qubitColors[qubitId] = getQubitColor(qubitId); + + // Create qubit node (circle type) + nodes.push({ + id: `q${qubitId}`, + type: 'circle', + position: { x, y: 0 }, + data: { label: `q${qubitId}` } + }); + }); + + // Step 2: Build graph structure to determine gate positions + const gateNodes = circuitData.nodes.filter(n => n.type === 'gate'); + const gatePositions = {}; + const gatesInGroups = new Set(); + + // Collect gates that will be in groups + if (circuitData.macros) { + circuitData.macros.forEach((macro) => { + if (macro.gate_ids && Array.isArray(macro.gate_ids)) { + macro.gate_ids.forEach(gid => gatesInGroups.add(gid)); + } + }); + } + + // Build edge graph to determine gate depths + const edgesByTarget = {}; + const edgesBySource = {}; + + circuitData.edges.forEach(edge => { + const source = edge['from-node']; + const target = edge['to-node']; + + if (!edgesByTarget[target]) { + edgesByTarget[target] = []; + } + edgesByTarget[target].push(edge); + + if (!edgesBySource[source]) { + edgesBySource[source] = []; + } + edgesBySource[source].push(edge); + }); + + // Map init/end nodes to qubit IDs + const nodeIdToQubitId = {}; + initNodes.forEach(initNode => { + const qubitId = initNode.qubits[0]; + nodeIdToQubitId[initNode.id] = `q${qubitId}`; + }); + + // Build a graph structure for topological sorting + const graph = {}; // nodeId -> [neighborIds] + const inDegree = {}; // nodeId -> number of incoming edges + + // Initialize graph and inDegree for all gates + gateNodes.forEach(gate => { + graph[gate.id] = []; + inDegree[gate.id] = 0; + }); + + // Build graph from all edges (including qubit-to-gate and gate-to-gate) + circuitData.edges.forEach(edge => { + let sourceId = edge['from-node']; + let targetId = edge['to-node']; + + // Convert init nodes to qubit IDs, but keep gate IDs as-is + if (nodeIdToQubitId[sourceId]) { + sourceId = nodeIdToQubitId[sourceId]; + } + + // Check if target is a gate + const targetGate = gateNodes.find(g => g.id === targetId); + + if (targetGate) { + // Target is a gate - count incoming edges + if (!inDegree[targetId]) { + inDegree[targetId] = 0; + } + + // If source is also a gate, add to graph + const sourceGate = gateNodes.find(g => g.id === sourceId); + if (sourceGate) { + if (!graph[sourceId]) graph[sourceId] = []; + graph[sourceId].push(targetId); + inDegree[targetId]++; + } else { + // Source is a qubit - this gate has no incoming gate edges + // inDegree stays 0 (or is already 0) + } + } + }); + + // Topological sort to ensure proper ordering + const gateDepths = {}; + const queue = []; + const processed = new Set(); + + // Initialize with gates that have no incoming gate edges (connected directly to qubits) + gateNodes.forEach(gate => { + if (inDegree[gate.id] === 0) { + gateDepths[gate.id] = 1; + queue.push({ gateId: gate.id, depth: 1 }); + processed.add(gate.id); + } + }); + + // Process gates in topological order + while (queue.length > 0) { + const { gateId, depth } = queue.shift(); + + // Process all neighbors + if (graph[gateId]) { + graph[gateId].forEach(neighborId => { + if (!processed.has(neighborId)) { + inDegree[neighborId]--; + if (inDegree[neighborId] === 0) { + gateDepths[neighborId] = depth + 1; + queue.push({ gateId: neighborId, depth: depth + 1 }); + processed.add(neighborId); + } else { + // Update depth if this path is longer + gateDepths[neighborId] = Math.max(gateDepths[neighborId] || 0, depth + 1); + } + } + }); + } + } + + // For any gates not processed, assign depth based on layer or default + gateNodes.forEach(gate => { + if (!gateDepths[gate.id]) { + gateDepths[gate.id] = gate.layer || 1; + } + }); + + // Ensure proper ordering: if A -> B, then depth(A) < depth(B) + // Do a final pass to ensure all edges respect depth ordering + let changed = true; + let iterations = 0; + while (changed && iterations < 10) { + changed = false; + circuitData.edges.forEach(edge => { + let sourceId = edge['from-node']; + let targetId = edge['to-node']; + + if (nodeIdToQubitId[sourceId]) { + sourceId = nodeIdToQubitId[sourceId]; + } + + const sourceGate = gateNodes.find(g => g.id === sourceId); + const targetGate = gateNodes.find(g => g.id === targetId); + + if (sourceGate && targetGate) { + const sourceDepth = gateDepths[sourceId] || 1; + const targetDepth = gateDepths[targetId] || 1; + + if (sourceDepth >= targetDepth) { + gateDepths[targetId] = sourceDepth + 1; + changed = true; + } + } + }); + iterations++; + } + + // Position gates by depth with proper spacing + const layerHeight = 250; // Increased from 200 to 250 for even more vertical separation + const baseY = 150; + const gatesByLayer = {}; + + gateNodes.forEach(gate => { + const depth = gateDepths[gate.id] || 1; + if (!gatesByLayer[depth]) { + gatesByLayer[depth] = []; + } + gatesByLayer[depth].push(gate); + }); + + // Position gates within each layer with proper horizontal spacing + Object.keys(gatesByLayer).sort((a, b) => parseInt(a) - parseInt(b)).forEach(layer => { + const layerGates = gatesByLayer[layer]; + const y = baseY + parseInt(layer) * layerHeight; + + // Track x positions used in this layer to avoid overlaps + const xPositionsUsed = new Set(); + const horizontalOffset = 200; // Additional horizontal spacing for overlapping gates (increased from 120 to 200) + + layerGates.forEach((gate) => { + // Find the leftmost qubit for this gate + const qubitIndices = gate.qubits.map(q => parseInt(q)).sort((a, b) => a - b); + const leftmostQubit = qubitIndices[0]; + let x = qubitXPositions[leftmostQubit.toString()] || 0; + + // Check if this x position is already used, if so, add offset + let offset = 0; + while (xPositionsUsed.has(x + offset)) { + offset += horizontalOffset; + } + x = x + offset; + xPositionsUsed.add(x); + + gatePositions[gate.id] = { x, y }; + + // Create non-grouped gate nodes + if (!gatesInGroups.has(gate.id)) { + nodes.push({ + id: gate.id, + type: 'custom', + position: { x, y }, + data: { label: gate.name.toUpperCase() } + }); + } + }); + }); + + // Step 3: Create groups using gate_ids from macros + if (circuitData.macros) { + circuitData.macros.forEach((macro, macroIndex) => { + if (macro.gate_ids && Array.isArray(macro.gate_ids) && macro.gate_ids.length > 0) { + const groupGates = macro.gate_ids.filter(gid => gatePositions[gid]); + + if (groupGates.length > 0) { + // Calculate group bounds based on gate positions + const groupX = Math.min(...groupGates.map(gid => gatePositions[gid].x)); + const groupY = Math.min(...groupGates.map(gid => gatePositions[gid].y)); + const groupMaxY = Math.max(...groupGates.map(gid => gatePositions[gid].y)); + + // Calculate group height dynamically with more padding + const gateSpacing = 180; // Space between gates (increased from 150 to 180) + const topPadding = 60; // Space for label at top (increased from 50 to 60) + const bottomPadding = 50; // Space at bottom + const groupHeight = (groupGates.length - 1) * gateSpacing + topPadding + bottomPadding + 100; // 100 for gate height + + // Create group node with larger width + const groupId = `group${macroIndex + 1}`; + const groupNode = { + id: groupId, + type: 'group', + position: { x: groupX, y: groupY - 40 }, // Adjusted to account for label space + style: { width: 300, height: groupHeight }, // Increased width from 200 to 300 + data: { label: macro.name } + }; + nodes.push(groupNode); + + // Create gate nodes as children of the group with more spacing + let relativeY = topPadding + 10; // Start position within group (space for label + extra padding) + groupGates.forEach((gateId) => { + const gate = gateNodes.find(g => g.id === gateId); + if (gate) { + nodes.push({ + id: gateId, + type: 'custom', + parentId: groupId, + extent: 'parent', + position: { x: 20, y: relativeY }, // Increased x from 10 to 20 for more horizontal space + data: { label: gate.name.toUpperCase() } + }); + relativeY += gateSpacing; // Space between gates (increased from 100px) + } + }); + } + } + }); + } + + // Step 4: Create edges with proper colors and handles + let edgeCounter = 0; + + // Track handle usage for each node to ensure different handles are used + const sourceHandleUsage = {}; // nodeId -> Set of used source handles + const targetHandleUsage = {}; // nodeId -> Set of used target handles + const nodeEntryHandle = {}; // nodeId_qubitId -> handle index used when entering (for correspondence) + const qubitHandleMap = {}; // qubitId -> preferred handle index (1, 2, or 3) to keep edges aligned + + // Helper function to determine preferred handle index based on qubit position + const getPreferredHandleIndex = (qubitId, allQubits) => { + const qubitIndex = parseInt(qubitId); + const sortedQubits = allQubits.map(q => parseInt(q)).sort((a, b) => a - b); + const positionInSorted = sortedQubits.indexOf(qubitIndex); + + // Map position to handle: leftmost -> 1, middle -> 2, rightmost -> 3 + if (sortedQubits.length === 1) return 2; // Middle if only one + if (sortedQubits.length === 2) { + return positionInSorted === 0 ? 1 : 3; // Left or right + } + // For 3+ qubits, distribute: left -> 1, middle -> 2, right -> 3 + if (positionInSorted === 0) return 1; // Leftmost + if (positionInSorted === sortedQubits.length - 1) return 3; // Rightmost + return 2; // Middle + }; + + // Helper function to get source handle based on entry handle for a specific qubit + const getSourceHandle = (node, qubitId, entryHandleIndex, allQubits) => { + if (node.type === 'circle') { + return 'bottom-source'; // Circle nodes only have one source handle + } + + // Use the same handle index as the entry handle for this qubit + if (entryHandleIndex !== undefined && entryHandleIndex !== null) { + const handle = `bottom-source-${entryHandleIndex}`; + if (!sourceHandleUsage[node.id]) { + sourceHandleUsage[node.id] = new Set(); + } + sourceHandleUsage[node.id].add(handle); + return handle; + } + + // If no entry handle, try to use preferred handle for this qubit + if (!qubitHandleMap[qubitId]) { + qubitHandleMap[qubitId] = getPreferredHandleIndex(qubitId, allQubits); + } + const preferredIndex = qubitHandleMap[qubitId]; + + if (!sourceHandleUsage[node.id]) { + sourceHandleUsage[node.id] = new Set(); + } + + // Try preferred handle first + const preferredHandle = `bottom-source-${preferredIndex}`; + if (!sourceHandleUsage[node.id].has(preferredHandle)) { + sourceHandleUsage[node.id].add(preferredHandle); + return preferredHandle; + } + + // If preferred is taken, find next available + for (let i = 1; i <= 3; i++) { + const handle = `bottom-source-${i}`; + if (!sourceHandleUsage[node.id].has(handle)) { + sourceHandleUsage[node.id].add(handle); + return handle; + } + } + + return 'bottom-source-1'; + }; + + const getTargetHandle = (node, qubitId, allQubits) => { + if (node.type === 'circle') { + return 'top-target'; // Circle nodes only have one target handle + } + + if (!targetHandleUsage[node.id]) { + targetHandleUsage[node.id] = new Set(); + } + + // Try to use preferred handle for this qubit to keep edges aligned + if (!qubitHandleMap[qubitId]) { + qubitHandleMap[qubitId] = getPreferredHandleIndex(qubitId, allQubits); + } + const preferredIndex = qubitHandleMap[qubitId]; + + // Try preferred handle first + const preferredHandle = `top-target-${preferredIndex}`; + if (!targetHandleUsage[node.id].has(preferredHandle)) { + targetHandleUsage[node.id].add(preferredHandle); + // Store the handle index for this specific (node, qubit) pair + const key = `${node.id}_${qubitId}`; + nodeEntryHandle[key] = preferredIndex; + return preferredHandle; + } + + // If preferred is taken, try other handles + for (let i = 1; i <= 3; i++) { + const handle = `top-target-${i}`; + if (!targetHandleUsage[node.id].has(handle)) { + targetHandleUsage[node.id].add(handle); + // Store the handle index for this specific (node, qubit) pair + const key = `${node.id}_${qubitId}`; + nodeEntryHandle[key] = i; + return handle; + } + } + + // If all handles are used, use preferred (or 1 if not set) + const key = `${node.id}_${qubitId}`; + const finalIndex = preferredIndex || 1; + nodeEntryHandle[key] = finalIndex; + return `top-target-${finalIndex}`; + }; + + // Get all qubit IDs for handle assignment + const allQubitIds = initNodes.map(n => n.qubits[0]); + + // Calculate entanglement count for each qubit + // Track how many multi-qubit gates each qubit has passed through + const qubitEntanglementCount = {}; // qubitId -> entanglement count + const qubitEdgeEntanglement = {}; // edgeId -> entanglement count for that edge + + // Initialize entanglement counts + allQubitIds.forEach(qubitId => { + qubitEntanglementCount[qubitId] = 0; + }); + + // Process edges in order to track entanglement + // First, build a map of edges by qubit in order + const edgesByQubit = {}; // qubitId -> [edges in order] + allQubitIds.forEach(qubitId => { + edgesByQubit[qubitId] = []; + }); + + circuitData.edges.forEach(edge => { + const qubitId = edge.qubit; + if (edgesByQubit[qubitId]) { + edgesByQubit[qubitId].push(edge); + } + }); + + // Sort edges by layer/depth for each qubit + allQubitIds.forEach(qubitId => { + edgesByQubit[qubitId].sort((a, b) => { + // Get the target gate for each edge + const targetA = a['to-node']; + const targetB = b['to-node']; + const gateA = gateNodes.find(g => g.id === targetA); + const gateB = gateNodes.find(g => g.id === targetB); + + const depthA = gateA ? (gateDepths[gateA.id] || gateA.layer || 0) : 0; + const depthB = gateB ? (gateDepths[gateB.id] || gateB.layer || 0) : 0; + + return depthA - depthB; + }); + }); + + // Calculate entanglement for each edge + allQubitIds.forEach(qubitId => { + let currentEntanglement = 0; + + edgesByQubit[qubitId].forEach(edge => { + const targetId = edge['to-node']; + const targetGate = gateNodes.find(g => g.id === targetId); + + if (targetGate) { + // Store entanglement count for this edge (before entering the gate) + const edgeKey = `${edge['from-node']}_${edge['to-node']}_${qubitId}`; + qubitEdgeEntanglement[edgeKey] = currentEntanglement; + + // Check if this is a multi-qubit gate (more than 1 qubit) + if (targetGate.qubits && targetGate.qubits.length > 1) { + // This is an entanglement gate - increment entanglement after exiting + // The next edge will have the increased entanglement + currentEntanglement++; + } + } else { + // Not a gate, store current entanglement + const edgeKey = `${edge['from-node']}_${edge['to-node']}_${qubitId}`; + qubitEdgeEntanglement[edgeKey] = currentEntanglement; + } + }); + + // Store final entanglement count for the qubit + qubitEntanglementCount[qubitId] = currentEntanglement; + }); + + // Helper function to get stroke width based on entanglement + const getStrokeWidth = (entanglementCount) => { + // Base width is 2, increase by 3 for each entanglement to make it more noticeable + // Cap at a reasonable maximum (e.g., 20) + return Math.min(2 + (entanglementCount * 3), 20); + }; + + // Process existing edges + circuitData.edges.forEach(edge => { + // Map source and target IDs + let sourceId = edge['from-node']; + let targetId = edge['to-node']; + + // Convert init/end nodes to qubit IDs + if (nodeIdToQubitId[sourceId]) { + sourceId = nodeIdToQubitId[sourceId]; + } + if (nodeIdToQubitId[targetId]) { + targetId = nodeIdToQubitId[targetId]; + } + + const sourceNode = nodes.find(n => n.id === sourceId); + const targetNode = nodes.find(n => n.id === targetId); + + if (sourceNode && targetNode) { + // Get next available handles for this node + const qubitId = edge.qubit; + const qubitIndex = parseInt(qubitId); + + // Get target handle (entry point) for this qubit + const targetHandle = getTargetHandle(targetNode, qubitId, allQubitIds); + + // Get source handle based on entry handle for this specific qubit + // Look up the entry handle index for this (node, qubit) pair + const sourceKey = `${sourceId}_${qubitId}`; + const entryHandleIndex = nodeEntryHandle[sourceKey]; + const sourceHandle = getSourceHandle(sourceNode, qubitId, entryHandleIndex, allQubitIds); + + // Get color for this qubit + const color = qubitColors[qubitId] || getQubitColor(qubitId); + + // Get entanglement count for this edge + const edgeKey = `${edge['from-node']}_${edge['to-node']}_${qubitId}`; + const entanglementCount = qubitEdgeEntanglement[edgeKey] || 0; + const strokeWidth = getStrokeWidth(entanglementCount); + + edges.push({ + id: `edge-${edgeCounter++}`, + source: sourceId, + target: targetId, + sourceHandle, + targetHandle, + label: `q${qubitId}`, + markerEnd: { type: 'arrowclosed', color }, + style: { stroke: color, strokeWidth: strokeWidth } + }); + } + }); + + // Step 5: Add measurement nodes at the end of each qubit chain + const endNodes = circuitData.nodes.filter(n => n.type === 'end'); + const measurementNodes = {}; + const maxLayer = Math.max(...gateNodes.map(g => gateDepths[g.id] || g.layer || 0), 0); + const measurementY = baseY + (maxLayer + 1) * layerHeight + 150; // Extra 150px spacing before measurements (increased from 100) + + // Build a mapping of edges by source (using converted IDs) for finding last nodes + const edgesBySourceConverted = {}; + edges.forEach(edge => { + if (!edgesBySourceConverted[edge.source]) { + edgesBySourceConverted[edge.source] = []; + } + edgesBySourceConverted[edge.source].push(edge); + }); + + // Find the last node for each qubit + initNodes.forEach(initNode => { + const qubitId = initNode.qubits[0]; + const qubitNodeId = `q${qubitId}`; + const x = qubitXPositions[qubitId] || 0; + + // Find the last node for this qubit by following edges + let lastNodeId = qubitNodeId; + let currentNode = qubitNodeId; + let foundNext = true; + + while (foundNext) { + foundNext = false; + if (edgesBySourceConverted[currentNode]) { + // Find edges for this qubit + const qubitEdges = edgesBySourceConverted[currentNode].filter(e => e.label === `q${qubitId}`); + if (qubitEdges.length > 0) { + // Take the first edge (assuming they're in order) + const nextEdge = qubitEdges[0]; + const nextId = nextEdge.target; + const nextNode = nodes.find(n => n.id === nextId); + if (nextNode && edgesBySourceConverted[nextId] && edgesBySourceConverted[nextId].some(e => e.label === `q${qubitId}`)) { + currentNode = nextId; + lastNodeId = nextId; + foundNext = true; + } else if (nextNode) { + // This is the last node + lastNodeId = nextId; + foundNext = false; + } + } + } + } + + // Create measurement node + const measurementId = `measure_${qubitId}`; + measurementNodes[qubitId] = measurementId; + + nodes.push({ + id: measurementId, + type: 'circle', + position: { x, y: measurementY }, + data: { label: `M${qubitId}` } + }); + + // Add edge from last node to measurement node + const lastNode = nodes.find(n => n.id === lastNodeId); + if (lastNode) { + const qubitIndex = parseInt(qubitId); + // Use the entry handle index for this (node, qubit) pair to get corresponding exit handle + const lastNodeKey = `${lastNodeId}_${qubitId}`; + const entryHandleIndex = nodeEntryHandle[lastNodeKey]; + const sourceHandle = getSourceHandle(lastNode, qubitId, entryHandleIndex, allQubitIds); + const color = qubitColors[qubitId] || getQubitColor(qubitId); + + // Get final entanglement count for this qubit + const finalEntanglementCount = qubitEntanglementCount[qubitId] || 0; + const strokeWidth = getStrokeWidth(finalEntanglementCount); + + edges.push({ + id: `edge-${edgeCounter++}`, + source: lastNodeId, + target: measurementId, + sourceHandle, + targetHandle: 'top-target', + label: `q${qubitId}`, + markerEnd: { type: 'arrowclosed', color }, + style: { stroke: color, strokeWidth: strokeWidth } + }); + } + }); + + return { nodes, edges }; +} + +export default function Circuit2() { + const [nodes, setNodes] = useState([]); + const [edges, setEdges] = useState([]); + const [circuitData, setCircuitData] = useState(null); + const [error, setError] = useState(null); + + // Handle file upload + const handleFileUpload = (event) => { + const file = event.target.files[0]; + if (!file) return; + + const reader = new FileReader(); + reader.onload = (e) => { + try { + const data = JSON.parse(e.target.result); + setCircuitData(data); + const { nodes: parsedNodes, edges: parsedEdges } = parseCircuitData(data); + setNodes(parsedNodes); + setEdges(parsedEdges); + setError(null); + } catch (err) { + setError('Invalid JSON file: ' + err.message); + console.error('Error parsing JSON:', err); + } + }; + reader.readAsText(file); + }; + + const onNodesChange = useCallback( + (changes) => setNodes((nodesSnapshot) => applyNodeChanges(changes, nodesSnapshot)), + [] + ); + + const onEdgesChange = useCallback( + (changes) => setEdges((edgesSnapshot) => applyEdgeChanges(changes, edgesSnapshot)), + [] + ); + + const onConnect = useCallback( + (params) => { + const newEdge = { + ...params, + markerEnd: { type: 'arrowclosed', color: '#1a192b' }, + style: { stroke: '#1a192b', strokeWidth: 2 } + }; + setEdges((edgesSnapshot) => addEdge(newEdge, edgesSnapshot)); + }, + [] + ); + + return ( +
+ {/* File upload button */} +
+
+ Upload your QASM file here to visualize the circuit +
+ + + {error && ( +
+ {error} +
+ )} +
+ + +
+ ); +} diff --git a/Quilt/my-react-app/src/index.css b/Quilt/my-react-app/src/index.css new file mode 100644 index 0000000..6e3758e --- /dev/null +++ b/Quilt/my-react-app/src/index.css @@ -0,0 +1,102 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + min-width: 320px; + min-height: 100vh; +} + +/* Ensure React Flow node labels are visible */ +.react-flow__node { + color: #000; +} + +.react-flow__node-default { + background: #fff; + border: 1px solid #1a192b; + color: #222; + font-size: 12px; + padding: 10px; + border-radius: 3px; +} + +.react-flow__node-default .react-flow__handle { + background: #1a192b; +} + +/* Hide default React Flow group label */ +.react-flow__node-group .react-flow__node-label { + display: none !important; +} + +/* Hide React Flow's default group label text - target the wrapper div that contains default label */ +.react-flow__node-group > div:first-of-type:not([style*="position: absolute"]):not([style*="background"]) { + font-size: 0 !important; + line-height: 0 !important; + color: transparent !important; +} + +/* But allow our custom label to show */ +.react-flow__node-group > div[style*="position: absolute"][style*="top"] { + color: #222 !important; + font-size: 14px !important; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/Quilt/my-react-app/src/main.jsx b/Quilt/my-react-app/src/main.jsx new file mode 100644 index 0000000..55b23bf --- /dev/null +++ b/Quilt/my-react-app/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import Circuit2 from './Circuit2.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/Quilt/my-react-app/vite.config.js b/Quilt/my-react-app/vite.config.js new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/Quilt/my-react-app/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/Quilt/pyproject.toml b/Quilt/pyproject.toml new file mode 100644 index 0000000..3d39cfd --- /dev/null +++ b/Quilt/pyproject.toml @@ -0,0 +1,72 @@ +[project] +name = "quilt" +version = "0.1.0" +description = "Quantum circuit macro-gate detection and hierarchical visualization tool" +readme = "README.md" +requires-python = ">=3.12" +license = {text = "MIT"} +authors = [ + {name = "Bruno", email = "bruno@quantum.bear"} +] +keywords = ["quantum", "qiskit", "circuit", "macro-gate", "dag", "visualization"] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering :: Physics", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] + +dependencies = [ + "qiskit>=2.2.3", + "qiskit-aer>=0.14.0", + "qiskit-qasm3-import>=0.5.0", + "matplotlib>=3.8.0", + "pylatexenc>=2.10", + "numpy>=1.26.0", + "scipy>=1.12.0", + "pillow>=10.0.0", + "pydot>=1.4.2", +] + +[project.optional-dependencies] +dev = [ + "pytest>=7.4.0", + "pytest-cov>=4.1.0", + "black>=23.0.0", + "ruff>=0.1.0", +] + +[project.scripts] +quilt = "macro_gate_detector.macro_gate_detector:main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["macro_gate_detector"] + +[tool.uv] +dev-dependencies = [ + "pytest>=7.4.0", + "pytest-cov>=4.1.0", + "black>=23.0.0", + "ruff>=0.1.0", +] + +[tool.black] +line-length = 100 +target-version = ['py312'] + +[tool.ruff] +line-length = 100 +target-version = "py312" + +[tool.pytest.ini_options] +testpaths = ["macro_gate_detector/tests"] +python_files = ["test_*.py"] +python_classes = ["Test*"] +python_functions = ["test_*"] + diff --git a/Quilt/uv.lock b/Quilt/uv.lock new file mode 100644 index 0000000..dc21a07 --- /dev/null +++ b/Quilt/uv.lock @@ -0,0 +1,956 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "antlr4-python3-runtime" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/5f/2cdf6f7aca3b20d3f316e9f505292e1f256a32089bd702034c29ebde6242/antlr4_python3_runtime-4.13.2.tar.gz", hash = "sha256:909b647e1d2fc2b70180ac586df3933e38919c85f98ccc656a96cd3f25ef3916", size = 117467, upload-time = "2024-08-03T19:00:12.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl", hash = "sha256:fe3835eb8d33daece0e799090eda89719dbccee7aa39ef94eed3818cafa5a7e8", size = 144462, upload-time = "2024-08-03T19:00:11.134Z" }, +] + +[[package]] +name = "black" +version = "25.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "pytokens" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/43/20b5c90612d7bdb2bdbcceeb53d588acca3bb8f0e4c5d5c751a2c8fdd55a/black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619", size = 648393, upload-time = "2025-09-19T00:27:37.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/8e/319cfe6c82f7e2d5bfb4d3353c6cc85b523d677ff59edc61fdb9ee275234/black-25.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1b9dc70c21ef8b43248f1d86aedd2aaf75ae110b958a7909ad8463c4aa0880b0", size = 1742012, upload-time = "2025-09-19T00:33:08.678Z" }, + { url = "https://files.pythonhosted.org/packages/94/cc/f562fe5d0a40cd2a4e6ae3f685e4c36e365b1f7e494af99c26ff7f28117f/black-25.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e46eecf65a095fa62e53245ae2795c90bdecabd53b50c448d0a8bcd0d2e74c4", size = 1581421, upload-time = "2025-09-19T00:35:25.937Z" }, + { url = "https://files.pythonhosted.org/packages/84/67/6db6dff1ebc8965fd7661498aea0da5d7301074b85bba8606a28f47ede4d/black-25.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9101ee58ddc2442199a25cb648d46ba22cd580b00ca4b44234a324e3ec7a0f7e", size = 1655619, upload-time = "2025-09-19T00:30:49.241Z" }, + { url = "https://files.pythonhosted.org/packages/10/10/3faef9aa2a730306cf469d76f7f155a8cc1f66e74781298df0ba31f8b4c8/black-25.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:77e7060a00c5ec4b3367c55f39cf9b06e68965a4f2e61cecacd6d0d9b7ec945a", size = 1342481, upload-time = "2025-09-19T00:31:29.625Z" }, + { url = "https://files.pythonhosted.org/packages/48/99/3acfea65f5e79f45472c45f87ec13037b506522719cd9d4ac86484ff51ac/black-25.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0172a012f725b792c358d57fe7b6b6e8e67375dd157f64fa7a3097b3ed3e2175", size = 1742165, upload-time = "2025-09-19T00:34:10.402Z" }, + { url = "https://files.pythonhosted.org/packages/3a/18/799285282c8236a79f25d590f0222dbd6850e14b060dfaa3e720241fd772/black-25.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f", size = 1581259, upload-time = "2025-09-19T00:32:49.685Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ce/883ec4b6303acdeca93ee06b7622f1fa383c6b3765294824165d49b1a86b/black-25.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831", size = 1655583, upload-time = "2025-09-19T00:30:44.505Z" }, + { url = "https://files.pythonhosted.org/packages/21/17/5c253aa80a0639ccc427a5c7144534b661505ae2b5a10b77ebe13fa25334/black-25.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:846d58e3ce7879ec1ffe816bb9df6d006cd9590515ed5d17db14e17666b2b357", size = 1343428, upload-time = "2025-09-19T00:32:13.839Z" }, + { url = "https://files.pythonhosted.org/packages/1b/46/863c90dcd3f9d41b109b7f19032ae0db021f0b2a81482ba0a1e28c84de86/black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae", size = 203363, upload-time = "2025-09-19T00:27:35.724Z" }, +] + +[[package]] +name = "click" +version = "8.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, +] + +[[package]] +name = "coverage" +version = "7.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/89/12/3e2d2ec71796e0913178478e693a06af6a3bc9f7f9cb899bf85a426d8370/coverage-7.11.1.tar.gz", hash = "sha256:b4b3a072559578129a9e863082a2972a2abd8975bc0e2ec57da96afcd6580a8a", size = 814037, upload-time = "2025-11-07T10:52:41.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/31/04af7e42fdb3681e4d73d37bf3f375f0488aa38d1001ee746c7dbfe09643/coverage-7.11.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:421e2d237dcecdefa9b77cae1aa0dfff5c495f29e053e776172457e289976311", size = 216896, upload-time = "2025-11-07T10:50:31.429Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e9/1c3628a1225bdea66295a117cd2bb1d324d9c433c40078b24d50f55448a7/coverage-7.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:08ef89c812072ecd52a862b46e131f75596475d23cc7f5a75410394341d4332f", size = 217261, upload-time = "2025-11-07T10:50:33.008Z" }, + { url = "https://files.pythonhosted.org/packages/2b/80/4d4f943da23c432b2bba8664f4eada9b19911081852e8cc89776c61d0b94/coverage-7.11.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bc6e0b2d6ed317810b4e435ffabc31b2d517d6ceb4183dfd6af4748c52d170eb", size = 248742, upload-time = "2025-11-07T10:50:34.634Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e1/c4b42f02fbb6ce08e05d7a2b26bcf5df11d3e67a3806e40415f7ab9511e7/coverage-7.11.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b59736704df8b1f8b1dafb36b16f2ef8a952e4410465634442459426bd2319ae", size = 251503, upload-time = "2025-11-07T10:50:36.501Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/3df60e88f1dabccae4994c6df4a2f23d4cd0eee27fc3ae8f0bb2e78cb538/coverage-7.11.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:843816452d8bfc4c2be72546b3b382850cb91150feaa963ec7d2b665ec9d4768", size = 252590, upload-time = "2025-11-07T10:50:38.059Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/2b9fae11361b0348c2d3612a8179d2cc8b6b245e8b14d5479c75b9f18613/coverage-7.11.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:19363046125d4a423c25d3d7c90bab3a0230932c16014198f87a6b3960c1b187", size = 249133, upload-time = "2025-11-07T10:50:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2b/e33712a8eede02762a536bdc2f89e736e0ad87bd13b35d724306585aeb54/coverage-7.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e37486aed7045c280ebdc207026bdef9267730177d929a5e25250e1f33cc125", size = 250524, upload-time = "2025-11-07T10:50:41.59Z" }, + { url = "https://files.pythonhosted.org/packages/84/c9/6181877977a0f6e46b9c93a8382b8c671769fb12df8a15be8d6091541b77/coverage-7.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7c68180e67b4843674bfb1d3ec928ffcfc94081b5da959e616405eca51c23356", size = 248673, upload-time = "2025-11-07T10:50:43.153Z" }, + { url = "https://files.pythonhosted.org/packages/9b/d6/ff26c2eb57d4dcd46c6ed136d6b04aceb7f58f48dcc500c77f7194711a6f/coverage-7.11.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cf825b60f94d1706c22d4887310db26cc3117d545ac6ad4229b4a0d718afcf9a", size = 248251, upload-time = "2025-11-07T10:50:45.069Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ff/411803f1fcb9efe00afbc96442564cc691f537541a8bde377cf1ac04e695/coverage-7.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:437149272ff0440df66044bd6ee87cbc252463754ca43cafa496cfb2f57f56dd", size = 250111, upload-time = "2025-11-07T10:50:46.701Z" }, + { url = "https://files.pythonhosted.org/packages/c1/9f/781c045e1e5f8930f8266f224318040413b60837749d2ed11883b7478c81/coverage-7.11.1-cp312-cp312-win32.whl", hash = "sha256:98ea0b8d1addfc333494c2248af367e8ecb27724a99804a18376b801f876da58", size = 219407, upload-time = "2025-11-07T10:50:48.862Z" }, + { url = "https://files.pythonhosted.org/packages/26/59/813d8eedc96a781e8a6f9c37f6ecb4326ebbffdafe2e1154ed2def468b76/coverage-7.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:7d49a473799e55a465bcadd19525977ab80031b8b86baaa622241808df4585cd", size = 220220, upload-time = "2025-11-07T10:50:51.576Z" }, + { url = "https://files.pythonhosted.org/packages/63/5f/c0905d9159d38194943a21d7d013f1c2f0c43e7d63f680ed56269728418a/coverage-7.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:0c77e5951ab176a6ccb70c6f688fca2a7ac834753ba82ee4eb741be655f30b43", size = 218856, upload-time = "2025-11-07T10:50:53.591Z" }, + { url = "https://files.pythonhosted.org/packages/f4/01/0c50c318f5e8f1a482da05d788d0ff06137803ed8fface4a1ba51e04b3ad/coverage-7.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:da9930594ca99d66eb6f613d7beba850db2f8dfa86810ee35ae24e4d5f2bb97d", size = 216920, upload-time = "2025-11-07T10:50:55.992Z" }, + { url = "https://files.pythonhosted.org/packages/20/11/9f038e6c2baea968c377ab355b0d1d0a46b5f38985691bf51164e1b78c1f/coverage-7.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc47a280dc014220b0fc6e5f55082a3f51854faf08fd9635b8a4f341c46c77d3", size = 217301, upload-time = "2025-11-07T10:50:57.609Z" }, + { url = "https://files.pythonhosted.org/packages/68/cd/9dcf93d81d0cddaa0bba90c3b4580e6f1ddf833918b816930d250cc553a4/coverage-7.11.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:74003324321bbf130939146886eddf92e48e616b5910215e79dea6edeb8ee7c8", size = 248277, upload-time = "2025-11-07T10:50:59.442Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/b2c7c494046c9c783d3cac4c812fc24d6104dd36a7a598e7dd6fea3e7927/coverage-7.11.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:211f7996265daab60a8249af4ca6641b3080769cbedcffc42cc4841118f3a305", size = 250871, upload-time = "2025-11-07T10:51:01.094Z" }, + { url = "https://files.pythonhosted.org/packages/a5/5a/b359649566954498aa17d7c98093182576d9e435ceb4ea917b3b48d56f86/coverage-7.11.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70619d194d8fea0cb028cb6bb9c85b519c7509c1d1feef1eea635183bc8ecd27", size = 252115, upload-time = "2025-11-07T10:51:03.087Z" }, + { url = "https://files.pythonhosted.org/packages/f3/17/3cef1ede3739622950f0737605353b797ec564e70c9d254521b10f4b03ba/coverage-7.11.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e0208bb59d441cfa3321569040f8e455f9261256e0df776c5462a1e5a9b31e13", size = 248442, upload-time = "2025-11-07T10:51:04.888Z" }, + { url = "https://files.pythonhosted.org/packages/5f/63/d5854c47ae42d9d18855329db6bc528f5b7f4f874257edb00cf8b483f9f8/coverage-7.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:545714d8765bda1c51f8b1c96e0b497886a054471c68211e76ef49dd1468587d", size = 250253, upload-time = "2025-11-07T10:51:06.515Z" }, + { url = "https://files.pythonhosted.org/packages/48/e8/c7706f8a5358a59c18b489e7e19e83d6161b7c8bc60771f95920570c94a8/coverage-7.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d0a2b02c1e20158dd405054bcca87f91fd5b7605626aee87150819ea616edd67", size = 248217, upload-time = "2025-11-07T10:51:08.405Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c9/a2136dfb168eb09e2f6d9d6b6c986243fdc0b3866a9376adb263d3c3378b/coverage-7.11.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0f4aa986a4308a458e0fb572faa3eb3db2ea7ce294604064b25ab32b435a468", size = 248040, upload-time = "2025-11-07T10:51:10.626Z" }, + { url = "https://files.pythonhosted.org/packages/18/9a/a63991c0608ddc6adf65e6f43124951aaf36bd79f41937b028120b8268ea/coverage-7.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d51cc6687e8bbfd1e041f52baed0f979cd592242cf50bf18399a7e03afc82d88", size = 249801, upload-time = "2025-11-07T10:51:12.63Z" }, + { url = "https://files.pythonhosted.org/packages/84/19/947acf7c0c6e90e4ec3abf474133ed36d94407d07e36eafdfd3acb59fee9/coverage-7.11.1-cp313-cp313-win32.whl", hash = "sha256:1b3067db3afe6deeca2b2c9f0ec23820d5f1bd152827acfadf24de145dfc5f66", size = 219430, upload-time = "2025-11-07T10:51:14.329Z" }, + { url = "https://files.pythonhosted.org/packages/35/54/36fef7afb3884450c7b6d494fcabe2fab7c669d547c800ca30f41c1dc212/coverage-7.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:39a4c44b0cd40e3c9d89b2b7303ebd6ab9ae8a63f9e9a8c4d65a181a0b33aebe", size = 220239, upload-time = "2025-11-07T10:51:16.418Z" }, + { url = "https://files.pythonhosted.org/packages/d3/dc/7d38bb99e8e69200b7dd5de15507226bd90eac102dfc7cc891b9934cdc76/coverage-7.11.1-cp313-cp313-win_arm64.whl", hash = "sha256:a2e3560bf82fa8169a577e054cbbc29888699526063fee26ea59ea2627fd6e73", size = 218868, upload-time = "2025-11-07T10:51:18.186Z" }, + { url = "https://files.pythonhosted.org/packages/36/c6/d1ff54fbd6bcad42dbcfd13b417e636ef84aae194353b1ef3361700f2525/coverage-7.11.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47a4f362a10285897ab3aa7a4b37d28213a4f2626823923613d6d7a3584dd79a", size = 217615, upload-time = "2025-11-07T10:51:21.065Z" }, + { url = "https://files.pythonhosted.org/packages/73/f9/6ed59e7cf1488d6f975e5b14ef836f5e537913523e92175135f8518a83ce/coverage-7.11.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0df35fa7419ef571db9dacd50b0517bc54dbfe37eb94043b5fc3540bff276acd", size = 217960, upload-time = "2025-11-07T10:51:22.797Z" }, + { url = "https://files.pythonhosted.org/packages/c4/74/2dab1dc2ebe16f074f80ae483b0f45faf278d102be703ac01b32cd85b6c3/coverage-7.11.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e1a2c621d341c9d56f7917e56fbb56be4f73fe0d0e8dae28352fb095060fd467", size = 259262, upload-time = "2025-11-07T10:51:24.467Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/eccfe039663e29a50a54b0c2c8d076acd174d7ac50d018ef8a5b1c37c8dc/coverage-7.11.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c354b111be9b2234d9573d75dd30ca4e414b7659c730e477e89be4f620b3fb5", size = 261326, upload-time = "2025-11-07T10:51:26.232Z" }, + { url = "https://files.pythonhosted.org/packages/f0/bb/2b829aa23fd5ee8318e33cc02a606eb09900921291497963adc3f06af8bb/coverage-7.11.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4589bd44698728f600233fb2881014c9b8ec86637ef454c00939e779661dbe7e", size = 263758, upload-time = "2025-11-07T10:51:27.912Z" }, + { url = "https://files.pythonhosted.org/packages/ac/03/d44c3d70e5da275caf2cad2071da6b425412fbcb1d1d5a81f1f89b45e3f1/coverage-7.11.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c6956fc8754f2309131230272a7213a483a32ecbe29e2b9316d808a28f2f8ea1", size = 258444, upload-time = "2025-11-07T10:51:30.107Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c1/cf61d9f46ae088774c65dd3387a15dfbc72de90c1f6e105025e9eda19b42/coverage-7.11.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63926a97ed89dc6a087369b92dcb8b9a94cead46c08b33a7f1f4818cd8b6a3c3", size = 261335, upload-time = "2025-11-07T10:51:31.814Z" }, + { url = "https://files.pythonhosted.org/packages/95/9a/b3299bb14f11f2364d78a2b9704491b15395e757af6116694731ce4e5834/coverage-7.11.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f5311ba00c53a7fb2b293fdc1f478b7286fe2a845a7ba9cda053f6e98178f0b4", size = 258951, upload-time = "2025-11-07T10:51:33.925Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a3/73cb2763e59f14ba6d8d6444b1f640a9be2242bfb59b7e50581c695db7ff/coverage-7.11.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:31bf5ffad84c974f9e72ac53493350f36b6fa396109159ec704210698f12860b", size = 257840, upload-time = "2025-11-07T10:51:36.092Z" }, + { url = "https://files.pythonhosted.org/packages/85/db/482e72589a952027e238ffa3a15f192c552e0685fd0c5220ad05b5f17d56/coverage-7.11.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:227ee59fbc4a8c57a7383a1d7af6ca94a78ae3beee4045f38684548a8479a65b", size = 260040, upload-time = "2025-11-07T10:51:38.277Z" }, + { url = "https://files.pythonhosted.org/packages/18/a1/b931d3ee099c2dca8e9ea56c07ae84c0f91562f7bbbcccab8c91b3474ef1/coverage-7.11.1-cp313-cp313t-win32.whl", hash = "sha256:a447d97b3ce680bb1da2e6bd822ebb71be6a1fb77ce2c2ad2fe4bd8aacec3058", size = 220102, upload-time = "2025-11-07T10:51:40.017Z" }, + { url = "https://files.pythonhosted.org/packages/9a/53/b553b7bfa6207def4918f0cb72884c844fa4c3f1566e58fbb4f34e54cdc5/coverage-7.11.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6d11180437c67bde2248563a42b8e5bbf85c8df78fae13bf818ad17bfb15f02", size = 221166, upload-time = "2025-11-07T10:51:41.921Z" }, + { url = "https://files.pythonhosted.org/packages/6b/45/1c1d58b3ed585598764bd2fe41fcf60ccafe15973ad621c322ba52e22d32/coverage-7.11.1-cp313-cp313t-win_arm64.whl", hash = "sha256:1e19a4c43d612760c6f7190411fb157e2d8a6dde00c91b941d43203bd3b17f6f", size = 219439, upload-time = "2025-11-07T10:51:43.753Z" }, + { url = "https://files.pythonhosted.org/packages/d9/c2/ac2c3417eaa4de1361036ebbc7da664242b274b2e00c4b4a1cfc7b29920b/coverage-7.11.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0305463c45c5f21f0396cd5028de92b1f1387e2e0756a85dd3147daa49f7a674", size = 216967, upload-time = "2025-11-07T10:51:45.55Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a3/afef455d03c468ee303f9df9a6f407e8bea64cd576fca914ff888faf52ca/coverage-7.11.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fa4d468d5efa1eb6e3062be8bd5f45cbf28257a37b71b969a8c1da2652dfec77", size = 217298, upload-time = "2025-11-07T10:51:47.31Z" }, + { url = "https://files.pythonhosted.org/packages/9d/59/6e2fb3fb58637001132dc32228b4fb5b332d75d12f1353cb00fe084ee0ba/coverage-7.11.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d2b2f5fc8fe383cbf2d5c77d6c4b2632ede553bc0afd0cdc910fa5390046c290", size = 248337, upload-time = "2025-11-07T10:51:49.48Z" }, + { url = "https://files.pythonhosted.org/packages/1d/5e/ce442bab963e3388658da8bde6ddbd0a15beda230afafaa25e3c487dc391/coverage-7.11.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bde6488c1ad509f4fb1a4f9960fd003d5a94adef61e226246f9699befbab3276", size = 250853, upload-time = "2025-11-07T10:51:51.215Z" }, + { url = "https://files.pythonhosted.org/packages/d1/2f/43f94557924ca9b64e09f1c3876da4eec44a05a41e27b8a639d899716c0e/coverage-7.11.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a69e0d6fa0b920fe6706a898c52955ec5bcfa7e45868215159f45fd87ea6da7c", size = 252190, upload-time = "2025-11-07T10:51:53.262Z" }, + { url = "https://files.pythonhosted.org/packages/8c/fa/a04e769b92bc5628d4bd909dcc3c8219efe5e49f462e29adc43e198ecfde/coverage-7.11.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:976e51e4a549b80e4639eda3a53e95013a14ff6ad69bb58ed604d34deb0e774c", size = 248335, upload-time = "2025-11-07T10:51:55.388Z" }, + { url = "https://files.pythonhosted.org/packages/99/d0/b98ab5d2abe425c71117a7c690ead697a0b32b83256bf0f566c726b7f77b/coverage-7.11.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d61fcc4d384c82971a3d9cf00d0872881f9ded19404c714d6079b7a4547e2955", size = 250209, upload-time = "2025-11-07T10:51:57.263Z" }, + { url = "https://files.pythonhosted.org/packages/9c/3f/b9c4fbd2e6d1b64098f99fb68df7f7c1b3e0a0968d24025adb24f359cdec/coverage-7.11.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:284c5df762b533fae3ebd764e3b81c20c1c9648d93ef34469759cb4e3dfe13d0", size = 248163, upload-time = "2025-11-07T10:51:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/08/fc/3e4d54fb6368b0628019eefd897fc271badbd025410fd5421a65fb58758f/coverage-7.11.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:bab32cb1d4ad2ac6dcc4e17eee5fa136c2a1d14ae914e4bce6c8b78273aece3c", size = 247983, upload-time = "2025-11-07T10:52:01.027Z" }, + { url = "https://files.pythonhosted.org/packages/b9/4a/a5700764a12e932b35afdddb2f59adbca289c1689455d06437f609f3ef35/coverage-7.11.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:36f2fed9ce392ca450fb4e283900d0b41f05c8c5db674d200f471498be3ce747", size = 249646, upload-time = "2025-11-07T10:52:02.856Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2c/45ed33d9e80a1cc9b44b4bd535d44c154d3204671c65abd90ec1e99522a2/coverage-7.11.1-cp314-cp314-win32.whl", hash = "sha256:853136cecb92a5ba1cc8f61ec6ffa62ca3c88b4b386a6c835f8b833924f9a8c5", size = 219700, upload-time = "2025-11-07T10:52:05.05Z" }, + { url = "https://files.pythonhosted.org/packages/90/d7/5845597360f6434af1290118ebe114642865f45ce47e7e822d9c07b371be/coverage-7.11.1-cp314-cp314-win_amd64.whl", hash = "sha256:77443d39143e20927259a61da0c95d55ffc31cf43086b8f0f11a92da5260d592", size = 220516, upload-time = "2025-11-07T10:52:07.259Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d0/d311a06f9cf7a48a98ffcfd0c57db0dcab6da46e75c439286a50dc648161/coverage-7.11.1-cp314-cp314-win_arm64.whl", hash = "sha256:829acb88fa47591a64bf5197e96a931ce9d4b3634c7f81a224ba3319623cdf6c", size = 219091, upload-time = "2025-11-07T10:52:09.216Z" }, + { url = "https://files.pythonhosted.org/packages/a7/3d/c6a84da4fa9b840933045b19dd19d17b892f3f2dd1612903260291416dba/coverage-7.11.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2ad1fe321d9522ea14399de83e75a11fb6a8887930c3679feb383301c28070d9", size = 217700, upload-time = "2025-11-07T10:52:11.348Z" }, + { url = "https://files.pythonhosted.org/packages/94/10/a4fc5022017dd7ac682dc423849c241dfbdad31734b8f96060d84e70b587/coverage-7.11.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f69c332f0c3d1357c74decc9b1843fcd428cf9221bf196a20ad22aa1db3e1b6c", size = 217968, upload-time = "2025-11-07T10:52:13.203Z" }, + { url = "https://files.pythonhosted.org/packages/59/2d/a554cd98924d296de5816413280ac3b09e42a05fb248d66f8d474d321938/coverage-7.11.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:576baeea4eebde684bf6c91c01e97171c8015765c8b2cfd4022a42b899897811", size = 259334, upload-time = "2025-11-07T10:52:15.079Z" }, + { url = "https://files.pythonhosted.org/packages/05/98/d484cb659ec33958ca96b6f03438f56edc23b239d1ad0417b7a97fc1848a/coverage-7.11.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:28ad84c694fa86084cfd3c1eab4149844b8cb95bd8e5cbfc4a647f3ee2cce2b3", size = 261445, upload-time = "2025-11-07T10:52:17.134Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fa/920cba122cc28f4557c0507f8bd7c6e527ebcc537d0309186f66464a8fd9/coverage-7.11.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b1043ff958f09fc3f552c014d599f3c6b7088ba97d7bc1bd1cce8603cd75b520", size = 263858, upload-time = "2025-11-07T10:52:19.836Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a0/036397bdbee0f3bd46c2e26fdfbb1a61b2140bf9059240c37b61149047fa/coverage-7.11.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c6681add5060c2742dafcf29826dff1ff8eef889a3b03390daeed84361c428bd", size = 258381, upload-time = "2025-11-07T10:52:21.687Z" }, + { url = "https://files.pythonhosted.org/packages/b6/61/2533926eb8990f182eb287f4873216c8ca530cc47241144aabf46fe80abe/coverage-7.11.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:773419b225ec9a75caa1e941dd0c83a91b92c2b525269e44e6ee3e4c630607db", size = 261321, upload-time = "2025-11-07T10:52:23.612Z" }, + { url = "https://files.pythonhosted.org/packages/32/6e/618f7e203a998e4f6b8a0fa395744a416ad2adbcdc3735bc19466456718a/coverage-7.11.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a9cb272a0e0157dbb9b2fd0b201b759bd378a1a6138a16536c025c2ce4f7643b", size = 258933, upload-time = "2025-11-07T10:52:25.514Z" }, + { url = "https://files.pythonhosted.org/packages/22/40/6b1c27f772cb08a14a338647ead1254a57ee9dabbb4cacbc15df7f278741/coverage-7.11.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:e09adb2a7811dc75998eef68f47599cf699e2b62eed09c9fefaeb290b3920f34", size = 257756, upload-time = "2025-11-07T10:52:27.845Z" }, + { url = "https://files.pythonhosted.org/packages/73/07/f9cd12f71307a785ea15b009c8d8cc2543e4a867bd04b8673843970b6b43/coverage-7.11.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1335fa8c2a2fea49924d97e1e3500cfe8d7c849f5369f26bb7559ad4259ccfab", size = 260086, upload-time = "2025-11-07T10:52:29.776Z" }, + { url = "https://files.pythonhosted.org/packages/34/02/31c5394f6f5d72a466966bcfdb61ce5a19862d452816d6ffcbb44add16ee/coverage-7.11.1-cp314-cp314t-win32.whl", hash = "sha256:4782d71d2a4fa7cef95e853b7097c8bbead4dbd0e6f9c7152a6b11a194b794db", size = 220483, upload-time = "2025-11-07T10:52:31.752Z" }, + { url = "https://files.pythonhosted.org/packages/7f/96/81e1ef5fbfd5090113a96e823dbe055e4c58d96ca73b1fb0ad9d26f9ec36/coverage-7.11.1-cp314-cp314t-win_amd64.whl", hash = "sha256:939f45e66eceb63c75e8eb8fc58bb7077c00f1a41b0e15c6ef02334a933cfe93", size = 221592, upload-time = "2025-11-07T10:52:33.724Z" }, + { url = "https://files.pythonhosted.org/packages/38/7a/a5d050de44951ac453a2046a0f3fb5471a4a557f0c914d00db27d543d94c/coverage-7.11.1-cp314-cp314t-win_arm64.whl", hash = "sha256:01c575bdbef35e3f023b50a146e9a75c53816e4f2569109458155cd2315f87d9", size = 219627, upload-time = "2025-11-07T10:52:36.285Z" }, + { url = "https://files.pythonhosted.org/packages/76/32/bd9f48c28e23b2f08946f8e83983617b00619f5538dbd7e1045fa7e88c00/coverage-7.11.1-py3-none-any.whl", hash = "sha256:0fa848acb5f1da24765cee840e1afe9232ac98a8f9431c6112c15b34e880b9e8", size = 208689, upload-time = "2025-11-07T10:52:38.646Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "dill" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, +] + +[[package]] +name = "fonttools" +version = "4.60.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/42/97a13e47a1e51a5a7142475bbcf5107fe3a68fc34aef331c897d5fb98ad0/fonttools-4.60.1.tar.gz", hash = "sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9", size = 3559823, upload-time = "2025-09-29T21:13:27.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/f7/a10b101b7a6f8836a5adb47f2791f2075d044a6ca123f35985c42edc82d8/fonttools-4.60.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc", size = 2832953, upload-time = "2025-09-29T21:11:39.616Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/7bd094b59c926acf2304d2151354ddbeb74b94812f3dc943c231db09cb41/fonttools-4.60.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877", size = 2352706, upload-time = "2025-09-29T21:11:41.826Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ca/4bb48a26ed95a1e7eba175535fe5805887682140ee0a0d10a88e1de84208/fonttools-4.60.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c", size = 4923716, upload-time = "2025-09-29T21:11:43.893Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9f/2cb82999f686c1d1ddf06f6ae1a9117a880adbec113611cc9d22b2fdd465/fonttools-4.60.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401", size = 4968175, upload-time = "2025-09-29T21:11:46.439Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/be569699e37d166b78e6218f2cde8c550204f2505038cdd83b42edc469b9/fonttools-4.60.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903", size = 4911031, upload-time = "2025-09-29T21:11:48.977Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9f/89411cc116effaec5260ad519162f64f9c150e5522a27cbb05eb62d0c05b/fonttools-4.60.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed", size = 5062966, upload-time = "2025-09-29T21:11:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/f888221934b5731d46cb9991c7a71f30cb1f97c0ef5fcf37f8da8fce6c8e/fonttools-4.60.1-cp312-cp312-win32.whl", hash = "sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6", size = 2218750, upload-time = "2025-09-29T21:11:56.601Z" }, + { url = "https://files.pythonhosted.org/packages/88/8f/a55b5550cd33cd1028601df41acd057d4be20efa5c958f417b0c0613924d/fonttools-4.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383", size = 2267026, upload-time = "2025-09-29T21:11:58.852Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb", size = 2825777, upload-time = "2025-09-29T21:12:01.22Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4", size = 2348080, upload-time = "2025-09-29T21:12:03.785Z" }, + { url = "https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c", size = 4903082, upload-time = "2025-09-29T21:12:06.382Z" }, + { url = "https://files.pythonhosted.org/packages/04/05/06b1455e4bc653fcb2117ac3ef5fa3a8a14919b93c60742d04440605d058/fonttools-4.60.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77", size = 4960125, upload-time = "2025-09-29T21:12:09.314Z" }, + { url = "https://files.pythonhosted.org/packages/8e/37/f3b840fcb2666f6cb97038793606bdd83488dca2d0b0fc542ccc20afa668/fonttools-4.60.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199", size = 4901454, upload-time = "2025-09-29T21:12:11.931Z" }, + { url = "https://files.pythonhosted.org/packages/fd/9e/eb76f77e82f8d4a46420aadff12cec6237751b0fb9ef1de373186dcffb5f/fonttools-4.60.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c", size = 5044495, upload-time = "2025-09-29T21:12:15.241Z" }, + { url = "https://files.pythonhosted.org/packages/f8/b3/cede8f8235d42ff7ae891bae8d619d02c8ac9fd0cfc450c5927a6200c70d/fonttools-4.60.1-cp313-cp313-win32.whl", hash = "sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272", size = 2217028, upload-time = "2025-09-29T21:12:17.96Z" }, + { url = "https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl", hash = "sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac", size = 2266200, upload-time = "2025-09-29T21:12:20.14Z" }, + { url = "https://files.pythonhosted.org/packages/9a/83/752ca11c1aa9a899b793a130f2e466b79ea0cf7279c8d79c178fc954a07b/fonttools-4.60.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a884aef09d45ba1206712c7dbda5829562d3fea7726935d3289d343232ecb0d3", size = 2822830, upload-time = "2025-09-29T21:12:24.406Z" }, + { url = "https://files.pythonhosted.org/packages/57/17/bbeab391100331950a96ce55cfbbff27d781c1b85ebafb4167eae50d9fe3/fonttools-4.60.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8a44788d9d91df72d1a5eac49b31aeb887a5f4aab761b4cffc4196c74907ea85", size = 2345524, upload-time = "2025-09-29T21:12:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2e/d4831caa96d85a84dd0da1d9f90d81cec081f551e0ea216df684092c6c97/fonttools-4.60.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e852d9dda9f93ad3651ae1e3bb770eac544ec93c3807888798eccddf84596537", size = 4843490, upload-time = "2025-09-29T21:12:29.123Z" }, + { url = "https://files.pythonhosted.org/packages/49/13/5e2ea7c7a101b6fc3941be65307ef8df92cbbfa6ec4804032baf1893b434/fonttools-4.60.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:154cb6ee417e417bf5f7c42fe25858c9140c26f647c7347c06f0cc2d47eff003", size = 4944184, upload-time = "2025-09-29T21:12:31.414Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2b/cf9603551c525b73fc47c52ee0b82a891579a93d9651ed694e4e2cd08bb8/fonttools-4.60.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5664fd1a9ea7f244487ac8f10340c4e37664675e8667d6fee420766e0fb3cf08", size = 4890218, upload-time = "2025-09-29T21:12:33.936Z" }, + { url = "https://files.pythonhosted.org/packages/fd/2f/933d2352422e25f2376aae74f79eaa882a50fb3bfef3c0d4f50501267101/fonttools-4.60.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:583b7f8e3c49486e4d489ad1deacfb8d5be54a8ef34d6df824f6a171f8511d99", size = 4999324, upload-time = "2025-09-29T21:12:36.637Z" }, + { url = "https://files.pythonhosted.org/packages/38/99/234594c0391221f66216bc2c886923513b3399a148defaccf81dc3be6560/fonttools-4.60.1-cp314-cp314-win32.whl", hash = "sha256:66929e2ea2810c6533a5184f938502cfdaea4bc3efb7130d8cc02e1c1b4108d6", size = 2220861, upload-time = "2025-09-29T21:12:39.108Z" }, + { url = "https://files.pythonhosted.org/packages/3e/1d/edb5b23726dde50fc4068e1493e4fc7658eeefcaf75d4c5ffce067d07ae5/fonttools-4.60.1-cp314-cp314-win_amd64.whl", hash = "sha256:f3d5be054c461d6a2268831f04091dc82753176f6ea06dc6047a5e168265a987", size = 2270934, upload-time = "2025-09-29T21:12:41.339Z" }, + { url = "https://files.pythonhosted.org/packages/fb/da/1392aaa2170adc7071fe7f9cfd181a5684a7afcde605aebddf1fb4d76df5/fonttools-4.60.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b6379e7546ba4ae4b18f8ae2b9bc5960936007a1c0e30b342f662577e8bc3299", size = 2894340, upload-time = "2025-09-29T21:12:43.774Z" }, + { url = "https://files.pythonhosted.org/packages/bf/a7/3b9f16e010d536ce567058b931a20b590d8f3177b2eda09edd92e392375d/fonttools-4.60.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9d0ced62b59e0430b3690dbc5373df1c2aa7585e9a8ce38eff87f0fd993c5b01", size = 2375073, upload-time = "2025-09-29T21:12:46.437Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/e9bcf51980f98e59bb5bb7c382a63c6f6cac0eec5f67de6d8f2322382065/fonttools-4.60.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:875cb7764708b3132637f6c5fb385b16eeba0f7ac9fa45a69d35e09b47045801", size = 4849758, upload-time = "2025-09-29T21:12:48.694Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/1d2cf7d1cba82264b2f8385db3f5960e3d8ce756b4dc65b700d2c496f7e9/fonttools-4.60.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a184b2ea57b13680ab6d5fbde99ccef152c95c06746cb7718c583abd8f945ccc", size = 5085598, upload-time = "2025-09-29T21:12:51.081Z" }, + { url = "https://files.pythonhosted.org/packages/5d/4d/279e28ba87fb20e0c69baf72b60bbf1c4d873af1476806a7b5f2b7fac1ff/fonttools-4.60.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:026290e4ec76583881763fac284aca67365e0be9f13a7fb137257096114cb3bc", size = 4957603, upload-time = "2025-09-29T21:12:53.423Z" }, + { url = "https://files.pythonhosted.org/packages/78/d4/ff19976305e0c05aa3340c805475abb00224c954d3c65e82c0a69633d55d/fonttools-4.60.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0e8817c7d1a0c2eedebf57ef9a9896f3ea23324769a9a2061a80fe8852705ed", size = 4974184, upload-time = "2025-09-29T21:12:55.962Z" }, + { url = "https://files.pythonhosted.org/packages/63/22/8553ff6166f5cd21cfaa115aaacaa0dc73b91c079a8cfd54a482cbc0f4f5/fonttools-4.60.1-cp314-cp314t-win32.whl", hash = "sha256:1410155d0e764a4615774e5c2c6fc516259fe3eca5882f034eb9bfdbee056259", size = 2282241, upload-time = "2025-09-29T21:12:58.179Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cb/fa7b4d148e11d5a72761a22e595344133e83a9507a4c231df972e657579b/fonttools-4.60.1-cp314-cp314t-win_amd64.whl", hash = "sha256:022beaea4b73a70295b688f817ddc24ed3e3418b5036ffcd5658141184ef0d0c", size = 2345760, upload-time = "2025-09-29T21:13:00.375Z" }, + { url = "https://files.pythonhosted.org/packages/c7/93/0dd45cd283c32dea1545151d8c3637b4b8c53cdb3a625aeb2885b184d74d/fonttools-4.60.1-py3-none-any.whl", hash = "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb", size = 1143175, upload-time = "2025-09-29T21:13:24.134Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, + { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, + { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, + { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, + { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, + { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, + { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, + { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, + { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, + { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, + { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, + { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, + { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, + { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, + { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, + { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/b3/09eb0f7796932826ec20c25b517d568627754f6c6462fca19e12c02f2e12/matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748", size = 8272389, upload-time = "2025-10-09T00:26:42.474Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/1ae80ddafb8652fd8046cb5c8460ecc8d4afccb89e2c6d6bec61e04e1eaf/matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f", size = 8128247, upload-time = "2025-10-09T00:26:44.77Z" }, + { url = "https://files.pythonhosted.org/packages/7d/18/95ae2e242d4a5c98bd6e90e36e128d71cf1c7e39b0874feaed3ef782e789/matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0", size = 8696996, upload-time = "2025-10-09T00:26:46.792Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3d/5b559efc800bd05cb2033aa85f7e13af51958136a48327f7c261801ff90a/matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695", size = 9530153, upload-time = "2025-10-09T00:26:49.07Z" }, + { url = "https://files.pythonhosted.org/packages/88/57/eab4a719fd110312d3c220595d63a3c85ec2a39723f0f4e7fa7e6e3f74ba/matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65", size = 9593093, upload-time = "2025-10-09T00:26:51.067Z" }, + { url = "https://files.pythonhosted.org/packages/31/3c/80816f027b3a4a28cd2a0a6ef7f89a2db22310e945cd886ec25bfb399221/matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee", size = 8122771, upload-time = "2025-10-09T00:26:53.296Z" }, + { url = "https://files.pythonhosted.org/packages/de/77/ef1fc78bfe99999b2675435cc52120887191c566b25017d78beaabef7f2d/matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8", size = 7992812, upload-time = "2025-10-09T00:26:54.882Z" }, + { url = "https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f", size = 8273212, upload-time = "2025-10-09T00:26:56.752Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c", size = 8128713, upload-time = "2025-10-09T00:26:59.001Z" }, + { url = "https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1", size = 8698527, upload-time = "2025-10-09T00:27:00.69Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7f/ccdca06f4c2e6c7989270ed7829b8679466682f4cfc0f8c9986241c023b6/matplotlib-3.10.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22df30ffaa89f6643206cf13877191c63a50e8f800b038bc39bee9d2d4957632", size = 9529690, upload-time = "2025-10-09T00:27:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/b8/95/b80fc2c1f269f21ff3d193ca697358e24408c33ce2b106a7438a45407b63/matplotlib-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b69676845a0a66f9da30e87f48be36734d6748024b525ec4710be40194282c84", size = 9593732, upload-time = "2025-10-09T00:27:04.653Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815", size = 8122727, upload-time = "2025-10-09T00:27:06.814Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a6/2faaf48133b82cf3607759027f82b5c702aa99cdfcefb7f93d6ccf26a424/matplotlib-3.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:fba2974df0bf8ce3c995fa84b79cde38326e0f7b5409e7a3a481c1141340bcf7", size = 7992958, upload-time = "2025-10-09T00:27:08.567Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f0/b018fed0b599bd48d84c08794cb242227fe3341952da102ee9d9682db574/matplotlib-3.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:932c55d1fa7af4423422cb6a492a31cbcbdbe68fd1a9a3f545aa5e7a143b5355", size = 8316849, upload-time = "2025-10-09T00:27:10.254Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b7/bb4f23856197659f275e11a2a164e36e65e9b48ea3e93c4ec25b4f163198/matplotlib-3.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e38c2d581d62ee729a6e144c47a71b3f42fb4187508dbbf4fe71d5612c3433b", size = 8178225, upload-time = "2025-10-09T00:27:12.241Z" }, + { url = "https://files.pythonhosted.org/packages/62/56/0600609893ff277e6f3ab3c0cef4eafa6e61006c058e84286c467223d4d5/matplotlib-3.10.7-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:786656bb13c237bbcebcd402f65f44dd61ead60ee3deb045af429d889c8dbc67", size = 8711708, upload-time = "2025-10-09T00:27:13.879Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1a/6bfecb0cafe94d6658f2f1af22c43b76cf7a1c2f0dc34ef84cbb6809617e/matplotlib-3.10.7-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09d7945a70ea43bf9248f4b6582734c2fe726723204a76eca233f24cffc7ef67", size = 9541409, upload-time = "2025-10-09T00:27:15.684Z" }, + { url = "https://files.pythonhosted.org/packages/08/50/95122a407d7f2e446fd865e2388a232a23f2b81934960ea802f3171518e4/matplotlib-3.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0b181e9fa8daf1d9f2d4c547527b167cb8838fc587deabca7b5c01f97199e84", size = 9594054, upload-time = "2025-10-09T00:27:17.547Z" }, + { url = "https://files.pythonhosted.org/packages/13/76/75b194a43b81583478a81e78a07da8d9ca6ddf50dd0a2ccabf258059481d/matplotlib-3.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:31963603041634ce1a96053047b40961f7a29eb8f9a62e80cc2c0427aa1d22a2", size = 8200100, upload-time = "2025-10-09T00:27:20.039Z" }, + { url = "https://files.pythonhosted.org/packages/f5/9e/6aefebdc9f8235c12bdeeda44cc0383d89c1e41da2c400caf3ee2073a3ce/matplotlib-3.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:aebed7b50aa6ac698c90f60f854b47e48cd2252b30510e7a1feddaf5a3f72cbf", size = 8042131, upload-time = "2025-10-09T00:27:21.608Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4b/e5bc2c321b6a7e3a75638d937d19ea267c34bd5a90e12bee76c4d7c7a0d9/matplotlib-3.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d883460c43e8c6b173fef244a2341f7f7c0e9725c7fe68306e8e44ed9c8fb100", size = 8273787, upload-time = "2025-10-09T00:27:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/6efae459c56c2fbc404da154e13e3a6039129f3c942b0152624f1c621f05/matplotlib-3.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07124afcf7a6504eafcb8ce94091c5898bbdd351519a1beb5c45f7a38c67e77f", size = 8131348, upload-time = "2025-10-09T00:27:24.926Z" }, + { url = "https://files.pythonhosted.org/packages/a6/5a/a4284d2958dee4116359cc05d7e19c057e64ece1b4ac986ab0f2f4d52d5a/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c17398b709a6cce3d9fdb1595c33e356d91c098cd9486cb2cc21ea2ea418e715", size = 9533949, upload-time = "2025-10-09T00:27:26.704Z" }, + { url = "https://files.pythonhosted.org/packages/de/ff/f3781b5057fa3786623ad8976fc9f7b0d02b2f28534751fd5a44240de4cf/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7146d64f561498764561e9cd0ed64fcf582e570fc519e6f521e2d0cfd43365e1", size = 9804247, upload-time = "2025-10-09T00:27:28.514Z" }, + { url = "https://files.pythonhosted.org/packages/47/5a/993a59facb8444efb0e197bf55f545ee449902dcee86a4dfc580c3b61314/matplotlib-3.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90ad854c0a435da3104c01e2c6f0028d7e719b690998a2333d7218db80950722", size = 9595497, upload-time = "2025-10-09T00:27:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/0d/a5/77c95aaa9bb32c345cbb49626ad8eb15550cba2e6d4c88081a6c2ac7b08d/matplotlib-3.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:4645fc5d9d20ffa3a39361fcdbcec731382763b623b72627806bf251b6388866", size = 8252732, upload-time = "2025-10-09T00:27:32.332Z" }, + { url = "https://files.pythonhosted.org/packages/74/04/45d269b4268d222390d7817dae77b159651909669a34ee9fdee336db5883/matplotlib-3.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:9257be2f2a03415f9105c486d304a321168e61ad450f6153d77c69504ad764bb", size = 8124240, upload-time = "2025-10-09T00:27:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/4b/c7/ca01c607bb827158b439208c153d6f14ddb9fb640768f06f7ca3488ae67b/matplotlib-3.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1e4bbad66c177a8fdfa53972e5ef8be72a5f27e6a607cec0d8579abd0f3102b1", size = 8316938, upload-time = "2025-10-09T00:27:35.534Z" }, + { url = "https://files.pythonhosted.org/packages/84/d2/5539e66e9f56d2fdec94bb8436f5e449683b4e199bcc897c44fbe3c99e28/matplotlib-3.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8eb7194b084b12feb19142262165832fc6ee879b945491d1c3d4660748020c4", size = 8178245, upload-time = "2025-10-09T00:27:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/77/b5/e6ca22901fd3e4fe433a82e583436dd872f6c966fca7e63cf806b40356f8/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d41379b05528091f00e1728004f9a8d7191260f3862178b88e8fd770206318", size = 9541411, upload-time = "2025-10-09T00:27:39.387Z" }, + { url = "https://files.pythonhosted.org/packages/9e/99/a4524db57cad8fee54b7237239a8f8360bfcfa3170d37c9e71c090c0f409/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a74f79fafb2e177f240579bc83f0b60f82cc47d2f1d260f422a0627207008ca", size = 9803664, upload-time = "2025-10-09T00:27:41.492Z" }, + { url = "https://files.pythonhosted.org/packages/e6/a5/85e2edf76ea0ad4288d174926d9454ea85f3ce5390cc4e6fab196cbf250b/matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc", size = 9594066, upload-time = "2025-10-09T00:27:43.694Z" }, + { url = "https://files.pythonhosted.org/packages/39/69/9684368a314f6d83fe5c5ad2a4121a3a8e03723d2e5c8ea17b66c1bad0e7/matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8", size = 8342832, upload-time = "2025-10-09T00:27:45.543Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/e22e08da14bc1a0894184640d47819d2338b792732e20d292bf86e5ab785/matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c", size = 8172585, upload-time = "2025-10-09T00:27:47.185Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "numpy" +version = "2.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size = 20582187, upload-time = "2025-10-15T16:18:11.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/7a/02420400b736f84317e759291b8edaeee9dc921f72b045475a9cbdb26b17/numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11", size = 20957727, upload-time = "2025-10-15T16:15:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/18/90/a014805d627aa5750f6f0e878172afb6454552da929144b3c07fcae1bb13/numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9", size = 14187262, upload-time = "2025-10-15T16:15:47.761Z" }, + { url = "https://files.pythonhosted.org/packages/c7/e4/0a94b09abe89e500dc748e7515f21a13e30c5c3fe3396e6d4ac108c25fca/numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667", size = 5115992, upload-time = "2025-10-15T16:15:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/db77c75b055c6157cbd4f9c92c4458daef0dd9cbe6d8d2fe7f803cb64c37/numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef", size = 6648672, upload-time = "2025-10-15T16:15:52.442Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e6/e31b0d713719610e406c0ea3ae0d90760465b086da8783e2fd835ad59027/numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e", size = 14284156, upload-time = "2025-10-15T16:15:54.351Z" }, + { url = "https://files.pythonhosted.org/packages/f9/58/30a85127bfee6f108282107caf8e06a1f0cc997cb6b52cdee699276fcce4/numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a", size = 16641271, upload-time = "2025-10-15T16:15:56.67Z" }, + { url = "https://files.pythonhosted.org/packages/06/f2/2e06a0f2adf23e3ae29283ad96959267938d0efd20a2e25353b70065bfec/numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16", size = 16059531, upload-time = "2025-10-15T16:15:59.412Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e7/b106253c7c0d5dc352b9c8fab91afd76a93950998167fa3e5afe4ef3a18f/numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786", size = 18578983, upload-time = "2025-10-15T16:16:01.804Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/04ecc41e71462276ee867ccbef26a4448638eadecf1bc56772c9ed6d0255/numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc", size = 6291380, upload-time = "2025-10-15T16:16:03.938Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a8/566578b10d8d0e9955b1b6cd5db4e9d4592dd0026a941ff7994cedda030a/numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32", size = 12787999, upload-time = "2025-10-15T16:16:05.801Z" }, + { url = "https://files.pythonhosted.org/packages/58/22/9c903a957d0a8071b607f5b1bff0761d6e608b9a965945411f867d515db1/numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db", size = 10197412, upload-time = "2025-10-15T16:16:07.854Z" }, + { url = "https://files.pythonhosted.org/packages/57/7e/b72610cc91edf138bc588df5150957a4937221ca6058b825b4725c27be62/numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966", size = 20950335, upload-time = "2025-10-15T16:16:10.304Z" }, + { url = "https://files.pythonhosted.org/packages/3e/46/bdd3370dcea2f95ef14af79dbf81e6927102ddf1cc54adc0024d61252fd9/numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3", size = 14179878, upload-time = "2025-10-15T16:16:12.595Z" }, + { url = "https://files.pythonhosted.org/packages/ac/01/5a67cb785bda60f45415d09c2bc245433f1c68dd82eef9c9002c508b5a65/numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197", size = 5108673, upload-time = "2025-10-15T16:16:14.877Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cd/8428e23a9fcebd33988f4cb61208fda832800ca03781f471f3727a820704/numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e", size = 6641438, upload-time = "2025-10-15T16:16:16.805Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d1/913fe563820f3c6b079f992458f7331278dcd7ba8427e8e745af37ddb44f/numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7", size = 14281290, upload-time = "2025-10-15T16:16:18.764Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7e/7d306ff7cb143e6d975cfa7eb98a93e73495c4deabb7d1b5ecf09ea0fd69/numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953", size = 16636543, upload-time = "2025-10-15T16:16:21.072Z" }, + { url = "https://files.pythonhosted.org/packages/47/6a/8cfc486237e56ccfb0db234945552a557ca266f022d281a2f577b98e955c/numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37", size = 16056117, upload-time = "2025-10-15T16:16:23.369Z" }, + { url = "https://files.pythonhosted.org/packages/b1/0e/42cb5e69ea901e06ce24bfcc4b5664a56f950a70efdcf221f30d9615f3f3/numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd", size = 18577788, upload-time = "2025-10-15T16:16:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/86/92/41c3d5157d3177559ef0a35da50f0cda7fa071f4ba2306dd36818591a5bc/numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646", size = 6282620, upload-time = "2025-10-15T16:16:29.811Z" }, + { url = "https://files.pythonhosted.org/packages/09/97/fd421e8bc50766665ad35536c2bb4ef916533ba1fdd053a62d96cc7c8b95/numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d", size = 12784672, upload-time = "2025-10-15T16:16:31.589Z" }, + { url = "https://files.pythonhosted.org/packages/ad/df/5474fb2f74970ca8eb978093969b125a84cc3d30e47f82191f981f13a8a0/numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc", size = 10196702, upload-time = "2025-10-15T16:16:33.902Z" }, + { url = "https://files.pythonhosted.org/packages/11/83/66ac031464ec1767ea3ed48ce40f615eb441072945e98693bec0bcd056cc/numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879", size = 21049003, upload-time = "2025-10-15T16:16:36.101Z" }, + { url = "https://files.pythonhosted.org/packages/5f/99/5b14e0e686e61371659a1d5bebd04596b1d72227ce36eed121bb0aeab798/numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562", size = 14302980, upload-time = "2025-10-15T16:16:39.124Z" }, + { url = "https://files.pythonhosted.org/packages/2c/44/e9486649cd087d9fc6920e3fc3ac2aba10838d10804b1e179fb7cbc4e634/numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a", size = 5231472, upload-time = "2025-10-15T16:16:41.168Z" }, + { url = "https://files.pythonhosted.org/packages/3e/51/902b24fa8887e5fe2063fd61b1895a476d0bbf46811ab0c7fdf4bd127345/numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6", size = 6739342, upload-time = "2025-10-15T16:16:43.777Z" }, + { url = "https://files.pythonhosted.org/packages/34/f1/4de9586d05b1962acdcdb1dc4af6646361a643f8c864cef7c852bf509740/numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7", size = 14354338, upload-time = "2025-10-15T16:16:46.081Z" }, + { url = "https://files.pythonhosted.org/packages/1f/06/1c16103b425de7969d5a76bdf5ada0804b476fed05d5f9e17b777f1cbefd/numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0", size = 16702392, upload-time = "2025-10-15T16:16:48.455Z" }, + { url = "https://files.pythonhosted.org/packages/34/b2/65f4dc1b89b5322093572b6e55161bb42e3e0487067af73627f795cc9d47/numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f", size = 16134998, upload-time = "2025-10-15T16:16:51.114Z" }, + { url = "https://files.pythonhosted.org/packages/d4/11/94ec578896cdb973aaf56425d6c7f2aff4186a5c00fac15ff2ec46998b46/numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64", size = 18651574, upload-time = "2025-10-15T16:16:53.429Z" }, + { url = "https://files.pythonhosted.org/packages/62/b7/7efa763ab33dbccf56dade36938a77345ce8e8192d6b39e470ca25ff3cd0/numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb", size = 6413135, upload-time = "2025-10-15T16:16:55.992Z" }, + { url = "https://files.pythonhosted.org/packages/43/70/aba4c38e8400abcc2f345e13d972fb36c26409b3e644366db7649015f291/numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c", size = 12928582, upload-time = "2025-10-15T16:16:57.943Z" }, + { url = "https://files.pythonhosted.org/packages/67/63/871fad5f0073fc00fbbdd7232962ea1ac40eeaae2bba66c76214f7954236/numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40", size = 10266691, upload-time = "2025-10-15T16:17:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/72/71/ae6170143c115732470ae3a2d01512870dd16e0953f8a6dc89525696069b/numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e", size = 20955580, upload-time = "2025-10-15T16:17:02.509Z" }, + { url = "https://files.pythonhosted.org/packages/af/39/4be9222ffd6ca8a30eda033d5f753276a9c3426c397bb137d8e19dedd200/numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff", size = 14188056, upload-time = "2025-10-15T16:17:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3d/d85f6700d0a4aa4f9491030e1021c2b2b7421b2b38d01acd16734a2bfdc7/numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f", size = 5116555, upload-time = "2025-10-15T16:17:07.499Z" }, + { url = "https://files.pythonhosted.org/packages/bf/04/82c1467d86f47eee8a19a464c92f90a9bb68ccf14a54c5224d7031241ffb/numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b", size = 6643581, upload-time = "2025-10-15T16:17:09.774Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d3/c79841741b837e293f48bd7db89d0ac7a4f2503b382b78a790ef1dc778a5/numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7", size = 14299186, upload-time = "2025-10-15T16:17:11.937Z" }, + { url = "https://files.pythonhosted.org/packages/e8/7e/4a14a769741fbf237eec5a12a2cbc7a4c4e061852b6533bcb9e9a796c908/numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2", size = 16638601, upload-time = "2025-10-15T16:17:14.391Z" }, + { url = "https://files.pythonhosted.org/packages/93/87/1c1de269f002ff0a41173fe01dcc925f4ecff59264cd8f96cf3b60d12c9b/numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52", size = 16074219, upload-time = "2025-10-15T16:17:17.058Z" }, + { url = "https://files.pythonhosted.org/packages/cd/28/18f72ee77408e40a76d691001ae599e712ca2a47ddd2c4f695b16c65f077/numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26", size = 18576702, upload-time = "2025-10-15T16:17:19.379Z" }, + { url = "https://files.pythonhosted.org/packages/c3/76/95650169b465ececa8cf4b2e8f6df255d4bf662775e797ade2025cc51ae6/numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc", size = 6337136, upload-time = "2025-10-15T16:17:22.886Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/a231a5c43ede5d6f77ba4a91e915a87dea4aeea76560ba4d2bf185c683f0/numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9", size = 12920542, upload-time = "2025-10-15T16:17:24.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/0c/ae9434a888f717c5ed2ff2393b3f344f0ff6f1c793519fa0c540461dc530/numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868", size = 10480213, upload-time = "2025-10-15T16:17:26.935Z" }, + { url = "https://files.pythonhosted.org/packages/83/4b/c4a5f0841f92536f6b9592694a5b5f68c9ab37b775ff342649eadf9055d3/numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec", size = 21052280, upload-time = "2025-10-15T16:17:29.638Z" }, + { url = "https://files.pythonhosted.org/packages/3e/80/90308845fc93b984d2cc96d83e2324ce8ad1fd6efea81b324cba4b673854/numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3", size = 14302930, upload-time = "2025-10-15T16:17:32.384Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4e/07439f22f2a3b247cec4d63a713faae55e1141a36e77fb212881f7cda3fb/numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365", size = 5231504, upload-time = "2025-10-15T16:17:34.515Z" }, + { url = "https://files.pythonhosted.org/packages/ab/de/1e11f2547e2fe3d00482b19721855348b94ada8359aef5d40dd57bfae9df/numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252", size = 6739405, upload-time = "2025-10-15T16:17:36.128Z" }, + { url = "https://files.pythonhosted.org/packages/3b/40/8cd57393a26cebe2e923005db5134a946c62fa56a1087dc7c478f3e30837/numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e", size = 14354866, upload-time = "2025-10-15T16:17:38.884Z" }, + { url = "https://files.pythonhosted.org/packages/93/39/5b3510f023f96874ee6fea2e40dfa99313a00bf3ab779f3c92978f34aace/numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0", size = 16703296, upload-time = "2025-10-15T16:17:41.564Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/19bb163617c8045209c1996c4e427bccbc4bbff1e2c711f39203c8ddbb4a/numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0", size = 16136046, upload-time = "2025-10-15T16:17:43.901Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c1/6dba12fdf68b02a21ac411c9df19afa66bed2540f467150ca64d246b463d/numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f", size = 18652691, upload-time = "2025-10-15T16:17:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/f8/73/f85056701dbbbb910c51d846c58d29fd46b30eecd2b6ba760fc8b8a1641b/numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d", size = 6485782, upload-time = "2025-10-15T16:17:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/17/90/28fa6f9865181cb817c2471ee65678afa8a7e2a1fb16141473d5fa6bacc3/numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6", size = 13113301, upload-time = "2025-10-15T16:17:50.938Z" }, + { url = "https://files.pythonhosted.org/packages/54/23/08c002201a8e7e1f9afba93b97deceb813252d9cfd0d3351caed123dcf97/numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29", size = 10547532, upload-time = "2025-10-15T16:17:53.48Z" }, +] + +[[package]] +name = "openqasm3" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/a0/678ce1e4efbeb1cf06a7728b4056754e52bfd2c5cad174dae0f2a17b2d03/openqasm3-1.0.1.tar.gz", hash = "sha256:c589dc05d4ced50ca24167d14e0f2c916e717499ba0442e0ff2a3030ef312d0a", size = 536861, upload-time = "2025-02-19T22:51:06.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/dd/2aa7698341948f3229f7a1cb75e84d9677444d9c730632d1907716574dc5/openqasm3-1.0.1-py3-none-any.whl", hash = "sha256:0d3a1ebe3465e3ea619bcaa369858bba8944cbb0c49604b24f94662d3ec41d41", size = 541545, upload-time = "2025-02-19T22:51:01.852Z" }, +] + +[package.optional-dependencies] +parser = [ + { name = "antlr4-python3-runtime" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, + { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, + { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, + { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, + { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "psutil" +version = "7.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059, upload-time = "2025-11-02T12:25:54.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/93/0c49e776b8734fef56ec9c5c57f923922f2cf0497d62e0f419465f28f3d0/psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc", size = 239751, upload-time = "2025-11-02T12:25:58.161Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8d/b31e39c769e70780f007969815195a55c81a63efebdd4dbe9e7a113adb2f/psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0", size = 240368, upload-time = "2025-11-02T12:26:00.491Z" }, + { url = "https://files.pythonhosted.org/packages/62/61/23fd4acc3c9eebbf6b6c78bcd89e5d020cfde4acf0a9233e9d4e3fa698b4/psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7", size = 287134, upload-time = "2025-11-02T12:26:02.613Z" }, + { url = "https://files.pythonhosted.org/packages/30/1c/f921a009ea9ceb51aa355cb0cc118f68d354db36eae18174bab63affb3e6/psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251", size = 289904, upload-time = "2025-11-02T12:26:05.207Z" }, + { url = "https://files.pythonhosted.org/packages/a6/82/62d68066e13e46a5116df187d319d1724b3f437ddd0f958756fc052677f4/psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa", size = 249642, upload-time = "2025-11-02T12:26:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/df/ad/c1cd5fe965c14a0392112f68362cfceb5230819dbb5b1888950d18a11d9f/psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee", size = 245518, upload-time = "2025-11-02T12:26:09.719Z" }, + { url = "https://files.pythonhosted.org/packages/2e/bb/6670bded3e3236eb4287c7bcdc167e9fae6e1e9286e437f7111caed2f909/psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353", size = 239843, upload-time = "2025-11-02T12:26:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/b8/66/853d50e75a38c9a7370ddbeefabdd3d3116b9c31ef94dc92c6729bc36bec/psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b", size = 240369, upload-time = "2025-11-02T12:26:14.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/bd/313aba97cb5bfb26916dc29cf0646cbe4dd6a89ca69e8c6edce654876d39/psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9", size = 288210, upload-time = "2025-11-02T12:26:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/c2/fa/76e3c06e760927a0cfb5705eb38164254de34e9bd86db656d4dbaa228b04/psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f", size = 291182, upload-time = "2025-11-02T12:26:18.848Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1d/5774a91607035ee5078b8fd747686ebec28a962f178712de100d00b78a32/psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7", size = 250466, upload-time = "2025-11-02T12:26:21.183Z" }, + { url = "https://files.pythonhosted.org/packages/00/ca/e426584bacb43a5cb1ac91fae1937f478cd8fbe5e4ff96574e698a2c77cd/psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264", size = 245756, upload-time = "2025-11-02T12:26:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359, upload-time = "2025-11-02T12:26:25.284Z" }, + { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171, upload-time = "2025-11-02T12:26:27.23Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261, upload-time = "2025-11-02T12:26:29.48Z" }, + { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635, upload-time = "2025-11-02T12:26:31.74Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633, upload-time = "2025-11-02T12:26:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608, upload-time = "2025-11-02T12:26:36.136Z" }, +] + +[[package]] +name = "pydot" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/35/b17cb89ff865484c6a20ef46bf9d95a5f07328292578de0b295f4a6beec2/pydot-4.0.1.tar.gz", hash = "sha256:c2148f681c4a33e08bf0e26a9e5f8e4099a82e0e2a068098f32ce86577364ad5", size = 162594, upload-time = "2025-06-17T20:09:56.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/32/a7125fb28c4261a627f999d5fb4afff25b523800faed2c30979949d6facd/pydot-4.0.1-py3-none-any.whl", hash = "sha256:869c0efadd2708c0be1f916eb669f3d664ca684bc57ffb7ecc08e70d5e93fee6", size = 37087, upload-time = "2025-06-17T20:09:55.25Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pylatexenc" +version = "2.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/ab/34ec41718af73c00119d0351b7a2531d2ebddb51833a36448fc7b862be60/pylatexenc-2.10.tar.gz", hash = "sha256:3dd8fd84eb46dc30bee1e23eaab8d8fb5a7f507347b23e5f38ad9675c84f40d3", size = 162597, upload-time = "2021-04-06T07:56:07.854Z" } + +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/1d/eb34f286b164c5e431a810a38697409cca1112cee04b287bb56ac486730b/pytest-9.0.0.tar.gz", hash = "sha256:8f44522eafe4137b0f35c9ce3072931a788a21ee40a2ed279e817d3cc16ed21e", size = 1562764, upload-time = "2025-11-08T17:25:33.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/99/cafef234114a3b6d9f3aaed0723b437c40c57bdb7b3e4c3a575bc4890052/pytest-9.0.0-py3-none-any.whl", hash = "sha256:e5ccdf10b0bac554970ee88fc1a4ad0ee5d221f8ef22321f9b7e4584e19d7f96", size = 373364, upload-time = "2025-11-08T17:25:31.811Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytokens" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/8d/a762be14dae1c3bf280202ba3172020b2b0b4c537f94427435f19c413b72/pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a", size = 17644, upload-time = "2025-11-05T13:36:35.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3", size = 12195, upload-time = "2025-11-05T13:36:33.183Z" }, +] + +[[package]] +name = "qiskit" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "numpy" }, + { name = "rustworkx" }, + { name = "scipy" }, + { name = "stevedore" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/40/3e54963067210d45895cbce879d63a9523e0d696f2f8dfade0337cf3afd5/qiskit-2.2.3.tar.gz", hash = "sha256:ec597bf021fe5fa5e44600b142e6de00fc873207dfbd750d4e1cf19a1a905592", size = 3781196, upload-time = "2025-10-30T15:28:57.617Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/19/9faba59be62207d9868a01888ed9a10a181bbbdc67324b997871963af99d/qiskit-2.2.3-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:23c4b023f8b32152624fce5f980edb8af4817559495187ef71758f8bb75c531a", size = 7818702, upload-time = "2025-10-30T15:28:45.648Z" }, + { url = "https://files.pythonhosted.org/packages/31/34/3361d3b7ec301c9d4156a61b2ff0d15ee42ecdb32f8dd8fb8e373a2a3e07/qiskit-2.2.3-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:46585ceacc4c8eab942c7d32a8a95263a8a1769c275d72d13c81fb1390c38d2c", size = 7346706, upload-time = "2025-10-30T15:28:48.277Z" }, + { url = "https://files.pythonhosted.org/packages/7f/02/f4bceea1366ea3efc9a0e33aabdbb793afac8e7c569eb4065bbdcb9877d0/qiskit-2.2.3-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3dc5071cd8c4e7a7b9685557dada82a125bcf9eb319e8c2b9d86ecd0b524baa9", size = 7721671, upload-time = "2025-10-30T15:28:50.694Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/4b0cf8809ee0daa00a4bd3d1db8b9ded370ecae841b2f1a9293ef717097c/qiskit-2.2.3-cp39-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f6f20fc9b98564154e1021161fe71e3f61e60cbe3f41eb5b0cad8107c970e8af", size = 8264643, upload-time = "2025-10-30T17:41:13.287Z" }, + { url = "https://files.pythonhosted.org/packages/50/fb/d8477e4bc92bff46548ab4eb3f54b73ca46a51aabc3f7cdf9f6e6a0db898/qiskit-2.2.3-cp39-abi3-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:edfcc6fb3c0a28f5970b4272dc677bc7424ca1986eafd4d49452b09461833126", size = 8001806, upload-time = "2025-10-30T17:41:15.234Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f6/98b5bb8e7690d170b59ec666b3e85863d40ad66a1eba80fcedf9e2711b8f/qiskit-2.2.3-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75acf702866a68be36870400d845d0775e7baa5397bf880bc56864ee105cbe93", size = 8007661, upload-time = "2025-10-30T15:28:53.134Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/4a35428070cfb6633d72afc077fdbe5adca08a462b401f99647e8a4a4925/qiskit-2.2.3-cp39-abi3-win_amd64.whl", hash = "sha256:80dbf57bc503c54dde91918fdece0e702def5b685892821eab0e584a071cedda", size = 7761574, upload-time = "2025-10-30T15:28:55.706Z" }, +] + +[[package]] +name = "qiskit-aer" +version = "0.17.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "psutil" }, + { name = "python-dateutil" }, + { name = "qiskit" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/6c/6b8b35f67159401580665c59ae64d676bef9e85aac4d2a50831cbe32f652/qiskit_aer-0.17.2.tar.gz", hash = "sha256:134eef8e509311955a15be543d2ba368f988f3583a2bc1f548af3196da820eb4", size = 6551618, upload-time = "2025-09-17T13:55:25.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/2c/7039b1891377ef081c92af79cee230be0a01e52c21561469f6807f17fe96/qiskit_aer-0.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5f03bf3f45f7f6cc6e480df473e4750178cb66ee7fb44d85d98c13901e81c42c", size = 2508338, upload-time = "2025-09-17T13:54:19.202Z" }, + { url = "https://files.pythonhosted.org/packages/50/02/f1d6906c2cb3ff3ec94f97656abbc56b80b80c4677ff603ee40063cf9c84/qiskit_aer-0.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:abb03d621cfd30e608ba8ddbb9e673707e6f790a744130d1d6355e3e10554d13", size = 2117032, upload-time = "2025-09-17T13:54:21.009Z" }, + { url = "https://files.pythonhosted.org/packages/10/b3/86a9687b2123201badcca23c0954fe17e83d648cfb1737558c00783e3ea6/qiskit_aer-0.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3ee2debad4dd9d1ff021002e82363a83ee22b1440ccbc293a444072c9fd0c1", size = 6454082, upload-time = "2025-09-17T15:22:24.811Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/45a3d07b0372317f33ce3abaa438d668b57f3ecdd0c62dcb4c2d43e44d17/qiskit_aer-0.17.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:782f6ba0bdd08faec19f7bbb65e95fc70b0c2d097b056fc929a95c084b57c203", size = 7974594, upload-time = "2025-09-17T13:54:22.628Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c3/91ea504db5ba2c43f1fc5918ff60098aa730a5db40830a096855325b2b66/qiskit_aer-0.17.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e91fc4f0a26540ff0e9d0a30b8be3e0f12b4c9c59ec1afffb753944d47e1888", size = 7926812, upload-time = "2025-09-17T14:51:09.356Z" }, + { url = "https://files.pythonhosted.org/packages/30/cc/c47b356b90dd00b9b19fdcaa8f6776613db0885630f7095f92659f62b5c8/qiskit_aer-0.17.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8857aad723036ff818af14bbd4c3375559741366bffce7b36b4eeb306b88cf", size = 12375640, upload-time = "2025-09-17T13:54:24.582Z" }, + { url = "https://files.pythonhosted.org/packages/06/eb/8b796a34622392ee1f66b7d03ba31385ef559cd3a145ec6de2556ebb983e/qiskit_aer-0.17.2-cp312-cp312-win32.whl", hash = "sha256:a9abdb24318c417b69867c6d43aed4684b67320b1e7010f4c57c84fdeff89a13", size = 6922323, upload-time = "2025-09-17T13:54:26.703Z" }, + { url = "https://files.pythonhosted.org/packages/30/f7/5943ba7f6be0a02667593ef5f684359a62d5a46ba9dac9a0367c3ab3d1d8/qiskit_aer-0.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:80c419bb3fb65a5135286ce4e98abd68b9dc836b77affbbc4b06721d53ce1e3c", size = 9563069, upload-time = "2025-09-17T13:54:28.885Z" }, + { url = "https://files.pythonhosted.org/packages/1e/96/0b7f3f7ee5cfc9dde495a2e324e53432abbfccb95a62cafa09e4fc07706d/qiskit_aer-0.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a8ac09544489e34cb60bc0e615bc5ae725de581c9a6bf5cd17b57f2a7baf9f16", size = 2508547, upload-time = "2025-09-17T13:54:32.728Z" }, + { url = "https://files.pythonhosted.org/packages/d7/08/4adfd24bd337d1b1b45a0fd85a2d0f1b9b386dfc9db8135fe5abbad3a0fc/qiskit_aer-0.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4c1bf5072bc54250009751350aaaed06bef15ada7ab43e6ce2c934831f6ee6ea", size = 2117037, upload-time = "2025-09-17T13:54:34.08Z" }, + { url = "https://files.pythonhosted.org/packages/93/3a/6068244629b8f04ce48fa4dddb8d0874f28e91611d90571e69d9417f22ba/qiskit_aer-0.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd9d3c5e6c5d09cb0a821bf5077a14e7f5f8db5c3d700023be92ce6a05923309", size = 6454589, upload-time = "2025-09-17T15:22:26.783Z" }, + { url = "https://files.pythonhosted.org/packages/d1/68/27ddd833d700bc9f9adede6e281146c0229acce895e64dcd32f1b62c90e9/qiskit_aer-0.17.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46820fb38bf85f8c6f8aaa350dd90d01b0be10d16f5f1ef4188882b3a0531f38", size = 7977976, upload-time = "2025-09-17T13:54:36.414Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ca/a1cd95daf75d09d2dc1744cde95d5d18fed61a0e4922788fb916a7cd8152/qiskit_aer-0.17.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2749e6027f67e1f6b9d328d2dda2d4bf926aebd3653edc62e94c45d8237294d8", size = 12376191, upload-time = "2025-09-17T13:54:38.092Z" }, + { url = "https://files.pythonhosted.org/packages/d6/69/e2f979e2fca054b0092fc52c46da050298513b9b03531305bc3f340c7669/qiskit_aer-0.17.2-cp313-cp313-win32.whl", hash = "sha256:c3ffd40a64bfcf8a6d10cbfdca8734d49ec57502fd70dc63aae9ed3819249dd6", size = 6922275, upload-time = "2025-09-17T13:54:40.024Z" }, + { url = "https://files.pythonhosted.org/packages/ae/91/195cb69d3af4359544939378879093764bd35d8abd7ac0de840bb5477d27/qiskit_aer-0.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:b38c5dfdc6cb2bacac78a47b0df8247123051564007fdecedb8ffbd4256f0f09", size = 9563116, upload-time = "2025-09-17T13:54:42.061Z" }, +] + +[[package]] +name = "qiskit-qasm3-import" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "openqasm3", extra = ["parser"] }, + { name = "qiskit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/e4/0229893ae295763a9273e47a7b1a8f10599ee49c2963750440d56a4b0023/qiskit_qasm3_import-0.6.0.tar.gz", hash = "sha256:6b763ee58538b33eaf5aaa8126b687f3c03f26c4d28e6a4f04f9be24a6b184ff", size = 37141, upload-time = "2025-06-10T16:34:11.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/7e/b8bbfbf1acfe0b40872727ef4741b54794beb65da34c4c327dc31a73d35d/qiskit_qasm3_import-0.6.0-py3-none-any.whl", hash = "sha256:2109b65a6859bec4a51e7b61bd525365f298f67f19b3952bf602423c6d21d697", size = 29490, upload-time = "2025-06-10T16:34:10.035Z" }, +] + +[[package]] +name = "quilt" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "pydot" }, + { name = "pylatexenc" }, + { name = "qiskit" }, + { name = "qiskit-aer" }, + { name = "qiskit-qasm3-import" }, + { name = "scipy" }, +] + +[package.optional-dependencies] +dev = [ + { name = "black" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, +] + +[package.dev-dependencies] +dev = [ + { name = "black" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "black", marker = "extra == 'dev'", specifier = ">=23.0.0" }, + { name = "matplotlib", specifier = ">=3.8.0" }, + { name = "numpy", specifier = ">=1.26.0" }, + { name = "pillow", specifier = ">=10.0.0" }, + { name = "pydot", specifier = ">=1.4.2" }, + { name = "pylatexenc", specifier = ">=2.10" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1.0" }, + { name = "qiskit", specifier = ">=2.2.3" }, + { name = "qiskit-aer", specifier = ">=0.14.0" }, + { name = "qiskit-qasm3-import", specifier = ">=0.5.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.1.0" }, + { name = "scipy", specifier = ">=1.12.0" }, +] +provides-extras = ["dev"] + +[package.metadata.requires-dev] +dev = [ + { name = "black", specifier = ">=23.0.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "ruff", specifier = ">=0.1.0" }, +] + +[[package]] +name = "ruff" +version = "0.14.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/55/cccfca45157a2031dcbb5a462a67f7cf27f8b37d4b3b1cd7438f0f5c1df6/ruff-0.14.4.tar.gz", hash = "sha256:f459a49fe1085a749f15414ca76f61595f1a2cc8778ed7c279b6ca2e1fd19df3", size = 5587844, upload-time = "2025-11-06T22:07:45.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/b9/67240254166ae1eaa38dec32265e9153ac53645a6c6670ed36ad00722af8/ruff-0.14.4-py3-none-linux_armv6l.whl", hash = "sha256:e6604613ffbcf2297cd5dcba0e0ac9bd0c11dc026442dfbb614504e87c349518", size = 12606781, upload-time = "2025-11-06T22:07:01.841Z" }, + { url = "https://files.pythonhosted.org/packages/46/c8/09b3ab245d8652eafe5256ab59718641429f68681ee713ff06c5c549f156/ruff-0.14.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d99c0b52b6f0598acede45ee78288e5e9b4409d1ce7f661f0fa36d4cbeadf9a4", size = 12946765, upload-time = "2025-11-06T22:07:05.858Z" }, + { url = "https://files.pythonhosted.org/packages/14/bb/1564b000219144bf5eed2359edc94c3590dd49d510751dad26202c18a17d/ruff-0.14.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9358d490ec030f1b51d048a7fd6ead418ed0826daf6149e95e30aa67c168af33", size = 11928120, upload-time = "2025-11-06T22:07:08.023Z" }, + { url = "https://files.pythonhosted.org/packages/a3/92/d5f1770e9988cc0742fefaa351e840d9aef04ec24ae1be36f333f96d5704/ruff-0.14.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b40d27924f1f02dfa827b9c0712a13c0e4b108421665322218fc38caf615c2", size = 12370877, upload-time = "2025-11-06T22:07:10.015Z" }, + { url = "https://files.pythonhosted.org/packages/e2/29/e9282efa55f1973d109faf839a63235575519c8ad278cc87a182a366810e/ruff-0.14.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f5e649052a294fe00818650712083cddc6cc02744afaf37202c65df9ea52efa5", size = 12408538, upload-time = "2025-11-06T22:07:13.085Z" }, + { url = "https://files.pythonhosted.org/packages/8e/01/930ed6ecfce130144b32d77d8d69f5c610e6d23e6857927150adf5d7379a/ruff-0.14.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa082a8f878deeba955531f975881828fd6afd90dfa757c2b0808aadb437136e", size = 13141942, upload-time = "2025-11-06T22:07:15.386Z" }, + { url = "https://files.pythonhosted.org/packages/6a/46/a9c89b42b231a9f487233f17a89cbef9d5acd538d9488687a02ad288fa6b/ruff-0.14.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1043c6811c2419e39011890f14d0a30470f19d47d197c4858b2787dfa698f6c8", size = 14544306, upload-time = "2025-11-06T22:07:17.631Z" }, + { url = "https://files.pythonhosted.org/packages/78/96/9c6cf86491f2a6d52758b830b89b78c2ae61e8ca66b86bf5a20af73d20e6/ruff-0.14.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f3a936ac27fb7c2a93e4f4b943a662775879ac579a433291a6f69428722649", size = 14210427, upload-time = "2025-11-06T22:07:19.832Z" }, + { url = "https://files.pythonhosted.org/packages/71/f4/0666fe7769a54f63e66404e8ff698de1dcde733e12e2fd1c9c6efb689cb5/ruff-0.14.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95643ffd209ce78bc113266b88fba3d39e0461f0cbc8b55fb92505030fb4a850", size = 13658488, upload-time = "2025-11-06T22:07:22.32Z" }, + { url = "https://files.pythonhosted.org/packages/ee/79/6ad4dda2cfd55e41ac9ed6d73ef9ab9475b1eef69f3a85957210c74ba12c/ruff-0.14.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:456daa2fa1021bc86ca857f43fe29d5d8b3f0e55e9f90c58c317c1dcc2afc7b5", size = 13354908, upload-time = "2025-11-06T22:07:24.347Z" }, + { url = "https://files.pythonhosted.org/packages/b5/60/f0b6990f740bb15c1588601d19d21bcc1bd5de4330a07222041678a8e04f/ruff-0.14.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:f911bba769e4a9f51af6e70037bb72b70b45a16db5ce73e1f72aefe6f6d62132", size = 13587803, upload-time = "2025-11-06T22:07:26.327Z" }, + { url = "https://files.pythonhosted.org/packages/c9/da/eaaada586f80068728338e0ef7f29ab3e4a08a692f92eb901a4f06bbff24/ruff-0.14.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:76158a7369b3979fa878612c623a7e5430c18b2fd1c73b214945c2d06337db67", size = 12279654, upload-time = "2025-11-06T22:07:28.46Z" }, + { url = "https://files.pythonhosted.org/packages/66/d4/b1d0e82cf9bf8aed10a6d45be47b3f402730aa2c438164424783ac88c0ed/ruff-0.14.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f3b8f3b442d2b14c246e7aeca2e75915159e06a3540e2f4bed9f50d062d24469", size = 12357520, upload-time = "2025-11-06T22:07:31.468Z" }, + { url = "https://files.pythonhosted.org/packages/04/f4/53e2b42cc82804617e5c7950b7079d79996c27e99c4652131c6a1100657f/ruff-0.14.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c62da9a06779deecf4d17ed04939ae8b31b517643b26370c3be1d26f3ef7dbde", size = 12719431, upload-time = "2025-11-06T22:07:33.831Z" }, + { url = "https://files.pythonhosted.org/packages/a2/94/80e3d74ed9a72d64e94a7b7706b1c1ebaa315ef2076fd33581f6a1cd2f95/ruff-0.14.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5a443a83a1506c684e98acb8cb55abaf3ef725078be40237463dae4463366349", size = 13464394, upload-time = "2025-11-06T22:07:35.905Z" }, + { url = "https://files.pythonhosted.org/packages/54/1a/a49f071f04c42345c793d22f6cf5e0920095e286119ee53a64a3a3004825/ruff-0.14.4-py3-none-win32.whl", hash = "sha256:643b69cb63cd996f1fc7229da726d07ac307eae442dd8974dbc7cf22c1e18fff", size = 12493429, upload-time = "2025-11-06T22:07:38.43Z" }, + { url = "https://files.pythonhosted.org/packages/bc/22/e58c43e641145a2b670328fb98bc384e20679b5774258b1e540207580266/ruff-0.14.4-py3-none-win_amd64.whl", hash = "sha256:26673da283b96fe35fa0c939bf8411abec47111644aa9f7cfbd3c573fb125d2c", size = 13635380, upload-time = "2025-11-06T22:07:40.496Z" }, + { url = "https://files.pythonhosted.org/packages/30/bd/4168a751ddbbf43e86544b4de8b5c3b7be8d7167a2a5cb977d274e04f0a1/ruff-0.14.4-py3-none-win_arm64.whl", hash = "sha256:dd09c292479596b0e6fec8cd95c65c3a6dc68e9ad17b8f2382130f87ff6a75bb", size = 12663065, upload-time = "2025-11-06T22:07:42.603Z" }, +] + +[[package]] +name = "rustworkx" +version = "0.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/b0/66d96f02120f79eeed86b5c5be04029b6821155f31ed4907a4e9f1460671/rustworkx-0.17.1.tar.gz", hash = "sha256:59ea01b4e603daffa4e8827316c1641eef18ae9032f0b1b14aa0181687e3108e", size = 399407, upload-time = "2025-09-15T16:29:46.429Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/24/8972ed631fa05fdec05a7bb7f1fc0f8e78ee761ab37e8a93d1ed396ba060/rustworkx-0.17.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c08fb8db041db052da404839b064ebfb47dcce04ba9a3e2eb79d0c65ab011da4", size = 2257491, upload-time = "2025-08-13T01:43:31.466Z" }, + { url = "https://files.pythonhosted.org/packages/23/ae/7b6bbae5e0487ee42072dc6a46edf5db9731a0701ed648db22121fb7490c/rustworkx-0.17.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:4ef8e327dadf6500edd76fedb83f6d888b9266c58bcdbffd5a40c33835c9dd26", size = 2040175, upload-time = "2025-08-13T01:43:33.762Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ea/c17fb9428c8f0dcc605596f9561627a5b9ef629d356204ee5088cfcf52c6/rustworkx-0.17.1-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b809e0aa2927c68574b196f993233e269980918101b0dd235289c4f3ddb2115", size = 2324771, upload-time = "2025-08-13T01:43:35.553Z" }, + { url = "https://files.pythonhosted.org/packages/d7/40/ec8b3b8b0f8c0b768690c454b8dcc2781b4f2c767f9f1215539c7909e35b/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e82c46a92fb0fd478b7372e15ca524c287485fdecaed37b8bb68f4df2720f2", size = 2068584, upload-time = "2025-08-13T01:43:37.261Z" }, + { url = "https://files.pythonhosted.org/packages/d9/22/713b900d320d06ce8677e71bba0ec5df0037f1d83270bff5db3b271c10d7/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42170075d8a7319e89ff63062c2f1d1116ced37b6f044f3bf36d10b60a107aa4", size = 2380949, upload-time = "2025-08-13T01:52:17.435Z" }, + { url = "https://files.pythonhosted.org/packages/20/4b/54be84b3b41a19caf0718a2b6bb280dde98c8626c809c969f16aad17458f/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65cba97fa95470239e2d65eb4db1613f78e4396af9f790ff771b0e5476bfd887", size = 2562069, upload-time = "2025-08-13T02:09:27.222Z" }, + { url = "https://files.pythonhosted.org/packages/39/5b/281bb21d091ab4e36cf377088366d55d0875fa2347b3189c580ec62b44c7/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246cc252053f89e36209535b9c58755960197e6ae08d48d3973760141c62ac95", size = 2221186, upload-time = "2025-08-13T01:43:38.598Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2d/30a941a21b81e9db50c4c3ef8a64c5ee1c8eea3a90506ca0326ce39d021f/rustworkx-0.17.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c10d25e9f0e87d6a273d1ea390b636b4fb3fede2094bf0cb3fe565d696a91b48", size = 2123510, upload-time = "2025-08-13T01:43:40.288Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ef/c9199e4b6336ee5a9f1979c11b5779c5cf9ab6f8386e0b9a96c8ffba7009/rustworkx-0.17.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:48784a673cf8d04f3cd246fa6b53fd1ccc4d83304503463bd561c153517bccc1", size = 2302783, upload-time = "2025-08-13T01:43:42.073Z" }, + { url = "https://files.pythonhosted.org/packages/30/3d/a49ab633e99fca4ccbb9c9f4bd41904186c175ebc25c530435529f71c480/rustworkx-0.17.1-cp39-abi3-win32.whl", hash = "sha256:5dbc567833ff0a8ad4580a4fe4bde92c186d36b4c45fca755fb1792e4fafe9b5", size = 1931541, upload-time = "2025-08-13T01:43:43.415Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ec/cee878c1879b91ab8dc7d564535d011307839a2fea79d2a650413edf53be/rustworkx-0.17.1-cp39-abi3-win_amd64.whl", hash = "sha256:d0a48fb62adabd549f9f02927c3a159b51bf654c7388a12fc16d45452d5703ea", size = 2055049, upload-time = "2025-08-13T01:43:44.926Z" }, +] + +[[package]] +name = "scipy" +version = "1.16.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, + { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, + { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, + { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, + { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, + { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, + { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, + { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, + { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, + { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, + { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, + { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, + { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, + { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, + { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, + { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, + { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, + { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, + { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, + { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, + { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, + { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, + { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, + { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, + { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, + { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "stevedore" +version = "5.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/5f/8418daad5c353300b7661dd8ce2574b0410a6316a8be650a189d5c68d938/stevedore-5.5.0.tar.gz", hash = "sha256:d31496a4f4df9825e1a1e4f1f74d19abb0154aff311c3b376fcc89dae8fccd73", size = 513878, upload-time = "2025-08-25T12:54:26.806Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/c5/0c06759b95747882bb50abda18f5fb48c3e9b0fbfc6ebc0e23550b52415d/stevedore-5.5.0-py3-none-any.whl", hash = "sha256:18363d4d268181e8e8452e71a38cd77630f345b2ef6b4a8d5614dac5ee0d18cf", size = 49518, upload-time = "2025-08-25T12:54:25.445Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] diff --git a/README.md b/README.md deleted file mode 100644 index 07e5ea7..0000000 --- a/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# 🧠 2025 Hackathon Challenge -**Brown Quantum Initiative Hackathon – November 8, 2025** -*Hosted at Brown University, Providence, RI* - ---- - -## 🐻 Bruno Goes Quantum - -Since the launch of the **Brown Quantum Initiative (BQI)** in 2023, our beloved mascot **Bruno the Bear** has become obsessed with quantum computing. He’s read every BIQS abstract, tinkered with Qiskit notebooks, and even tried to draw Bloch spheres on napkins at the Blue Room. - -This fall, Bruno decided to *finally join a research group* to prove his quantum skills. Unfortunately, all the nice quantum computing professors (like Prof. Rubenstein and Coley) are on sabbatical… so Bruno ended up in the lab of the **infamous Professor CNOTworthy**, notorious for assigning open-ended problems that might not even be possible. 😭 - -On Bruno’s first day, the professor gave him a single cryptic instruction: - -> “Bruno, if you want to earn your place in my lab, show me that you can -> (1) **see quantum circuits differently**, and -> (2) **make them smaller**.” - -Now, Bruno needs *your* help to buy time with Professor CNOTworthy and survive until the end of the semester when the other professors are back. - ---- - -## ⚡ Your Mission: Help Bruno the Bear - -You can assist Bruno through one (or both) of the following **challenge paths**: - ---- - -### 🪄 Path 1: Visualize the Unseen - -Bruno’s circuits are getting too complex for his bear brain. He needs a fresh way to *see* quantum circuits — something more intuitive, dynamic, or even artistic than the standard gate-by-gate diagrams. - -**Your task:** -- Rethink how quantum circuits are visualized. -- Build a **prototype tool** that can load **any QASM file** and display it in an innovative way. -- Consider geometry, animation, sound, 3D structure, or interaction — you can go beyond boxes and wires. -- The best visualizations will reveal new patterns or insights into circuit structure. - ---- - -### ⚙️ Path 2: Compress the Quantum Forest - -Professor CNOTworthy has given Bruno **three massive quantum circuits**, each using **40 qubits**. He doesn’t expect Bruno to run them (yet) — but he *does* expect him to make them as compact as possible. - -**Your task:** -- **Compile each of the three provided circuits** to *two different target architectures*: - 1. **An all-to-all connectivity** quantum computer *of your choice*, and - 2. **IBM’s Fez machine**, a representative of IBM’s heavy-hex QPU family. -- You can use open source tools to help you compile circuits -- Report and justify your optimization pipeline and compilation strategy. -- The goal: achieve the **smallest total two-qubit gate count** for both targets while maintaining functional equivalence — i.e. no approximations. - ---- - -### ⁉️ Hidden Challenge - -This challenge will be revealed later in the day. - ---- - -## 💻 Submission Requirements - -At the end of the competition, each team must: - -- **Submit all code and documentation** via a **pull request** to the official 2025 Brown Quantum Hackathon GitHub repository. -- **Present their work** in a **10-minute presentation**, followed by **up to 5 minutes of Q&A** from judges and the audience. -- Clearly explain: - - What problem you tackled - - Your methodology and tools - - Your key findings or visualizations - - Any creative or technical insights - - Other things you would like to share with the judges - ---- - -## 🧭 Guidelines -- You may choose **either** Path 1 or Path 2 — or **both**, if you’re feeling ambitious. -- You can use AI and AI tools all you want. However, you are resposible for understanding all the code you wrote and you might be asked questions about it. Failure to udnerstand what your code is doing or why is it doing it after the final submission could result in point penalties. Our suggestion is use AI all you want to prototype but before submitting your final solution make sure you understand what the code is doing. - -**Judging Criteria:** -- 🧠 **Innovation** – Originality and creativity of your approach. -- ⚙️ **Technical correctness** – Functionality and soundness of your solution. -- 🗣️ **Presentation clarity** – How clearly you communicate your ideas and results. -