Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 324d1af1cc | |||
| f2c9a700bf | |||
| 3044f26302 | |||
| 62ebec48c2 | |||
| 74db79020b | |||
| 3baf637356 | |||
| 162d7b675f | |||
| 5914d39eff | |||
| 00e0d5b31d | |||
| 85af9f0246 |
@@ -1,4 +1,8 @@
|
|||||||
# K.G.One Studio
|
<div align="center">
|
||||||
|
<img src="./res/KGOne-logo.png" alt="K.G.One Logo" width="160" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
# K.G.One Music Studio
|
||||||
|
|
||||||
> **AI-native music creation. Compose, generate, and produce — right in your browser.**
|
> **AI-native music creation. Compose, generate, and produce — right in your browser.**
|
||||||
|
|
||||||
@@ -7,43 +11,44 @@
|
|||||||

|

|
||||||

|

|
||||||
|
|
||||||
<!-- IMAGE: hero screenshot of K.G.Studio DAW with the K.G.One Music Generator panel open, showing a clip generation result loaded into a track -->
|
<div align="center">
|
||||||
|
<img src="./res/KGOne-Demo-GIF.gif" alt="K.G.One Logo" width="640" />
|
||||||
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## What is K.G.One Studio?
|
## What is K.G.One Music Studio?
|
||||||
|
|
||||||
**K.G.One Studio** is an AI-powered music production platform — think Cursor, but for making music. It pairs [K.G.Studio](https://github.com/KGAudioLab/K.G.Studio), a lightweight browser-based DAW, with **K.G.One**, a local AI backend that brings real generative AI capabilities to your workflow.
|
**K.G.One Music Studio** is an AI-powered music production platform built entirely on open-source software. It combines [K.G.Studio](https://github.com/KGAudioLab/K.G.Studio), a lightweight browser-based DAW, with **K.G.One**, a local AI backend that brings generative music tools into your workflow.
|
||||||
|
|
||||||
No heavy software to install. Open K.G.Studio in any modern browser, point it at your K.G.One server, and you can generate full songs from text, produce MIDI clips and WAV loops, or strip apart any track into clean stems — all without leaving the browser.
|
Every integrated component is open source, and the full stack can run locally on your own machine. Open K.G.Studio in any modern browser, connect it to your K.G.One server, and you can generate full songs from text, produce MIDI clips and WAV loops, or separate a track into clean stems without leaving the browser.
|
||||||
|
|
||||||
K.G.Studio ships with a built-in **AI Musician Assistant** for harmony, arrangement, and note editing through natural conversation. K.G.One extends the DAW with a dedicated **K.G.One Music Generator** panel — GPU-accelerated tools for generating full songs, producing MIDI clips, and separating stems, all accessible directly from the browser interface.
|
K.G.Studio ships with a built-in **AI Musician Assistant** for harmony, arrangement, and note editing through natural conversation. K.G.One extends the DAW with a dedicated **K.G.One Music Generator** panel — GPU-accelerated tools for generating full songs, producing MIDI clips, and separating stems, all accessible directly from the browser interface.
|
||||||
|
|
||||||
Both K.G.Studio and K.G.One are built by the same author.
|
Both **K.G.Studio** and **K.G.One Music Studio** are built by the same author. K.G.One Music Studio also integrates three open-source third-party components: **ACE-Step 1.5** for full-song generation, **Foundation-1** for audio clip generation, and **python-audio-separator** for stem separation.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Platform Capabilities
|
## Components
|
||||||
|
|
||||||
| What you can do | Powered by | Output | Port |
|
| | Component | Capabilities |
|
||||||
|-----------------|-----------|--------|------|
|
|--|-----------|-------------|
|
||||||
| **Compose and edit in the browser DAW** | [K.G.Studio](https://github.com/KGAudioLab/K.G.Studio) | MIDI, Audio tracks, Project files | `/kgstudio/` |
|
| <img src="./res/banners/kgstudio.png" width="210"> | [**K.G.Studio**](https://github.com/KGAudioLab/K.G.Studio) | Browser-based DAW — compose, edit, and produce in any modern browser |
|
||||||
| **Generate a full song from text** | [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5) | Full-length music (MP3/WAV/FLAC) | 8001 (internal) |
|
| <img src="./res/banners/acestep.png" width="210"> | [**ACE-Step 1.5**](https://github.com/ace-step/ACE-Step-1.5) | Generate full-length songs from text prompts |
|
||||||
| **Generate MIDI clips + WAV loops from text** | [Foundation-1](https://huggingface.co/RoyalCities/Foundation-1) | WAV audio + MIDI transcription | 8002 (internal) |
|
| <img src="./res/banners/foundation1.png" width="210"> | [**Foundation-1**](https://huggingface.co/RoyalCities/Foundation-1) | Generate instrument clips and MIDI loops from text |
|
||||||
| **Separate stems from any audio** | [python-audio-separator](https://github.com/nomadkaraoke/python-audio-separator) | Vocals, Instrumental, and more (MP3) | CLI (no port) |
|
| <img src="./res/banners/uvr5.png" width="210"> | [**python-audio-separator**](https://github.com/nomadkaraoke/python-audio-separator) | Separate any audio into vocals, instrumental, and more |
|
||||||
| **K.G.One Server** | FastAPI | Routes all AI requests | **8000** (public) |
|
|
||||||
|
|
||||||
> **Note:** All AI models require a GPU. Only one model can be active at a time — you switch explicitly via `POST /v1/models/load`.
|
> **Note:** All AI models require a CUDA-enabled GPU. Apple Silicon support is coming soon.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
<!-- IMAGE: architecture diagram showing browser → K.G.Studio UI → K.G.One server (port 8000) → AI models (ACE-Step 8001, Foundation-1 8002, audio-separator CLI) with GPU mutex illustrated -->
|
K.G.One Music Studio is built from five parts: K.G.Studio, K.G.One, ACE-Step 1.5, Foundation-1, and python-audio-separator.
|
||||||
|
|
||||||
K.G.Studio runs entirely in the browser — it stores your projects locally and never requires a server to use as a standalone DAW. When you connect it to K.G.One, the **K.G.One Music Generator** panel unlocks inside K.G.Studio, letting you generate full songs, produce MIDI clips, and separate stems without leaving your session.
|
**K.G.Studio** is the main interface. It runs entirely in the browser, stores projects locally, and can be used as a standalone DAW without any server. You can try it here: [https://kgaudiolab.github.io/kgstudio/](https://kgaudiolab.github.io/kgstudio/). It also includes an AI Musician Assistant for harmony, arrangement, and note editing through natural-language interaction. That assistant requires access to a modern LLM, which can also be hosted locally with open-source tools such as Ollama, vLLM, or llama.cpp. Model quality and editing performance can vary significantly, and not all models perform equally well. For local hosting, we recommend **qwen3.5-35b-a3b**. Additional recommended commercial and free LLM options are listed in the [K.G.Studio README](https://github.com/KGAudioLab/K.G.Studio). When K.G.Studio connects to a K.G.One server, the **K.G.One Music Generator** panel becomes available inside the DAW, so song generation, clip generation, and stem separation stay part of the same workflow.
|
||||||
|
|
||||||
K.G.One manages a single NVIDIA GPU across all three AI services. When you switch models via the API, the active service is shut down before the next one loads. This keeps VRAM clean and prevents conflicts between the very different dependency stacks each model requires.
|
**K.G.One** provides a single local API layer between K.G.Studio and the three integrated AI services. It routes requests to the correct backend, manages model startup and shutdown, and keeps the browser interface consistent across different generation tasks. When you switch models through the API, K.G.One stops the active service before loading the next one. This helps free GPU memory and avoids conflicts between services with different runtime dependencies.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -52,7 +57,7 @@ K.G.One manages a single NVIDIA GPU across all three AI services. When you switc
|
|||||||
| Requirement | Notes |
|
| Requirement | Notes |
|
||||||
|-------------|-------|
|
|-------------|-------|
|
||||||
| Windows 10/11 or Linux | Use `init.bat` on Windows, `init.sh` on Linux |
|
| Windows 10/11 or Linux | Use `init.bat` on Windows, `init.sh` on Linux |
|
||||||
| NVIDIA GPU | CUDA required for all AI models |
|
| NVIDIA GPU | CUDA required for all AI models (VRAM >= 8GB), Apple Silicon support is coming soon. |
|
||||||
| [Git](https://git-scm.com/downloads) | For cloning sub-projects |
|
| [Git](https://git-scm.com/downloads) | For cloning sub-projects |
|
||||||
| [uv](https://docs.astral.sh/uv/getting-started/installation/) | Python environment manager |
|
| [uv](https://docs.astral.sh/uv/getting-started/installation/) | Python environment manager |
|
||||||
| nvm ([Windows](https://github.com/coreybutler/nvm-windows/releases) / [Linux](https://github.com/nvm-sh/nvm)) | Node.js version manager (for building K.G.Studio) |
|
| nvm ([Windows](https://github.com/coreybutler/nvm-windows/releases) / [Linux](https://github.com/nvm-sh/nvm)) | Node.js version manager (for building K.G.Studio) |
|
||||||
@@ -93,21 +98,7 @@ init.bat
|
|||||||
|
|
||||||
> **Note:** The first run downloads large runtime packages and model weights (several GB total). How long it takes depends on your network speed and machine — subsequent runs skip already-completed steps.
|
> **Note:** The first run downloads large runtime packages and model weights (several GB total). How long it takes depends on your network speed and machine — subsequent runs skip already-completed steps.
|
||||||
|
|
||||||
To use a local Foundation-1 checkpoint instead of downloading from HuggingFace:
|
### 2. Start K.G.One Music Studio
|
||||||
|
|
||||||
**Windows:**
|
|
||||||
```bat
|
|
||||||
set FOUNDATION1_CKPT_PATH=C:\path\to\foundation1.safetensors
|
|
||||||
set FOUNDATION1_CONFIG_PATH=C:\path\to\model_config.json
|
|
||||||
```
|
|
||||||
|
|
||||||
**Linux:**
|
|
||||||
```bash
|
|
||||||
export FOUNDATION1_CKPT_PATH=/path/to/foundation1.safetensors
|
|
||||||
export FOUNDATION1_CONFIG_PATH=/path/to/model_config.json
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Start K.G.One Studio
|
|
||||||
|
|
||||||
**Windows:**
|
**Windows:**
|
||||||
```bat
|
```bat
|
||||||
@@ -128,24 +119,18 @@ uv run ./main.py --host 0.0.0.0
|
|||||||
uv run ./main.py --host 0.0.0.0 --port 8080
|
uv run ./main.py --host 0.0.0.0 --port 8080
|
||||||
```
|
```
|
||||||
|
|
||||||
### Upgrading a pinned dependency
|
|
||||||
|
|
||||||
Edit the `commit` field in `submodules.json`, delete the corresponding subfolder, then re-run `init.bat` (Windows) or `./init.sh` (Linux).
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Using K.G.One Studio
|
## Using K.G.One Music Studio
|
||||||
|
|
||||||
<!-- IMAGE: screenshot of K.G.Studio showing the K.G.One Music Generator panel — loading a model and triggering a clip generation -->
|
**K.G.Studio is the recommended way to use K.G.One Music Studio.** It opens automatically in your browser when the server starts and covers every capability through a visual interface.
|
||||||
|
|
||||||
**K.G.Studio is the recommended way to use K.G.One Studio.** It opens automatically in your browser when the server starts and covers every capability through a visual interface.
|
|
||||||
|
|
||||||
**K.G.One Music Generator panel** (requires K.G.One server):
|
**K.G.One Music Generator panel** (requires K.G.One server):
|
||||||
- **Generate a full song** — describe the mood, genre, and style; get back a full-length audio track
|
- **Generate a full song** — describe the mood, genre, and style; get back a full-length audio track
|
||||||
- **Generate MIDI clips + WAV loops** — produce instrument loops that land directly on your tracks, ready to edit in the piano roll
|
- **Generate MIDI clips + WAV loops** — produce instrument loops that land directly on your tracks, ready to edit in the piano roll
|
||||||
- **Separate stems** — split any audio file into vocals, instrumentals, or individual instruments
|
- **Separate stems** — split any audio file into vocals, instrumentals, or individual instruments
|
||||||
|
|
||||||
**K.G.Studio Musician Assistant** (works standalone, no K.G.One needed):
|
**K.G.Studio Musician Assistant** (works standalone, no K.G.One needed, requires an external LLM service):
|
||||||
- Arrange, edit, and compose using the AI chat panel — describe what you want and the assistant makes edits directly in the project
|
- Arrange, edit, and compose using the AI chat panel — describe what you want and the assistant makes edits directly in the project
|
||||||
|
|
||||||
> AI generation tools (full song, clip, stem separation) will be integrated into the Musician Assistant in a future release.
|
> AI generation tools (full song, clip, stem separation) will be integrated into the Musician Assistant in a future release.
|
||||||
@@ -163,42 +148,9 @@ If you want to call the AI features programmatically, integrate K.G.One into you
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Project Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
K.G.One/
|
|
||||||
├── submodules.json # Pinned commits — source of truth for dependency versions
|
|
||||||
├── init.bat # Windows bootstrap script
|
|
||||||
├── init.sh # Linux bootstrap script
|
|
||||||
├── pyproject.toml # K.G.One Python project
|
|
||||||
├── main.py # K.G.One FastAPI server (port 8000); serves K.G.Studio at /kgstudio/
|
|
||||||
├── services/
|
|
||||||
│ ├── model_manager.py # GPU mutex — starts/stops AI model subprocesses
|
|
||||||
│ ├── acestep_client.py # ACE-Step connection config
|
|
||||||
│ ├── foundation1_client.py# Foundation-1 connection config
|
|
||||||
│ └── separator_runner.py # Runs audio-separator CLI per-request, manages tasks
|
|
||||||
├── foundation1_server/
|
|
||||||
│ └── server.py # Foundation-1 FastAPI wrapper (port 8002)
|
|
||||||
├── kgstudio/ # K.G.Studio browser DAW — built as a static SPA, served at /kgstudio/
|
|
||||||
├── ace-step/ # Cloned by init.bat — ACE-Step 1.5 source
|
|
||||||
├── foundation1/ # Cloned by init.bat — RC-stable-audio-tools source
|
|
||||||
├── separator/ # Cloned by init.bat — python-audio-separator source + venv
|
|
||||||
├── soundfonts/ # Cloned by init.bat — soundfont samples for K.G.Studio
|
|
||||||
├── docs/
|
|
||||||
│ └── API.md # Full REST API reference
|
|
||||||
├── outputs/
|
|
||||||
│ ├── clip/ # Foundation-1 generated WAV + MIDI files
|
|
||||||
│ ├── fullsong/ # (reserved for ACE-Step output references)
|
|
||||||
│ └── separator/ # Separated stem MP3 files
|
|
||||||
└── uploads/
|
|
||||||
└── separator/ # Temporary upload storage (auto-deleted after processing)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
K.G.One Studio is an experimental, actively evolving project — contributions are very welcome! Whether you're a developer, musician, or designer, your expertise can make a real difference.
|
K.G.One Music Studio is an experimental, actively evolving project — contributions are very welcome! Whether you're a developer, musician, or designer, your expertise can make a real difference.
|
||||||
|
|
||||||
### How You Can Help
|
### How You Can Help
|
||||||
|
|
||||||
@@ -232,22 +184,22 @@ No contribution is too small — from reporting bugs to suggesting new features,
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
K.G.One Studio is licensed under the [Apache License 2.0](./LICENSE) with two supplemental conditions:
|
K.G.One Music Studio is licensed under the [Apache License 2.0](./LICENSE) with two supplemental conditions:
|
||||||
|
|
||||||
- **No patents** — this software may not be used to file or support any patent application in any jurisdiction.
|
- **No patents** — this software may not be used to file or support any patent application in any jurisdiction.
|
||||||
- **Attribution** — public or commercial deployments must display `Powered by K.G.One © 2026 Xiaohan Tian` in a prominent location visible to end users.
|
- **Attribution** — public or commercial deployments must display `Powered by K.G.One © 2026 Xiaohan Tian` in a prominent location visible to end users.
|
||||||
|
|
||||||
### Third-party component licenses
|
### Third-party component licenses
|
||||||
|
|
||||||
K.G.One Studio integrates or proxies the following projects. If you use the corresponding features, you are responsible for complying with their licenses.
|
K.G.One Music Studio integrates or proxies the following projects. If you use the corresponding features, you are responsible for complying with their licenses.
|
||||||
|
|
||||||
| Component | Used for | License | Notes |
|
| Component | Used for | License | Notes |
|
||||||
|-----------|----------|---------|-------|
|
|-----------|----------|---------|-------|
|
||||||
| [K.G.Studio](https://github.com/KGAudioLab/K.G.Studio) | Browser DAW UI | Apache 2.0 + custom terms | Public/commercial use requires displaying `Powered by K.G.Studio © 2025 Xiaohan Tian`; no patent filing permitted |
|
| [K.G.Studio](https://github.com/KGAudioLab/K.G.Studio) | Browser DAW UI | Apache 2.0 + custom terms | Public/commercial use requires displaying `Powered by K.G.Studio © 2025-2026 Xiaohan Tian`; no patent filing permitted |
|
||||||
| [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5) | Full-song generation (`/v1/fullsong/*`) | MIT | Permissive — attribution required |
|
| [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5) | Full-song generation (`/v1/fullsong/*`) | MIT | Permissive — attribution required |
|
||||||
| [stable-audio-open-1.0](https://huggingface.co/stabilityai/stable-audio-open-1.0) | Clip generation (`/v1/clip/*`) via Foundation-1 | Stability AI Community License | **Non-commercial only.** Commercial use requires a separate license from Stability AI — see [stability.ai/license](https://stability.ai/license) |
|
| [stable-audio-open-1.0](https://huggingface.co/stabilityai/stable-audio-open-1.0) | Clip generation (`/v1/clip/*`) via Foundation-1 | Stability AI Community License | **Non-commercial only.** Commercial use requires a separate license from Stability AI — see [stability.ai/license](https://stability.ai/license) |
|
||||||
| [python-audio-separator / UVR5](https://github.com/nomadkaraoke/python-audio-separator) | Stem separation (`/v1/separator/*`) | MIT | Permissive — attribution required |
|
| [python-audio-separator / UVR5](https://github.com/nomadkaraoke/python-audio-separator) | Stem separation (`/v1/separator/*`) | MIT | Permissive — attribution required |
|
||||||
|
|
||||||
> **Note:** The `clip` generation feature is powered by a model released under the Stability AI Community License, which **does not permit commercial use**. If you intend to use K.G.One Studio in a commercial product, you must obtain a commercial license from Stability AI before enabling or exposing the `/v1/clip/*` endpoints.
|
> **Note:** The `clip` generation feature is powered by a model released under the Stability AI Community License, which **does not permit commercial use**. If you intend to use K.G.One Music Studio in a commercial product, you must obtain a commercial license from Stability AI before enabling or exposing the `/v1/clip/*` endpoints.
|
||||||
|
|
||||||
See [LICENSE](./LICENSE) for the full terms including third-party notices.
|
See [LICENSE](./LICENSE) for the full terms including third-party notices.
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo " KGOne Cleanup Script (Linux/macOS)"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo "This will permanently delete:"
|
||||||
|
echo " .venv/ (gateway Python environment)"
|
||||||
|
echo " ace-step/ (submodule + venv + model checkpoints)"
|
||||||
|
echo " foundation1/ (submodule + venv + model weights)"
|
||||||
|
echo " separator/ (submodule + venv)"
|
||||||
|
echo " kgstudio/ (frontend repo + node_modules + dist)"
|
||||||
|
echo " soundfonts/ (soundfont-for-samplers MP3 samples, ~150 MB)"
|
||||||
|
echo " outputs/ (all generated audio and MIDI files)"
|
||||||
|
echo " uploads/ (all uploaded audio files)"
|
||||||
|
echo ""
|
||||||
|
echo "Re-run init.sh or init-macos.sh to restore everything except outputs and uploads."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
cd "$ROOT" || exit 1
|
||||||
|
|
||||||
|
read -r -p "Type YES to confirm: " CONFIRM
|
||||||
|
if [ "$CONFIRM" != "YES" ]; then
|
||||||
|
echo "Cancelled."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
remove_dir() {
|
||||||
|
local dir="$1"
|
||||||
|
if [ -d "$dir" ]; then
|
||||||
|
echo "Removing $dir ..."
|
||||||
|
rm -rf "$dir"
|
||||||
|
echo " Done."
|
||||||
|
else
|
||||||
|
echo "$dir not found, skipping."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_dir ".venv"
|
||||||
|
remove_dir "ace-step"
|
||||||
|
remove_dir "foundation1"
|
||||||
|
remove_dir "separator"
|
||||||
|
remove_dir "kgstudio"
|
||||||
|
remove_dir "soundfonts"
|
||||||
|
remove_dir "outputs"
|
||||||
|
remove_dir "uploads"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " Cleanup complete."
|
||||||
|
echo " Run init.sh or init-macos.sh to set up again."
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
@@ -60,6 +60,110 @@ curl -X 'POST' \
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# `/v1/fullsong/remix`
|
||||||
|
|
||||||
|
## Request
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X 'POST' \
|
||||||
|
'http://127.0.0.1:8000/v1/fullsong/remix' \
|
||||||
|
-H 'accept: application/json' \
|
||||||
|
-F 'audio_file=@source.mp3;type=audio/mpeg' \
|
||||||
|
-F 'caption=Genre: Lo-fi hip hop. Style: Chill, mellow, dusty samples. Mood: Relaxed, nostalgic.' \
|
||||||
|
-F 'lyrics=[Verse 1]
|
||||||
|
Your lyrics here...' \
|
||||||
|
-F 'audio_cover_strength=0.5' \
|
||||||
|
-F 'cover_noise_strength=0.2'
|
||||||
|
```
|
||||||
|
|
||||||
|
Optional form fields (omit to use defaults):
|
||||||
|
|
||||||
|
| Field | Type | Default | Description |
|
||||||
|
|-------|------|---------|-------------|
|
||||||
|
| `caption` | string | — | Style description for the remix |
|
||||||
|
| `lyrics` | string | — | New lyrics (leave unset to keep original feel) |
|
||||||
|
| `instrumental` | bool | — | Suppress vocals |
|
||||||
|
| `inference_steps` | int | — | Diffusion steps |
|
||||||
|
| `guidance_scale` | float | — | CFG guidance strength |
|
||||||
|
| `use_random_seed` | bool | — | Randomise seed |
|
||||||
|
| `seed` | int | — | Fixed seed for reproducibility |
|
||||||
|
| `thinking` | bool | — | Enable chain-of-thought reasoning |
|
||||||
|
| `batch_size` | int | — | Number of outputs |
|
||||||
|
| `audio_format` | string | — | Output format (`mp3`, `wav`, …) |
|
||||||
|
| `audio_cover_strength` | float | `0.5` | Remix Strength: 0=creative freedom, 1=faithful to source |
|
||||||
|
| `cover_noise_strength` | float | `0.2` | Cover Strength (Melody Retention): 0=pure style transfer, 0.1–0.25 recommended |
|
||||||
|
|
||||||
|
## Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"task_id": "a1b2c3d4-0000-0000-0000-000000000000",
|
||||||
|
"status": "queued",
|
||||||
|
"queue_position": 1
|
||||||
|
},
|
||||||
|
"code": 200,
|
||||||
|
"error": null,
|
||||||
|
"timestamp": 1776227065582,
|
||||||
|
"extra": null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Poll `/v1/fullsong/result/{task_id}` and download via `/v1/fullsong/audio/{task_id}` — same flow as `/v1/fullsong/generate`.
|
||||||
|
|
||||||
|
# `/v1/fullsong/repaint`
|
||||||
|
|
||||||
|
## Request
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X 'POST' \
|
||||||
|
'http://127.0.0.1:8000/v1/fullsong/repaint' \
|
||||||
|
-H 'accept: application/json' \
|
||||||
|
-F 'audio_file=@source.mp3;type=audio/mpeg' \
|
||||||
|
-F 'caption=Genre: Jazz piano. Style: Smooth, mellow, intimate.' \
|
||||||
|
-F 'repainting_start=30.0' \
|
||||||
|
-F 'repainting_end=60.0' \
|
||||||
|
-F 'repaint_strength=0.5'
|
||||||
|
```
|
||||||
|
|
||||||
|
Optional form fields (omit to use defaults):
|
||||||
|
|
||||||
|
| Field | Type | Default | Description |
|
||||||
|
|-------|------|---------|-------------|
|
||||||
|
| `caption` | string | — | Style description for the repainted region |
|
||||||
|
| `lyrics` | string | — | New lyrics for the repainted region |
|
||||||
|
| `instrumental` | bool | — | Suppress vocals |
|
||||||
|
| `inference_steps` | int | — | Diffusion steps |
|
||||||
|
| `guidance_scale` | float | — | CFG guidance strength |
|
||||||
|
| `use_random_seed` | bool | — | Randomise seed |
|
||||||
|
| `seed` | int | — | Fixed seed for reproducibility |
|
||||||
|
| `thinking` | bool | — | Enable chain-of-thought reasoning |
|
||||||
|
| `batch_size` | int | — | Number of outputs |
|
||||||
|
| `audio_format` | string | — | Output format (`mp3`, `wav`, …) |
|
||||||
|
| `repainting_start` | float | `0.0` | Start of repaint region in seconds |
|
||||||
|
| `repainting_end` | float | `-1.0` | End of repaint region in seconds; -1 = until end of track |
|
||||||
|
| `repaint_strength` | float | `0.5` | 0=preserve source closely, 1=full regeneration |
|
||||||
|
|
||||||
|
`repaint_mode` is fixed to `"balanced"`.
|
||||||
|
|
||||||
|
## Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"task_id": "a1b2c3d4-0000-0000-0000-000000000000",
|
||||||
|
"status": "queued",
|
||||||
|
"queue_position": 1
|
||||||
|
},
|
||||||
|
"code": 200,
|
||||||
|
"error": null,
|
||||||
|
"timestamp": 1776227065582,
|
||||||
|
"extra": null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Poll `/v1/fullsong/result/{task_id}` and download via `/v1/fullsong/audio/{task_id}` — same flow as `/v1/fullsong/generate`.
|
||||||
|
|
||||||
# `/v1/fullsong/result/{task_id}`
|
# `/v1/fullsong/result/{task_id}`
|
||||||
|
|
||||||
## Request
|
## Request
|
||||||
|
|||||||
@@ -0,0 +1,323 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo " KGOne Initialization Script (macOS)"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
cd "$ROOT"
|
||||||
|
|
||||||
|
echo "Checking prerequisites..."
|
||||||
|
|
||||||
|
if [ "$(uname -s)" != "Darwin" ]; then
|
||||||
|
echo " ERROR: This script is for macOS only."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$(uname -m)" != "arm64" ]; then
|
||||||
|
echo " ERROR: This script currently supports Apple Silicon macOS only."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v git &>/dev/null; then
|
||||||
|
echo " ERROR: git not found. Install Xcode Command Line Tools or Git from https://git-scm.com/download/mac"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v uv &>/dev/null; then
|
||||||
|
echo " ERROR: uv not found. Install from https://docs.astral.sh/uv/"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v jq &>/dev/null; then
|
||||||
|
echo " ERROR: jq not found. Install via Homebrew (e.g. brew install jq)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# nvm is a shell function — it must be sourced, not found on PATH
|
||||||
|
if ! command -v nvm &>/dev/null; then
|
||||||
|
if [ -s "$HOME/.nvm/nvm.sh" ]; then
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
source "$HOME/.nvm/nvm.sh"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if ! command -v nvm &>/dev/null; then
|
||||||
|
echo " ERROR: nvm not found. Install from https://github.com/nvm-sh/nvm"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " git ... OK"
|
||||||
|
echo " uv ... OK"
|
||||||
|
echo " jq ... OK"
|
||||||
|
echo " nvm ... OK"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
echo "[1/9] Reading submodules.json..."
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
ACESTEP_URL=$(jq -r '."ace-step".url' submodules.json)
|
||||||
|
ACESTEP_COMMIT=$(jq -r '."ace-step".commit' submodules.json)
|
||||||
|
FOUNDATION1_URL=$(jq -r '.foundation1.url' submodules.json)
|
||||||
|
FOUNDATION1_COMMIT=$(jq -r '.foundation1.commit' submodules.json)
|
||||||
|
SEP_URL=$(jq -r '."python-audio-separator".url' submodules.json)
|
||||||
|
SEP_COMMIT=$(jq -r '."python-audio-separator".commit' submodules.json)
|
||||||
|
KGSTUDIO_URL=$(jq -r '.kgstudio.url' submodules.json)
|
||||||
|
SOUNDFONTS_URL=$(jq -r '."soundfont-for-samplers".url' submodules.json)
|
||||||
|
SOUNDFONTS_COMMIT=$(jq -r '."soundfont-for-samplers".commit' submodules.json)
|
||||||
|
|
||||||
|
if [ -z "$ACESTEP_URL" ] || [ "$ACESTEP_URL" = "null" ]; then
|
||||||
|
echo " ERROR: Could not read from submodules.json"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " ACE-Step URL : $ACESTEP_URL"
|
||||||
|
echo " ACE-Step commit: $ACESTEP_COMMIT"
|
||||||
|
echo " Foundation-1 URL : $FOUNDATION1_URL"
|
||||||
|
echo " Foundation-1 commit: $FOUNDATION1_COMMIT"
|
||||||
|
echo " audio-separator URL : $SEP_URL"
|
||||||
|
echo " audio-separator commit: $SEP_COMMIT"
|
||||||
|
echo " KGStudio URL : $KGSTUDIO_URL"
|
||||||
|
echo " soundfont-for-samplers URL : $SOUNDFONTS_URL"
|
||||||
|
echo " soundfont-for-samplers commit: $SOUNDFONTS_COMMIT"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
echo "[2/9] Setting up ACE-Step..."
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -d "ace-step/.git" ]; then
|
||||||
|
echo " Repository exists. Fetching refs..."
|
||||||
|
git -C ace-step fetch --quiet origin
|
||||||
|
else
|
||||||
|
echo " Cloning ACE-Step (may take several minutes)..."
|
||||||
|
git clone "$ACESTEP_URL" ace-step || { echo " ERROR: Failed to clone ACE-Step"; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " Checking out pinned commit $ACESTEP_COMMIT..."
|
||||||
|
git -C ace-step checkout "$ACESTEP_COMMIT" --quiet || { echo " ERROR: Could not checkout ACE-Step commit $ACESTEP_COMMIT"; exit 1; }
|
||||||
|
echo " ACE-Step OK."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
echo "[3/9] Setting up Foundation-1..."
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -d "foundation1/.git" ]; then
|
||||||
|
echo " Repository exists. Fetching refs..."
|
||||||
|
git -C foundation1 fetch --quiet origin
|
||||||
|
else
|
||||||
|
echo " Cloning Foundation-1..."
|
||||||
|
git clone "$FOUNDATION1_URL" foundation1 || { echo " ERROR: Failed to clone Foundation-1"; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " Checking out pinned commit $FOUNDATION1_COMMIT..."
|
||||||
|
git -C foundation1 checkout "$FOUNDATION1_COMMIT" --quiet || { echo " ERROR: Could not checkout Foundation-1 commit $FOUNDATION1_COMMIT"; exit 1; }
|
||||||
|
echo " Foundation-1 OK."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
echo "[4/9] Setting up python-audio-separator..."
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -d "separator/.git" ]; then
|
||||||
|
echo " Repository exists. Fetching refs..."
|
||||||
|
git -C separator fetch --quiet origin
|
||||||
|
else
|
||||||
|
echo " Cloning python-audio-separator..."
|
||||||
|
git clone "$SEP_URL" separator || { echo " ERROR: Failed to clone python-audio-separator"; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " Checking out pinned commit $SEP_COMMIT..."
|
||||||
|
git -C separator checkout "$SEP_COMMIT" --quiet || { echo " ERROR: Could not checkout python-audio-separator commit $SEP_COMMIT"; exit 1; }
|
||||||
|
echo " python-audio-separator OK."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
echo "[5/9] Setting up KGStudio..."
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -d "kgstudio/.git" ]; then
|
||||||
|
echo " Repository exists. Pulling latest..."
|
||||||
|
git -C kgstudio pull --quiet origin
|
||||||
|
else
|
||||||
|
echo " Cloning KGStudio..."
|
||||||
|
git clone "$KGSTUDIO_URL" kgstudio || { echo " ERROR: Failed to clone KGStudio"; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " Installing Node.js 20.19 (latest patch)..."
|
||||||
|
nvm install 20.19 || { echo " ERROR: Failed to install Node.js 20.19"; exit 1; }
|
||||||
|
nvm use 20.19 || { echo " ERROR: Failed to activate Node.js 20.19"; exit 1; }
|
||||||
|
|
||||||
|
echo " Installing npm dependencies..."
|
||||||
|
pushd kgstudio >/dev/null
|
||||||
|
npm install --no-audit --no-fund
|
||||||
|
_EC=$?
|
||||||
|
echo " [debug] npm install exit code: $_EC"
|
||||||
|
if [ "$_EC" -ne 0 ]; then
|
||||||
|
popd >/dev/null
|
||||||
|
echo " ERROR: npm install failed (exit code $_EC)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " Building KGStudio (tsc + vite build)..."
|
||||||
|
npm run build
|
||||||
|
_EC=$?
|
||||||
|
echo " [debug] npm run build exit code: $_EC"
|
||||||
|
if [ "$_EC" -ne 0 ]; then
|
||||||
|
popd >/dev/null
|
||||||
|
echo " ERROR: npm run build failed (exit code $_EC)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
popd >/dev/null
|
||||||
|
|
||||||
|
if [ ! -f "kgstudio/dist/index.html" ]; then
|
||||||
|
echo " ERROR: Build succeeded but dist/index.html not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo " KGStudio OK."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
echo "[6/9] Setting up soundfonts..."
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -d "soundfonts/.git" ]; then
|
||||||
|
echo " Repository exists. Fetching refs..."
|
||||||
|
git -C soundfonts fetch --quiet origin
|
||||||
|
else
|
||||||
|
echo " Cloning soundfont-for-samplers (may take several minutes, ~150 MB)..."
|
||||||
|
git clone "$SOUNDFONTS_URL" soundfonts || { echo " ERROR: Failed to clone soundfont-for-samplers"; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " Checking out pinned commit $SOUNDFONTS_COMMIT..."
|
||||||
|
git -C soundfonts checkout "$SOUNDFONTS_COMMIT" --quiet || { echo " ERROR: Could not checkout soundfont-for-samplers commit $SOUNDFONTS_COMMIT"; exit 1; }
|
||||||
|
echo " soundfont-for-samplers OK."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
echo "[7/9] Setting up Python environments..."
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
# Gateway venv
|
||||||
|
if [ -f ".venv/bin/python" ]; then
|
||||||
|
echo " Gateway venv already exists, skipping."
|
||||||
|
else
|
||||||
|
echo " Creating gateway venv..."
|
||||||
|
uv venv .venv || { echo " ERROR: Failed to create gateway venv"; exit 1; }
|
||||||
|
uv pip install --python .venv "fastapi>=0.110.0" "uvicorn[standard]>=0.27.0" "httpx>=0.27.0" "python-multipart>=0.0.9" || { echo " ERROR: Failed to install gateway dependencies"; exit 1; }
|
||||||
|
echo " Gateway venv OK."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ACE-Step venv
|
||||||
|
if [ -f "ace-step/.venv/bin/python" ]; then
|
||||||
|
echo " ACE-Step venv already exists, skipping."
|
||||||
|
else
|
||||||
|
echo " Creating ACE-Step venv..."
|
||||||
|
echo " NOTE: Downloads large Apple Silicon dependencies. May take 10-20 minutes."
|
||||||
|
pushd ace-step >/dev/null
|
||||||
|
uv venv .venv || { popd >/dev/null; echo " ERROR: Failed to create ACE-Step venv"; exit 1; }
|
||||||
|
uv pip install --python .venv -e . || { popd >/dev/null; echo " ERROR: Failed to install ACE-Step dependencies"; exit 1; }
|
||||||
|
popd >/dev/null
|
||||||
|
echo " ACE-Step venv OK."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Foundation-1 venv
|
||||||
|
if [ -f "foundation1/.venv/bin/python" ]; then
|
||||||
|
echo " Foundation-1 venv already exists, skipping."
|
||||||
|
else
|
||||||
|
echo " Creating Foundation-1 venv (requires Python 3.10)..."
|
||||||
|
if ! uv venv --python 3.10 foundation1/.venv 2>/dev/null; then
|
||||||
|
echo " WARNING: Python 3.10 not found. Falling back to default Python."
|
||||||
|
uv venv foundation1/.venv || { echo " ERROR: Failed to create Foundation-1 venv"; exit 1; }
|
||||||
|
fi
|
||||||
|
echo " Installing PyTorch 2.5.1 (Apple Silicon wheels)..."
|
||||||
|
echo " NOTE: This may take several minutes."
|
||||||
|
uv pip install --python foundation1/.venv torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 || { echo " ERROR: Failed to install PyTorch"; exit 1; }
|
||||||
|
echo " Installing pinned numpy..."
|
||||||
|
uv pip install --python foundation1/.venv "numpy==1.23.5" || { echo " ERROR: Failed to install numpy"; exit 1; }
|
||||||
|
echo " Installing Foundation-1 dependencies..."
|
||||||
|
uv pip install --python foundation1/.venv -e foundation1 || { echo " ERROR: Failed to install Foundation-1 dependencies"; exit 1; }
|
||||||
|
uv pip install --python foundation1/.venv "fastapi>=0.110.0" "uvicorn[standard]>=0.27.0" || { echo " ERROR: Failed to install Foundation-1 server dependencies"; exit 1; }
|
||||||
|
echo " Pinning setuptools for pkg_resources compatibility..."
|
||||||
|
uv pip install --python foundation1/.venv "setuptools<70" || { echo " ERROR: Failed to pin setuptools"; exit 1; }
|
||||||
|
echo " Foundation-1 venv OK."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Separator venv
|
||||||
|
if [ -f "separator/.venv/pyvenv.cfg" ]; then
|
||||||
|
echo " Separator venv already exists, skipping."
|
||||||
|
else
|
||||||
|
echo " Creating separator venv..."
|
||||||
|
echo " NOTE: Installs Apple Silicon PyTorch plus CPU ONNX Runtime."
|
||||||
|
uv venv separator/.venv || { echo " ERROR: Failed to create separator venv"; exit 1; }
|
||||||
|
uv pip install --python separator/.venv -e "separator[cpu]" || { echo " ERROR: Failed to install audio-separator"; exit 1; }
|
||||||
|
uv pip install --python separator/.venv --force-reinstall onnxruntime || { echo " ERROR: Failed to install onnxruntime"; exit 1; }
|
||||||
|
echo " Separator venv OK."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
echo "[8/9] Creating output directories..."
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
mkdir -p "outputs/clip"
|
||||||
|
mkdir -p "outputs/fullsong"
|
||||||
|
mkdir -p "outputs/separator"
|
||||||
|
mkdir -p "uploads/separator"
|
||||||
|
mkdir -p "foundation1/generations"
|
||||||
|
mkdir -p "foundation1/models"
|
||||||
|
echo " Done."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
echo "[9/9] Downloading model weights..."
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -f "ace-step/checkpoints/acestep-v15-turbo/model.safetensors" ]; then
|
||||||
|
echo " ACE-Step weights OK."
|
||||||
|
else
|
||||||
|
echo " Downloading ACE-Step checkpoints (may take several minutes)..."
|
||||||
|
ace-step/.venv/bin/python -c "from acestep.api.model_download import ensure_model_downloaded; import os; ckpt=os.path.join(os.getcwd(),'ace-step','checkpoints'); ensure_model_downloaded('acestep-v15-turbo', ckpt); ensure_model_downloaded('vae', ckpt)" || { echo " ERROR: ACE-Step weight download failed"; exit 1; }
|
||||||
|
echo " ACE-Step weights OK."
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -f "foundation1/models/RoyalCities-Foundation-1/Foundation_1.safetensors" ]; then
|
||||||
|
echo " Foundation-1 weights OK."
|
||||||
|
else
|
||||||
|
echo " Downloading Foundation-1 weights (approx 1.7 GB)..."
|
||||||
|
foundation1/.venv/bin/python -c "from huggingface_hub import snapshot_download; snapshot_download('RoyalCities/Foundation-1', local_dir='foundation1/models/RoyalCities-Foundation-1')" || { echo " ERROR: Foundation-1 weight download failed"; exit 1; }
|
||||||
|
echo " Foundation-1 weights OK."
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo " Separator models will be downloaded on first use (handled by audio-separator)."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo " Initialization complete!"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo "Start the gateway:"
|
||||||
|
echo " uv run ./main.py"
|
||||||
|
echo " uv run ./main.py --host 0.0.0.0 (allow remote access)"
|
||||||
|
echo " uv run ./main.py --host 0.0.0.0 --port 8080 (custom port)"
|
||||||
|
echo ""
|
||||||
|
echo "The default browser will open automatically once the server starts."
|
||||||
|
echo ""
|
||||||
|
echo "Then load a model:"
|
||||||
|
echo " POST http://127.0.0.1:8000/v1/models/load"
|
||||||
|
echo ' Body: {"model": "clip"} -- Foundation-1 (MIDI + WAV)'
|
||||||
|
echo ' Body: {"model": "fullsong"} -- ACE-Step 1.5 (full songs)'
|
||||||
|
echo ""
|
||||||
|
echo "Or separate stems (no model load needed):"
|
||||||
|
echo " POST http://127.0.0.1:8000/v1/separator/separate"
|
||||||
|
echo " Body: multipart/form-data file=<audio> model_filename=<model>"
|
||||||
|
echo ""
|
||||||
|
echo "K.G.Studio DAW:"
|
||||||
|
echo " http://127.0.0.1:8000 (redirects to /kgstudio/)"
|
||||||
|
echo ""
|
||||||
|
echo "API docs: http://127.0.0.1:8000/docs"
|
||||||
|
echo ""
|
||||||
@@ -6,6 +6,7 @@ import argparse
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import shutil
|
import shutil
|
||||||
|
import tempfile
|
||||||
import threading
|
import threading
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
import uuid
|
import uuid
|
||||||
@@ -208,6 +209,157 @@ async def fullsong_generate(req: FullsongGenerateRequest, request: Request):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@app.post(
|
||||||
|
"/v1/fullsong/remix",
|
||||||
|
tags=["fullsong"],
|
||||||
|
summary="Submit a remix/cover task (ACE-Step 1.5)",
|
||||||
|
)
|
||||||
|
async def fullsong_remix(
|
||||||
|
request: Request,
|
||||||
|
audio_file: UploadFile = File(...),
|
||||||
|
caption: Optional[str] = Form(None),
|
||||||
|
lyrics: Optional[str] = Form(None),
|
||||||
|
instrumental: Optional[bool] = Form(None),
|
||||||
|
inference_steps: Optional[int] = Form(None),
|
||||||
|
guidance_scale: Optional[float] = Form(None),
|
||||||
|
use_random_seed: Optional[bool] = Form(None),
|
||||||
|
seed: Optional[int] = Form(None),
|
||||||
|
thinking: Optional[bool] = Form(None),
|
||||||
|
batch_size: Optional[int] = Form(None),
|
||||||
|
audio_format: Optional[str] = Form(None),
|
||||||
|
audio_cover_strength: float = Form(0.5),
|
||||||
|
cover_noise_strength: float = Form(0.2),
|
||||||
|
):
|
||||||
|
"""Upload a source audio file and reinterpret it in a new style.
|
||||||
|
|
||||||
|
- `audio_file`: source audio (MP3, WAV, FLAC, …)
|
||||||
|
- `caption`: style description for the remix
|
||||||
|
- `lyrics`: new lyrics (or leave unset to keep existing)
|
||||||
|
- `audio_cover_strength`: how closely the remix follows the source structure (0=creative, 1=faithful; default 0.5)
|
||||||
|
- `cover_noise_strength`: melody retention level (0=pure style transfer, 0.1–0.25 recommended; default 0.2)
|
||||||
|
|
||||||
|
Returns `{"data": {"task_id": "...", "status": "queued", ...}}`.
|
||||||
|
Poll `/v1/fullsong/result/{task_id}`, then download via `/v1/fullsong/audio/{task_id}`.
|
||||||
|
"""
|
||||||
|
_require("fullsong")
|
||||||
|
suffix = Path(audio_file.filename or "audio").suffix or ".mp3"
|
||||||
|
with tempfile.NamedTemporaryFile(suffix=suffix, prefix="kg_remix_", delete=False) as tmp:
|
||||||
|
shutil.copyfileobj(audio_file.file, tmp)
|
||||||
|
src_audio_path = tmp.name
|
||||||
|
|
||||||
|
payload: dict = {
|
||||||
|
"task_type": "cover",
|
||||||
|
"src_audio_path": src_audio_path,
|
||||||
|
"audio_cover_strength": audio_cover_strength,
|
||||||
|
"cover_noise_strength": cover_noise_strength,
|
||||||
|
}
|
||||||
|
for key, val in [
|
||||||
|
("caption", caption),
|
||||||
|
("lyrics", lyrics),
|
||||||
|
("instrumental", instrumental),
|
||||||
|
("inference_steps", inference_steps),
|
||||||
|
("guidance_scale", guidance_scale),
|
||||||
|
("use_random_seed", use_random_seed),
|
||||||
|
("seed", seed),
|
||||||
|
("thinking", thinking),
|
||||||
|
("batch_size", batch_size),
|
||||||
|
("audio_format", audio_format),
|
||||||
|
]:
|
||||||
|
if val is not None:
|
||||||
|
payload[key] = val
|
||||||
|
|
||||||
|
try:
|
||||||
|
resp = await request.app.state.http_client.post(
|
||||||
|
f"{ACESTEP_BASE_URL}/release_task",
|
||||||
|
json=payload,
|
||||||
|
)
|
||||||
|
except httpx.ConnectError:
|
||||||
|
raise HTTPException(503, "Sub-service unreachable — is the model loaded?")
|
||||||
|
return Response(
|
||||||
|
content=resp.content,
|
||||||
|
status_code=resp.status_code,
|
||||||
|
headers={k: v for k, v in resp.headers.items() if k.lower() not in ("transfer-encoding",)},
|
||||||
|
media_type=resp.headers.get("content-type"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@app.post(
|
||||||
|
"/v1/fullsong/repaint",
|
||||||
|
tags=["fullsong"],
|
||||||
|
summary="Repaint a time region of an existing song (ACE-Step 1.5)",
|
||||||
|
)
|
||||||
|
async def fullsong_repaint(
|
||||||
|
request: Request,
|
||||||
|
audio_file: UploadFile = File(...),
|
||||||
|
caption: Optional[str] = Form(None),
|
||||||
|
lyrics: Optional[str] = Form(None),
|
||||||
|
instrumental: Optional[bool] = Form(None),
|
||||||
|
inference_steps: Optional[int] = Form(None),
|
||||||
|
guidance_scale: Optional[float] = Form(None),
|
||||||
|
use_random_seed: Optional[bool] = Form(None),
|
||||||
|
seed: Optional[int] = Form(None),
|
||||||
|
thinking: Optional[bool] = Form(None),
|
||||||
|
batch_size: Optional[int] = Form(None),
|
||||||
|
audio_format: Optional[str] = Form(None),
|
||||||
|
repainting_start: float = Form(0.0),
|
||||||
|
repainting_end: float = Form(-1.0),
|
||||||
|
repaint_strength: float = Form(0.5),
|
||||||
|
):
|
||||||
|
"""Upload a source audio file and re-generate a time region in a new style.
|
||||||
|
|
||||||
|
- `audio_file`: source audio (MP3, WAV, FLAC, …)
|
||||||
|
- `caption`: style description for the repainted region
|
||||||
|
- `repainting_start`: start of the region to repaint in seconds (default 0.0)
|
||||||
|
- `repainting_end`: end of the region in seconds; -1 = until end of track (default -1.0)
|
||||||
|
- `repaint_strength`: 0=preserve source closely, 1=full regeneration (default 0.5)
|
||||||
|
|
||||||
|
Returns `{"data": {"task_id": "...", "status": "queued", ...}}`.
|
||||||
|
Poll `/v1/fullsong/result/{task_id}`, then download via `/v1/fullsong/audio/{task_id}`.
|
||||||
|
"""
|
||||||
|
_require("fullsong")
|
||||||
|
suffix = Path(audio_file.filename or "audio").suffix or ".mp3"
|
||||||
|
with tempfile.NamedTemporaryFile(suffix=suffix, prefix="kg_repaint_", delete=False) as tmp:
|
||||||
|
shutil.copyfileobj(audio_file.file, tmp)
|
||||||
|
src_audio_path = tmp.name
|
||||||
|
|
||||||
|
payload: dict = {
|
||||||
|
"task_type": "repaint",
|
||||||
|
"src_audio_path": src_audio_path,
|
||||||
|
"repaint_mode": "balanced",
|
||||||
|
"repainting_start": repainting_start,
|
||||||
|
"repainting_end": repainting_end,
|
||||||
|
"repaint_strength": repaint_strength,
|
||||||
|
}
|
||||||
|
for key, val in [
|
||||||
|
("caption", caption),
|
||||||
|
("lyrics", lyrics),
|
||||||
|
("instrumental", instrumental),
|
||||||
|
("inference_steps", inference_steps),
|
||||||
|
("guidance_scale", guidance_scale),
|
||||||
|
("use_random_seed", use_random_seed),
|
||||||
|
("seed", seed),
|
||||||
|
("thinking", thinking),
|
||||||
|
("batch_size", batch_size),
|
||||||
|
("audio_format", audio_format),
|
||||||
|
]:
|
||||||
|
if val is not None:
|
||||||
|
payload[key] = val
|
||||||
|
|
||||||
|
try:
|
||||||
|
resp = await request.app.state.http_client.post(
|
||||||
|
f"{ACESTEP_BASE_URL}/release_task",
|
||||||
|
json=payload,
|
||||||
|
)
|
||||||
|
except httpx.ConnectError:
|
||||||
|
raise HTTPException(503, "Sub-service unreachable — is the model loaded?")
|
||||||
|
return Response(
|
||||||
|
content=resp.content,
|
||||||
|
status_code=resp.status_code,
|
||||||
|
headers={k: v for k, v in resp.headers.items() if k.lower() not in ("transfer-encoding",)},
|
||||||
|
media_type=resp.headers.get("content-type"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.get(
|
@app.get(
|
||||||
"/v1/fullsong/result/{task_id}",
|
"/v1/fullsong/result/{task_id}",
|
||||||
tags=["fullsong"],
|
tags=["fullsong"],
|
||||||
|
|||||||
@@ -6,6 +6,12 @@ Place sample files in ./samples/ before starting:
|
|||||||
clip.mid
|
clip.mid
|
||||||
separator_(Vocals)_MDX23C-8KFFT-InstVoc_HQ.mp3
|
separator_(Vocals)_MDX23C-8KFFT-InstVoc_HQ.mp3
|
||||||
separator_(Instrumental)_MDX23C-8KFFT-InstVoc_HQ.mp3
|
separator_(Instrumental)_MDX23C-8KFFT-InstVoc_HQ.mp3
|
||||||
|
KGOne_Stem_Bass_Sample.mp3
|
||||||
|
KGOne_Stem_Drums_Sample.mp3
|
||||||
|
KGOne_Stem_Guitar_Sample.mp3
|
||||||
|
KGOne_Stem_Other_Sample.mp3
|
||||||
|
KGOne_Stem_Piano_Sample.mp3
|
||||||
|
KGOne_Stem_Vocals_Sample.mp3
|
||||||
|
|
||||||
Run:
|
Run:
|
||||||
uv sync
|
uv sync
|
||||||
@@ -46,7 +52,7 @@ ALLOWED_MODELS = {
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
_active_model: Optional[str] = None
|
_active_model: Optional[str] = None
|
||||||
_tasks: dict[str, float] = {} # task_id -> unix timestamp of creation
|
_tasks: dict[str, dict] = {} # task_id -> {"created_at": float, "model_filename": str | None}
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# App
|
# App
|
||||||
@@ -92,10 +98,10 @@ def _sample(filename: str) -> Path:
|
|||||||
|
|
||||||
def _task_age(task_id: str) -> float:
|
def _task_age(task_id: str) -> float:
|
||||||
"""Return seconds since this task was created, or raise 404 if unknown."""
|
"""Return seconds since this task was created, or raise 404 if unknown."""
|
||||||
created_at = _tasks.get(task_id)
|
task_info = _tasks.get(task_id)
|
||||||
if created_at is None:
|
if task_info is None:
|
||||||
raise HTTPException(404, f"Task '{task_id}' not found")
|
raise HTTPException(404, f"Task '{task_id}' not found")
|
||||||
return time.time() - created_at
|
return time.time() - task_info["created_at"]
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@@ -191,7 +197,82 @@ async def fullsong_generate(req: FullsongGenerateRequest):
|
|||||||
"""
|
"""
|
||||||
_require("fullsong")
|
_require("fullsong")
|
||||||
task_id = str(uuid.uuid4())
|
task_id = str(uuid.uuid4())
|
||||||
_tasks[task_id] = time.time()
|
_tasks[task_id] = {"created_at": time.time(), "model_filename": None}
|
||||||
|
return {
|
||||||
|
"data": {
|
||||||
|
"task_id": task_id,
|
||||||
|
"status": "queued",
|
||||||
|
"queue_position": 1,
|
||||||
|
},
|
||||||
|
"code": 200,
|
||||||
|
"error": None,
|
||||||
|
"timestamp": int(time.time() * 1000),
|
||||||
|
"extra": None,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@app.post(
|
||||||
|
"/v1/fullsong/remix",
|
||||||
|
tags=["fullsong"],
|
||||||
|
summary="Submit a remix/cover task (ACE-Step 1.5)",
|
||||||
|
)
|
||||||
|
async def fullsong_remix(
|
||||||
|
audio_file: UploadFile = File(...),
|
||||||
|
caption: Optional[str] = Form(None),
|
||||||
|
lyrics: Optional[str] = Form(None),
|
||||||
|
instrumental: Optional[bool] = Form(None),
|
||||||
|
inference_steps: Optional[int] = Form(None),
|
||||||
|
guidance_scale: Optional[float] = Form(None),
|
||||||
|
use_random_seed: Optional[bool] = Form(None),
|
||||||
|
seed: Optional[int] = Form(None),
|
||||||
|
thinking: Optional[bool] = Form(None),
|
||||||
|
batch_size: Optional[int] = Form(None),
|
||||||
|
audio_format: Optional[str] = Form(None),
|
||||||
|
audio_cover_strength: float = Form(0.5),
|
||||||
|
cover_noise_strength: float = Form(0.2),
|
||||||
|
):
|
||||||
|
"""Mock remix endpoint — accepts the same multipart form as the real server."""
|
||||||
|
_require("fullsong")
|
||||||
|
task_id = str(uuid.uuid4())
|
||||||
|
_tasks[task_id] = {"created_at": time.time(), "model_filename": None}
|
||||||
|
return {
|
||||||
|
"data": {
|
||||||
|
"task_id": task_id,
|
||||||
|
"status": "queued",
|
||||||
|
"queue_position": 1,
|
||||||
|
},
|
||||||
|
"code": 200,
|
||||||
|
"error": None,
|
||||||
|
"timestamp": int(time.time() * 1000),
|
||||||
|
"extra": None,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@app.post(
|
||||||
|
"/v1/fullsong/repaint",
|
||||||
|
tags=["fullsong"],
|
||||||
|
summary="Repaint a time region of an existing song (ACE-Step 1.5)",
|
||||||
|
)
|
||||||
|
async def fullsong_repaint(
|
||||||
|
audio_file: UploadFile = File(...),
|
||||||
|
caption: Optional[str] = Form(None),
|
||||||
|
lyrics: Optional[str] = Form(None),
|
||||||
|
instrumental: Optional[bool] = Form(None),
|
||||||
|
inference_steps: Optional[int] = Form(None),
|
||||||
|
guidance_scale: Optional[float] = Form(None),
|
||||||
|
use_random_seed: Optional[bool] = Form(None),
|
||||||
|
seed: Optional[int] = Form(None),
|
||||||
|
thinking: Optional[bool] = Form(None),
|
||||||
|
batch_size: Optional[int] = Form(None),
|
||||||
|
audio_format: Optional[str] = Form(None),
|
||||||
|
repainting_start: float = Form(0.0),
|
||||||
|
repainting_end: float = Form(-1.0),
|
||||||
|
repaint_strength: float = Form(0.5),
|
||||||
|
):
|
||||||
|
"""Mock repaint endpoint — accepts the same multipart form as the real server."""
|
||||||
|
_require("fullsong")
|
||||||
|
task_id = str(uuid.uuid4())
|
||||||
|
_tasks[task_id] = {"created_at": time.time(), "model_filename": None}
|
||||||
return {
|
return {
|
||||||
"data": {
|
"data": {
|
||||||
"task_id": task_id,
|
"task_id": task_id,
|
||||||
@@ -225,7 +306,7 @@ async def fullsong_result(task_id: str):
|
|||||||
"file": "",
|
"file": "",
|
||||||
"wave": "",
|
"wave": "",
|
||||||
"status": 0,
|
"status": 0,
|
||||||
"create_time": int(_tasks[task_id]),
|
"create_time": int(_tasks[task_id]["created_at"]),
|
||||||
"env": "development",
|
"env": "development",
|
||||||
"progress": min(0.9, age / 10),
|
"progress": min(0.9, age / 10),
|
||||||
"stage": "Phase 1: Generating CoT metadata (once for all items)...",
|
"stage": "Phase 1: Generating CoT metadata (once for all items)...",
|
||||||
@@ -247,7 +328,7 @@ async def fullsong_result(task_id: str):
|
|||||||
"file": "/v1/audio?path=mock",
|
"file": "/v1/audio?path=mock",
|
||||||
"wave": "",
|
"wave": "",
|
||||||
"status": 1,
|
"status": 1,
|
||||||
"create_time": int(_tasks[task_id]),
|
"create_time": int(_tasks[task_id]["created_at"]),
|
||||||
"env": "development",
|
"env": "development",
|
||||||
"progress": 1.0,
|
"progress": 1.0,
|
||||||
"stage": "succeeded",
|
"stage": "succeeded",
|
||||||
@@ -345,7 +426,7 @@ async def clip_generate(req: ClipGenerateRequest):
|
|||||||
"""
|
"""
|
||||||
_require("clip")
|
_require("clip")
|
||||||
task_id = str(uuid.uuid4())
|
task_id = str(uuid.uuid4())
|
||||||
_tasks[task_id] = time.time()
|
_tasks[task_id] = {"created_at": time.time(), "model_filename": None}
|
||||||
return {"task_id": task_id}
|
return {"task_id": task_id}
|
||||||
|
|
||||||
|
|
||||||
@@ -428,7 +509,7 @@ async def separator_separate(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
task_id = str(uuid.uuid4())
|
task_id = str(uuid.uuid4())
|
||||||
_tasks[task_id] = time.time()
|
_tasks[task_id] = {"created_at": time.time(), "model_filename": model_filename}
|
||||||
return {"task_id": task_id}
|
return {"task_id": task_id}
|
||||||
|
|
||||||
|
|
||||||
@@ -447,13 +528,28 @@ async def separator_result(task_id: str):
|
|||||||
age = _task_age(task_id)
|
age = _task_age(task_id)
|
||||||
if age < 10:
|
if age < 10:
|
||||||
return {"task_id": task_id, "status": "running"}
|
return {"task_id": task_id, "status": "running"}
|
||||||
|
|
||||||
|
model_filename = _tasks[task_id]["model_filename"]
|
||||||
|
|
||||||
|
if model_filename == "htdemucs_6s.yaml":
|
||||||
|
files = [
|
||||||
|
f"{task_id}_(Bass)_htdemucs_6s.mp3",
|
||||||
|
f"{task_id}_(Drums)_htdemucs_6s.mp3",
|
||||||
|
f"{task_id}_(Guitar)_htdemucs_6s.mp3",
|
||||||
|
f"{task_id}_(Other)_htdemucs_6s.mp3",
|
||||||
|
f"{task_id}_(Piano)_htdemucs_6s.mp3",
|
||||||
|
f"{task_id}_(Vocals)_htdemucs_6s.mp3",
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
files = [
|
||||||
|
f"{task_id}_(Instrumental)_MDX23C-8KFFT-InstVoc_HQ.mp3",
|
||||||
|
f"{task_id}_(Vocals)_MDX23C-8KFFT-InstVoc_HQ.mp3",
|
||||||
|
]
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"task_id": task_id,
|
"task_id": task_id,
|
||||||
"status": "complete",
|
"status": "complete",
|
||||||
"files": [
|
"files": files,
|
||||||
f"{task_id}_(Instrumental)_MDX23C-8KFFT-InstVoc_HQ.mp3",
|
|
||||||
f"{task_id}_(Vocals)_MDX23C-8KFFT-InstVoc_HQ.mp3",
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -467,7 +563,19 @@ async def separator_download(filename: str):
|
|||||||
|
|
||||||
`filename` is one of the entries from the `files` list in the result response.
|
`filename` is one of the entries from the `files` list in the result response.
|
||||||
"""
|
"""
|
||||||
if "Vocals" in filename:
|
if "(Bass)_htdemucs_6s" in filename:
|
||||||
|
sample_name = "KGOne_Stem_Bass_Sample.mp3"
|
||||||
|
elif "(Drums)_htdemucs_6s" in filename:
|
||||||
|
sample_name = "KGOne_Stem_Drums_Sample.mp3"
|
||||||
|
elif "(Guitar)_htdemucs_6s" in filename:
|
||||||
|
sample_name = "KGOne_Stem_Guitar_Sample.mp3"
|
||||||
|
elif "(Other)_htdemucs_6s" in filename:
|
||||||
|
sample_name = "KGOne_Stem_Other_Sample.mp3"
|
||||||
|
elif "(Piano)_htdemucs_6s" in filename:
|
||||||
|
sample_name = "KGOne_Stem_Piano_Sample.mp3"
|
||||||
|
elif "(Vocals)_htdemucs_6s" in filename:
|
||||||
|
sample_name = "KGOne_Stem_Vocals_Sample.mp3"
|
||||||
|
elif "(Vocals)" in filename:
|
||||||
sample_name = "separator_(Vocals)_MDX23C-8KFFT-InstVoc_HQ.mp3"
|
sample_name = "separator_(Vocals)_MDX23C-8KFFT-InstVoc_HQ.mp3"
|
||||||
else:
|
else:
|
||||||
sample_name = "separator_(Instrumental)_MDX23C-8KFFT-InstVoc_HQ.mp3"
|
sample_name = "separator_(Instrumental)_MDX23C-8KFFT-InstVoc_HQ.mp3"
|
||||||
|
|||||||
|
After Width: | Height: | Size: 8.9 MiB |
@@ -0,0 +1,131 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<svg width="1024" height="1024" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" enable-background="new 0 0 1024 1024" version="1.1" xml:space="preserve">
|
||||||
|
<g class="layer">
|
||||||
|
<title>Layer 1</title>
|
||||||
|
<path d="m525.63,657.78c-1.84,15.23 -3.46,30.07 -5.4,44.86c-0.25,1.87 -2.14,4.88 -3.46,4.99c-3.18,0.25 -3.38,-2.71 -3.49,-5.37c-1.38,-34.3 -8.31,-67.26 -24.63,-97.74c-20.78,-38.81 -50.87,-67.13 -93.11,-81.57c-23.73,-8.11 -48.2,-11.56 -73.15,-12.48c-1.55,-0.06 -4.09,-1.98 -4.35,-3.37c-0.6,-3.31 2.25,-3.25 4.69,-3.37c30.4,-1.49 60.13,-6.12 88.13,-18.81c30.99,-14.05 54.19,-36.72 71.81,-65.4c16,-26.06 24.47,-54.7 28.18,-84.86c1.06,-8.53 1.46,-17.14 2.53,-25.67c0.27,-2.11 2.02,-4.02 3.08,-6.02c1.29,2.02 3.64,4.02 3.7,6.08c0.61,24.81 4.81,48.95 12.93,72.39c13.12,37.84 34.88,69.29 68.53,91.79c18.48,12.36 38.93,20.2 60.64,24.33c14.47,2.75 29.21,4.1 43.79,6.31c1.69,0.26 3.13,2.07 4.69,3.16c-1.68,1.09 -3.3,3.03 -5.05,3.15c-41.84,2.99 -81.77,11.55 -115.5,38.71c-28.91,23.26 -47.52,53.41 -58.99,88.29c-2.17,6.62 -3.65,13.46 -5.57,20.6m-95.97,-157.65c-7.6,2.37 -15.2,4.74 -23.49,7.33c1.39,0.3 2.03,0.43 2.67,0.56c41.89,8.79 72.63,31.57 90.16,71.27c7.57,17.12 13.51,34.73 17.74,53.77c0.51,-1.33 0.82,-1.9 0.94,-2.5c3.64,-18.02 9.82,-35.19 17.23,-51.97c15.06,-34.07 40.32,-56.45 76.06,-66.97c5.24,-1.55 10.54,-2.88 17.07,-4.66c-2.43,-0.56 -3.51,-0.81 -4.59,-1.06c-30.74,-6.95 -57.02,-21.05 -75.66,-47.31c-11.1,-15.62 -18.47,-33.04 -24.02,-51.26c-2.56,-8.45 -4.7,-17.02 -6.88,-25.02c-3.63,12.02 -6.86,24.44 -11.1,36.5c-13.35,37.88 -35.99,67.34 -76.13,81.32z" fill="#f3efec" id="svg_3" opacity="1" transform="matrix(1 0 0 1 0 0)"/>
|
||||||
|
<path d="m583.83,862.97c-0.83,10.63 -6.01,19.16 -13.6,26.09c-12.12,11.05 -26.32,16.06 -42.87,13.17c-15.66,-2.73 -23.88,-17.64 -18.64,-33.16c5.88,-17.4 18.99,-26.62 36.16,-31.05c6.85,-1.77 13.44,-0.82 20.01,1.25c1.2,0.38 2.45,0.64 4.16,1.08c0,-6.34 0,-12.15 0,-17.96c0,-21.65 0,-43.3 -0.01,-64.96c0,-5.89 -0.4,-6.26 -5.86,-4.59c-30.42,9.34 -60.82,18.78 -91.27,28.04c-3.49,1.07 -4.02,3.12 -4.01,6.29c0.08,32.15 -0.7,64.32 0.29,96.45c0.73,23.32 -16.13,40.65 -31.86,46.87c-9.07,3.59 -18.4,5.28 -28.14,3.37c-16.79,-3.3 -25.11,-18.29 -19.65,-35.02c7.1,-21.8 35.36,-39.07 59.6,-29.66c1.05,0.4 2.13,0.69 3.93,1.26c0,-2.24 0,-3.97 0,-5.71c-0.04,-39.15 -0.02,-78.3 -0.19,-117.44c-0.02,-5.2 1.61,-8.29 6.8,-9.88c38.79,-11.84 77.52,-23.85 116.28,-35.76c5.16,-1.58 6.94,-0.56 8.68,5.33c-0.42,1.33 -0.62,1.98 -0.62,2.64c-0.01,49.86 -0.02,99.72 0.02,149.59c0,1.25 0.52,2.51 0.79,3.76z" fill="#f3efec" id="svg_4" opacity="1"/>
|
||||||
|
<path d="m587.87,142.98c0.05,1.73 0.11,3.46 -0.18,5.93c-0.18,4.84 0,8.96 0.18,13.07c0.06,1.08 0.12,2.17 -0.14,3.84c-0.16,1.44 -0.01,2.3 0.15,3.16c0.06,1.08 0.11,2.17 -0.15,3.87c-0.17,1.78 -0.01,2.96 0.15,4.13c0.06,0.46 0.11,0.92 -0.19,2.02c-0.46,1.3 -0.66,1.95 -0.66,2.59c-0.02,22.38 -0.03,44.75 0.02,67.12c0,1.09 0.5,2.17 0.77,3.26c-0.55,12.05 -6.5,21.48 -15.49,28.71c-10.92,8.79 -23.41,13.14 -37.84,10.57c-16.23,-2.89 -25.27,-18.34 -17.97,-36.17c7.49,-18.31 33.19,-33.32 53.62,-24.43c0.72,0.31 1.59,0.27 2.65,0.43c0.1,-1.3 0.26,-2.42 0.26,-3.53c0.01,-23.3 0.01,-46.61 -0.01,-69.91c-0.01,-5.39 -0.93,-6.16 -6.21,-4.67c-29.21,8.27 -58.42,16.6 -87.6,24.98c-1.47,0.43 -2.73,1.59 -4.49,3.06c-0.52,1.3 -0.71,1.95 -0.71,2.6c-0.01,29.86 -0.02,59.73 0.02,89.59c0,1.26 0.5,2.51 0.77,3.77c-0.38,11.32 -5.97,20.28 -14.01,27.38c-10.75,9.5 -23.41,14.48 -38.21,12.71c-20.02,-2.41 -29.79,-18.66 -21.92,-37.3c6.72,-15.93 19.42,-24.92 36.07,-27.47c7.36,-1.13 15.16,0.58 23.15,1.03c0.01,-0.23 0.15,-1.81 0.15,-3.39c-0.02,-35.63 -0.02,-71.26 -0.14,-106.88c-0.01,-4.88 1.18,-7.75 6.6,-9.19c37.29,-9.87 74.49,-20.1 111.7,-30.26c4.23,-1.16 7.9,-1.28 9.51,4.16c-0.08,0.72 0.03,0.97 0.14,1.22c0.06,3.38 0.12,6.76 -0.14,10.78c-0.16,1.5 -0.01,2.36 0.14,3.22c0.06,1.08 0.11,2.17 -0.18,3.96c-0.18,5.82 0.01,10.93 0.19,16.04z" fill="#f3efec" id="svg_5" opacity="1"/>
|
||||||
|
<path d="m774.83,536.97c-0.38,10.86 -5.54,19.66 -12.76,27.14c-10.85,11.22 -24.41,16.88 -40.04,16.37c-20.63,-0.68 -31.23,-16.4 -24.62,-35.92c7.5,-22.13 35.32,-37.75 58.07,-29.34c1.28,0.47 2.8,0.31 4.69,-0.2c0.58,-1.63 0.8,-2.61 0.8,-3.59c0.02,-37.4 0.03,-74.81 -0.02,-112.22c0,-1.39 -0.59,-2.79 -0.91,-4.19c2.15,-1.94 3.98,-4.85 6.49,-5.67c27.59,-8.95 55.28,-17.58 82.95,-26.28c5.93,-1.87 11.86,-3.72 17.83,-5.46c6.4,-1.87 9.62,0.52 9.63,7.05c0.02,12.15 0.01,24.3 -0.2,37.01c-0.1,0.81 0.01,1.06 0.12,1.31c0.05,6.04 0.11,12.08 -0.15,18.78c-0.15,1.5 0,2.36 0.15,3.22c0.06,1.73 0.11,3.46 -0.15,5.84c-0.16,1.81 -0.01,2.99 0.15,4.16c0.06,10.71 0.12,21.41 -0.14,32.8c-0.17,1.85 -0.01,3.02 0.16,4.2c0.05,0.46 0.11,0.91 -0.07,1.79c-0.14,0.69 -0.04,0.95 0.07,1.21c0.05,3.71 0.11,7.43 -0.16,11.81c-0.16,1.84 0,3.02 0.16,4.19c0.06,1.08 0.11,2.17 -0.18,3.95c-0.2,4.14 -0.04,7.59 0.12,11.04c-0.03,11.39 -5.02,20.71 -12.61,28.66c-9.65,10.1 -21.53,15.67 -35.71,15.45c-19.42,-0.3 -30.22,-15.4 -24.14,-33.84c6.7,-20.29 32.26,-36.41 53.95,-28.88c1.01,0.35 2.39,-0.39 3.98,-1.31c0.48,-1.34 0.68,-1.99 0.68,-2.63c0.02,-23.91 0.03,-47.81 -0.02,-71.71c0,-1.23 -0.58,-2.47 -0.89,-3.7c-1.82,-0.55 -3.92,-1.99 -5.42,-1.52c-25.81,8.07 -51.56,16.35 -77.28,24.71c-1.59,0.52 -2.84,2.07 -4.64,3.8c-0.5,1.3 -0.69,1.95 -0.69,2.6c-0.02,31.87 -0.02,63.74 0.02,95.61c0,1.25 0.51,2.5 0.78,3.76z" fill="#f3efec" id="svg_6" opacity="1"/>
|
||||||
|
<path d="m273.19,367.92c0.57,0.74 1.15,1.48 1.31,2.69c-0.77,3.18 -1.44,5.89 -1.45,8.6c-0.09,19.33 -0.05,38.65 -0.05,57.98c0.01,4.21 0.01,8.42 0.05,12.63c0.06,7.53 0.17,15.06 0.23,22.58c0.06,8.28 -0.07,16.56 0.2,24.83c0.17,5.26 0.94,10.5 1.43,15.74c0.02,0.46 0.03,0.91 -0.39,1.74c-2.17,1.23 -3.3,2.14 -0.72,3.42c-0.03,0.48 -0.06,0.96 -0.67,1.65c-0.76,0.22 -0.94,0.22 -1.19,0.08c-0.14,-0.19 -0.22,-0.24 -0.31,-0.29c0.12,0.15 0.25,0.29 0.23,0.76c-1.04,2.81 -1.93,5.28 -2.82,7.76c-0.27,0.51 -0.54,1.02 -1.41,1.72c-1.25,1.24 -1.91,2.28 -2.58,3.32c-8.69,9.94 -19.53,15.15 -32.82,14.03c-15.88,-1.33 -23.6,-13.76 -18.66,-29c5.2,-16.03 25.01,-30.65 43.84,-25.3c1.03,0.3 2.41,-0.67 3.85,-1.57c0.1,-0.77 -0.01,-1.02 -0.12,-1.27c-0.06,-0.46 -0.11,-0.92 0.16,-1.95c0.17,-2.07 0,-3.56 -0.16,-5.05c-0.06,-0.46 -0.11,-0.92 0.19,-2.02c0.45,-21.73 0.55,-42.81 0.59,-63.89c0,-0.71 -0.65,-1.42 -1,-2.13c0,0 -0.21,-0.28 -0.1,-0.84c-1.1,-1.72 -2.16,-3.56 -3.55,-3.86c-1.7,-0.37 -4.39,-0.07 -5.4,1.06c-2.49,2.8 -8.08,0.19 -8.88,5.38c-0.43,0.11 -0.86,0.21 -1.72,0.18c-0.71,0.18 -1,0.5 -1.28,0.82c-0.44,0.1 -0.88,0.2 -1.78,0.18c-0.56,0.18 -0.66,0.48 -0.75,0.77c-0.21,0.08 -0.43,0.15 -1.1,-0.18c-0.86,-0.64 -1.36,-1.18 -1.65,-1.08c-12.16,3.9 -24.3,7.84 -36.41,11.9c-0.53,0.18 -0.66,1.56 -0.98,2.39c-0.19,0.06 -0.39,0.13 -1,-0.19c-0.97,0.11 -1.52,0.62 -2.07,1.14c-0.16,0.07 -0.31,0.15 -0.85,-0.15c-1.37,0.28 -2.35,0.94 -3.33,1.61c0,0 -0.05,-0.09 -0.39,-0.08c-1.25,1.4 -2.9,2.75 -2.96,4.17c-0.21,5.09 0.2,10.21 0.21,15.31c0.03,11.51 0.01,23.01 -0.07,34.52c-0.09,14.05 -0.32,28.1 -0.36,42.15c-0.01,4.61 0.37,9.23 0.57,13.85c-0.04,0.44 -0.08,0.88 -0.57,1.65c-3.38,0.97 -2.81,2.54 -1.52,4.31c-0.71,1.57 -1.41,3.14 -2.68,4.91c-0.77,0.85 -0.98,1.49 -1.18,2.14c-0.81,1.25 -1.62,2.5 -3.07,3.89c-1.47,1.35 -2.3,2.56 -3.13,3.76c-2.4,2.09 -4.8,4.17 -7.69,6.11c-1.08,0.52 -1.66,1.19 -2.25,1.86c-0.75,0.45 -1.51,0.9 -2.8,1.13c-5.52,1.25 -10.49,2.69 -15.43,4.25c-0.39,0.13 -0.51,1.13 -0.76,1.73c-0.44,0.06 -0.88,0.12 -1.74,-0.22c-3.69,-0.15 -6.97,0.1 -10.24,0.35c-0.45,0.01 -0.9,0.03 -1.72,-0.33c-2.35,-0.77 -4.33,-1.16 -6.3,-1.54c-0.59,-0.12 -1.18,-0.23 -1.94,-0.98c-2.17,-1.76 -4.18,-2.88 -6.18,-4c-0.35,-0.02 -0.61,-0.18 -0.84,-1.09c-0.98,-3.6 -1.05,-7.4 -2.98,-9.43c-3.48,-3.67 -2.07,-7.32 -1.79,-11.18c0.06,-0.74 -0.76,-1.55 -1.18,-2.33c-0.01,-0.45 -0.01,-0.9 0.4,-1.76c2.11,-4.38 3.8,-8.36 5.49,-12.34c0.03,-0.33 0.15,-0.61 0.96,-0.95c1.07,-1.08 1.55,-2.07 2.03,-3.06c1.11,-1.25 2.21,-2.5 3.99,-3.84c4.05,-1.27 8.01,-1.77 8.07,-6.66c1.41,-0.81 2.81,-1.62 4.76,-2.23c3.65,-0.51 7.47,0.26 8.9,-3.88c0.2,-0.06 0.39,-0.12 1,0.24c2.39,-0.16 4.36,-0.74 6.33,-1.32c2.04,-0.05 4.08,-0.09 6.56,0.3c2.06,2.26 7.21,3.27 10.46,2.41c1.13,-0.12 2.26,-0.25 3.95,-0.91c0.71,-2.33 0.99,-4.13 0.99,-5.93c0.03,-29.71 0.03,-59.42 0.03,-89.52c-0.6,-2.13 -1.19,-3.85 -1.79,-5.58c-0.05,-4.02 -0.1,-8.04 0.21,-12.56c0.42,-1.15 0.49,-1.79 0.56,-2.44c0.46,-0.93 0.93,-1.87 2.12,-2.89c9.24,-0.97 16.97,-3.89 23.91,-8.87c0.44,-0.09 0.89,-0.17 1.69,-0.03c0.55,0.43 0.74,0.63 0.92,0.83c0.01,-0.56 0.02,-1.12 0.03,-1.69c0.2,-0.07 0.39,-0.15 1.01,0.17c1.46,0.45 2.59,0.79 3.53,0.51c8.36,-2.54 16.67,-5.25 25.03,-7.78c5.49,-1.66 11.17,-2.76 16.53,-4.76c5.25,-1.97 10.19,-4.76 15.26,-7.19c0.44,-0.1 0.87,-0.19 1.67,-0.03c1.02,-0.18 1.67,-0.61 2.33,-1.04c0.44,-0.05 0.88,-0.11 1.73,0.25c1.42,0.76 2.44,1.11 3.45,1.45z" fill="#f3efec" id="svg_7" opacity="1"/>
|
||||||
|
<path d="m273.86,767.97c-1.22,12.26 -7.79,21.54 -16.73,29.31c-12.67,11.03 -27.68,15.53 -44.18,13.5c-17.04,-2.1 -25.72,-20.18 -18.53,-37.53c8.92,-21.53 33.55,-35.92 58.59,-28.62c1.41,0.4 2.86,0.64 4.95,1.1c0.18,-2.33 0.48,-4.38 0.48,-6.42c-0.09,-40.16 -0.22,-80.31 -0.33,-120.46c-0.01,-5.85 2.96,-9.31 8.19,-8.63c2.24,0.29 5.62,2.01 6.15,3.78c4.88,16.29 17.32,25.69 30.39,34.68c15.15,10.42 25.87,23.99 29.53,42.42c4.15,20.91 -0.41,39.66 -14.17,56.05c-1.18,1.39 -2.51,2.69 -3.96,3.8c-2.15,1.66 -4.43,4.03 -7.29,1.36c-2.81,-2.61 -2.05,-5.29 -0.27,-8.43c3.39,-5.97 7.31,-11.95 9.13,-18.46c7.78,-27.81 -6.45,-51.95 -34.42,-59.39c-2,-0.53 -4.14,-0.52 -6.87,-0.3c-0.94,2.05 -1.47,3.64 -1.47,5.23c-0.05,30.75 -0.05,61.51 0,92.26c0,1.59 0.53,3.17 0.81,4.75z" fill="#f3efec" id="svg_8" opacity="1" transform="matrix(1 0 0 1 0 0)"/>
|
||||||
|
<path d="m704.1,160.02c-0.06,-0.46 -0.13,-0.91 0.06,-1.78c0.31,-0.51 0.45,-0.65 0.43,-0.69c-0.12,-0.19 -0.28,-0.35 -0.42,-0.52c0.6,-4.66 4.28,-5.77 7.86,-5.78c3.49,0 6.21,2.27 6.88,5.99c2.35,13.18 9.78,23.25 19.41,31.98c7.49,6.79 15.52,13.07 22.5,20.35c21.2,22.1 20.29,61.66 -1.63,82.55c-1.78,1.7 -4.41,3.52 -6.63,3.51c-3.42,-0.02 -4.37,-5.05 -1.85,-8.77c5.76,-8.53 8.94,-17.71 9.49,-28.18c1.07,-20.55 -13.2,-37.23 -30.52,-42.7c-3.04,-0.96 -6.12,-3.94 -9.94,-0.01c-0.23,3.77 -0.05,6.89 0.13,10.01c0.06,1.08 0.12,2.17 -0.18,3.96c-0.47,1.36 -0.67,2 -0.67,2.65c-0.01,26.88 -0.02,53.75 0.02,80.62c0.01,1.26 0.52,2.51 0.79,3.76c-0.37,11.66 -6.04,20.97 -14.16,28.52c-10.65,9.91 -23.54,15.1 -38.36,14.52c-23.37,-0.91 -32.45,-18.82 -24.97,-38.54c6.19,-16.3 26.76,-30.41 44.23,-30.26c5.65,0.04 11.28,1.83 17.49,2.92c0,-12.07 0,-24.16 0.31,-37c0.13,-3.2 -0.05,-5.65 -0.23,-8.11c-0.06,-3.05 -0.11,-6.1 0.19,-9.91c0.17,-8.54 -0.02,-16.31 -0.2,-24.09c-0.06,-1.08 -0.12,-2.17 0.19,-3.96c0.44,-16.91 0.54,-33.11 0.59,-49.31c0,-0.58 -0.53,-1.15 -0.81,-1.73z" fill="#f3efec" id="svg_9" opacity="1"/>
|
||||||
|
<path d="m769.19,681.03c-0.05,-20.43 -0.08,-40.85 -0.15,-61.28c-0.02,-4.49 2.61,-6.75 6.62,-7.17c3.58,-0.37 6.98,1.2 7.27,5.07c1.41,18.81 12.28,31.45 26.82,42.63c1.35,1.39 2.49,2.13 3.62,2.87c0,0 0.32,0.14 0.23,0.63c0.77,1.05 1.65,1.61 2.52,2.17c0.35,0.03 0.61,0.19 0.85,1.1c1.06,1.39 2.04,2.17 3.03,2.95c0,0 0,0 -0.01,0.36c0.71,1.1 1.41,1.83 2.12,2.56c0,0 -0.09,0.06 -0.08,0.39c0.98,1.45 1.95,2.58 2.91,3.71c1.01,1.75 2.02,3.5 2.8,5.84c-0.58,3.16 -0.68,5.59 2.9,5.85c0.08,0.19 0.16,0.37 -0.16,0.98c-1.77,3.59 -1.16,6 2.26,7.33c0.07,0.74 0.14,1.49 -0.14,2.83c-0.46,7.1 -0.56,13.62 -0.66,20.13c0,0.45 0,0.9 -0.37,1.72c-3.43,6.72 -6.47,13.07 -9.52,19.43c-0.66,0.77 -1.33,1.55 -2.42,2.08c-0.6,-0.26 -0.79,-0.27 -0.97,-0.29c0.2,0.19 0.41,0.38 0.61,0.56c-1.49,0.82 -2.99,1.64 -4.48,2.46c-0.91,-1.72 -1.82,-3.44 -2.27,-5.55c1.07,-1.74 1.69,-3.1 2.32,-4.45c0.67,-1.44 1.34,-2.87 2.52,-4.7c1.3,-3.6 2.08,-6.81 2.87,-10.02c-0.08,-0.24 -0.13,-0.49 0.32,-1.07c3.69,-5.22 3.31,-11.72 -0.33,-14.17c-0.06,-0.44 -0.13,-0.89 0.04,-1.83c-0.17,-1.06 -0.56,-1.62 -0.96,-2.17c-0.09,-0.44 -0.18,-0.87 -0.07,-1.81c-0.21,-1.06 -0.63,-1.62 -1.04,-2.19c-0.71,-1.4 -1.41,-2.81 -2.16,-4.92c-0.7,-1.49 -1.35,-2.28 -2,-3.07c-1.94,-2.11 -3.87,-4.21 -5.93,-7.02c-1.22,-1.41 -2.32,-2.12 -3.42,-2.83c-0.51,-0.2 -1.01,-0.39 -1.65,-1.2c-1.18,-1.06 -2.2,-1.49 -3.23,-1.92c-1.39,-0.62 -2.79,-1.24 -4.49,-2.36c-0.32,-0.98 -0.21,-1.87 -0.38,-1.92c-2.82,-0.92 -5.67,-1.8 -8.57,-2.43c-0.25,-0.05 -0.9,1.74 -1.37,2.67c0,0 0.01,0.02 -0.34,0.06c-1.02,1.11 -2.21,2.14 -2.26,3.23c-0.28,6.16 -0.42,12.34 -0.36,18.52c0.1,9.21 0.62,18.43 0.59,27.64c-0.04,14.21 -0.42,28.41 -0.52,42.61c-0.01,0.99 1.15,1.98 1.77,2.97c0.02,0.44 0.05,0.88 -0.31,1.69c-2.42,5.71 -4.47,11.06 -6.52,16.4c-0.78,1.23 -1.56,2.46 -2.99,3.85c-1.41,1.21 -2.17,2.27 -2.93,3.34c-2.25,1.97 -4.51,3.95 -7.42,5.97c-1.3,0.64 -1.96,1.25 -2.62,1.86c0,0 -0.06,-0.1 -0.4,-0.09c-0.84,0.01 -1.4,-0.14 -1.82,0.03c-9.13,3.74 -18.3,7.15 -28.5,5.08c-0.63,-0.13 -1.56,1.17 -2.35,1.8c-0.44,0 -0.89,0 -1.73,-0.43c-3.03,-1.1 -5.67,-1.77 -8.3,-2.44c-0.58,-0.15 -1.16,-0.3 -1.93,-1.07c-0.93,-0.82 -1.66,-1 -2.4,-1.19c0,0 -0.29,-0.12 -0.2,-0.59c-0.55,-0.76 -1.19,-1.06 -1.84,-1.35c0,0 -0.31,-0.14 -0.21,-0.62c-0.77,-1.05 -1.63,-1.62 -2.49,-2.19c0,0 0.08,-0.05 0.06,-0.37c-0.69,-1.11 -1.36,-1.88 -2.04,-2.66c-0.29,-0.47 -0.59,-0.95 -0.7,-1.88c-0.55,-2.03 -1.28,-3.6 -2.02,-5.17c-0.05,-0.44 -0.1,-0.88 0.12,-1.92c0.79,-5.5 1.29,-10.4 1.8,-15.3c0.23,-0.69 0.46,-1.39 1.2,-2.49c0.89,-1.39 1.26,-2.38 1.63,-3.37c0,0 0.12,-0.48 0.63,-0.69c1.1,-1.3 1.7,-2.39 2.29,-3.49c2.39,-2.56 4.78,-5.13 7.87,-7.74c2.22,-1.35 3.74,-2.65 5.25,-3.96c0.84,-0.61 1.67,-1.23 3.23,-1.62c1.04,0.29 1.45,0.52 1.67,0.4c11.35,-6.1 23.03,-5.52 34.92,-1.93c0.92,0.28 2.12,-0.38 3.2,-0.61c0.31,-0.86 0.62,-1.71 1.27,-3.18c0.17,-2.43 0,-4.24 -0.17,-6.06c-0.05,-5.71 -0.11,-11.42 0.18,-17.87c0.18,-3.2 0,-5.66 -0.17,-8.13c-0.05,-9.04 -0.11,-18.08 0.08,-27.66c0.29,-0.64 0.43,-0.78 0.4,-0.82c-0.11,-0.19 -0.28,-0.34 -0.42,-0.51z" fill="#f3efec" id="svg_10" opacity="1"/>
|
||||||
|
<path d="m338.16,147.03c1.27,-4.78 4.19,-6.9 8.83,-6.21c4.35,0.65 6.91,3.25 6.92,7.68c0.06,37.78 1.11,75.6 -0.39,113.32c-0.83,20.58 -14.58,33.97 -33.74,41.09c-14.5,5.39 -28.31,4.3 -41.32,-4.87c-14.86,-10.48 -15.21,-31.25 -2.68,-44.22c15.57,-16.15 35.33,-20.2 56.14,-11.71c1.64,0.67 3.28,1.35 6.04,2.48c0,-3.03 0,-5.39 0.35,-8.48c0.17,-3.85 -0.01,-6.97 -0.18,-10.09c-0.06,-1.08 -0.12,-2.17 0.18,-3.96c0.47,-12.08 0.61,-23.46 0.64,-34.83c0.01,-1.41 -0.54,-2.81 -0.83,-4.21c-0.05,-0.46 -0.11,-0.91 0.19,-2.02c0.18,-5.09 -0.01,-9.53 -0.19,-13.98c-0.06,-0.76 -0.11,-1.53 0.17,-2.93c0.17,-2.44 0,-4.25 -0.17,-6.07c-0.06,-0.46 -0.12,-0.91 0.15,-1.92c0.17,-1.73 0,-2.91 -0.16,-4.08c-0.06,-0.77 -0.12,-1.53 0.12,-2.81c0.17,-1.07 0.05,-1.62 -0.07,-2.18z" fill="#f3efec" id="svg_11" opacity="1"/>
|
||||||
|
<path d="m372.32,829.69c-21.85,-9.56 -42.63,-20.26 -61.46,-34.41c-5.29,-3.98 -6.38,-9.15 -3.02,-13.56c3.52,-4.61 7.92,-4.95 13.77,-0.84c25.74,18.14 53.5,32.21 83.62,41.51c3.29,1.01 6.66,1.79 10,2.65c5.44,1.4 8.07,5.84 6.68,11.32c-1.08,4.26 -6.42,7.51 -10.92,6.09c-12.82,-4.04 -25.56,-8.35 -38.67,-12.76z" fill="#f3efec" id="svg_12" opacity="1"/>
|
||||||
|
<path d="m227.91,685.59c-6.39,6.47 -11.75,5.81 -16.1,-1.52c-15.81,-26.62 -26.59,-55.22 -33.57,-85.31c-1.31,-5.66 1.04,-10.45 5.59,-11.67c5.82,-1.56 10.45,1.13 11.7,7.49c5.79,29.2 17.17,56.15 32,81.83c1.32,2.29 0.43,5.86 0.38,9.18z" fill="#f3efec" id="svg_13" opacity="1"/>
|
||||||
|
<path d="m622.41,839.5c-6.27,0.62 -10.29,-2.14 -11.31,-7.32c-0.77,-3.86 2.11,-8.19 6.47,-10.01c16.46,-6.85 32.92,-13.72 49.35,-20.65c5.97,-2.51 10.76,-1.26 13.02,3.61c2.36,5.07 0.63,9.66 -5.5,12.32c-17.16,7.45 -34.44,14.59 -52.03,22.05z" fill="#f3efec" id="svg_14" opacity="1"/>
|
||||||
|
<path d="m836.11,592.13c0.97,-4.42 1.74,-8.47 2.86,-12.41c1.44,-5.03 5.89,-7.68 10.55,-6.6c4.62,1.07 7.31,5.63 6.31,10.8c-3.65,18.95 -9.36,37.27 -16.86,55.04c-2.37,5.64 -6.75,7.73 -11.9,5.7c-4.73,-1.87 -6.35,-6.92 -4.41,-12.51c4.56,-13.17 8.94,-26.4 13.45,-40.02z" fill="#f3efec" id="svg_15" opacity="1"/>
|
||||||
|
<path d="m643.21,202.78c-8.54,-3.05 -16.7,-6.04 -24.92,-8.83c-5.3,-1.81 -8.38,-6.49 -7.16,-11.39c1.24,-4.97 6.5,-8.32 11.71,-6.29c16.22,6.3 32.31,12.94 48.29,19.81c4.76,2.04 6.02,6.74 4.13,11.21c-2.29,5.42 -7.22,7.21 -12.58,4.65c-6.36,-3.04 -12.74,-6.01 -19.47,-9.16z" fill="#f3efec" id="svg_16" opacity="1"/>
|
||||||
|
<path d="m232.1,340.15c-2.57,4.99 -4.9,9.69 -7.43,14.28c-2.82,5.14 -7.75,6.75 -12.44,4.27c-4.59,-2.42 -6.12,-7.44 -3.14,-12.55c8.2,-14.08 16.54,-28.08 25.1,-41.94c3.35,-5.43 8.5,-6.4 13.1,-3.25c4.51,3.09 4.73,7.71 1.06,13.36c-5.48,8.42 -10.75,16.98 -16.25,25.83z" fill="#f3efec" id="svg_17" opacity="1"/>
|
||||||
|
<path d="m799.6,340.45c-5.65,-9.17 -11.05,-18.04 -16.54,-26.87c-3.12,-5.01 -2.41,-10.02 2,-13.01c4.13,-2.79 9.69,-1.92 12.57,2.87c8.37,13.96 16.53,28.06 24.4,42.3c3.04,5.51 1.31,10.07 -3.61,12.45c-4.95,2.39 -9.59,0.48 -12.43,-5.13c-2.07,-4.1 -4.12,-8.2 -6.39,-12.61z" fill="#f3efec" id="svg_18" opacity="1"/>
|
||||||
|
<path d="m429.66,191.91c-13.02,4.13 -25.68,8.11 -38.25,12.33c-5.96,2 -10.31,0.43 -12.49,-5.03c-1.95,-4.89 -0.21,-9.19 5.49,-11.2c13.73,-4.83 27.58,-9.33 41.43,-13.78c3.64,-1.16 8.21,1.88 9.71,5.89c1.69,4.51 -0.33,8.82 -5.89,11.79z" fill="#f3efec" id="svg_19" opacity="1"/>
|
||||||
|
<path d="m275.08,512.59c-0.66,-4.86 -1.43,-10.1 -1.6,-15.36c-0.27,-8.27 -0.14,-16.55 -0.2,-24.83c-0.06,-7.52 -0.17,-15.05 -0.23,-22.58c-0.04,-4.21 -0.04,-8.42 -0.05,-12.63c0,-19.33 -0.04,-38.65 0.05,-57.98c0.01,-2.71 0.68,-5.42 1.39,-8.23c0.57,18.65 0.84,37.4 0.99,56.15c0.22,26.4 0.37,52.81 0.49,79.21c0.01,1.96 -0.44,3.92 -0.84,6.25z" fill="#f3efec" id="svg_20" opacity="1"/>
|
||||||
|
<path d="m783.98,767.61c-0.73,-0.59 -1.89,-1.58 -1.88,-2.57c0.1,-14.2 0.48,-28.4 0.52,-42.61c0.03,-9.21 -0.49,-18.43 -0.59,-27.64c-0.06,-6.18 0.08,-12.36 0.36,-18.52c0.05,-1.09 1.24,-2.12 2.25,-3.23c0.15,20.55 -0.04,41.15 -0.23,61.76c-0.1,10.8 -0.2,21.61 -0.43,32.81z" fill="#f3efec" id="svg_21" opacity="1"/>
|
||||||
|
<path d="m187.38,543.78c-0.51,-4.37 -0.89,-8.99 -0.88,-13.6c0.04,-14.05 0.27,-28.1 0.36,-42.15c0.08,-11.51 0.1,-23.01 0.07,-34.52c-0.01,-5.1 -0.42,-10.22 -0.21,-15.31c0.06,-1.42 1.71,-2.77 3,-4.14c0,1.9 -0.7,3.78 -0.7,5.66c-0.07,29.16 0.01,58.32 -0.11,87.47c-0.02,5.45 -0.8,10.89 -1.53,16.59z" fill="#f3efec" id="svg_22" opacity="1"/>
|
||||||
|
<path d="m583.95,862.57c-0.39,-0.85 -0.91,-2.11 -0.91,-3.36c-0.04,-49.87 -0.03,-99.73 -0.02,-149.59c0,-0.66 0.2,-1.31 0.57,-2.27c0.37,17.81 0.51,35.93 0.59,54.05c0.13,31.77 0.24,63.54 0.33,95.31c0,1.82 -0.28,3.64 -0.56,5.86z" fill="#f3efec" id="svg_23" opacity="1"/>
|
||||||
|
<path d="m175,419.96c0,29.71 0,59.42 -0.03,89.13c0,1.8 -0.28,3.6 -0.76,5.67c-0.58,-18.63 -0.89,-37.54 -1.06,-56.46c-0.11,-12.44 -0.03,-24.89 0.32,-37.8c0.75,-0.48 1.14,-0.51 1.53,-0.54z" fill="#f3efec" id="svg_24" opacity="1"/>
|
||||||
|
<path d="m759.82,395.33c0.54,1.09 1.13,2.49 1.13,3.88c0.05,37.41 0.04,74.82 0.02,112.22c0,0.98 -0.22,1.96 -0.61,3.25c-0.39,-20 -0.52,-40.31 -0.6,-60.61c-0.08,-19.48 -0.11,-38.95 0.06,-58.74z" fill="#f3efec" id="svg_25" opacity="1"/>
|
||||||
|
<path d="m263.64,367.31c-4.7,2.41 -9.64,5.2 -14.89,7.17c-5.36,2 -11.04,3.1 -16.53,4.76c-8.36,2.53 -16.67,5.24 -25.03,7.78c-0.94,0.28 -2.07,-0.06 -3.22,-0.46c19.25,-6.43 38.6,-12.52 57.95,-18.61c0.47,-0.15 0.9,-0.41 1.72,-0.64z" fill="#f3efec" id="svg_26" opacity="1"/>
|
||||||
|
<path d="m274,767.52c-0.42,-1.13 -0.95,-2.71 -0.95,-4.3c-0.05,-30.75 -0.05,-61.51 0,-92.26c0,-1.59 0.53,-3.18 1.18,-5.07c0.31,26.07 0.27,52.44 0.18,78.81c-0.02,7.46 -0.17,14.91 -0.41,22.82z" fill="#f3efec" id="svg_27" opacity="1"/>
|
||||||
|
<path d="m774.94,536.51c-0.38,-0.8 -0.89,-2.05 -0.89,-3.3c-0.04,-31.87 -0.04,-63.74 -0.02,-95.61c0,-0.65 0.19,-1.3 0.57,-2.26c0.33,33.37 0.39,67.04 0.34,101.17z" fill="#f3efec" id="svg_28" opacity="1"/>
|
||||||
|
<path d="m474.92,276.51c-0.37,-0.8 -0.87,-2.05 -0.87,-3.31c-0.04,-29.86 -0.03,-59.73 -0.02,-89.59c0,-0.65 0.19,-1.3 0.56,-2.27c0.33,31.37 0.38,63.04 0.33,95.17z" fill="#f3efec" id="svg_29" opacity="1"/>
|
||||||
|
<path d="m719.95,316.52c-0.39,-0.8 -0.9,-2.05 -0.91,-3.31c-0.04,-26.87 -0.03,-53.74 -0.02,-80.62c0,-0.65 0.2,-1.29 0.58,-2.25c0.34,28.37 0.41,57.04 0.35,86.18z" fill="#f3efec" id="svg_30" opacity="1"/>
|
||||||
|
<path d="m197.69,431.56c-0.05,-0.69 0.08,-2.07 0.61,-2.25c12.11,-4.06 24.25,-8 36.41,-11.9c0.29,-0.1 0.79,0.44 1.31,1.04c-12.57,4.56 -25.26,8.77 -38.33,13.11z" fill="#f3efec" id="svg_31" opacity="1"/>
|
||||||
|
<path d="m767.64,745.17c-0.7,0.32 -1.9,0.98 -2.82,0.7c-11.89,-3.59 -23.57,-4.17 -34.92,1.93c-0.22,0.12 -0.63,-0.11 -1.34,-0.39c12.28,-7.41 25.31,-8.16 39.08,-2.24z" fill="#f3efec" id="svg_32" opacity="1"/>
|
||||||
|
<path d="m861.98,408.47c0.39,0.77 0.97,2.01 0.97,3.24c0.05,23.9 0.04,47.8 0.02,71.71c0,0.64 -0.2,1.29 -0.59,2.25c-0.34,-25.38 -0.41,-51.05 -0.4,-77.2z" fill="#f3efec" id="svg_33" opacity="1"/>
|
||||||
|
<path d="m728.37,808.15c0.43,-0.84 1.36,-2.14 1.99,-2.01c10.2,2.07 19.37,-1.34 28.5,-5.08c0.42,-0.17 0.98,-0.02 1.87,0c-9.56,6.25 -20.27,9.02 -32.36,7.09z" fill="#f3efec" id="svg_34" opacity="1"/>
|
||||||
|
<path d="m587.94,251.51c-0.39,-0.63 -0.89,-1.71 -0.89,-2.8c-0.05,-22.37 -0.04,-44.74 -0.02,-67.12c0,-0.64 0.2,-1.29 0.57,-2.25c0.34,23.7 0.39,47.71 0.34,72.17z" fill="#f3efec" id="svg_35" opacity="1"/>
|
||||||
|
<path d="m260.79,415.43c0.48,0.26 1.13,0.97 1.13,1.68c-0.04,21.08 -0.14,42.16 -0.51,63.55c-0.43,-21.39 -0.59,-43.08 -0.62,-65.23z" fill="#f3efec" id="svg_36" opacity="1"/>
|
||||||
|
<path d="m199.63,387.24c-6.56,4.97 -14.29,7.89 -23.22,8.76c6.74,-2.67 13.92,-5.33 21.08,-8.01c0.6,-0.22 1.18,-0.49 2.14,-0.75z" fill="#f3efec" id="svg_37" opacity="1"/>
|
||||||
|
<path d="m704.03,160.48c0.35,0.12 0.88,0.69 0.88,1.27c-0.05,16.2 -0.15,32.4 -0.51,48.91c-0.33,-16.37 -0.39,-33.04 -0.37,-50.18z" fill="#f3efec" id="svg_38" opacity="1"/>
|
||||||
|
<path d="m110.88,549.38c0.62,0.42 1.44,1.23 1.38,1.97c-0.28,3.86 -1.69,7.51 1.79,11.18c1.93,2.03 2,5.83 2.91,9.2c-6.53,-5.84 -7.97,-13.47 -6.08,-22.35z" fill="#f3efec" id="svg_39" opacity="1"/>
|
||||||
|
<path d="m832.15,719.65c-0.11,-6.18 -0.01,-12.7 0.41,-19.43c0.15,6.22 -0.03,12.66 -0.41,19.43z" fill="#f3efec" id="svg_40" opacity="1"/>
|
||||||
|
<path d="m243.36,416.71c0.43,-5.18 6.02,-2.57 8.51,-5.37c1.01,-1.13 3.7,-1.43 5.4,-1.06c1.39,0.3 2.45,2.14 3.62,3.7c-1.79,-0.11 -3.69,-1.35 -5.25,-1.01c-4.05,0.87 -7.95,2.44 -12.28,3.74z" fill="#f3efec" id="svg_41" opacity="1"/>
|
||||||
|
<path d="m822.37,740.99c2.73,-6.22 5.77,-12.57 9.12,-18.96c-2.73,6.24 -5.77,12.53 -9.12,18.96z" fill="#f3efec" id="svg_42" opacity="1"/>
|
||||||
|
<path d="m820.16,706.44c3.7,1.99 4.08,8.49 0.45,13.53c-0.44,-4.26 -0.48,-8.66 -0.45,-13.53z" fill="#f3efec" id="svg_43" opacity="1"/>
|
||||||
|
<path d="m338.05,183.48c0.36,0.94 0.91,2.34 0.9,3.75c-0.03,11.37 -0.17,22.75 -0.55,34.43c-0.32,-12.36 -0.37,-25.04 -0.35,-38.18z" fill="#f3efec" id="svg_44" opacity="1"/>
|
||||||
|
<path d="m146.38,579.82c-0.14,-0.65 -0.02,-1.65 0.37,-1.78c4.94,-1.56 9.91,-3 15.1,-4.18c-4.89,2.2 -9.98,4.1 -15.47,5.96z" fill="#f3efec" id="svg_45" opacity="1"/>
|
||||||
|
<path d="m777.36,785.96c1.73,-5.2 3.78,-10.55 6.12,-15.94c-1.73,5.24 -3.76,10.52 -6.12,15.94z" fill="#f3efec" id="svg_46" opacity="1"/>
|
||||||
|
<path d="m705.92,771.02c-0.3,4.64 -0.8,9.54 -1.55,14.7c0.28,-4.63 0.81,-9.53 1.55,-14.7z" fill="#f3efec" id="svg_47" opacity="1"/>
|
||||||
|
<path d="m116.65,535.07c-1.37,3.83 -3.06,7.81 -5.08,11.86c1.37,-3.85 3.07,-7.78 5.08,-11.86z" fill="#f3efec" id="svg_48" opacity="1"/>
|
||||||
|
<path d="m785.4,672.88c0.06,-0.83 0.71,-2.62 0.96,-2.57c2.9,0.63 5.75,1.51 8.57,2.43c0.17,0.05 0.06,0.94 0.08,1.76c-3.06,-0.36 -6.13,-1.04 -9.61,-1.62z" fill="#f3efec" id="svg_49" opacity="1"/>
|
||||||
|
<path d="m169.82,515.62c-3.04,1.17 -8.19,0.16 -9.81,-2.02c3.19,0.33 6.4,1.02 9.81,2.02z" fill="#f3efec" id="svg_50" opacity="1"/>
|
||||||
|
<path d="m704.06,215.49c0.25,7.31 0.44,15.08 0.35,23.17c-0.32,-7.37 -0.37,-15.04 -0.35,-23.17z" fill="#f3efec" id="svg_51" opacity="1"/>
|
||||||
|
<path d="m131.71,520.49c0.25,4.81 -3.71,5.31 -7.47,6.46c2.13,-2.13 4.65,-4.25 7.47,-6.46z" fill="#f3efec" id="svg_52" opacity="1"/>
|
||||||
|
<path d="m134.37,580.04c2.91,-0.39 6.19,-0.64 9.55,-0.53c-3,0.46 -6.09,0.56 -9.55,0.53z" fill="#f3efec" id="svg_53" opacity="1"/>
|
||||||
|
<path d="m145.32,514.42c-1.07,4.02 -4.89,3.25 -8.19,3.69c2.48,-1.37 5.15,-2.47 8.19,-3.69z" fill="#f3efec" id="svg_54" opacity="1"/>
|
||||||
|
<path d="m718.15,805.38c2.46,0.36 5.1,1.03 7.8,2.05c-2.5,-0.34 -5.06,-1.04 -7.8,-2.05z" fill="#f3efec" id="svg_55" opacity="1"/>
|
||||||
|
<path d="m832.77,696.67c-3.45,-0.98 -4.06,-3.39 -2.33,-6.67c1.03,2.02 1.69,4.17 2.33,6.67z" fill="#f3efec" id="svg_56" opacity="1"/>
|
||||||
|
<path d="m820.07,721.55c-0.63,2.88 -1.41,6.09 -2.55,9.38c0.57,-2.96 1.48,-6.01 2.55,-9.38z" fill="#f3efec" id="svg_57" opacity="1"/>
|
||||||
|
<path d="m587.93,142.52c-0.24,-4.65 -0.43,-9.76 -0.34,-15.18c0.32,4.7 0.36,9.71 0.34,15.18z" fill="#f3efec" id="svg_58" opacity="1"/>
|
||||||
|
<path d="m272,520c0.19,0 0.37,0 0.84,0c-0.87,2.6 -2.03,5.19 -3.49,7.93c0.58,-2.32 1.47,-4.79 2.51,-7.6c0.14,-0.33 0.14,-0.33 0.14,-0.33z" fill="#f3efec" id="svg_59" opacity="1"/>
|
||||||
|
<path d="m338.05,167.48c0.25,3.99 0.44,8.43 0.35,13.19c-0.32,-4.04 -0.37,-8.39 -0.35,-13.19z" fill="#f3efec" id="svg_60" opacity="1"/>
|
||||||
|
<path d="m587.94,161.52c-0.25,-3.65 -0.43,-7.77 -0.34,-12.18c0.32,3.7 0.36,7.71 0.34,12.18z" fill="#f3efec" id="svg_61" opacity="1"/>
|
||||||
|
<path d="m830.52,688.37c-3.46,0.08 -3.36,-2.35 -2.72,-5.17c1.05,1.46 1.83,3.14 2.72,5.17z" fill="#f3efec" id="svg_62" opacity="1"/>
|
||||||
|
<path d="m152.66,513.14c-1.62,0.66 -3.59,1.24 -5.68,1.46c1.69,-0.75 3.51,-1.15 5.68,-1.46z" fill="#f3efec" id="svg_63" opacity="1"/>
|
||||||
|
<path d="m126.19,578.33c1.77,0.08 3.75,0.47 5.77,1.16c-1.82,-0.09 -3.69,-0.48 -5.77,-1.16z" fill="#f3efec" id="svg_64" opacity="1"/>
|
||||||
|
<path d="m876.91,505.52c-0.25,-3 -0.41,-6.45 -0.3,-10.19c0.31,3.05 0.35,6.4 0.3,10.19z" fill="#f3efec" id="svg_65" opacity="1"/>
|
||||||
|
<path d="m724.67,749.08c-1.18,1.25 -2.7,2.55 -4.6,3.82c1.17,-1.27 2.72,-2.52 4.6,-3.82z" fill="#f3efec" id="svg_66" opacity="1"/>
|
||||||
|
<path d="m118.01,573.36c1.86,0.81 3.87,1.93 5.9,3.42c-1.9,-0.8 -3.83,-1.95 -5.9,-3.42z" fill="#f3efec" id="svg_67" opacity="1"/>
|
||||||
|
<path d="m704.16,788.33c0.79,1.22 1.52,2.79 2.03,4.52c-0.85,-1.28 -1.47,-2.73 -2.03,-4.52z" fill="#f3efec" id="svg_68" opacity="1"/>
|
||||||
|
<path d="m814.55,736.07c-0.34,1.22 -0.96,2.58 -1.92,3.94c0.32,-1.26 0.98,-2.54 1.92,-3.94z" fill="#f3efec" id="svg_69" opacity="1"/>
|
||||||
|
<path d="m338.06,226.47c0.24,2.67 0.42,5.79 0.33,9.21c-0.31,-2.73 -0.35,-5.75 -0.33,-9.21z" fill="#f3efec" id="svg_70" opacity="1"/>
|
||||||
|
<path d="m719.94,225.53c-0.25,-2.67 -0.43,-5.79 -0.34,-9.2c0.31,2.72 0.36,5.74 0.34,9.2z" fill="#f3efec" id="svg_71" opacity="1"/>
|
||||||
|
<path d="m175,419.57c-0.39,0.42 -0.78,0.45 -1.46,0.47c-0.36,-1.8 -0.43,-3.6 -0.41,-5.72c0.68,1.4 1.27,3.12 1.87,5.25z" fill="#f3efec" id="svg_72" opacity="1"/>
|
||||||
|
<path d="m185.24,549.79c-1.55,-1.57 -2.12,-3.14 1.16,-3.79c-0.07,1.19 -0.49,2.39 -1.16,3.79z" fill="#f3efec" id="svg_73" opacity="1"/>
|
||||||
|
<path d="m175.21,564.59c0.54,-1.1 1.37,-2.31 2.54,-3.53c-0.52,1.13 -1.38,2.28 -2.54,3.53z" fill="#f3efec" id="svg_74" opacity="1"/>
|
||||||
|
<path d="m824.91,676.69c-0.93,-0.8 -1.9,-1.93 -2.85,-3.43c0.95,0.79 1.89,1.95 2.85,3.43z" fill="#f3efec" id="svg_75" opacity="1"/>
|
||||||
|
<path d="m190.36,434.06c0.69,-0.62 1.67,-1.28 2.78,-1.6c-0.74,0.74 -1.61,1.15 -2.78,1.6z" fill="#f3efec" id="svg_76" opacity="1"/>
|
||||||
|
<path d="m813.23,662.9c-0.99,-0.49 -2.13,-1.23 -3.27,-2.35c1.03,0.45 2.07,1.27 3.27,2.35z" fill="#f3efec" id="svg_77" opacity="1"/>
|
||||||
|
<path d="m704.08,249.46c0.24,2.02 0.42,4.47 0.36,7.2c-0.31,-2.06 -0.37,-4.41 -0.36,-7.2z" fill="#f3efec" id="svg_78" opacity="1"/>
|
||||||
|
<path d="m769.06,710.46c0.24,2.03 0.42,4.49 0.33,7.23c-0.31,-2.08 -0.35,-4.44 -0.33,-7.23z" fill="#f3efec" id="svg_79" opacity="1"/>
|
||||||
|
<path d="m273.93,517.87c-2.71,-1.02 -1.58,-1.93 0.51,-2.83c0.1,0.82 -0.14,1.7 -0.51,2.83z" fill="#f3efec" id="svg_80" opacity="1"/>
|
||||||
|
<path d="m771.42,793.17c0.46,-0.95 1.22,-2.01 2.34,-3.09c-0.44,0.97 -1.24,1.97 -2.34,3.09z" fill="#f3efec" id="svg_81" opacity="1"/>
|
||||||
|
<path d="m265.34,533.02c0.38,-0.93 1.04,-1.97 2.06,-3.03c-0.35,0.97 -1.06,1.94 -2.06,3.03z" fill="#f3efec" id="svg_82" opacity="1"/>
|
||||||
|
<path d="m711.6,760.86c-0.31,0.96 -0.91,2.05 -1.86,3.16c0.28,-1 0.93,-2.02 1.86,-3.16z" fill="#f3efec" id="svg_83" opacity="1"/>
|
||||||
|
<path d="m769.05,736.44c0.24,1.4 0.41,3.21 0.32,5.28c-0.3,-1.45 -0.34,-3.15 -0.32,-5.28z" fill="#f3efec" id="svg_84" opacity="1"/>
|
||||||
|
<path d="m804.83,680.42c0.95,0.43 2.05,1.14 3.15,2.24c-1,-0.39 -2,-1.17 -3.15,-2.24z" fill="#f3efec" id="svg_85" opacity="1"/>
|
||||||
|
<path d="m819.91,669.7c-0.9,-0.48 -1.88,-1.26 -2.87,-2.42c0.93,0.45 1.85,1.29 2.87,2.42z" fill="#f3efec" id="svg_86" opacity="1"/>
|
||||||
|
<path d="m338.05,158.44c0.24,1.4 0.41,3.21 0.33,5.28c-0.31,-1.45 -0.35,-3.15 -0.33,-5.28z" fill="#f3efec" id="svg_87" opacity="1"/>
|
||||||
|
<path d="m708.99,798.33c0.78,0.3 1.64,0.87 2.32,1.77c-0.87,-0.28 -1.56,-0.89 -2.32,-1.77z" fill="#f3efec" id="svg_88" opacity="1"/>
|
||||||
|
<path d="m814.07,690.31c0.61,0.47 1.26,1.26 1.91,2.41c-0.63,-0.46 -1.25,-1.28 -1.91,-2.41z" fill="#f3efec" id="svg_89" opacity="1"/>
|
||||||
|
<path d="m708.66,765.03c-0.07,0.86 -0.44,1.85 -1.14,2.91c0.06,-0.88 0.45,-1.83 1.14,-2.91z" fill="#f3efec" id="svg_90" opacity="1"/>
|
||||||
|
<path d="m822.03,672.62c-0.63,-0.43 -1.33,-1.16 -2.04,-2.26c0.65,0.41 1.3,1.19 2.04,2.26z" fill="#f3efec" id="svg_91" opacity="1"/>
|
||||||
|
<path d="m706.99,795.34c0.62,0.47 1.29,1.24 1.96,2.39c-0.64,-0.45 -1.27,-1.26 -1.96,-2.39z" fill="#f3efec" id="svg_92" opacity="1"/>
|
||||||
|
<path d="m816.03,665.69c-0.78,-0.3 -1.66,-0.86 -2.35,-1.76c0.87,0.28 1.56,0.88 2.35,1.76z" fill="#f3efec" id="svg_93" opacity="1"/>
|
||||||
|
<path d="m799.94,677.32c0.89,0.13 1.91,0.56 2.99,1.35c-0.91,-0.11 -1.88,-0.58 -2.99,-1.35z" fill="#f3efec" id="svg_94" opacity="1"/>
|
||||||
|
<path d="m267.72,366.15c-0.37,0.5 -1.02,0.93 -1.71,1.09c0.46,-0.57 0.94,-0.87 1.71,-1.09z" fill="#f3efec" id="svg_95" opacity="1"/>
|
||||||
|
<path d="m273.05,367.62c-0.87,-0.04 -1.89,-0.39 -2.98,-1.07c0.9,0.03 1.87,0.4 2.98,1.07z" fill="#f3efec" id="svg_96" opacity="1"/>
|
||||||
|
<path d="m261.07,483.43c0.23,1.08 0.4,2.57 0.31,4.3c-0.29,-1.14 -0.33,-2.51 -0.31,-4.3z" fill="#f3efec" id="svg_97" opacity="1"/>
|
||||||
|
<path d="m165.26,572.64c0.31,-0.65 0.89,-1.32 1.64,-1.74c-0.35,0.74 -0.86,1.23 -1.64,1.74z" fill="#f3efec" id="svg_98" opacity="1"/>
|
||||||
|
<path d="m119.66,531.03c-0.18,0.87 -0.66,1.86 -1.5,2.87c0.15,-0.9 0.68,-1.82 1.5,-2.87z" fill="#f3efec" id="svg_99" opacity="1"/>
|
||||||
|
<path d="m876.93,434.59c-0.23,-0.78 -0.38,-1.96 -0.3,-3.34c0.28,0.84 0.32,1.89 0.3,3.34z" fill="#f3efec" id="svg_100" opacity="1"/>
|
||||||
|
<path d="m713.87,802.96c0.52,0.04 1.25,0.22 2.04,0.76c-0.57,0.03 -1.19,-0.29 -2.04,-0.76z" fill="#f3efec" id="svg_101" opacity="1"/>
|
||||||
|
<path d="m711.72,801.07c0.54,0.09 1.18,0.39 1.64,1.02c-0.63,-0.05 -1.09,-0.44 -1.64,-1.02z" fill="#f3efec" id="svg_102" opacity="1"/>
|
||||||
|
<path d="m761.4,801.06c0.34,-0.55 1,-1.16 2.03,-1.63c-0.31,0.61 -1.01,1.1 -2.03,1.63z" fill="#f3efec" id="svg_103" opacity="1"/>
|
||||||
|
<path d="m194.51,432.62c0.29,-0.49 0.84,-1 1.51,-1.16c-0.34,0.61 -0.79,0.88 -1.51,1.16z" fill="#f3efec" id="svg_104" opacity="1"/>
|
||||||
|
<path d="m876.94,471.59c-0.23,-0.79 -0.39,-1.96 -0.31,-3.35c0.29,0.85 0.33,1.9 0.31,3.35z" fill="#f3efec" id="svg_105" opacity="1"/>
|
||||||
|
<path d="m876.95,490.59c-0.23,-0.78 -0.39,-1.96 -0.31,-3.35c0.28,0.85 0.33,1.9 0.31,3.35z" fill="#f3efec" id="svg_106" opacity="1"/>
|
||||||
|
<path d="m338.04,152.41c0.23,0.78 0.4,1.96 0.32,3.35c-0.29,-0.84 -0.34,-1.9 -0.32,-3.35z" fill="#f3efec" id="svg_107" opacity="1"/>
|
||||||
|
<path d="m818.13,698.27c0.47,0.28 0.89,0.84 1.09,1.56c-0.53,-0.31 -0.84,-0.79 -1.09,-1.56z" fill="#f3efec" id="svg_108" opacity="1"/>
|
||||||
|
<path d="m181.4,556.93c-0.08,-0.54 0.13,-1.18 0.66,-1.81c0.09,0.58 -0.14,1.14 -0.66,1.81z" fill="#f3efec" id="svg_109" opacity="1"/>
|
||||||
|
<path d="m587.95,176.59c-0.23,-0.78 -0.39,-1.96 -0.31,-3.34c0.28,0.84 0.33,1.89 0.31,3.34z" fill="#f3efec" id="svg_110" opacity="1"/>
|
||||||
|
<path d="m819.28,702.26c0.42,0.27 0.81,0.83 1,1.55c-0.48,-0.32 -0.75,-0.8 -1,-1.55z" fill="#f3efec" id="svg_111" opacity="1"/>
|
||||||
|
<path d="m173.73,399.15c0.18,0.49 0.11,1.13 -0.24,1.82c-0.19,-0.52 -0.1,-1.09 0.24,-1.82z" fill="#f3efec" id="svg_112" opacity="1"/>
|
||||||
|
<path d="m587.93,122.61c-0.22,-0.49 -0.37,-1.35 -0.3,-2.39c0.28,0.55 0.32,1.29 0.3,2.39z" fill="#f3efec" id="svg_113" opacity="1"/>
|
||||||
|
<path d="m587.94,168.61c-0.22,-0.49 -0.37,-1.35 -0.3,-2.39c0.28,0.55 0.32,1.29 0.3,2.39z" fill="#f3efec" id="svg_114" opacity="1"/>
|
||||||
|
<path d="m876.93,424.61c-0.22,-0.49 -0.37,-1.35 -0.3,-2.39c0.27,0.55 0.32,1.29 0.3,2.39z" fill="#f3efec" id="svg_115" opacity="1"/>
|
||||||
|
<path d="m202.43,386.39c0.21,0.52 0.2,1.08 0.19,1.64c-0.18,-0.2 -0.37,-0.4 -0.59,-0.89c-0.02,-0.28 0.17,-0.7 0.4,-0.75z" fill="#f3efec" id="svg_116" opacity="1"/>
|
||||||
|
<path d="m240.22,417.77c0.05,-0.37 0.34,-0.69 0.72,-0.83c0.07,0.55 -0.13,0.78 -0.72,0.83z" fill="#f3efec" id="svg_117" opacity="1"/>
|
||||||
|
<path d="m338.06,147.35c0.22,0.24 0.34,0.79 0.26,1.49c-0.27,-0.3 -0.31,-0.74 -0.26,-1.49z" fill="#f3efec" id="svg_118" opacity="1"/>
|
||||||
|
<path d="m876.94,474.74c-0.17,-0.02 -0.27,-0.28 -0.22,-0.63c0.16,-0.08 0.28,0.39 0.22,0.63z" fill="#f3efec" id="svg_119" opacity="1"/>
|
||||||
|
<path d="m769.11,681.26c0.22,-0.06 0.39,0.09 0.5,0.28c0.03,0.04 -0.11,0.18 -0.32,0.36c-0.15,0.07 -0.27,-0.41 -0.18,-0.64z" fill="#f3efec" id="svg_120" opacity="1"/>
|
||||||
|
<path d="m587.92,108.74c-0.17,-0.01 -0.28,-0.26 -0.25,-0.61c0.14,-0.09 0.31,0.37 0.25,0.61z" fill="#f3efec" id="svg_121" opacity="1"/>
|
||||||
|
<path d="m704.06,157.26c0.25,-0.06 0.41,0.1 0.53,0.29c0.02,0.04 -0.12,0.18 -0.34,0.35c-0.2,-0.08 -0.25,-0.25 -0.19,-0.64z" fill="#f3efec" id="svg_122" opacity="1"/>
|
||||||
|
<path d="m261.08,490.26c0.17,0.01 0.28,0.26 0.25,0.61c-0.14,0.09 -0.31,-0.37 -0.25,-0.61z" fill="#f3efec" id="svg_123" opacity="1"/>
|
||||||
|
<path d="m237.66,418.6c-0.11,-0.22 -0.01,-0.52 0.21,-0.64c0.14,0.17 -0.01,0.57 -0.21,0.64z" fill="#f3efec" id="svg_124" opacity="1"/>
|
||||||
|
<path d="m876.92,402.74c-0.17,-0.01 -0.28,-0.26 -0.25,-0.61c0.14,-0.09 0.31,0.37 0.25,0.61z" fill="#f3efec" id="svg_125" opacity="1"/>
|
||||||
|
<path d="m272,520c-0.12,-0.14 -0.25,-0.28 -0.37,-0.43c0.09,0.05 0.17,0.1 0.31,0.29c0.06,0.14 0.06,0.14 0.06,0.14z" fill="#f3efec" id="svg_127" opacity="1"/>
|
||||||
|
<path d="m819.28,743.42c-0.21,-0.12 -0.42,-0.31 -0.62,-0.5c0.18,0.02 0.37,0.03 0.66,0.23c0.1,0.2 -0.02,0.21 -0.04,0.27z" fill="#f3efec" id="svg_128" opacity="1"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 312 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 126 KiB |