Compare commits
64 Commits
9f0ccda99b
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| d9c9ed1187 | |||
| 7a8f4f325c | |||
| f9dd4c3ca4 | |||
| 45b89ebae1 | |||
| 9caa6691fe | |||
| c549ec259c | |||
| 7c651ded4e | |||
| f4bc25b3b1 | |||
| 25768e3665 | |||
| 120f4bedca | |||
| 38e63fdf22 | |||
| 9d27cb6648 | |||
| 39921aa8fc | |||
| 1488962537 | |||
| 67931eeadb | |||
| cce7fa3190 | |||
| 10ff2d32f5 | |||
| ce38975c10 | |||
| f6bff6e389 | |||
| 3de0492631 | |||
| a665fdf2f4 | |||
| 450d559216 | |||
| 1ca88df3ed | |||
| 4df6451dac | |||
| ed8cf87d4e | |||
| f80f071c24 | |||
| 2c924c1e4a | |||
| 2a242e97cc | |||
| ae50908bc9 | |||
| 3ba10dad5f | |||
| 90761b3e13 | |||
| b58d39e707 | |||
| 8cc9fdaa62 | |||
| 3145758747 | |||
| 79ac1b0659 | |||
| e175844d87 | |||
| 8ce54bfb03 | |||
| 3fc5e98069 | |||
| 17a848bbb0 | |||
| b6d68374d3 | |||
| 91d1616dd7 | |||
| 39f683a31e | |||
| 3839a1e6a2 | |||
| c673ae0da5 | |||
| 2db3c12fc6 | |||
| b475fb8953 | |||
| 4ad60c9423 | |||
| de7f6c366e | |||
| ed0f7b614a | |||
| 9065b1c593 | |||
| 03b41649ee | |||
| b38bb4b4c7 | |||
| dece214102 | |||
| 3d69899dbf | |||
| 924e919a65 | |||
| 8c9c4bfdc5 | |||
| 0c9170af65 | |||
| 0374602047 | |||
| 5323ad056e | |||
| 8bb0fa4a8e | |||
| 95dca420a5 | |||
| 307feb711f | |||
| d215e9a33e | |||
| a52746ed0c |
67
.gitea/workflows/deploy.yml
Normal file
@@ -0,0 +1,67 @@
|
||||
name: CI/CD — Build & Deploy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
name: Build & Deploy
|
||||
runs-on: vps-runner
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
# ── Backend ──────────────────────────────────────────────────────────────
|
||||
- name: Install backend deps
|
||||
working-directory: Backend
|
||||
run: npm ci --omit=dev
|
||||
|
||||
- name: Deploy backend
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||
run: |
|
||||
mkdir -p /var/www/clickerz/backend
|
||||
rsync -a --delete --exclude=node_modules --exclude=.env Backend/ /var/www/clickerz/backend/
|
||||
cd /var/www/clickerz/backend && npm ci --omit=dev
|
||||
|
||||
- name: Restart pm2
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||
run: |
|
||||
su - tetardtek-brain -c 'pm2 reload clickerz-backend --update-env'
|
||||
|
||||
# ── Frontend ─────────────────────────────────────────────────────────────
|
||||
- name: Install & build frontend
|
||||
working-directory: Frontend
|
||||
env:
|
||||
VITE_BACKEND_URL: https://clickerz.tetardtek.com
|
||||
VITE_OAUTH_URL: https://superoauth.tetardtek.com
|
||||
VITE_OAUTH_CLIENT_ID: clickerz
|
||||
run: |
|
||||
npm ci
|
||||
npm run build
|
||||
|
||||
- name: Run frontend tests
|
||||
working-directory: Frontend
|
||||
run: npx vitest run
|
||||
|
||||
- name: Deploy frontend
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||
run: |
|
||||
mkdir -p /var/www/clickerz/frontend/dist
|
||||
rsync -a --delete Frontend/dist/ /var/www/clickerz/frontend/dist/
|
||||
echo "✅ Frontend Svelte deployed"
|
||||
|
||||
# ── Smoke test ───────────────────────────────────────────────────────────
|
||||
- name: Smoke test API
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||
run: |
|
||||
sleep 3
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:3520/api/auth/me)
|
||||
if [ "$HTTP_CODE" = "401" ] || [ "$HTTP_CODE" = "200" ]; then
|
||||
echo "✅ API responds OK (HTTP $HTTP_CODE)"
|
||||
else
|
||||
echo "❌ API unreachable (HTTP $HTTP_CODE)"
|
||||
exit 1
|
||||
fi
|
||||
@@ -3,6 +3,7 @@
|
||||
# Application Configuration
|
||||
APP_PORT=3310
|
||||
APP_SECRET=YOUR_APP_SECRET_KEY
|
||||
NODE_ENV=development
|
||||
|
||||
# Database Configuration
|
||||
DB_HOST=localhost
|
||||
@@ -13,3 +14,9 @@ DB_NAME=YOUR_DATABASE_NAME
|
||||
|
||||
# Frontend URL (for CORS configuration)
|
||||
FRONTEND_URL=http://localhost:3000
|
||||
|
||||
# SuperOAuth — service externe d'authentification (introspection, pas de secret JWT)
|
||||
SUPER_OAUTH_URL=https://superoauth.tetardtek.com
|
||||
|
||||
# Cookie signing secret
|
||||
COOKIE_SECRET=
|
||||
|
||||
14
Backend/database/migrations/002_game_saves.sql
Normal file
@@ -0,0 +1,14 @@
|
||||
-- Migration 002 — Game saves with anti-cheat metadata
|
||||
-- Safe: CREATE TABLE IF NOT EXISTS, no data loss
|
||||
-- Run: mysql -u <user> -p clickerz < migrations/002_game_saves.sql
|
||||
|
||||
CREATE TABLE IF NOT EXISTS game_saves (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
user_id INT NOT NULL UNIQUE,
|
||||
game_state JSON NOT NULL,
|
||||
last_save TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
lifetime_tadpoles BIGINT DEFAULT 0,
|
||||
prestige_count INT DEFAULT 0,
|
||||
play_time_seconds INT DEFAULT 0,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
4
Backend/database/migrations/003_save_version.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
-- Migration 003: Add save_version column for Sprint 3 migration system
|
||||
-- Safe to run on existing data — defaults to 1 (Sprint 2 saves)
|
||||
|
||||
ALTER TABLE game_saves ADD COLUMN save_version INT DEFAULT 1 AFTER game_state;
|
||||
@@ -1,3 +1,4 @@
|
||||
DROP TABLE IF EXISTS game_saves;
|
||||
DROP TABLE IF EXISTS users;
|
||||
|
||||
CREATE TABLE users (
|
||||
@@ -10,3 +11,15 @@ CREATE TABLE users (
|
||||
lastname VARCHAR(50) NULL,
|
||||
super_oauth_id VARCHAR(36) NULL UNIQUE
|
||||
);
|
||||
|
||||
CREATE TABLE game_saves (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
user_id INT NOT NULL UNIQUE,
|
||||
game_state JSON NOT NULL,
|
||||
save_version INT DEFAULT 1,
|
||||
last_save TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
lifetime_tadpoles BIGINT DEFAULT 0,
|
||||
prestige_count INT DEFAULT 0,
|
||||
play_time_seconds INT DEFAULT 0,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
34
Backend/package-lock.json
generated
@@ -6,13 +6,13 @@
|
||||
"": {
|
||||
"dependencies": {
|
||||
"bcrypt": "^5.1.1",
|
||||
"cookie-parser": "^1.4.7",
|
||||
"cors": "^2.8.5",
|
||||
"dotenv": "^16.4.1",
|
||||
"express": "^4.18.2",
|
||||
"joi": "^17.13.1",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"mysql2": "^3.9.1",
|
||||
"nodemailer": "^6.9.9"
|
||||
"mysql2": "^3.9.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^3.0.3"
|
||||
@@ -334,6 +334,28 @@
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/cookie-parser": {
|
||||
"version": "1.4.7",
|
||||
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
|
||||
"integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cookie": "0.7.2",
|
||||
"cookie-signature": "1.0.6"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cookie-parser/node_modules/cookie": {
|
||||
"version": "0.7.2",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
|
||||
"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
@@ -1239,14 +1261,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/nodemailer": {
|
||||
"version": "6.9.9",
|
||||
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.9.tgz",
|
||||
"integrity": "sha512-dexTll8zqQoVJEZPwQAKzxxtFn0qTnjdQTchoU6Re9BUUGBJiOy3YMn/0ShTW6J5M0dfQ1NeDeRTTl4oIWgQMA==",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/nodemon": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.3.tgz",
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"bcrypt": "^5.1.1",
|
||||
"cookie-parser": "^1.4.7",
|
||||
"cors": "^2.8.5",
|
||||
"dotenv": "^16.4.1",
|
||||
"express": "^4.18.2",
|
||||
"joi": "^17.13.1",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"mysql2": "^3.9.1",
|
||||
"nodemailer": "^6.9.9"
|
||||
"mysql2": "^3.9.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^3.0.3"
|
||||
|
||||
@@ -1,86 +1,32 @@
|
||||
// Load the express module to create a web application
|
||||
|
||||
const express = require("express");
|
||||
const cors = require("cors");
|
||||
const cookieParser = require("cookie-parser");
|
||||
|
||||
const app = express();
|
||||
|
||||
// Configure it
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
// CORS Handling: Why is the current code commented out and do I need to define specific allowed origins for my project?
|
||||
|
||||
// CORS (Cross-Origin Resource Sharing) is a security mechanism in web browsers that blocks requests from a different domain than the server.
|
||||
// You may find the following magic line in forums:
|
||||
|
||||
// app.use(cors());
|
||||
|
||||
// You should NOT do that: such code uses the `cors` module to allow all origins, which can pose security issues.
|
||||
// For this pedagogical template, the CORS code is commented out to show the need for defining specific allowed origins.
|
||||
|
||||
// To enable CORS and define allowed origins:
|
||||
// 1. Install the `cors` module in the backend directory
|
||||
// 2. Uncomment the line `const cors = require("cors");`
|
||||
// 3. Uncomment the section `app.use(cors({ origin: [...] }))`
|
||||
// 4. Be sure to only have URLs in the array with domains from which you want to allow requests.
|
||||
// For example: ["http://mysite.com", "http://another-domain.com"]
|
||||
|
||||
const cors = require("cors");
|
||||
// Trust reverse proxy (Apache on VPS)
|
||||
app.set("trust proxy", 1);
|
||||
|
||||
// CORS — frontend + SuperOAuth origins
|
||||
app.use(
|
||||
cors({
|
||||
origin: [
|
||||
process.env.FRONTEND_URL,
|
||||
process.env.SUPER_OAUTH_URL,
|
||||
],
|
||||
].filter(Boolean),
|
||||
credentials: true,
|
||||
})
|
||||
);
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
// Request Parsing: Understanding the purpose of this part
|
||||
|
||||
// Request parsing is necessary to extract data sent by the client in an HTTP request.
|
||||
// For example to access the body of a POST request.
|
||||
// The current code contains different parsing options as comments to demonstrate different ways of extracting data.
|
||||
|
||||
// 1. `express.json()`: Parses requests with JSON data.
|
||||
// 2. `express.urlencoded()`: Parses requests with URL-encoded data.
|
||||
// 3. `express.text()`: Parses requests with raw text data.
|
||||
// 4. `express.raw()`: Parses requests with raw binary data.
|
||||
|
||||
// Uncomment one or more of these options depending on the format of the data sent by your client:
|
||||
// Cookie parser with signing
|
||||
const cookieSecret = process.env.COOKIE_SECRET;
|
||||
if (!cookieSecret) {
|
||||
console.error("COOKIE_SECRET manquant — cookies non signés !");
|
||||
}
|
||||
app.use(cookieParser(cookieSecret));
|
||||
|
||||
// JSON body parser
|
||||
app.use(express.json());
|
||||
// app.use(express.urlencoded());
|
||||
// app.use(express.text());
|
||||
// app.use(express.raw());
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
// Cookies: Why and how to use the `cookie-parser` module?
|
||||
|
||||
// Cookies are small pieces of data stored in the client's browser. They are often used to store user-specific information or session data.
|
||||
|
||||
// The `cookie-parser` module allows us to parse and manage cookies in our Express application. It parses the `Cookie` header in incoming requests and populates `req.cookies` with an object containing the cookies.
|
||||
|
||||
// To use `cookie-parser`, make sure it is installed in `backend/package.json` (you may need to install it separately):
|
||||
// npm install cookie-parser
|
||||
|
||||
// Then, require the module and use it as middleware in your Express application:
|
||||
|
||||
// const cookieParser = require("cookie-parser");
|
||||
// app.use(cookieParser());
|
||||
|
||||
// Once `cookie-parser` is set up, you can read and set cookies in your routes.
|
||||
// For example, to set a cookie named "username" with the value "john":
|
||||
// res.cookie("username", "john");
|
||||
|
||||
// To read the value of a cookie named "username":
|
||||
// const username = req.cookies.username;
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
// Import the API routes from the router module
|
||||
const path = require("path");
|
||||
@@ -89,35 +35,7 @@ const router = require("./router");
|
||||
// Mount the API routes under the "/api" endpoint
|
||||
app.use("/api", router);
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
// Production-ready setup: What is it for, and when should I enable it?
|
||||
|
||||
// The code includes commented sections to set up a production environment where the frontend and backend are served from the same server.
|
||||
|
||||
// What it's for:
|
||||
// - Serving frontend static files from the backend, which is useful when building a single-page application with React, Angular, etc.
|
||||
// - Redirecting unhandled requests (e.g., all requests not matching a defined API route) to the frontend's index.html. This allows the frontend to handle client-side routing.
|
||||
|
||||
// When to enable it:
|
||||
// It depends on your project and its structure. If you are developing a single-page application, you'll enable these sections when you are ready to deploy your project to production.
|
||||
|
||||
// To enable production configuration:
|
||||
// 1. Uncomment the lines related to serving static files and redirecting unhandled requests.
|
||||
// 2. Ensure that the `reactBuildPath` points to the correct directory where your frontend's build artifacts are located.
|
||||
|
||||
// const reactBuildPath = `${__dirname}/../../frontend/dist`;
|
||||
|
||||
// // Serve react resources
|
||||
|
||||
// app.use(express.static(reactBuildPath));
|
||||
|
||||
// // Redirect unhandled requests to the react index file
|
||||
|
||||
// app.get("*", (req, res) => {
|
||||
// res.sendFile(`${reactBuildPath}/index.html`);
|
||||
// });
|
||||
|
||||
// Serve frontend static files in production
|
||||
app.use("*", (req, res) => {
|
||||
if (req.originalUrl.includes("assets")) {
|
||||
res.sendFile(
|
||||
@@ -127,26 +45,5 @@ app.use("*", (req, res) => {
|
||||
res.sendFile(path.resolve(__dirname, `../../frontend/dist/index.html`));
|
||||
}
|
||||
});
|
||||
/* ************************************************************************* */
|
||||
|
||||
// Middleware for Error Logging (Uncomment to enable)
|
||||
// Important: Error-handling middleware should be defined last, after other app.use() and routes calls.
|
||||
|
||||
/*
|
||||
// Define a middleware function to log errors
|
||||
const logErrors = (err, req, res, next) => {
|
||||
// Log the error to the console for debugging purposes
|
||||
console.error(err);
|
||||
console.error("on req:", req.method, req.path);
|
||||
|
||||
// Pass the error to the next middleware in the stack
|
||||
next(err);
|
||||
};
|
||||
|
||||
// Mount the logErrors middleware globally
|
||||
app.use(logErrors);
|
||||
*/
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
||||
module.exports = app;
|
||||
|
||||
@@ -1,78 +1,175 @@
|
||||
const jwt = require("jsonwebtoken");
|
||||
const tables = require("../tables");
|
||||
|
||||
const secretKey = process.env.APP_SECRET;
|
||||
const SUPER_OAUTH_URL = process.env.SUPER_OAUTH_URL;
|
||||
const COOKIE_NAME = "session";
|
||||
const REFRESH_COOKIE_NAME = "refresh_token";
|
||||
|
||||
/**
|
||||
* GET /api/auth/callback?code=<token>
|
||||
*
|
||||
* Reçoit le token SuperOAuth depuis le frontend après redirect OAuth.
|
||||
* Valide auprès de SuperOAuth, résout ou crée le user local, retourne un JWT local.
|
||||
*/
|
||||
const callback = async (req, res) => {
|
||||
const { code } = req.query;
|
||||
function cookieOptions(maxAgeDays) {
|
||||
const isProduction = process.env.NODE_ENV === "production";
|
||||
return {
|
||||
httpOnly: true,
|
||||
signed: true,
|
||||
secure: isProduction,
|
||||
sameSite: "lax",
|
||||
maxAge: maxAgeDays * 24 * 60 * 60 * 1000,
|
||||
};
|
||||
}
|
||||
|
||||
if (!code) {
|
||||
return res.status(400).json({ message: "Missing OAuth code." });
|
||||
async function introspectToken(token) {
|
||||
if (!SUPER_OAUTH_URL) {
|
||||
throw new Error("SUPER_OAUTH_URL not configured");
|
||||
}
|
||||
|
||||
const superOAuthUrl = process.env.SUPER_OAUTH_URL;
|
||||
if (!superOAuthUrl) {
|
||||
return res.status(500).json({ message: "Auth service not configured." });
|
||||
const response = await fetch(`${SUPER_OAUTH_URL}/api/v1/auth/token/validate`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ token }),
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (!response.ok || !data.data?.valid || !data.data?.user) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!data.data.user.isActive) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return data.data.user;
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /api/auth/session
|
||||
* Receives { token, refreshToken? } from frontend after PKCE exchange.
|
||||
* Introspects token via SuperOAuth, upserts local user, sets httpOnly cookies.
|
||||
*/
|
||||
const session = async (req, res) => {
|
||||
const { token, refreshToken } = req.body;
|
||||
|
||||
if (!token) {
|
||||
return res.status(400).json({ message: "Missing token." });
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(`${superOAuthUrl}/api/v1/auth/token/validate`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ token: code }),
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (!response.ok || !data.data?.valid || !data.data?.user) {
|
||||
const oauthUser = await introspectToken(token);
|
||||
if (!oauthUser) {
|
||||
return res.status(401).json({ message: "Invalid OAuth token." });
|
||||
}
|
||||
|
||||
if (!data.data.user.isActive) {
|
||||
return res.status(401).json({ message: "Account is disabled." });
|
||||
}
|
||||
|
||||
const { id: superOAuthId, email, nickname } = data.data.user;
|
||||
const { id: superOAuthId, email, nickname } = oauthUser;
|
||||
|
||||
let localUser = await tables.users.getBySuperOAuthId(superOAuthId);
|
||||
|
||||
if (!localUser) {
|
||||
// Premier login OAuth — créer le compte local
|
||||
const insertId = await tables.users.create({
|
||||
nickname: nickname ?? email?.split("@")[0] ?? `user_${Date.now()}`,
|
||||
mail: email ?? `${superOAuthId}@oauth.local`,
|
||||
password: "", // pas de password local — auth via SuperOAuth uniquement
|
||||
password: "",
|
||||
tetardcoin: 1000,
|
||||
});
|
||||
await tables.users.linkSuperOAuth(insertId, superOAuthId);
|
||||
localUser = await tables.users.read(insertId);
|
||||
}
|
||||
|
||||
const token = jwt.sign({ user: localUser.id }, secretKey, { expiresIn: "7d" });
|
||||
// Set session cookie
|
||||
res.cookie(COOKIE_NAME, String(localUser.id), cookieOptions(7));
|
||||
|
||||
return res.status(200).json({
|
||||
message: "Connexion réussie",
|
||||
user: localUser,
|
||||
token,
|
||||
});
|
||||
// Set refresh token cookie if provided
|
||||
if (refreshToken) {
|
||||
res.cookie(REFRESH_COOKIE_NAME, refreshToken, cookieOptions(30));
|
||||
}
|
||||
|
||||
return res.status(200).json({ user: localUser });
|
||||
} catch (err) {
|
||||
console.error("auth/callback — error", err);
|
||||
console.error("auth/session — error", err);
|
||||
return res.status(500).json({ message: "Internal server error." });
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* POST /api/auth/refresh
|
||||
* Reads refresh_token from cookie, exchanges for new access token via SuperOAuth.
|
||||
*/
|
||||
const refresh = async (req, res) => {
|
||||
const refreshToken = req.signedCookies?.[REFRESH_COOKIE_NAME];
|
||||
if (!refreshToken) {
|
||||
return res.status(401).json({ message: "No refresh token." });
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(`${SUPER_OAUTH_URL}/oauth/token`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
body: new URLSearchParams({
|
||||
grant_type: "refresh_token",
|
||||
refresh_token: refreshToken,
|
||||
}).toString(),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
return res.status(401).json({ message: "Refresh token invalid or expired." });
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
if (!data.access_token) {
|
||||
return res.status(401).json({ message: "Refresh failed." });
|
||||
}
|
||||
|
||||
// Validate new token
|
||||
const oauthUser = await introspectToken(data.access_token);
|
||||
if (!oauthUser) {
|
||||
return res.status(401).json({ message: "Refreshed token invalid." });
|
||||
}
|
||||
|
||||
const localUser = await tables.users.getBySuperOAuthId(oauthUser.id);
|
||||
if (!localUser) {
|
||||
return res.status(401).json({ message: "User not found." });
|
||||
}
|
||||
|
||||
// Set new cookies
|
||||
res.cookie(COOKIE_NAME, String(localUser.id), cookieOptions(7));
|
||||
if (data.refresh_token) {
|
||||
res.cookie(REFRESH_COOKIE_NAME, data.refresh_token, cookieOptions(30));
|
||||
}
|
||||
|
||||
return res.status(200).json({ success: true });
|
||||
} catch (err) {
|
||||
console.error("auth/refresh — error", err);
|
||||
return res.status(500).json({ message: "Internal server error." });
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* GET /api/auth/me
|
||||
* Returns current user from session cookie.
|
||||
*/
|
||||
const me = async (req, res) => {
|
||||
const userId = req.signedCookies?.[COOKIE_NAME];
|
||||
if (!userId) {
|
||||
return res.status(401).json({ message: "Not authenticated." });
|
||||
}
|
||||
|
||||
try {
|
||||
const user = await tables.users.read(parseInt(userId, 10));
|
||||
if (!user) {
|
||||
return res.status(401).json({ message: "User not found." });
|
||||
}
|
||||
return res.status(200).json(user);
|
||||
} catch (err) {
|
||||
console.error("auth/me — error", err);
|
||||
return res.status(500).json({ message: "Internal server error." });
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* POST /api/auth/logout
|
||||
* Stateless — le token JWT est géré côté client.
|
||||
* Clears session cookies.
|
||||
*/
|
||||
const logout = (_req, res) => {
|
||||
res.clearCookie(COOKIE_NAME);
|
||||
res.clearCookie(REFRESH_COOKIE_NAME);
|
||||
return res.status(200).json({ message: "Déconnexion réussie." });
|
||||
};
|
||||
|
||||
module.exports = { callback, logout };
|
||||
module.exports = { session, refresh, me, logout };
|
||||
|
||||
145
Backend/src/controllers/saveControllers.js
Normal file
@@ -0,0 +1,145 @@
|
||||
const tables = require("../tables");
|
||||
const { migrateSave } = require("../services/migrateSave");
|
||||
|
||||
// --- Anti-cheat validation ---
|
||||
|
||||
// Max production théorique par seconde (5 generators maxés + click humain réaliste)
|
||||
// Tier 5 = 150/s × 200 owned = 30 000/s (extreme case)
|
||||
// Tous tiers cumulés extreme ≈ 50 000/s
|
||||
// × prestige multiplier max réaliste (×10) = 500 000/s
|
||||
// × evolution tree multiplier (×1.5) = 750 000/s
|
||||
// Marge ×1.1 appliquée dans la validation
|
||||
const MAX_PRODUCTION_PER_SECOND = 750_000;
|
||||
const CHEAT_MARGIN = 1.1;
|
||||
|
||||
function validateGameState(gameState, previousSave) {
|
||||
// Vérification structurelle basique
|
||||
if (!gameState || typeof gameState !== "object") {
|
||||
return { valid: false, reason: "Invalid game state format" };
|
||||
}
|
||||
|
||||
if (typeof gameState.resources !== "number" || gameState.resources < 0) {
|
||||
return { valid: false, reason: "Invalid resources value" };
|
||||
}
|
||||
|
||||
if (!Array.isArray(gameState.generators)) {
|
||||
return { valid: false, reason: "Invalid generators" };
|
||||
}
|
||||
|
||||
// Si pas de save précédente, c'est la première — accepter
|
||||
if (!previousSave) {
|
||||
return { valid: true };
|
||||
}
|
||||
|
||||
// Calcul du temps écoulé depuis le dernier save
|
||||
const lastSaveTime = new Date(previousSave.last_save).getTime();
|
||||
const now = Date.now();
|
||||
const elapsedSeconds = Math.max((now - lastSaveTime) / 1000, 0);
|
||||
|
||||
// Ressources max possibles = production max × temps × marge
|
||||
const maxPossibleResources =
|
||||
MAX_PRODUCTION_PER_SECOND * elapsedSeconds * CHEAT_MARGIN;
|
||||
|
||||
// Comparer les ressources actuelles avec le maximum théorique
|
||||
// On compare le delta (gain depuis dernier save)
|
||||
const previousState = previousSave.game_state;
|
||||
const previousResources =
|
||||
typeof previousState === "object"
|
||||
? previousState.resources ?? 0
|
||||
: 0;
|
||||
|
||||
const resourceDelta = gameState.resources - previousResources;
|
||||
|
||||
if (resourceDelta > maxPossibleResources && resourceDelta > 0) {
|
||||
return {
|
||||
valid: false,
|
||||
reason: `Resource gain (${Math.floor(resourceDelta)}) exceeds maximum possible (${Math.floor(maxPossibleResources)}) in ${Math.floor(elapsedSeconds)}s`,
|
||||
};
|
||||
}
|
||||
|
||||
return { valid: true };
|
||||
}
|
||||
|
||||
// --- Controllers ---
|
||||
|
||||
/**
|
||||
* GET /api/save
|
||||
* Charge la save du joueur connecté.
|
||||
*/
|
||||
const load = async (req, res) => {
|
||||
try {
|
||||
const userId = req.user;
|
||||
const save = await tables.game_saves.getByUserId(userId);
|
||||
|
||||
if (!save) {
|
||||
return res.status(200).json({ gameState: null });
|
||||
}
|
||||
|
||||
// game_state est stocké en JSON — MySQL le retourne comme objet si type JSON
|
||||
const rawState =
|
||||
typeof save.game_state === "string"
|
||||
? JSON.parse(save.game_state)
|
||||
: save.game_state;
|
||||
|
||||
// Migrate on load — lazy migration, never touch DB rows directly
|
||||
const gameState = migrateSave(rawState);
|
||||
|
||||
return res.status(200).json({
|
||||
gameState,
|
||||
lastSave: save.last_save,
|
||||
lifetimeTadpoles: save.lifetime_tadpoles,
|
||||
prestigeCount: save.prestige_count,
|
||||
playTimeSeconds: save.play_time_seconds,
|
||||
});
|
||||
} catch (err) {
|
||||
console.error("save/load error:", err);
|
||||
return res.status(500).json({ message: "Failed to load save." });
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* POST /api/save
|
||||
* Sauvegarde le game state du joueur connecté.
|
||||
* Anti-cheat : valide le delta de ressources vs temps écoulé.
|
||||
*/
|
||||
const save = async (req, res) => {
|
||||
try {
|
||||
const userId = req.user;
|
||||
const { gameState, playTimeSeconds } = req.body;
|
||||
|
||||
if (!gameState) {
|
||||
return res.status(400).json({ message: "gameState required." });
|
||||
}
|
||||
|
||||
// Récupérer la save précédente pour validation
|
||||
const previousSave = await tables.game_saves.getByUserId(userId);
|
||||
|
||||
// Valider l'état
|
||||
const validation = validateGameState(gameState, previousSave);
|
||||
if (!validation.valid) {
|
||||
console.warn(
|
||||
`Anti-cheat: user ${userId} rejected — ${validation.reason}`
|
||||
);
|
||||
return res.status(422).json({
|
||||
message: "Save rejected: anomaly detected.",
|
||||
reason: validation.reason,
|
||||
});
|
||||
}
|
||||
|
||||
// Extraire les métadonnées pour la table
|
||||
const metadata = {
|
||||
lifetimeTadpoles: gameState.lifetimeTadpoles ?? 0,
|
||||
prestigeCount: gameState.prestigeCount ?? 0,
|
||||
playTimeSeconds: playTimeSeconds ?? 0,
|
||||
};
|
||||
|
||||
await tables.game_saves.upsert(userId, gameState, metadata);
|
||||
|
||||
return res.status(200).json({ message: "Save successful.", lastSave: new Date().toISOString() });
|
||||
} catch (err) {
|
||||
console.error("save/save error:", err);
|
||||
return res.status(500).json({ message: "Failed to save." });
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = { load, save };
|
||||
@@ -3,11 +3,9 @@ require("dotenv").config();
|
||||
const bcrypt = require("bcrypt");
|
||||
const jwt = require("jsonwebtoken");
|
||||
const Joi = require("joi");
|
||||
const nodemailer = require("nodemailer");
|
||||
const tables = require("../tables");
|
||||
|
||||
const secretKey = process.env.APP_SECRET;
|
||||
const resetTokenSecret = process.env.RESET_TOKEN_SECRET;
|
||||
const saltRounds = 10;
|
||||
|
||||
const passwordSchema = Joi.string()
|
||||
@@ -36,126 +34,13 @@ const validateEmail = async (email) => {
|
||||
|
||||
const validateUniqueNickname = async (nickname) => {
|
||||
await nicknameSchema.validateAsync(nickname);
|
||||
const existingUserByNickname = await tables.users.getByNickname(
|
||||
nickname
|
||||
);
|
||||
const existingUserByNickname = await tables.users.getByNickname(nickname);
|
||||
|
||||
if (existingUserByNickname) {
|
||||
throw new Error("Ce pseudo est déjà pris.");
|
||||
}
|
||||
};
|
||||
|
||||
const transporter = nodemailer.createTransport({
|
||||
service: "gmail",
|
||||
auth: {
|
||||
user: process.env.EMAIL_USER,
|
||||
pass: process.env.EMAIL_PASS,
|
||||
},
|
||||
});
|
||||
|
||||
const generateResetToken = (user) => {
|
||||
const resetToken = jwt.sign({ user: user.id }, resetTokenSecret, {
|
||||
expiresIn: "1h",
|
||||
});
|
||||
|
||||
const base64Token = Buffer.from(resetToken).toString("base64");
|
||||
|
||||
return base64Token;
|
||||
};
|
||||
|
||||
const sendPasswordResetEmail = async (user, resetToken) => {
|
||||
const resetLink = `${process.env.FRONTEND_URL}/reset-password/${resetToken}`;
|
||||
const mailOptions = {
|
||||
from: "INSERT_YOUR_EMAIL_ADDRESS_HERE",
|
||||
to: user.mail,
|
||||
subject: "Réinitialisation de mot de passe",
|
||||
html: `
|
||||
<p>Bonjour ${user.firstname},</p>
|
||||
<p>Vous avez demandé une réinitialisation de mot de passe pour votre compte.</p>
|
||||
<p>Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe :</p>
|
||||
<a href="${resetLink}">Réinitialiser le mot de passe</a>
|
||||
<p>Si vous n'avez pas demandé cette réinitialisation, veuillez ignorer ce message.</p>
|
||||
<p>Merci,</p>
|
||||
`,
|
||||
};
|
||||
|
||||
await transporter.sendMail(mailOptions);
|
||||
};
|
||||
|
||||
const forgottenPassword = async (req, res) => {
|
||||
const { mail } = req.body;
|
||||
|
||||
try {
|
||||
const user = await tables.users.getByMail(mail);
|
||||
if (!user) {
|
||||
return res.status(404).json({ message: "Utilisateur non trouvé" });
|
||||
}
|
||||
|
||||
const resetToken = generateResetToken(user);
|
||||
|
||||
await sendPasswordResetEmail(user, resetToken);
|
||||
|
||||
return res.status(200).json({
|
||||
message: "Envoi d'un e-mail de réinitialisation du mot de passe",
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(
|
||||
"Erreur dans l'envoi de l'e-mail de réinitialisation du mot de passe:",
|
||||
error
|
||||
);
|
||||
return res.status(500).json({
|
||||
message:
|
||||
"Erreur dans l'envoi de l'e-mail de réinitialisation du mot de passe",
|
||||
});
|
||||
}
|
||||
};
|
||||
const resetPassword = async (req, res) => {
|
||||
const { password } = req.body;
|
||||
|
||||
const resetToken = decodeURIComponent(req.params.token);
|
||||
|
||||
try {
|
||||
const decodedToken = jwt.verify(resetToken, resetTokenSecret);
|
||||
|
||||
const user = await tables.users.read(decodedToken.user);
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({ message: "Utilisateur non trouvé" });
|
||||
}
|
||||
|
||||
if (!password) {
|
||||
return res.status(400).json({ message: "Nouveau mot de passe manquant" });
|
||||
}
|
||||
|
||||
const { error } = Joi.string()
|
||||
.min(8)
|
||||
.regex(/[A-Z]/)
|
||||
.message("Le mot de passe doit contenir au moins une majuscule.")
|
||||
.regex(/\d/)
|
||||
.message("Le mot de passe doit contenir au moins un chiffre.")
|
||||
.regex(/[!@#$%^&*()_+{}[\]:;<>,.?~\\/-]/)
|
||||
.message("Le mot de passe doit contenir au moins un caractère spécial.")
|
||||
.validate(password);
|
||||
|
||||
if (error) {
|
||||
return res.status(400).json({ message: error.details[0].message });
|
||||
}
|
||||
|
||||
const hashedPassword = await bcrypt.hash(password, saltRounds);
|
||||
await tables.users.edit(user.id, { password: hashedPassword });
|
||||
|
||||
return res
|
||||
.status(200)
|
||||
.json({ message: "Réinitialisation du mot de passe réussie" });
|
||||
} catch (error) {
|
||||
console.error("Erreur de réinitialisation du mot de passe:", error);
|
||||
return res.status(500).json({
|
||||
message: "Erreur de réinitialisation du mot de passe",
|
||||
error,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const login = async (req, res) => {
|
||||
const { mail, password } = req.body;
|
||||
|
||||
@@ -378,7 +263,7 @@ const destroy = async (req, res) => {
|
||||
});
|
||||
}
|
||||
|
||||
const user = await tables.users.getById(userId);
|
||||
const user = await tables.users.read(userId);
|
||||
|
||||
const isCurrentPasswordCorrect = await bcrypt.compare(
|
||||
currentPassword,
|
||||
@@ -438,7 +323,5 @@ module.exports = {
|
||||
add,
|
||||
destroy,
|
||||
login,
|
||||
forgottenPassword,
|
||||
resetPassword,
|
||||
updateCoins,
|
||||
};
|
||||
|
||||
@@ -1,23 +1,26 @@
|
||||
const jwt = require("jsonwebtoken");
|
||||
const tables = require("../tables");
|
||||
|
||||
const secretKey = process.env.APP_SECRET;
|
||||
/**
|
||||
* Cookie-based auth middleware.
|
||||
* Reads signed session cookie → resolves local user → sets req.user = user.id
|
||||
*/
|
||||
const verifyToken = async (req, res, next) => {
|
||||
const userId = req.signedCookies?.session;
|
||||
|
||||
const verifyToken = (req, res, next) => {
|
||||
const token = req.header("x-auth-token");
|
||||
|
||||
if (!token) {
|
||||
return res
|
||||
.status(401)
|
||||
.json({ message: "Access denied. No token provided." });
|
||||
if (!userId) {
|
||||
return res.status(401).json({ message: "Access denied. No session." });
|
||||
}
|
||||
|
||||
try {
|
||||
const decoded = jwt.verify(token, secretKey);
|
||||
req.user = decoded.user;
|
||||
next();
|
||||
return null;
|
||||
} catch (error) {
|
||||
return res.status(401).json({ message: "Invalid token." });
|
||||
const user = await tables.users.read(parseInt(userId, 10));
|
||||
if (!user) {
|
||||
return res.status(401).json({ message: "User not found." });
|
||||
}
|
||||
req.user = user.id;
|
||||
return next();
|
||||
} catch (err) {
|
||||
console.error("verifyToken — error", err);
|
||||
return res.status(500).json({ message: "Internal server error." });
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
45
Backend/src/models/GameSaveManager.js
Normal file
@@ -0,0 +1,45 @@
|
||||
const AbstractManager = require("./AbstractManager");
|
||||
|
||||
class GameSaveManager extends AbstractManager {
|
||||
constructor() {
|
||||
super({ table: "game_saves" });
|
||||
}
|
||||
|
||||
async getByUserId(userId) {
|
||||
const [rows] = await this.database.query(
|
||||
`SELECT * FROM ${this.table} WHERE user_id = ?`,
|
||||
[userId]
|
||||
);
|
||||
return rows[0] ?? null;
|
||||
}
|
||||
|
||||
async upsert(userId, gameState, metadata) {
|
||||
const { lifetimeTadpoles, prestigeCount, playTimeSeconds } = metadata;
|
||||
const saveVersion = gameState.saveVersion ?? 1;
|
||||
const gameStateJson = JSON.stringify(gameState);
|
||||
|
||||
const [result] = await this.database.query(
|
||||
`INSERT INTO ${this.table} (user_id, game_state, save_version, lifetime_tadpoles, prestige_count, play_time_seconds)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
game_state = VALUES(game_state),
|
||||
save_version = VALUES(save_version),
|
||||
lifetime_tadpoles = VALUES(lifetime_tadpoles),
|
||||
prestige_count = VALUES(prestige_count),
|
||||
play_time_seconds = VALUES(play_time_seconds),
|
||||
last_save = CURRENT_TIMESTAMP`,
|
||||
[userId, gameStateJson, saveVersion, lifetimeTadpoles, prestigeCount, playTimeSeconds]
|
||||
);
|
||||
|
||||
return result.affectedRows;
|
||||
}
|
||||
|
||||
async delete(userId) {
|
||||
await this.database.query(
|
||||
`DELETE FROM ${this.table} WHERE user_id = ?`,
|
||||
[userId]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = GameSaveManager;
|
||||
@@ -60,6 +60,14 @@ class UserManager extends AbstractManager {
|
||||
return rows[0];
|
||||
}
|
||||
|
||||
async getByNickname(nickname) {
|
||||
const [rows] = await this.database.query(
|
||||
`SELECT * FROM ${this.table} WHERE nickname = ?`,
|
||||
[nickname]
|
||||
);
|
||||
return rows[0] ?? null;
|
||||
}
|
||||
|
||||
async getByMail(mail) {
|
||||
const [rows] = await this.database.query(
|
||||
`SELECT * FROM ${this.table} WHERE mail = ?`,
|
||||
|
||||
@@ -2,17 +2,13 @@ const express = require("express");
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
/* ************************************************************************* */
|
||||
// Define Your API Routes Here
|
||||
/* ************************************************************************* */
|
||||
|
||||
// Import Controllers
|
||||
const userControllers = require("./controllers/userControllers");
|
||||
const authControllers = require("./controllers/authControllers");
|
||||
const saveControllers = require("./controllers/saveControllers");
|
||||
const verifyToken = require("./middlewares/verifyToken");
|
||||
const verifyOAuth = require("./middlewares/verifyOAuth");
|
||||
|
||||
// Vérifie que le token appartient au même utilisateur que :id
|
||||
// Vérifie que le cookie session appartient au même utilisateur que :id
|
||||
const verifySelf = (req, res, next) => {
|
||||
if (String(req.user) !== String(req.params.id)) {
|
||||
return res.status(403).json({ message: "Forbidden." });
|
||||
@@ -20,11 +16,13 @@ const verifySelf = (req, res, next) => {
|
||||
return next();
|
||||
};
|
||||
|
||||
// Auth SuperOAuth
|
||||
router.get("/auth/callback", authControllers.callback);
|
||||
// Auth — PKCE flow (cookie-based)
|
||||
router.post("/auth/session", authControllers.session);
|
||||
router.post("/auth/refresh", authControllers.refresh);
|
||||
router.get("/auth/me", authControllers.me);
|
||||
router.post("/auth/logout", authControllers.logout);
|
||||
|
||||
// User management (auth locale — conservée pendant migration)
|
||||
// User management
|
||||
router.get("/users", verifyToken, userControllers.browse);
|
||||
router.get("/users/:id", verifyToken, verifySelf, userControllers.read);
|
||||
router.get("/users/:id/field", verifyToken, verifySelf, userControllers.read);
|
||||
@@ -33,10 +31,11 @@ router.post("/users", userControllers.add);
|
||||
router.delete("/users/:id", verifyToken, verifySelf, userControllers.destroy);
|
||||
router.post("/login", userControllers.login);
|
||||
|
||||
// Sync game state — SuperOAuth uniquement
|
||||
router.patch("/users/:id/coins", verifyOAuth, verifySelf, userControllers.updateCoins);
|
||||
// Sync game state — cookie auth (was verifyOAuth, now same as verifyToken)
|
||||
router.patch("/users/:id/coins", verifyToken, verifySelf, userControllers.updateCoins);
|
||||
|
||||
|
||||
/* ************************************************************************* */
|
||||
// Game saves — cookie auth
|
||||
router.get("/save", verifyToken, saveControllers.load);
|
||||
router.post("/save", verifyToken, saveControllers.save);
|
||||
|
||||
module.exports = router;
|
||||
|
||||
65
Backend/src/services/migrateSave.js
Normal file
@@ -0,0 +1,65 @@
|
||||
// migrateSave.js — Backend save migration (mirrors Frontend/src/core/migrateSave.ts)
|
||||
// Applied on load — lazy migration, never touch DB directly.
|
||||
|
||||
const CURRENT_SAVE_VERSION = 2;
|
||||
|
||||
// Default evolution tree (Sprint 2 — 18 nodes)
|
||||
// Used to merge new nodes into old saves
|
||||
const DEFAULT_TREE_IDS = [
|
||||
"ponte_amelioree", "double_ponte", "ponte_frenetique", "auto_ponte",
|
||||
"ponte_critique", "maitre_pondeur",
|
||||
"instinct_gregaire", "symbiose_algale", "courant_profond", "maree_haute",
|
||||
"ecosysteme_mature", "marais_eternel",
|
||||
"memoire_genetique", "adn_renforce", "eveil_rapide", "resilience",
|
||||
"heritage", "transcendance",
|
||||
];
|
||||
|
||||
/**
|
||||
* Migrate a raw game state to the current version.
|
||||
* Backend only needs structural migration for anti-cheat validation —
|
||||
* the full tree/generator merge happens on the frontend.
|
||||
*/
|
||||
function migrateSave(raw) {
|
||||
if (!raw || typeof raw !== "object") return raw;
|
||||
|
||||
const version = typeof raw.saveVersion === "number" ? raw.saveVersion : 1;
|
||||
let state = { ...raw };
|
||||
|
||||
if (version < 2) {
|
||||
state = migrateV1toV2(state);
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
function migrateV1toV2(state) {
|
||||
state.saveVersion = 2;
|
||||
|
||||
// RunStats
|
||||
if (!state.runStats) {
|
||||
state.runStats = {
|
||||
startedAt: state.lastTick || Date.now(),
|
||||
tadpolesProduced: 0,
|
||||
bestRun: null,
|
||||
};
|
||||
}
|
||||
|
||||
// Tree reset fields
|
||||
if (typeof state.freeResetAvailable !== "boolean") {
|
||||
state.freeResetAvailable = true;
|
||||
}
|
||||
if (typeof state.extraResetsUsed !== "number") {
|
||||
state.extraResetsUsed = 0;
|
||||
}
|
||||
|
||||
// Backfill cosmetics
|
||||
if (!state.lastOnline) state.lastOnline = state.lastTick;
|
||||
if (!Array.isArray(state.cosmeticInventory)) state.cosmeticInventory = [];
|
||||
if (!state.cosmeticEquipped || typeof state.cosmeticEquipped !== "object") {
|
||||
state.cosmeticEquipped = {};
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
module.exports = { migrateSave, CURRENT_SAVE_VERSION };
|
||||
@@ -4,10 +4,11 @@
|
||||
|
||||
// Import the manager modules responsible for handling data operations on the tables
|
||||
const UserManager = require("./models/UserManager");
|
||||
const GameSaveManager = require("./models/GameSaveManager");
|
||||
|
||||
const managers = [
|
||||
UserManager,
|
||||
// Add other managers here
|
||||
GameSaveManager,
|
||||
];
|
||||
|
||||
// Create an empty object to hold data managers for different tables
|
||||
|
||||
8
Frontend/.env.example
Executable file
@@ -0,0 +1,8 @@
|
||||
# .env.sample - Sample Environment Variables for Frontend (Vite)
|
||||
|
||||
# Backend API URL
|
||||
VITE_BACKEND_URL=http://localhost:3310
|
||||
|
||||
# SuperOAuth PKCE — OAuth provider
|
||||
VITE_OAUTH_URL=https://superoauth.tetardtek.com
|
||||
VITE_OAUTH_CLIENT_ID=clickerz
|
||||
@@ -1,7 +0,0 @@
|
||||
# .env.sample - Sample Environment Variables for Frontend (Vite)
|
||||
|
||||
# Backend API URL (call it in React with import.meta.env.VITE_BACKEND_URL)
|
||||
VITE_BACKEND_URL=http://localhost:3310
|
||||
|
||||
# Other Environment Variables (if needed)
|
||||
# VITE_OTHER_VARIABLE=value
|
||||
@@ -1,20 +0,0 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
env: { browser: true, es2020: true },
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:react/recommended',
|
||||
'plugin:react/jsx-runtime',
|
||||
'plugin:react-hooks/recommended',
|
||||
],
|
||||
ignorePatterns: ['dist', '.eslintrc.cjs'],
|
||||
parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
|
||||
settings: { react: { version: '18.2' } },
|
||||
plugins: ['react-refresh'],
|
||||
rules: {
|
||||
'react-refresh/only-export-components': [
|
||||
'warn',
|
||||
{ allowConstantExport: true },
|
||||
],
|
||||
},
|
||||
}
|
||||
43
Frontend/.gitignore
vendored
Executable file → Normal file
@@ -1,25 +1,24 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
.env
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
# Output
|
||||
.output
|
||||
.vercel
|
||||
.netlify
|
||||
.wrangler
|
||||
/.svelte-kit
|
||||
/build
|
||||
/dist
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
Thumbs.db
|
||||
|
||||
# Env
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
!.env.test
|
||||
|
||||
# Vite
|
||||
vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
||||
|
||||
1
Frontend/.npmrc
Normal file
@@ -0,0 +1 @@
|
||||
engine-strict=true
|
||||
1
Frontend/.nvmrc
Normal file
@@ -0,0 +1 @@
|
||||
22
|
||||
3
Frontend/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"recommendations": ["svelte.svelte-vscode"]
|
||||
}
|
||||
70
Frontend/README.md
Executable file → Normal file
@@ -1,50 +1,42 @@
|
||||
<!--Head-->
|
||||
# sv
|
||||
|
||||
<h3>Xmass Clicker</h3>
|
||||
<br>
|
||||
Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli).
|
||||
|
||||
### 📄 About :
|
||||
<br> This site is a prototype exercise designed and developed by TrueQuiLeaks Team as part of their Web and Mobile Developer training at the Wild Code School on the Remote campus from September 2023.
|
||||
## Creating a project
|
||||
|
||||
<br>
|
||||
<br>
|
||||
If you're seeing this, you've probably already done this step. Congrats!
|
||||
|
||||
|
||||
### ✏️ Languages :
|
||||
This site is developed with the following languages : <br>
|
||||
<p dir="auto">
|
||||
<a href="https://www.w3.org/html/" target="_blank" rel="noreferrer">
|
||||
<img src="https://raw.githubusercontent.com/devicons/devicon/master/icons/html5/html5-original-wordmark.svg" alt="html5" width="40" height="40"/></a>
|
||||
|
||||
<a href="https://www.w3schools.com/css/" target="_blank" rel="noreferrer">
|
||||
<img src="https://raw.githubusercontent.com/devicons/devicon/master/icons/css3/css3-original-wordmark.svg" alt="css3" width="40" height="40"/></a>
|
||||
```sh
|
||||
# create a new project
|
||||
npx sv create my-app
|
||||
```
|
||||
|
||||
<a href="https://sass-lang.com" target="_blank" rel="noreferrer">
|
||||
<img src="https://raw.githubusercontent.com/devicons/devicon/master/icons/sass/sass-original.svg" alt="sass" width="40" height="40"/></a>
|
||||
To recreate this project with the same configuration:
|
||||
|
||||
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank" rel="noreferrer">
|
||||
<img src="https://raw.githubusercontent.com/devicons/devicon/master/icons/javascript/javascript-original.svg" alt="javascript" width="40" height="40"/></a>
|
||||
```sh
|
||||
# recreate this project
|
||||
npx sv@0.13.0 create --template minimal --types ts --no-install Frontend-svelte
|
||||
```
|
||||
|
||||
<a href="https://reactjs.org/" target="_blank" rel="noreferrer">
|
||||
<img src="https://raw.githubusercontent.com/devicons/devicon/master/icons/react/react-original-wordmark.svg" alt="react" width="40" height="40"/></a>
|
||||
</p>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
### 🎖️Achievements :
|
||||
- **W3C:** Our website has passed W3C certification.
|
||||
- **Accessibility:** bookofwilder.fr to pass the LightHouse PC and Mobile test with a result of 100%.
|
||||
- **SEO:** This was one of our personal validation criteria and after the LightHouse tests (PC and Mobile), our site fulfilled it 100%.
|
||||
- **Speed:** Our site sets speed records with a 100% on the LightHouse PC test and 100% on Mobile. Improvements are underway to optimize this latter result.
|
||||
## Developing
|
||||
|
||||
<br>
|
||||
<br>
|
||||
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
|
||||
|
||||
### Credits :
|
||||
```sh
|
||||
npm run dev
|
||||
|
||||
This site is a prototype exercise designed and developed by: Alix C, Sebastien L, Baptiste S, Kévin T and Nicolas DF as part of their Web and Mobile Developer training at the Wild Code School on the Remote campus from September 2023 .
|
||||
# or start the server and open the app in a new browser tab
|
||||
npm run dev -- --open
|
||||
```
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
## Building
|
||||
|
||||
To create a production version of your app:
|
||||
|
||||
```sh
|
||||
npm run build
|
||||
```
|
||||
|
||||
You can preview the production build with `npm run preview`.
|
||||
|
||||
> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
<!doctype html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/svg+xml"
|
||||
href="./svg/logo.svg"
|
||||
/>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta
|
||||
name="description"
|
||||
content="Xmass Click votre nouveau Clicker préféré !"
|
||||
/>
|
||||
<meta name="robots" content="index, follow" />
|
||||
<meta
|
||||
name="googlebot"
|
||||
content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"
|
||||
/>
|
||||
<meta
|
||||
name="bingbot"
|
||||
content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"
|
||||
/>
|
||||
<link rel="canonical" href="https://xmass.click" />
|
||||
<meta property="og:url" content="https://xmass.click" />
|
||||
<meta property="og:site_name" content="Xmass Click" />
|
||||
<meta property="og:locale" content="fr_FR" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="Xmass Click" />
|
||||
<meta
|
||||
property="og:description"
|
||||
content="Xmass Click votre nouveau Clicker préféré !"
|
||||
/>
|
||||
<meta
|
||||
property="og:image"
|
||||
content="https://xmass.click/webp/share-cover.webp"
|
||||
/>
|
||||
<meta
|
||||
property="og:image:secure_url"
|
||||
content="https://xmass.click/webp/share-cover.webp"
|
||||
/>
|
||||
<meta property="og:image:width" content="584" />
|
||||
<meta property="og:image:height" content="384" />
|
||||
<meta property="fb:pages" content />
|
||||
<meta property="fb:admins" content />
|
||||
<meta property="fb:app_id" content />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content />
|
||||
<meta name="twitter:creator" content />
|
||||
<meta name="twitter:title" content="Xmass Click" />
|
||||
<meta
|
||||
name="twitter:description"
|
||||
content="Xmass Click votre nouveau Clicker préféré !"
|
||||
/>
|
||||
<meta
|
||||
name="twitter:image"
|
||||
content="https://xmass.click/webp/share-cover.webp"
|
||||
/>
|
||||
<title>Name</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.jsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
8756
Frontend/package-lock.json
generated
Executable file → Normal file
56
Frontend/package.json
Executable file → Normal file
@@ -1,33 +1,27 @@
|
||||
{
|
||||
"name": "template",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
|
||||
"preview": "vite preview",
|
||||
"test": "vitest run"
|
||||
},
|
||||
"dependencies": {
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-lottie-player": "^1.5.5",
|
||||
"react-router-dom": "^6.19.0",
|
||||
"sass": "^1.69.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^18.3.28",
|
||||
"@types/react-dom": "^18.2.15",
|
||||
"@vitejs/plugin-react": "^4.2.0",
|
||||
"eslint": "^8.53.0",
|
||||
"eslint-plugin-react": "^7.33.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.4",
|
||||
"typescript": "^5.9.3",
|
||||
"vite": "^5.0.0",
|
||||
"vitest": "^4.1.0"
|
||||
}
|
||||
"name": "clickerz-frontend",
|
||||
"private": true,
|
||||
"version": "0.0.1",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"prepare": "svelte-kit sync || echo ''",
|
||||
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
||||
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
||||
"test": "vitest run"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sveltejs/adapter-static": "^3.0.10",
|
||||
"@sveltejs/kit": "^2.50.2",
|
||||
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
||||
"@tailwindcss/vite": "^4.2.2",
|
||||
"svelte": "^5.54.0",
|
||||
"svelte-check": "^4.4.2",
|
||||
"tailwindcss": "^4.2.2",
|
||||
"typescript": "^5.9.3",
|
||||
"vite": "^7.3.1",
|
||||
"vitest": "^4.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 56 KiB |
@@ -1,4 +0,0 @@
|
||||
<svg width="55" height="39" viewBox="0 0 55 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="1" y="1" width="53" height="37" rx="7" stroke="#202020" stroke-width="2" stroke-miterlimit="1.78829" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="20 20"/>
|
||||
<path d="M8.18 27V13.06H11.32V18.36H16.74V13.06H19.88V27H16.74V21.24H11.32V27H8.18ZM28.0425 27.36C26.2158 27.36 24.8358 26.9133 23.9025 26.02C22.9825 25.1267 22.5225 23.7733 22.5225 21.96V13.06H25.6625V21.6C25.6625 22.24 25.7158 22.7733 25.8225 23.2C25.9425 23.6267 26.1758 23.9467 26.5225 24.16C26.8692 24.3733 27.3758 24.48 28.0425 24.48C28.7092 24.48 29.2092 24.3733 29.5425 24.16C29.8892 23.9467 30.1225 23.6333 30.2425 23.22C30.3625 22.7933 30.4225 22.2667 30.4225 21.64V13.06H33.5625V21.86C33.5625 23.7133 33.0958 25.0933 32.1625 26C31.2425 26.9067 29.8692 27.36 28.0425 27.36ZM36.2066 27V13.06H40.4066C42.7399 13.06 44.5466 13.6733 45.8266 14.9C47.1066 16.1267 47.7466 17.8733 47.7466 20.14C47.7466 22.3533 47.1132 24.0533 45.8466 25.24C44.5932 26.4133 42.7732 27 40.3866 27H36.2066ZM39.3466 24.12H40.0666C41.0132 24.12 41.8199 24.0133 42.4866 23.8C43.1666 23.5867 43.6866 23.1867 44.0466 22.6C44.4066 22 44.5866 21.14 44.5866 20.02C44.5866 18.94 44.4132 18.1067 44.0666 17.52C43.7332 16.92 43.2466 16.5067 42.6066 16.28C41.9799 16.0533 41.2266 15.94 40.3466 15.94H39.3466V24.12Z" fill="#202020"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,4 +0,0 @@
|
||||
<svg width="55" height="39" viewBox="0 0 55 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="1" y="1" width="53" height="37" rx="7" fill="#202020" stroke="#202020" stroke-width="2" stroke-miterlimit="1.78829" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M8.18 27V13.06H11.32V18.36H16.74V13.06H19.88V27H16.74V21.24H11.32V27H8.18ZM28.0425 27.36C26.2158 27.36 24.8358 26.9133 23.9025 26.02C22.9825 25.1267 22.5225 23.7733 22.5225 21.96V13.06H25.6625V21.6C25.6625 22.24 25.7158 22.7733 25.8225 23.2C25.9425 23.6267 26.1758 23.9467 26.5225 24.16C26.8692 24.3733 27.3758 24.48 28.0425 24.48C28.7092 24.48 29.2092 24.3733 29.5425 24.16C29.8892 23.9467 30.1225 23.6333 30.2425 23.22C30.3625 22.7933 30.4225 22.2667 30.4225 21.64V13.06H33.5625V21.86C33.5625 23.7133 33.0958 25.0933 32.1625 26C31.2425 26.9067 29.8692 27.36 28.0425 27.36ZM36.2066 27V13.06H40.4066C42.7399 13.06 44.5466 13.6733 45.8266 14.9C47.1066 16.1267 47.7466 17.8733 47.7466 20.14C47.7466 22.3533 47.1132 24.0533 45.8466 25.24C44.5932 26.4133 42.7732 27 40.3866 27H36.2066ZM39.3466 24.12H40.0666C41.0132 24.12 41.8199 24.0133 42.4866 23.8C43.1666 23.5867 43.6866 23.1867 44.0466 22.6C44.4066 22 44.5866 21.14 44.5866 20.02C44.5866 18.94 44.4132 18.1067 44.0666 17.52C43.7332 16.92 43.2466 16.5067 42.6066 16.28C41.9799 16.0533 41.2266 15.94 40.3466 15.94H39.3466V24.12Z" fill="#EAEAEA"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,13 +0,0 @@
|
||||
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="1" y="1" width="37" height="37" rx="7" stroke="#202020" stroke-width="2" stroke-miterlimit="1.78829" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="20 20"/>
|
||||
<path d="M6 6H32.7643V32.7643H6V6Z" fill="white" fill-opacity="0.01"/>
|
||||
<path d="M19.3821 8.23035V30.5339" stroke="#202020" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9.74951 13.8063L29.0649 24.958" stroke="#202020" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9.74658 24.9454L29.0181 13.819" stroke="#202020" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.6911 11.5759L14.3639 16.5942L9.34558 17.7094" stroke="#202020" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9.34558 21.0549L14.3639 22.1701L12.6911 27.1884" stroke="#202020" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M26.0732 11.5759L24.4004 16.5942L29.4187 17.7094" stroke="#202020" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M29.4187 21.0549L24.4004 22.1701L26.0732 27.1884" stroke="#202020" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M16.0366 9.90308L19.3822 13.2486L22.7277 9.90308" stroke="#202020" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M16.0366 28.8612L19.3822 25.5156L22.7277 28.8612" stroke="#202020" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,12 +0,0 @@
|
||||
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="39" height="39" rx="8" fill="#202020"/>
|
||||
<path d="M19.3821 8.23035V30.5339" stroke="#EAEAEA" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9.74951 13.8063L29.0649 24.958" stroke="#EAEAEA" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9.74658 24.9454L29.0181 13.819" stroke="#EAEAEA" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.6911 11.5759L14.3639 16.5942L9.34558 17.7094" stroke="#EAEAEA" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9.34558 21.0549L14.3639 22.1701L12.6911 27.1884" stroke="#EAEAEA" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M26.0732 11.5759L24.4004 16.5942L29.4187 17.7094" stroke="#EAEAEA" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M29.4187 21.0549L24.4004 22.1701L26.0732 27.1884" stroke="#EAEAEA" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M16.0366 9.90308L19.3822 13.2486L22.7277 9.90308" stroke="#EAEAEA" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M16.0366 28.8612L19.3822 25.5156L22.7277 28.8612" stroke="#EAEAEA" stroke-width="2.23035" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 463 KiB |
|
Before Width: | Height: | Size: 439 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 463 KiB |
|
Before Width: | Height: | Size: 911 KiB |
|
Before Width: | Height: | Size: 891 KiB |
|
Before Width: | Height: | Size: 599 KiB |
|
Before Width: | Height: | Size: 765 KiB |
|
Before Width: | Height: | Size: 702 KiB |
|
Before Width: | Height: | Size: 569 KiB |
|
Before Width: | Height: | Size: 742 KiB |
|
Before Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 687 KiB |
|
Before Width: | Height: | Size: 45 KiB |
@@ -1,14 +0,0 @@
|
||||
<svg width="131" height="153" viewBox="0 0 131 153" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M65.5 85.9041C90.3373 85.9041 110.472 71.3403 110.472 53.3749C110.472 35.4095 90.3373 20.8457 65.5 20.8457C40.6627 20.8457 20.5281 35.4095 20.5281 53.3749C20.5281 71.3403 40.6627 85.9041 65.5 85.9041Z" fill="white"/>
|
||||
<path d="M65.5 153C101.675 153 131 131.789 131 105.623C131 79.4568 101.675 58.2451 65.5 58.2451C29.3253 58.2451 0 79.4568 0 105.623C0 131.789 29.3253 153 65.5 153Z" fill="white"/>
|
||||
<path d="M74.2579 53.5983C74.2348 53.5806 74.2169 53.5606 74.1947 53.5429C71.4944 51.4636 67.229 50.1261 62.4805 52.5684C58.267 54.7361 57.8458 58.8908 60.5462 60.9703C60.5693 60.988 60.5961 61.0019 60.6189 61.0196C60.8381 61.192 61.0966 61.3515 61.3991 61.495C61.7968 61.698 62.2283 61.8623 62.6868 61.9878L76.6706 65.566C79.1905 66.4639 80.3658 65.6652 79.2834 63.7902L75.4646 55.152C75.3198 54.8127 75.1188 54.4913 74.8652 54.1909C74.686 53.964 74.4814 53.7674 74.2579 53.5983Z" fill="#F72F56"/>
|
||||
<path d="M69.5506 105.237C69.5506 106.855 67.7369 108.167 65.5004 108.167C63.2632 108.167 61.4502 106.855 61.4502 105.237C61.4502 103.619 63.2632 102.308 65.5004 102.308C67.7369 102.308 69.5506 103.619 69.5506 105.237Z" fill="#824D29"/>
|
||||
<path d="M65.5004 92.0067C67.7373 92.0067 69.5506 90.6951 69.5506 89.0771C69.5506 87.4591 67.7373 86.1475 65.5004 86.1475C63.2635 86.1475 61.4502 87.4591 61.4502 89.0771C61.4502 90.6951 63.2635 92.0067 65.5004 92.0067Z" fill="#824D29"/>
|
||||
<path d="M79.5439 49.5277C81.1226 49.5277 82.4023 48.602 82.4023 47.4601C82.4023 46.3182 81.1226 45.3926 79.5439 45.3926C77.9653 45.3926 76.6855 46.3182 76.6855 47.4601C76.6855 48.602 77.9653 49.5277 79.5439 49.5277Z" fill="black"/>
|
||||
<path d="M54.6488 49.5281C56.2276 49.5281 57.5075 48.6024 57.5075 47.4604C57.5075 46.3183 56.2276 45.3926 54.6488 45.3926C53.0699 45.3926 51.79 46.3183 51.79 47.4604C51.79 48.6024 53.0699 49.5281 54.6488 49.5281Z" fill="black"/>
|
||||
<path d="M69.5506 121.397C69.5506 123.015 67.7369 124.327 65.5004 124.327C63.2632 124.327 61.4502 123.015 61.4502 121.397C61.4502 119.779 63.2632 118.468 65.5004 118.468C67.7369 118.468 69.5506 119.779 69.5506 121.397Z" fill="#824D29"/>
|
||||
<path d="M82.0696 22.4785H50.1528L46.9612 0H85.2605L82.0696 22.4785Z" fill="#288C66"/>
|
||||
<path d="M91.2871 22.3595C91.2871 23.7463 89.7329 24.8704 87.8158 24.8704H43.8456C41.9284 24.8704 40.3743 23.7463 40.3743 22.3595C40.3743 20.9728 41.9284 19.8486 43.8456 19.8486H87.8158C89.7329 19.8486 91.2871 20.9728 91.2871 22.3595Z" fill="#288C66"/>
|
||||
<path d="M82.7858 17.457H49.4363L49.7619 19.8484H82.4602L82.7858 17.457Z" fill="black"/>
|
||||
<path d="M64.3821 63.4975C64.3821 63.4975 64.841 64.4017 64.3821 65.1485C64.3821 65.1485 61.3531 64.3625 58.5073 66.4458C55.6618 68.5291 53.5516 73.4423 47.0341 73.4423C40.5172 73.4423 40.104 70.7301 40.6548 68.2933C40.6548 68.2933 43.408 67.6247 47.447 68.4701C47.447 68.4701 50.6899 69.433 53.0844 67.4284C55.4787 65.4237 60.1597 62.9865 64.3821 63.4975Z" fill="#603813"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.9 KiB |
@@ -1,5 +0,0 @@
|
||||
<svg width="59" height="58" viewBox="0 0 59 58" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M54.9517 50.3231H3.57922L24.7327 10.1934H33.575L54.9517 50.3231Z" fill="#F72F56"/>
|
||||
<path d="M29.2388 13.2652C32.9019 13.2652 35.8714 10.2957 35.8714 6.6326C35.8714 2.96951 32.9019 0 29.2388 0C25.5757 0 22.6062 2.96951 22.6062 6.6326C22.6062 10.2957 25.5757 13.2652 29.2388 13.2652Z" fill="white"/>
|
||||
<path d="M58.0826 52.4684C58.0826 55.25 55.8277 57.5051 53.0461 57.5051H5.0365C2.25487 57.5051 0 55.25 0 52.4684V51.1363C0 48.3547 2.25487 46.0996 5.0365 46.0996H53.0463C55.8279 46.0996 58.0828 48.3547 58.0828 51.1363L58.0826 52.4684Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 661 B |
|
Before Width: | Height: | Size: 36 KiB |
@@ -1,14 +0,0 @@
|
||||
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M19.5 39C30.2696 39 39 30.2695 39 19.5C39 8.73044 30.2696 0 19.5 0C8.73045 0 0 8.73044 0 19.5C0 30.2695 8.73045 39 19.5 39Z" fill="#824D29"/>
|
||||
<path d="M25.9308 9.75035C27.1339 9.75035 28.1092 8.77505 28.1092 7.57196C28.1092 6.36887 27.1339 5.39355 25.9308 5.39355C24.7277 5.39355 23.7524 6.36887 23.7524 7.57196C23.7524 8.77505 24.7277 9.75035 25.9308 9.75035Z" fill="black"/>
|
||||
<path d="M15.662 9.75085C15.662 10.9533 14.6871 11.9289 13.4841 11.9289C12.2808 11.9289 11.3057 10.9533 11.3057 9.75085C11.3057 8.54719 12.281 7.57227 13.4841 7.57227C14.6871 7.57207 15.662 8.54719 15.662 9.75085Z" fill="black"/>
|
||||
<path d="M19.3962 5.39349C20.5992 5.39349 21.5744 4.41828 21.5744 3.21529C21.5744 2.01231 20.5992 1.03711 19.3962 1.03711C18.1932 1.03711 17.218 2.01231 17.218 3.21529C17.218 4.41828 18.1932 5.39349 19.3962 5.39349Z" fill="black"/>
|
||||
<path d="M23.7524 16.5958C23.7524 17.7994 22.7775 18.7743 21.5742 18.7743C20.3714 18.7743 19.3962 17.7994 19.3962 16.5958C19.3962 15.3931 20.3714 14.418 21.5742 14.418C22.7775 14.4178 23.7524 15.3931 23.7524 16.5958Z" fill="black"/>
|
||||
<path d="M33.7105 16.5958C33.7105 17.7994 32.7352 18.7743 31.5321 18.7743C30.3289 18.7743 29.3541 17.7994 29.3541 16.5958C29.3541 15.3931 30.3289 14.418 31.5321 14.418C32.7352 14.4178 33.7105 15.3931 33.7105 16.5958Z" fill="black"/>
|
||||
<path d="M32.7766 29.0429C33.9796 29.0429 34.9548 28.0677 34.9548 26.8647C34.9548 25.6617 33.9796 24.6865 32.7766 24.6865C31.5736 24.6865 30.5984 25.6617 30.5984 26.8647C30.5984 28.0677 31.5736 29.0429 32.7766 29.0429Z" fill="black"/>
|
||||
<path d="M21.5745 29.0425C22.7773 29.0425 23.7525 28.0674 23.7525 26.8645C23.7525 25.6616 22.7773 24.6865 21.5745 24.6865C20.3716 24.6865 19.3965 25.6616 19.3965 26.8645C19.3965 28.0674 20.3716 29.0425 21.5745 29.0425Z" fill="black"/>
|
||||
<path d="M23.7524 36.1992C24.9554 36.1992 25.9306 35.224 25.9306 34.021C25.9306 32.818 24.9554 31.8428 23.7524 31.8428C22.5494 31.8428 21.5742 32.818 21.5742 34.021C21.5742 35.224 22.5494 36.1992 23.7524 36.1992Z" fill="black"/>
|
||||
<path d="M11.3059 31.8437C12.5089 31.8437 13.4841 30.8685 13.4841 29.6655C13.4841 28.4625 12.5089 27.4873 11.3059 27.4873C10.1029 27.4873 9.12769 28.4625 9.12769 29.6655C9.12769 30.8685 10.1029 31.8437 11.3059 31.8437Z" fill="black"/>
|
||||
<path d="M13.4839 20.9521C14.6868 20.9521 15.662 19.9769 15.662 18.7739C15.662 17.5709 14.6868 16.5957 13.4839 16.5957C12.2809 16.5957 11.3057 17.5709 11.3057 18.7739C11.3057 19.9769 12.2809 20.9521 13.4839 20.9521Z" fill="black"/>
|
||||
<path d="M6.94937 20.0188C6.94937 21.2221 5.97444 22.1972 4.77138 22.1972C3.56811 22.1972 2.59338 21.2221 2.59338 20.0188C2.59338 18.8164 3.56831 17.8408 4.77138 17.8408C5.97444 17.8408 6.94937 18.8164 6.94937 20.0188Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
@@ -1,11 +0,0 @@
|
||||
<svg width="66" height="65" viewBox="0 0 66 65" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M32.7772 64.0257C14.7039 64.0257 0 50.3883 0 33.6261C0 16.8634 14.7039 3.22656 32.7772 3.22656C50.8505 3.22656 65.5542 16.8636 65.5542 33.6261C65.5542 50.3885 50.8505 64.0257 32.7772 64.0257ZM32.7772 19.8698C23.8805 19.8698 16.643 26.041 16.643 33.6261C16.643 41.2113 23.8807 47.3825 32.7772 47.3825C41.6735 47.3825 48.9112 41.2113 48.9112 33.6261C48.9114 26.041 41.6735 19.8698 32.7772 19.8698Z" fill="#288C66"/>
|
||||
<path d="M38.2171 12.6027L51.3547 14.6054V0L32.4877 8.79116L13.6208 0V14.6054L27.138 12.5364L12.8845 27.4262L19.3059 26.3828L19.6139 32.5729L32.5488 11.7556H32.6925L45.6193 32.5729L45.9187 26.3497L52.382 27.4097L38.2171 12.6027Z" fill="#F72F56"/>
|
||||
<path d="M60.4595 34.2207C60.4595 36.1437 58.9008 37.7024 56.9785 37.7024C55.0551 37.7024 53.4963 36.1437 53.4963 34.2207C53.4963 32.298 55.0551 30.7393 56.9785 30.7393C58.901 30.7393 60.4595 32.298 60.4595 34.2207Z" fill="#F9E238"/>
|
||||
<path d="M48.826 52.9874C50.7487 52.9874 52.3075 51.4287 52.3075 49.5059C52.3075 47.5831 50.7487 46.0244 48.826 46.0244C46.9032 46.0244 45.3445 47.5831 45.3445 49.5059C45.3445 51.4287 46.9032 52.9874 48.826 52.9874Z" fill="#FFFADC"/>
|
||||
<path d="M32.5227 58.7612C34.4456 58.7612 36.0044 57.2024 36.0044 55.2795C36.0044 53.3567 34.4456 51.7979 32.5227 51.7979C30.5998 51.7979 29.041 53.3567 29.041 55.2795C29.041 57.2024 30.5998 58.7612 32.5227 58.7612Z" fill="#F9E238"/>
|
||||
<path d="M14.5201 52.3077C16.4428 52.3077 18.0015 50.749 18.0015 48.8262C18.0015 46.9034 16.4428 45.3447 14.5201 45.3447C12.5973 45.3447 11.0386 46.9034 11.0386 48.8262C11.0386 50.749 12.5973 52.3077 14.5201 52.3077Z" fill="#F78E39"/>
|
||||
<path d="M8.40628 37.7022C10.3291 37.7022 11.8878 36.1435 11.8878 34.2207C11.8878 32.298 10.3291 30.7393 8.40628 30.7393C6.48351 30.7393 4.9248 32.298 4.9248 34.2207C4.9248 36.1435 6.48351 37.7022 8.40628 37.7022Z" fill="#F9E238"/>
|
||||
<path d="M12.482 22.7569C14.4048 22.7569 15.9635 21.1982 15.9635 19.2754C15.9635 17.3527 14.4048 15.7939 12.482 15.7939C10.5592 15.7939 9.00049 17.3527 9.00049 19.2754C9.00049 21.1982 10.5592 22.7569 12.482 22.7569Z" fill="#FFFADC"/>
|
||||
<path d="M56.384 19.2756C56.384 21.1986 54.8247 22.7573 52.9024 22.7573C50.9792 22.7573 49.4207 21.1984 49.4207 19.2756C49.4207 17.3529 50.9792 15.7939 52.9024 15.7939C54.8245 15.7939 56.384 17.3529 56.384 19.2756Z" fill="#F78E39"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
@@ -1,7 +0,0 @@
|
||||
<svg width="217" height="340" viewBox="0 0 217 340" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M145.905 297.001C145.905 297.001 255.771 126.76 202.364 109.211C166.602 97.4613 147.432 154.172 147.432 154.172C147.432 154.172 176.271 -5.3277 79.5298 0.137296C-55.5092 7.7683 22.3098 297.001 22.3098 297.001H22.1848L17.6718 340.001H150.042L145.529 297.001H145.905Z" fill="#F72F56"/>
|
||||
<path d="M148.018 321.001H19.6917L18.6047 331.001H149.107L148.018 321.001Z" fill="white"/>
|
||||
<path d="M146.152 303.001H21.5608L20.4718 313.001H147.24L146.152 303.001Z" fill="white"/>
|
||||
<path d="M125.545 200.001H93.9198L116.649 177.851C117.992 176.507 117.992 174.621 116.649 173.278L116.209 172.979C114.866 171.637 112.583 171.71 111.241 173.053L88.7719 195.486V163.343C88.7719 161.445 87.4429 159.001 85.5459 159.001H84.9209C83.0219 159.001 79.7729 161.445 79.7729 163.343V194.968L57.8999 172.24C56.5579 170.897 54.8109 170.897 53.4678 172.24L53.2388 172.681C51.8968 174.023 52.0039 175.625 53.3459 176.966L77.0639 200.001H43.6719C41.7729 200.001 39.7719 202.693 39.7719 204.592V205.216C39.7719 207.115 41.7719 208.001 43.6719 208.001H75.8148L53.4518 230.69C52.1098 232.032 52.1098 234.372 53.4518 235.715L53.8938 236.238C55.2368 237.58 56.5569 237.621 57.8988 236.279L79.7719 213.591V245.216C79.7719 247.113 83.0208 249.001 84.9198 249.001H85.5448C87.4418 249.001 88.7708 247.113 88.7708 245.216V213.073L111.239 235.435C112.581 236.778 114.809 236.778 116.152 235.436L116.621 234.994C117.964 233.651 117.975 231.149 116.633 229.807L95.1689 208.001H125.544C127.442 208.001 128.771 207.115 128.771 205.216V204.592C128.772 202.693 127.443 200.001 125.545 200.001Z" fill="white"/>
|
||||
<path d="M93.7299 177.417L84.8519 197.354L77.1069 176.733C76.6359 175.51 75.3629 174.944 74.1399 175.414L73.7879 175.591C72.5649 176.06 71.8919 177.638 72.3629 178.86L80.1189 199.441L59.8579 190.416C58.6599 189.883 57.4309 190.036 56.8979 191.232L56.7229 191.626C56.1899 192.823 56.5499 194.626 57.7459 195.158L77.6829 204.038L57.0639 211.784C55.8389 212.254 55.2739 213.525 55.7439 214.749L55.9209 215.101C56.3899 216.325 57.5729 216.822 58.7949 216.351L80.1209 207.98L70.7459 229.032C70.2129 230.228 71.1509 231.809 72.3499 232.342L72.7429 232.517C73.9409 233.051 74.9569 232.34 75.4879 231.143L84.5119 210.88L92.5249 231.341C92.9939 232.564 94.4629 233.218 95.6859 232.749L96.1359 232.616C97.3589 232.147 97.9069 230.986 97.4369 229.762L89.4239 209.264L109.36 218.143C110.558 218.675 112.139 217.738 112.672 216.54L112.847 216.146C113.38 214.949 112.669 213.934 111.472 213.401L91.2089 204.378L111.671 196.364C112.894 195.896 113.548 194.427 113.079 193.204L112.945 192.752C112.476 191.528 110.922 190.807 109.7 191.277L89.9459 198.676L98.4739 179.528C99.0049 178.331 98.8559 177.101 97.6579 176.569L97.2649 176.393C96.0649 175.86 94.2608 176.22 93.7299 177.417Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
@@ -1,7 +0,0 @@
|
||||
<svg width="24" height="38" viewBox="0 0 24 38" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16.1364 32.847C16.1364 32.847 28.2871 14.0191 22.3805 12.0783C18.4254 10.7788 16.3053 17.0508 16.3053 17.0508C16.3053 17.0508 19.4948 -0.58922 8.79564 0.0151844C-6.13907 0.859139 2.46736 32.847 2.46736 32.847H2.45354L1.95442 37.6026H16.594L16.0948 32.847H16.1364Z" fill="#F72F56"/>
|
||||
<path d="M16.3701 35.502H2.17783L2.05762 36.6079H16.4906L16.3701 35.502Z" fill="white"/>
|
||||
<path d="M16.1637 33.5107H2.38448L2.26404 34.6167H16.284L16.1637 33.5107Z" fill="white"/>
|
||||
<path d="M13.8847 22.1194H10.3871L12.9008 19.6697C13.0493 19.521 13.0493 19.3125 12.9008 19.1639L12.8522 19.1309C12.7036 18.9824 12.4511 18.9905 12.3027 19.139L9.81774 21.62V18.0652C9.81774 17.8553 9.67076 17.585 9.46096 17.585H9.39184C9.18182 17.585 8.82249 17.8553 8.82249 18.0652V21.5628L6.40344 19.0491C6.25502 18.9006 6.06181 18.9006 5.91328 19.0491L5.88795 19.0979C5.73953 19.2463 5.75136 19.4235 5.89978 19.5718L8.52289 22.1194H4.82988C4.61986 22.1194 4.39856 22.4171 4.39856 22.6271V22.6961C4.39856 22.9062 4.61975 23.0041 4.82988 23.0041H8.38476L5.91151 25.5134C5.76309 25.6619 5.76309 25.9207 5.91151 26.0692L5.96039 26.127C6.10892 26.2754 6.25491 26.28 6.40333 26.1316L8.82238 23.6224V27.12C8.82238 27.3298 9.18171 27.5386 9.39173 27.5386H9.46085C9.67065 27.5386 9.81763 27.3298 9.81763 27.12V23.5651L12.3025 26.0382C12.4509 26.1868 12.6973 26.1868 12.8458 26.0383L12.8977 25.9895C13.0462 25.8409 13.0475 25.5642 12.899 25.4158L10.5252 23.0041H13.8846C14.0945 23.0041 14.2415 22.9062 14.2415 22.6961V22.6271C14.2416 22.4171 14.0946 22.1194 13.8847 22.1194Z" fill="white"/>
|
||||
<path d="M10.3662 19.6216L9.38429 21.8265L8.52773 19.5459C8.47564 19.4107 8.33485 19.3481 8.19959 19.4L8.16066 19.4196C8.0254 19.4715 7.95097 19.646 8.00306 19.7812L8.86084 22.0573L6.62006 21.0592C6.48757 21.0003 6.35165 21.0172 6.2927 21.1494L6.27335 21.193C6.2144 21.3254 6.25421 21.5248 6.38648 21.5836L8.59143 22.5657L6.31106 23.4224C6.17558 23.4744 6.11309 23.615 6.16507 23.7503L6.18465 23.7893C6.23652 23.9246 6.36735 23.9796 6.5025 23.9275L8.86106 23.0017L7.82423 25.33C7.76528 25.4622 7.86902 25.6371 8.00162 25.696L8.04508 25.7154C8.17758 25.7744 8.28994 25.6958 8.34867 25.5634L9.34669 23.3224L10.2329 25.5853C10.2848 25.7206 10.4472 25.7929 10.5825 25.741L10.6322 25.7263C10.7675 25.6745 10.8281 25.5461 10.7761 25.4107L9.88993 23.1437L12.0948 24.1257C12.2273 24.1845 12.4021 24.0809 12.4611 23.9484L12.4804 23.9048C12.5394 23.7724 12.4607 23.6602 12.3283 23.6012L10.0873 22.6033L12.3503 21.717C12.4856 21.6653 12.5579 21.5028 12.5061 21.3675L12.4912 21.3176C12.4394 21.1822 12.2675 21.1024 12.1324 21.1544L9.94766 21.9727L10.8908 19.855C10.9495 19.7227 10.9331 19.5866 10.8006 19.5278L10.7571 19.5083C10.6244 19.4494 10.4249 19.4892 10.3662 19.6216Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 672 KiB |
@@ -1,408 +0,0 @@
|
||||
<svg width="274" height="339" viewBox="0 0 274 339" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_d_1_8834)">
|
||||
<path d="M162.439 284.132L168.069 309.011L174.993 308.326L177.579 280.708L162.439 284.132Z" fill="#E4E3F3"/>
|
||||
<path d="M163.504 288.697C163.504 288.697 171.112 289.534 171.569 292.349C171.949 295.164 172.406 300.261 171.873 300.566C171.341 300.87 166.7 302.62 166.7 302.62H175.601L176.971 287.403L169.515 285.045L163.504 288.697Z" fill="url(#paint0_linear_1_8834)"/>
|
||||
<path d="M199.034 314.945C193.404 312.434 184.351 308.174 180.47 305.359C180.166 305.13 180.014 304.826 180.014 304.446V301.022C180.014 300.337 179.329 299.805 178.644 299.957L164.798 303.152C164.265 303.304 163.885 303.837 163.961 304.37L165.939 316.086C166.015 316.619 166.471 316.999 167.004 316.999H174.232C174.764 316.999 175.221 316.619 175.297 316.086C175.525 315.097 176.818 314.869 177.275 315.706C177.655 316.391 178.112 316.923 178.492 316.923H198.578C199.719 316.999 200.1 315.401 199.034 314.945Z" fill="#34241D"/>
|
||||
<path d="M171.873 302.315C171.873 302.315 164.721 303.533 164.721 304.522C164.721 305.511 167.004 315.782 167.004 315.782H172.862C172.862 315.782 169.134 315.173 168.83 312.663C168.526 310.152 168.069 304.826 168.83 304.37C169.515 303.913 171.873 302.315 171.873 302.315Z" fill="url(#paint1_linear_1_8834)"/>
|
||||
<path d="M179.786 305.814L178.645 310.455C178.645 310.455 181.155 309.619 183.438 310.455C185.72 311.292 199.035 315.781 199.035 315.781L179.786 305.814Z" fill="url(#paint2_linear_1_8834)"/>
|
||||
<path d="M124.398 278.884V307.719L115.801 308.48L110.703 282.688L124.398 278.884Z" fill="#E4E3F3"/>
|
||||
<path d="M124.398 286.72V303.23L123.409 304.904C123.409 304.904 112.377 304.98 117.094 302.317C121.887 299.654 119.833 296.078 119.453 293.643C119.072 291.209 116.485 289.839 116.485 289.839L123.941 285.198L124.398 286.72Z" fill="url(#paint3_linear_1_8834)"/>
|
||||
<path d="M110.931 303.078L126.376 301.176C126.832 301.1 127.289 301.48 127.289 301.937L127.898 316.088C127.898 316.544 127.517 316.925 127.061 316.925H120.137C119.909 316.925 119.681 316.773 119.529 316.62L117.855 314.414C117.55 314.034 116.942 313.958 116.637 314.338L114.507 316.62C114.355 316.773 114.127 316.849 113.899 316.849H92.2912C91.3782 316.849 91.1499 315.631 91.9869 315.327L110.703 307.643C111.083 307.491 111.312 307.034 111.16 306.578L110.247 304.067C110.094 303.686 110.399 303.154 110.931 303.078Z" fill="#34241D"/>
|
||||
<path d="M115.192 303.763C115.192 303.763 112.833 304.067 112.833 304.904C112.833 305.741 114.735 310.61 114.735 310.61C114.735 310.61 112.225 310.078 111.616 310.078C111.007 310.078 93.8129 315.784 93.8129 315.784C93.8129 315.784 111.92 308.632 111.996 307.871C112.073 307.11 110.094 303.763 110.627 303.763C111.084 303.763 116.485 303.078 116.485 303.078L115.192 303.763Z" fill="url(#paint4_linear_1_8834)"/>
|
||||
<path d="M121.583 302.622C121.583 302.622 126.376 302.013 126.376 302.165C126.376 302.317 127.669 315.632 126.985 315.784C126.3 315.936 122.344 315.784 122.344 315.784C122.344 315.784 125.159 315.556 125.235 314.11C125.311 312.664 126.833 301.632 121.583 302.622Z" fill="url(#paint5_linear_1_8834)"/>
|
||||
<path d="M184.351 285.046C184.046 285.198 183.666 285.35 183.362 285.426C173.395 289.23 165.558 289.002 161.298 288.469H161.222C160.613 288.393 160.08 288.317 159.624 288.165C158.559 287.937 157.95 287.709 157.95 287.709L159.32 280.177C159.32 280.177 153.613 270.286 148.059 265.645C147.07 264.808 146.005 264.123 145.092 263.667C144.712 263.515 144.407 263.362 144.027 263.286C138.017 261.308 131.55 264.123 130.789 264.427C130.028 264.732 126.604 280.177 126.604 280.177L127.745 288.089C124.778 288.926 121.963 289.459 119.453 289.687C116.485 289.991 113.899 289.839 111.692 289.535C110.323 289.382 109.029 289.078 107.964 288.774C103.932 287.709 101.801 286.263 101.801 286.263L103.78 279.035L95.7149 246.548V246.472L94.6498 242.059C95.7149 242.212 96.704 242.364 97.7692 242.44C144.712 247.994 183.133 226.995 183.133 226.995C184.959 233.919 181.916 276.905 181.916 276.905L183.97 283.296L184.351 285.046Z" fill="#C23434"/>
|
||||
<path d="M143.951 263.363C137.94 261.385 131.473 264.2 130.713 264.504C129.952 264.808 126.528 280.253 126.528 280.253L127.745 288.089C124.778 288.926 121.963 289.459 119.453 289.687L111.692 289.535C111.92 289.535 120.442 288.774 121.126 285.883C121.887 282.916 113.746 282.079 113.746 282.079C113.746 282.079 121.735 281.927 122.572 279.797C123.409 277.742 126.832 267.319 124.398 264.732C121.887 262.145 111.692 259.635 111.692 259.635C111.692 259.635 140.527 261.537 143.951 263.363Z" fill="url(#paint6_linear_1_8834)"/>
|
||||
<path opacity="0.5" d="M104.616 286.415C105.529 287.024 107.736 288.774 107.888 288.85C103.856 287.784 101.725 286.339 101.725 286.339L103.703 279.111L95.6388 246.624C96.0953 248.07 105.149 278.807 106.366 279.72C107.584 280.633 110.475 281.926 110.627 282.002C110.399 281.926 105.073 280.709 104.464 282.002C103.932 283.296 103.703 285.73 104.616 286.415Z" fill="url(#paint7_linear_1_8834)"/>
|
||||
<path opacity="0.5" d="M166.547 281.394C166.547 281.394 161.754 281.774 161.145 282.839C160.537 283.904 159.624 288.165 159.624 288.165C158.559 287.937 157.95 287.708 157.95 287.708L159.319 280.176C159.319 280.176 153.613 270.286 148.059 265.645C151.103 267.699 155.744 271.122 158.026 274.166C161.678 278.959 161.069 280.481 161.982 280.633C162.895 280.861 166.547 281.394 166.547 281.394Z" fill="url(#paint8_linear_1_8834)"/>
|
||||
<path d="M184.351 285.045L183.361 285.425C173.395 289.229 165.558 289.001 161.298 288.469H161.222C161.222 288.469 170.047 288.621 174.079 286.719C178.112 284.817 179.101 280.708 177.503 279.719C175.905 278.73 168.602 280.708 168.602 280.708C168.602 280.708 174.992 276.372 175.297 275.382C175.601 274.393 172.253 264.198 170.808 260.47C169.286 256.818 162.743 253.775 159.396 252.938C155.972 252.101 137.18 256.286 121.963 254.916C106.747 253.547 95.6388 246.471 95.6388 246.471L97.6169 242.515C144.56 248.069 182.981 227.07 182.981 227.07C184.807 233.994 181.764 276.98 181.764 276.98L184.351 285.045Z" fill="url(#paint9_linear_1_8834)"/>
|
||||
<path d="M195.383 219.31C194.013 220.756 192.644 222.201 191.274 223.571C189.676 225.092 188.155 226.614 186.557 227.983C163.428 248.678 141.136 254.004 122.648 252.938C95.0302 251.341 76.0858 235.287 76.0858 235.287C85.9004 231.864 87.422 224.94 87.422 224.94L90.9218 223.875L94.3455 222.886L93.3564 220.375L88.7154 208.735C82.4767 203.942 78.9008 197.855 77.1509 191.388C71.5969 171.302 83.0853 147.565 83.0853 147.565C62.2388 152.434 47.8593 136.533 47.0985 134.707C46.3377 132.881 48.3919 115.458 65.3582 120.556C66.2712 120.86 67.2602 121.012 68.2493 121.164C86.6612 123.979 124.398 109.448 124.398 109.448C131.474 107.013 142.582 107.317 153.994 111.121C156.885 112.034 159.776 113.252 162.591 114.621C163.124 119.414 164.645 122.458 164.645 122.458C168.449 121.621 171.569 121.469 174.156 121.773C175.753 122.99 177.275 124.284 178.721 125.653C181.155 127.936 183.133 130.751 184.731 133.946C186.329 137.141 187.47 140.641 188.383 144.369C189.905 150.684 190.513 157.608 190.665 164.151C190.894 177.465 188.992 189.41 188.231 192.225C186.709 198.159 183.59 201.963 183.59 201.963L185.34 213.3L195.383 219.31Z" fill="#C23434"/>
|
||||
<path d="M195.382 219.31C194.013 220.756 192.644 222.201 191.274 223.571C189.676 225.092 188.155 226.614 186.557 227.983C185.416 226.31 182.372 224.179 174.612 227.146C163.428 231.483 139.462 235.135 139.462 235.135L98.9104 211.626C199.947 216.495 143.114 137.446 138.93 136.913C134.745 136.381 131.321 139.652 122.952 141.326C114.507 143 110.855 136.913 110.855 136.913V135.163L132.995 115.534C132.995 115.534 143.038 113.023 153.842 111.273C156.733 112.186 159.624 113.404 162.439 114.773C162.972 119.566 164.493 122.61 164.493 122.61C168.297 121.773 171.417 121.621 174.003 121.925C175.601 123.142 177.123 124.436 178.568 125.805C181.003 128.088 182.981 130.903 184.579 134.098C186.177 137.294 187.318 140.793 188.231 144.521C189.296 151.825 189.981 158.977 190.513 164.303C190.741 177.617 188.839 189.562 188.079 192.377C186.557 198.311 183.438 202.115 183.438 202.115L185.188 213.452L195.382 219.31Z" fill="url(#paint10_linear_1_8834)"/>
|
||||
<path d="M94.802 127.251L83.0853 147.565C62.2388 152.434 47.8593 136.533 47.0985 134.707C46.3377 132.881 48.3919 115.458 65.3582 120.556C66.2712 120.86 67.2602 121.012 68.2493 121.164C68.2493 121.164 63.8365 123.827 61.7062 126.186C59.5759 128.544 55.3914 138.967 69.3145 140.261C83.0092 141.63 94.4216 127.707 94.802 127.251Z" fill="url(#paint11_linear_1_8834)"/>
|
||||
<path opacity="0.5" d="M104.693 134.021C104.693 134.021 96.3997 136.228 92.3673 134.021C92.3673 134.021 77.9878 159.433 77.0748 176.095C76.2379 191.311 82.6288 196.561 82.6288 196.561C82.6288 196.561 79.1291 172.519 87.1177 155.857C95.1824 139.271 104.693 134.021 104.693 134.021Z" fill="url(#paint12_linear_1_8834)"/>
|
||||
<path opacity="0.5" d="M129.8 251.493L122.648 252.862C95.0303 251.265 76.0858 235.211 76.0858 235.211C85.9004 231.864 87.422 224.94 87.422 224.94L90.9218 223.875L114.812 230.722C114.812 230.722 104.084 235.744 101.878 239.472C99.5952 243.276 129.8 251.493 129.8 251.493Z" fill="url(#paint13_linear_1_8834)"/>
|
||||
<path d="M159.396 221.592L93.3564 220.375L88.7154 208.734C82.4766 203.941 78.9008 197.855 77.1509 191.388C77.1509 191.388 85.2917 215.354 115.42 218.016C145.473 220.679 159.396 221.592 159.396 221.592Z" fill="url(#paint14_linear_1_8834)"/>
|
||||
<path d="M69.0863 123.142C69.0863 123.142 78.5966 124.968 83.3137 124.436C88.0308 123.903 89.7806 130.294 89.7806 130.294L97.3889 119.643C97.3889 119.643 81.792 124.284 69.0863 123.142Z" fill="url(#paint15_linear_1_8834)"/>
|
||||
<path d="M88.7154 208.736C88.7154 208.736 84.9113 222.354 87.422 224.941C94.1172 231.941 142.886 248.374 187.166 214.442C187.166 214.442 187.622 198.997 183.362 201.128C179.101 203.258 138.017 224.789 88.7154 208.736Z" fill="#34241D"/>
|
||||
<path d="M98.3016 212.616C98.3016 212.616 89.9326 209.192 89.6282 210.333C89.3239 211.475 87.498 220.757 87.9544 222.811C88.4109 224.865 90.5412 226.767 93.128 227.832C95.7148 228.898 97.769 229.278 97.769 229.278C97.769 229.278 90.6934 226.235 90.4652 222.278C90.1608 218.322 91.226 212.692 93.128 212.464C95.0301 212.312 98.3016 212.616 98.3016 212.616Z" fill="url(#paint16_linear_1_8834)"/>
|
||||
<path d="M151.635 213.833C151.635 213.833 180.623 204.703 183.514 203.257C184.731 202.649 185.34 213.376 185.34 213.376C185.34 213.376 182.601 207.29 180.623 207.29C178.644 207.29 156.124 213.681 151.635 213.833Z" fill="url(#paint17_linear_1_8834)"/>
|
||||
<path d="M134.06 211.55C133.908 211.246 133.071 211.169 131.854 211.169C128.811 211.246 123.104 211.93 117.474 212.082C109.562 212.311 105.453 210.789 105.453 210.789C104.693 210.789 104.084 211.702 103.627 213.148C102.03 218.093 102.258 229.505 104.008 232.472C105.758 235.44 112.681 236.505 119.529 236.581C123.713 236.657 127.821 236.353 130.789 235.896C132.615 235.592 134.06 235.288 134.745 234.907C138.473 233.081 134.669 212.463 134.06 211.55ZM129.267 232.092C126.756 233.309 111.007 234.451 108.192 230.646C108.116 230.57 108.116 230.494 108.04 230.418C106.518 227.755 106.671 215.354 109.105 215.43C109.105 215.43 111.92 216.495 117.398 216.343C122.876 216.191 128.43 215.278 128.887 215.963C129.191 216.571 131.854 230.799 129.267 232.092Z" fill="#E4E3F3"/>
|
||||
<path d="M134.06 211.55C133.452 210.561 125.387 211.854 117.474 212.082C109.562 212.311 105.453 210.789 105.453 210.789C104.693 210.789 104.084 211.702 103.627 213.148C103.704 212.995 104.464 211.398 105.606 211.854C106.823 212.387 107.051 212.919 107.051 213.908C107.051 214.898 105.149 215.43 105.301 216.115C105.453 216.876 105.377 228.44 105.834 229.886C106.29 231.331 109.486 233.69 112.301 233.918C115.116 234.146 122.8 233.842 122.952 234.451C123.028 235.059 123.713 235.82 119.453 236.581C126.148 236.657 132.843 235.82 134.745 234.907C138.473 233.081 134.669 212.463 134.06 211.55ZM129.267 232.092C126.68 233.385 110.399 234.451 107.964 230.418C106.442 227.755 106.595 215.354 109.029 215.43C109.029 215.43 111.844 216.495 117.322 216.343C122.8 216.191 128.354 215.278 128.811 215.963C129.191 216.571 131.854 230.799 129.267 232.092Z" fill="url(#paint18_linear_1_8834)"/>
|
||||
<path d="M128.811 215.962C128.354 215.278 122.8 216.191 117.322 216.343C111.844 216.495 109.029 215.43 109.029 215.43C106.671 215.354 106.443 227.755 107.964 230.418C108.04 230.494 108.04 230.57 108.116 230.646C108.421 231.94 109.181 233.081 109.181 233.081C107.432 232.396 106.366 230.95 105.834 229.961C105.225 229.048 105.377 217.864 105.301 216.191C105.225 214.517 105.606 213.604 107.051 213.984C112.986 215.43 129.191 214.288 129.8 214.288C130.332 214.212 128.811 215.962 128.811 215.962Z" fill="url(#paint19_linear_1_8834)"/>
|
||||
<path d="M134.669 234.907C133.984 235.287 132.539 235.591 130.713 235.896C130.713 235.896 132.539 233.461 133.071 232.244C133.604 230.95 131.321 215.201 131.245 214.821C131.169 214.364 133.604 214.136 133.908 213.147C134.212 212.158 131.93 211.321 131.778 211.245C132.995 211.245 133.832 211.321 133.984 211.626C134.669 212.462 138.473 233.081 134.669 234.907Z" fill="url(#paint20_linear_1_8834)"/>
|
||||
<path d="M119.337 149.211C119.793 147.29 118.604 145.363 116.683 144.907C114.761 144.451 112.834 145.639 112.378 147.561C111.922 149.482 113.111 151.41 115.032 151.865C116.954 152.321 118.881 151.133 119.337 149.211Z" fill="#34241D"/>
|
||||
<path d="M110.855 177.845C112.41 177.845 113.67 176.585 113.67 175.03C113.67 173.475 112.41 172.215 110.855 172.215C109.301 172.215 108.04 173.475 108.04 175.03C108.04 176.585 109.301 177.845 110.855 177.845Z" fill="#34241D"/>
|
||||
<path d="M114.481 203.098C115.699 201.88 115.699 199.905 114.481 198.687C113.263 197.469 111.288 197.469 110.069 198.687C108.851 199.905 108.851 201.88 110.069 203.098C111.288 204.316 113.263 204.316 114.481 203.098Z" fill="#34241D"/>
|
||||
<path d="M110.323 173.355C109.79 173.432 109.41 173.736 109.105 174.192C108.801 174.649 108.573 175.334 108.953 175.79C109.182 176.094 109.638 176.094 109.79 175.714C109.942 175.334 109.866 174.953 109.942 174.649C110.018 174.268 110.247 173.888 110.475 173.66C110.551 173.508 110.475 173.355 110.323 173.355Z" fill="white"/>
|
||||
<path d="M115.04 145.662C114.279 145.814 113.67 146.27 113.29 146.879C112.986 147.335 112.681 148.324 113.214 148.781C113.67 149.161 113.899 148.401 113.899 148.02C114.127 147.183 114.507 146.499 115.192 145.966C115.344 145.814 115.192 145.586 115.04 145.662Z" fill="white"/>
|
||||
<path d="M111.464 199.376C111.388 199.3 111.312 199.3 111.236 199.376C110.779 199.681 110.475 200.061 110.323 200.594C110.171 201.05 110.018 201.659 110.551 201.963C110.779 202.115 111.008 201.963 111.084 201.735C111.16 201.507 111.084 201.278 111.084 200.974C111.084 200.67 111.16 200.442 111.312 200.137C111.312 200.061 111.616 199.452 111.464 199.376Z" fill="white"/>
|
||||
<path d="M191.274 223.494C192.644 222.125 194.013 220.755 195.382 219.234L185.34 213.299L183.59 201.963C183.59 201.963 186.709 198.083 188.231 192.225C189.524 187.127 194.47 153.575 184.731 133.946C183.133 130.75 181.155 127.935 178.721 125.653C177.275 124.283 175.677 122.99 174.156 121.773C171.569 121.468 168.449 121.621 164.645 122.457C164.645 122.457 163.124 119.414 162.591 114.621C162.211 111.121 162.287 106.632 163.885 101.687C166.243 94.2309 182.905 85.4815 201.469 88.4487C212.273 90.1225 223.761 95.8287 233.5 107.926C233.652 109.143 239.434 147.108 252.596 159.357C265.835 171.759 236.695 234.374 191.274 223.494Z" fill="#733520"/>
|
||||
<path d="M191.274 223.494C192.644 222.125 194.013 220.755 195.382 219.234L185.34 213.299L183.59 201.963C183.59 201.963 186.709 198.083 188.231 192.225C189.524 187.127 194.47 153.575 184.731 133.946C183.133 130.75 181.155 127.935 178.721 125.653C177.275 124.283 175.677 122.99 174.156 121.773C171.569 121.468 168.449 121.621 164.645 122.457C164.645 122.457 163.124 119.414 162.591 114.621C162.211 111.121 162.287 106.632 163.885 101.687C166.243 94.2309 182.905 85.4815 201.469 88.4487C201.013 88.5248 182.068 92.2528 178.873 95.1439C175.601 98.1111 172.025 113.556 177.351 116.675C182.677 119.795 198.654 117.36 201.469 124.892C204.284 132.424 200.936 145.434 206.034 150.836C211.131 156.314 235.326 161.792 236.163 156.238C236.999 150.76 233.652 109.143 233.5 107.85C233.652 109.067 239.434 147.032 252.596 159.281C265.835 171.759 236.695 234.374 191.274 223.494Z" fill="url(#paint21_linear_1_8834)"/>
|
||||
<path d="M199.947 92.1769C199.947 92.1769 208.469 91.1118 214.403 95.2202C220.413 99.3286 231.065 108.382 231.065 108.382L232.054 124.968C232.13 124.968 230.532 100.166 199.947 92.1769Z" fill="url(#paint22_linear_1_8834)"/>
|
||||
<path d="M201.241 192.073C199.263 192.453 196.828 192.453 194.393 191.921C189.981 191.008 185.644 188.345 183.97 183.247C181.383 175.259 178.873 155.934 178.873 155.934L188.079 146.195L193.633 140.337C193.633 140.337 211.208 163.77 211.968 168.716C212.653 173.585 206.795 191.008 201.241 192.073Z" fill="#C23434"/>
|
||||
<path d="M201.241 192.073C199.263 192.453 196.828 192.453 194.393 191.92C194.546 191.92 197.132 192.301 198.502 191.388C199.871 190.475 203.143 185.606 202.991 180.432C202.839 175.258 198.958 169.4 196.372 164.303C193.785 159.281 188.079 160.042 188.079 160.042V146.119L193.633 140.261C193.633 140.261 211.208 163.694 211.968 168.639C212.653 173.585 206.795 191.007 201.241 192.073Z" fill="url(#paint23_linear_1_8834)"/>
|
||||
<path d="M180.623 164.379C180.623 164.379 183.97 181.193 188.307 183.932C192.644 186.595 195.306 187.28 195.306 187.28C195.306 187.28 192.491 189.866 187.926 187.28C183.514 184.617 180.623 164.379 180.623 164.379Z" fill="url(#paint24_linear_1_8834)"/>
|
||||
<path d="M195.383 153.044C190.589 162.63 181.079 166.891 171.949 161.489C169.819 160.196 168.297 158.598 167.232 156.848C163.732 150.99 165.178 143.534 165.178 143.534L176.134 130.219C176.134 130.219 176.21 129.687 176.362 128.926C176.818 126.872 178.264 123.144 182.449 123.144C188.155 123.144 192.035 126.491 192.948 127.785C193.861 129.078 195.535 133.947 196.828 135.773C198.198 137.523 200.176 143.457 195.383 153.044Z" fill="#E4E3F3"/>
|
||||
<path d="M195.383 153.044C190.589 162.63 181.079 166.891 171.949 161.489C169.819 160.196 168.297 158.598 167.232 156.848L165.939 152.663L173.243 146.501L176.742 148.479C176.742 148.479 176.895 153.805 179.558 153.653C182.22 153.5 185.492 152.055 189.676 146.957C191.046 145.36 192.644 139.73 192.644 137.067C192.644 134.099 192.111 128.241 189.676 127.176C183.438 124.361 183.209 128.469 183.209 128.469L178.873 131.893L176.21 129.002C176.666 126.948 178.112 123.22 182.296 123.22C188.003 123.22 191.883 126.567 192.796 127.861C193.709 129.154 195.383 134.023 196.676 135.849C198.198 137.523 200.176 143.458 195.383 153.044Z" fill="url(#paint25_linear_1_8834)"/>
|
||||
<path d="M177.275 171.227C177.275 171.227 173.243 172.749 169.819 168.641C169.362 168.108 168.754 167.652 168.145 167.271C163.732 164.684 155.515 165.065 154.222 168.641C152.7 172.749 141.44 165.826 141.44 165.826C147.831 163.087 151.94 158.978 154.526 154.794C158.939 147.87 159.32 141.023 159.32 141.023C159.32 141.023 173.09 136.838 173.09 147.87C173.09 158.978 177.275 171.227 177.275 171.227Z" fill="#733520"/>
|
||||
<path d="M177.275 171.227C177.275 171.227 173.243 172.749 169.819 168.641C169.362 168.108 168.754 167.652 168.145 167.271C167.689 165.521 167.689 163.543 167.156 160.804C166.243 155.935 165.102 149.772 162.287 150.913C159.472 152.055 154.526 164.532 154.526 164.532V154.794C158.939 147.87 159.32 141.023 159.32 141.023C159.32 141.023 173.09 136.838 173.09 147.87C173.09 158.978 177.275 171.227 177.275 171.227Z" fill="url(#paint26_linear_1_8834)"/>
|
||||
<path d="M160.309 154.87C160.309 154.87 154.983 165.598 155.82 165.293C156.657 164.989 162.363 164.38 162.363 164.38C162.363 164.38 159.32 159.815 160.309 154.87Z" fill="url(#paint27_linear_1_8834)"/>
|
||||
<path d="M150.874 160.576C150.874 160.576 146.462 164.761 143.495 165.826L148.972 168.184C148.972 168.108 145.929 167.119 150.874 160.576Z" fill="url(#paint28_linear_1_8834)"/>
|
||||
<path d="M55.3914 106.481C55.924 107.85 56.3044 108.611 56.3044 108.611L56.2283 108.687L39.7946 123.599C32.2625 121.393 19.1003 100.318 18.1873 93.0144C17.2743 85.7866 19.8611 84.8737 22.4479 75.7438C23.2087 73.0048 25.1107 70.4941 27.3932 68.4399C32.6429 63.7228 39.8707 61.3643 39.7946 63.0381C39.7185 64.3315 40.4032 73.2331 41.6966 79.8522C42.8379 85.4823 44.3595 89.4386 46.2616 85.9388C48.3158 82.1347 50.5222 79.9283 52.3481 78.7871C54.1741 77.6459 55.6957 77.5698 56.3805 77.8741C57.826 78.5588 53.109 86.1671 52.7285 93.3949C52.5003 97.275 53.5654 101.46 54.6306 104.427L54.7067 104.655C54.9349 105.34 55.2393 105.948 55.3914 106.481Z" fill="#C23434"/>
|
||||
<path d="M29.2191 68.4396C29.2191 68.4396 33.5558 65.5485 36.1426 65.0159C38.7294 64.4833 38.7294 69.0482 38.7294 69.0482L39.5663 88.0688C39.5663 88.0688 37.9686 69.8851 35.2296 69.0482C32.5667 68.2113 29.2191 68.4396 29.2191 68.4396Z" fill="url(#paint29_linear_1_8834)"/>
|
||||
<path d="M56.2283 78.7109C56.2283 78.7109 51.8156 83.8845 50.5222 90.0472C49.3049 96.2098 52.2721 100.699 52.2721 100.699C52.2721 100.699 49.3049 93.4709 56.2283 78.7109Z" fill="url(#paint30_linear_1_8834)"/>
|
||||
<path d="M56.2283 108.687L39.7946 123.599C32.2625 121.393 19.1003 100.318 18.1873 93.014C17.2743 85.7862 19.8611 84.8732 22.4479 75.7433C23.2087 73.0044 25.1107 70.4937 27.3932 68.4395C27.3932 68.4395 18.7959 85.7101 21.0023 93.014C23.2087 100.394 33.3276 115.61 36.447 116.599C39.5663 117.512 54.5545 104.35 54.5545 104.35L54.6306 104.578L55.3153 106.481L56.2283 108.687Z" fill="url(#paint31_linear_1_8834)"/>
|
||||
<path d="M46.2615 100.242C46.1855 100.166 44.816 99.2532 43.2183 94.6122C41.6205 89.8951 41.6966 79.8523 41.6966 79.8523C42.8379 85.4823 44.3595 89.4386 46.2615 85.9388C48.3158 82.1347 50.5221 79.9283 52.3481 78.7871C43.1422 87.6126 46.1855 100.014 46.2615 100.242Z" fill="url(#paint32_linear_1_8834)"/>
|
||||
<path d="M68.1732 121.241C68.1732 121.241 66.4994 120.937 65.2821 120.632C63.9887 120.328 56.7609 126.263 52.8807 131.436C49.0005 136.61 46.5659 142.848 44.1313 138.131C41.7727 133.49 37.8925 139.273 35.0014 129.838C32.1864 120.632 52.5764 105.036 53.4894 104.351C53.4894 104.351 56.0762 101.764 58.8151 104.351C61.0215 106.405 63.38 110.133 65.206 112.111C65.6625 112.644 66.0429 113.024 66.4233 113.252C68.4015 114.546 68.1732 121.241 68.1732 121.241Z" fill="#E4E3F3"/>
|
||||
<path d="M68.1732 121.241C68.1732 121.241 66.4994 120.936 65.2821 120.632C63.9887 120.328 56.7609 126.262 52.8807 131.436C49.0005 136.609 46.5659 142.848 44.1313 138.131C41.7727 133.49 37.8925 139.272 35.0014 129.838C32.1864 120.632 52.5764 105.035 53.4894 104.351C52.8807 104.883 42.99 113.861 43.0661 116.372C43.1422 118.958 46.642 125.425 49.6092 124.969C52.5003 124.512 61.7823 118.045 63.8365 116.752C65.8907 115.459 65.206 112.111 65.206 112.111C65.6625 112.644 66.0429 113.024 66.4233 113.252C68.4015 114.546 68.1732 121.241 68.1732 121.241Z" fill="url(#paint33_linear_1_8834)"/>
|
||||
<path d="M183.057 146.425C178.416 151.218 173.243 150.99 173.243 150.99C173.243 150.99 170.808 140.947 158.635 145.664L157.418 149.468C157.418 149.468 155.896 148.935 154.374 147.566C152.548 145.968 150.646 143.229 150.951 138.969C151.559 130.98 156.961 123.22 161.45 121.394C164.037 120.329 168.373 118.122 173.775 120.176C177.732 121.698 182.22 125.578 186.937 133.947C186.861 133.947 187.698 141.632 183.057 146.425Z" fill="#C23434"/>
|
||||
<path d="M183.057 146.424C178.416 151.217 173.243 150.989 173.243 150.989C173.243 150.989 170.808 140.946 158.635 145.663L157.418 149.467C157.418 149.467 155.896 148.935 154.374 147.565C155.515 145.435 157.494 142.848 160.309 141.327C165.634 138.512 171.417 144.674 173.775 144.902C176.134 145.207 177.655 139.653 178.873 133.186C180.09 126.719 173.775 120.176 173.775 120.176C177.731 121.697 182.22 125.578 186.937 133.947C186.861 133.947 187.698 141.631 183.057 146.424Z" fill="url(#paint34_linear_1_8834)"/>
|
||||
<path opacity="0.5" d="M168.906 120.176C168.906 120.176 161.298 119.872 157.646 126.111C153.994 132.273 152.853 136.838 153.157 139.805C153.385 142.773 155.211 143.457 155.211 143.457C155.211 143.457 156.429 137.827 160.993 137.827C165.558 137.827 165.558 137.827 165.558 137.827C165.558 137.827 158.787 135.925 159.015 132.882C159.244 129.839 164.037 120.176 168.906 120.176Z" fill="url(#paint35_linear_1_8834)"/>
|
||||
<path d="M204.436 57.6361C204.436 62.5814 200.404 66.5377 195.535 66.5377C192.644 66.5377 190.057 65.1682 188.459 63.0379C187.318 61.5163 186.633 59.6903 186.633 57.6361C186.633 52.6907 190.665 48.7345 195.535 48.7345C200.404 48.6584 204.436 52.6907 204.436 57.6361Z" fill="#E4E3F3"/>
|
||||
<path d="M192.035 58.7771C189.753 59.3097 177.884 51.7776 176.362 52.4623C174.84 53.1471 177.732 55.8099 176.514 56.1143C175.297 56.4186 173.547 59.3858 170.58 58.0163C169.971 57.712 167.232 57.0273 163.124 56.1143C146.842 52.3863 109.942 44.9302 109.942 44.9302C109.942 44.9302 110.095 44.1694 110.551 42.7999C111.844 38.8436 115.344 30.1703 123.333 22.9425C133.984 13.204 142.81 13.0518 150.114 14.9539C157.418 16.8559 172.938 19.2905 175.906 21.0404C178.568 22.6381 186.861 43.9411 191.426 49.7995C191.578 50.0277 191.731 50.1799 191.883 50.332C192.263 50.7885 192.644 51.0929 192.948 51.1689C196.752 52.8427 194.317 58.2446 192.035 58.7771Z" fill="#C23434"/>
|
||||
<path d="M192.035 58.7776C189.752 59.3102 177.884 51.7781 176.362 52.4628C174.84 53.1475 177.732 55.8104 176.514 56.1147C175.297 56.4191 173.547 59.3863 170.58 58.0168C169.971 57.7125 167.232 57.0277 163.124 56.1147C162.287 55.3539 161.754 54.8974 161.754 54.8974C161.754 54.8974 167.613 45.6154 168.069 45.3872C168.526 45.1589 172.254 44.4742 172.482 43.409C172.71 42.3439 169.362 38.3876 169.21 38.3115C169.362 38.3876 176.971 42.42 177.96 45.235C179.025 48.05 190.513 54.517 192.415 53.8323C193.861 53.2997 192.491 51.3216 191.807 50.3325C192.187 50.789 192.568 51.0933 192.872 51.1694C196.752 52.8432 194.317 58.245 192.035 58.7776Z" fill="url(#paint36_linear_1_8834)"/>
|
||||
<path opacity="0.5" d="M176.286 21.9536C176.286 21.9536 156.352 17.0843 143.875 16.4757C131.397 15.7909 119.909 35.268 120.137 36.257C120.365 37.3222 131.017 36.5614 131.017 36.5614C131.017 36.5614 118.007 38.3112 117.322 39.3003C116.714 40.2894 120.898 42.0393 120.898 42.0393L112.073 43.7892C113.366 39.8329 116.866 31.1595 124.854 23.9317C135.506 14.1932 144.331 14.0411 151.635 15.9431C158.787 17.8452 173.243 20.1276 176.286 21.9536Z" fill="url(#paint37_linear_1_8834)"/>
|
||||
<path d="M172.786 81.6775C172.558 81.7536 172.254 81.8296 172.025 81.8296C170.351 82.134 168.449 82.21 168.449 82.21L167.613 87.4597C167.613 87.4597 167.308 88.0684 166.776 89.1335C164.721 93.1659 159.091 103.285 151.864 107.698C142.81 113.252 118.692 117.816 113.29 110.513C110.018 106.1 108.04 102.144 106.823 97.959C106.062 95.144 105.682 92.2529 105.606 88.9814C105.53 86.0142 106.29 83.2752 107.203 80.9166C108.801 76.8843 111.007 74.1453 111.007 74.1453C109.942 58.092 116.561 54.0597 116.561 54.0597C137.408 36.8651 152.472 45.2341 160.841 53.9836C165.939 59.3093 168.526 64.7112 168.526 64.7112C169.515 64.2547 170.428 63.8743 171.264 63.5699C185.34 58.7768 178.568 80.2319 172.786 81.6775Z" fill="#F0A080"/>
|
||||
<path d="M172.254 81.5254L171.949 81.9058C170.275 82.2101 168.373 82.2862 168.373 82.2862L167.536 87.5359C167.536 87.5359 167.232 88.1446 166.7 89.2097L162.591 94.8398L137.788 99.7851C138.397 99.6329 147.907 96.894 150.646 93.7746C153.461 90.5792 156.276 75.5149 155.896 70.1131C155.515 64.7113 152.168 61.668 144.94 59.5377C137.712 57.4074 119.605 58.016 119.605 58.016L118.768 54.7445L123.333 52.386L128.963 50.4078L137.56 49.2666L146.614 49.5709L160.841 54.0598C165.939 59.3855 168.526 64.7873 168.526 64.7873C169.515 64.3309 170.428 63.9504 171.264 63.6461C170.352 64.5591 169.439 65.7003 168.83 66.9176C167.384 69.8088 166.547 74.9063 167.765 78.1778C169.058 81.4493 172.254 81.5254 172.254 81.5254Z" fill="url(#paint38_linear_1_8834)"/>
|
||||
<path d="M114.431 94.0792L106.823 97.9594C106.062 95.1444 105.682 92.2532 105.606 88.9817C105.53 86.0145 106.29 83.2755 107.203 80.917C107.203 80.917 105.606 89.5143 107.736 90.5033C109.866 91.4924 113.366 88.5252 113.366 88.5252L114.431 94.0792Z" fill="url(#paint39_linear_1_8834)"/>
|
||||
<path d="M168.602 101.536C168.602 101.536 180.47 121.774 157.494 119.567C157.494 119.567 158.483 140.566 135.734 132.273C135.734 132.273 115.268 150 106.138 132.501C106.138 132.501 78.4443 138.207 97.617 116.524C97.617 116.524 94.802 109.981 98.4539 105.035C100.052 102.905 102.791 101.003 107.508 100.09C121.659 97.2751 114.431 99.6337 113.518 101.307C113.442 101.46 113.366 101.612 113.442 101.764C113.746 102.449 115.04 104.959 116.942 106.785C119.072 108.764 121.887 109.905 125.007 106.861C125.92 105.948 126.909 104.655 127.822 102.905C127.822 102.905 128.506 100.318 133.071 100.775C136.951 101.155 148.136 100.471 154.146 94.384C155.287 93.2428 156.276 91.8733 156.961 90.2756C161.222 80.461 161.069 68.3639 159.7 62.886C159.7 62.886 158.863 61.5165 162.667 61.3644C166.395 61.2122 168.678 63.0382 168.602 64.712C168.602 64.7881 168.602 64.7881 168.602 64.8642C168.449 66.538 165.254 70.6464 165.254 75.1352C165.254 79.6241 168.373 82.287 168.373 82.287C168.373 82.287 175.829 94.9927 168.602 101.536Z" fill="#E4E3F3"/>
|
||||
<path d="M116.942 106.786C106.138 115.078 98.3778 105.036 98.3778 105.036L113.442 101.308C113.366 101.46 113.29 101.612 113.366 101.764C113.67 102.449 115.04 104.96 116.942 106.786Z" fill="url(#paint40_linear_1_8834)"/>
|
||||
<path d="M155.211 95.2207C155.211 95.2207 154.526 99.6335 151.179 102.677C147.831 105.72 143.951 108.763 136.951 110.133C130.028 111.426 125.235 107.013 125.083 106.861C125.996 105.948 126.985 104.655 127.898 102.905C127.898 102.905 128.582 100.318 133.147 100.775C137.028 101.155 141.897 101.307 150.57 97.1228L155.211 95.2207Z" fill="url(#paint41_linear_1_8834)"/>
|
||||
<path d="M168.449 82.211C168.449 82.211 166.7 80.7654 165.787 78.1025C165.634 78.9394 165.634 79.7763 165.634 80.5372C165.558 82.1349 165.634 83.8087 165.863 85.4064C166.015 86.3955 166.091 87.3846 165.939 88.2975C166.015 88.5258 166.091 88.8301 166.091 89.1344C167.004 93.6233 161.83 98.7969 161.83 98.7969C161.83 98.7969 162.591 99.4055 163.808 101.536C165.026 103.666 164.037 110.818 160.613 113.405C157.189 115.991 151.787 114.318 151.787 114.318C151.787 114.318 153.385 119.263 148.135 122.839C142.81 126.415 135.582 124.208 132.843 124.665C130.104 125.121 124.702 133.262 117.931 134.099C111.16 134.936 106.138 132.501 106.138 132.501C115.344 150 135.734 132.273 135.734 132.273C158.483 140.566 157.494 119.567 157.494 119.567C180.47 121.774 168.602 101.536 168.602 101.536C175.829 94.9928 168.449 82.211 168.449 82.211Z" fill="url(#paint42_linear_1_8834)"/>
|
||||
<path d="M116.942 106.785L120.822 103.437L125.007 107.317L127.898 102.905L123.333 99.7852L119.529 98.9482L115.725 102.752L114.431 105.187L116.942 106.785Z" fill="url(#paint43_linear_1_8834)"/>
|
||||
<path d="M134.365 107.698C129.419 108.155 124.55 106.709 120.67 101.383C120.67 101.383 106.975 119.415 91.4543 97.6552C90.3892 96.1336 97.9974 101.764 112.149 93.0903C115.801 90.8839 119.605 93.7751 120.518 94.5359C120.67 94.612 120.67 94.6881 120.67 94.6881C120.67 94.6881 124.17 90.1992 129.267 93.1664C131.778 94.612 136.495 96.3619 141.364 97.3509C146.157 98.2639 151.027 98.4161 153.842 96.6662C157.722 94.1555 146.081 106.557 134.365 107.698Z" fill="#E4E3F3"/>
|
||||
<path d="M134.365 107.698C129.419 108.155 124.55 106.709 120.67 101.383L120.365 95.2206L120.518 94.5359C120.67 94.612 120.67 94.6881 120.67 94.6881C120.67 94.6881 124.17 90.1992 129.267 93.1664C131.778 94.612 136.495 96.3619 141.364 97.3509C141.364 97.3509 135.886 97.1227 132.995 96.8184C130.104 96.514 128.43 96.8944 127.365 100.851C126.3 104.655 134.365 107.698 134.365 107.698Z" fill="url(#paint44_linear_1_8834)"/>
|
||||
<path d="M131.321 86.5473C140.375 86.0148 134.973 95.6772 130.941 93.8512C127.517 92.3296 125.691 92.5578 125.691 92.5578C116.714 99.0248 110.627 92.71 112.301 83.5801C113.975 74.4503 124.55 77.874 124.55 77.874C124.55 77.874 128.43 80.2325 128.05 83.504C127.746 86.8517 131.321 86.5473 131.321 86.5473Z" fill="url(#paint45_linear_1_8834)"/>
|
||||
<path d="M173.471 55.43C171.645 57.4081 172.786 62.5817 168.525 64.712C166.623 65.7011 162.287 63.9512 157.113 61.7448C150.494 58.9298 142.505 55.3539 136.191 55.3539C124.93 55.3539 115.648 58.7015 111.996 61.5166C111.312 62.0491 110.703 62.1252 110.247 61.7448C108.192 60.2992 107.66 52.4628 106.214 49.3434C104.388 45.5393 109.866 42.0395 109.866 42.0395C117.855 38.8441 125.311 37.3985 131.93 37.0181C139.462 36.6377 146.005 37.7029 151.635 39.5288C166.623 44.4742 174.536 54.2888 173.471 55.43Z" fill="#E4E3F3"/>
|
||||
<path d="M173.471 55.4295C171.645 57.4076 172.786 62.5812 168.526 64.7115C166.623 65.7006 162.287 63.9507 157.113 61.7443C150.494 58.9293 142.505 55.3534 136.191 55.3534C124.93 55.3534 115.648 58.701 111.997 61.516C111.312 62.0486 110.703 62.1247 110.247 61.7443C108.268 53.7557 135.962 52.3862 145.473 52.3101C146.994 52.3101 149.657 52.4623 149.733 50.9406C149.733 50.9406 150.418 48.9625 150.57 48.506C151.027 47.2126 153.537 45.5388 153.385 43.6367C153.309 41.7347 151.635 39.5283 151.635 39.5283C166.623 44.4737 174.536 54.2882 173.471 55.4295Z" fill="url(#paint46_linear_1_8834)"/>
|
||||
<path d="M142.582 73.8417C144.598 73.8417 146.233 71.4233 146.233 68.4399C146.233 65.4566 144.598 63.0381 142.582 63.0381C140.565 63.0381 138.93 65.4566 138.93 68.4399C138.93 71.4233 140.565 73.8417 142.582 73.8417Z" fill="#020203"/>
|
||||
<path d="M144.103 67.1462C144.859 67.1462 145.473 66.533 145.473 65.7767C145.473 65.0204 144.859 64.4072 144.103 64.4072C143.347 64.4072 142.734 65.0204 142.734 65.7767C142.734 66.533 143.347 67.1462 144.103 67.1462Z" fill="white"/>
|
||||
<path d="M117.931 72.8517C119.612 72.8517 120.974 70.842 120.974 68.3629C120.974 65.8837 119.612 63.874 117.931 63.874C116.25 63.874 114.888 65.8837 114.888 68.3629C114.888 70.842 116.25 72.8517 117.931 72.8517Z" fill="#020203"/>
|
||||
<path d="M120.365 66.1569C120.365 66.7655 119.833 67.2981 119.224 67.2981C118.616 67.2981 118.083 66.7655 118.083 66.1569C118.083 65.5482 118.616 65.0156 119.224 65.0156C119.833 65.0156 120.365 65.5482 120.365 66.1569Z" fill="white"/>
|
||||
<path d="M135.658 60.6789C135.658 60.6789 136.038 63.9504 137.332 63.1135C138.625 62.2766 143.266 58.016 150.874 63.7982C158.483 69.5044 147.907 49.4948 135.658 57.8638C135.049 58.1681 135.658 60.6789 135.658 60.6789Z" fill="#E4E3F3"/>
|
||||
<path d="M125.387 61.1358C125.387 61.1358 125.007 64.2552 123.789 63.4182C122.572 62.5813 118.159 58.6251 110.931 64.0269C103.704 69.4287 113.746 50.4843 125.387 58.3968C125.92 58.7772 125.387 61.1358 125.387 61.1358Z" fill="#E4E3F3"/>
|
||||
<g opacity="0.46">
|
||||
<path d="M175.829 69.1243C175.525 67.6788 174.003 67.3744 172.71 67.8309C170.808 68.5917 169.591 70.722 169.134 72.6241C168.678 74.2218 167.917 78.3302 170.275 78.7867C171.645 79.0911 174.003 77.9498 174.384 76.5804C174.384 76.5043 174.308 76.4282 174.308 76.5043C173.547 76.7325 172.025 77.6455 171.493 76.7325C171.036 75.9717 171.417 73.9936 171.493 73.2328C171.569 72.2437 171.645 71.3307 172.025 70.4177C172.634 69.0482 174.536 67.2984 175.829 69.2004C175.753 69.2765 175.829 69.2004 175.829 69.1243Z" fill="#D9635A"/>
|
||||
</g>
|
||||
<g opacity="0.82">
|
||||
<path d="M120.822 78.2536C118.768 77.9492 116.409 79.0905 115.04 80.536C113.29 82.4381 112.909 84.7206 113.746 87.1552C113.746 87.2313 113.899 87.2313 113.899 87.1552C113.975 85.2531 114.659 82.9707 115.801 81.3729C117.094 79.547 118.768 78.8622 120.822 78.2536Z" fill="white"/>
|
||||
</g>
|
||||
<g opacity="0.82">
|
||||
<path d="M121.811 78.5584C122.268 78.7867 122.876 78.9388 123.409 79.091C123.561 79.1671 124.17 79.3953 124.246 79.0149C124.246 78.9388 124.246 78.7867 124.17 78.7867C123.561 78.3302 122.572 77.9498 121.811 78.4063C121.735 78.4063 121.735 78.5584 121.811 78.5584Z" fill="white"/>
|
||||
</g>
|
||||
<path d="M204.436 57.6359C204.436 62.5812 200.404 66.5375 195.535 66.5375C192.644 66.5375 190.057 65.168 188.459 63.0377C198.806 71.1024 204.512 49.2669 195.535 48.6582C200.404 48.6582 204.436 52.6906 204.436 57.6359Z" fill="url(#paint47_linear_1_8834)"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d_1_8834" x="0.6" y="0.6" width="272.605" height="337.799" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="4"/>
|
||||
<feGaussianBlur stdDeviation="8.7"/>
|
||||
<feComposite in2="hardAlpha" operator="out"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.75 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1_8834"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1_8834" result="shape"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear_1_8834" x1="151.29" y1="294.403" x2="179.016" y2="293.766" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_1_8834" x1="155.236" y1="311.427" x2="177.678" y2="308.327" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#B06543"/>
|
||||
<stop offset="0.0309089" stop-color="#AA6343"/>
|
||||
<stop offset="0.3704" stop-color="#754938"/>
|
||||
<stop offset="0.6565" stop-color="#51362C"/>
|
||||
<stop offset="0.875" stop-color="#3C2922"/>
|
||||
<stop offset="1" stop-color="#34241D"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_1_8834" x1="195.598" y1="294.348" x2="184.706" y2="323.482" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#B06543"/>
|
||||
<stop offset="0.0309089" stop-color="#AA6343"/>
|
||||
<stop offset="0.3704" stop-color="#754938"/>
|
||||
<stop offset="0.6565" stop-color="#51362C"/>
|
||||
<stop offset="0.875" stop-color="#3C2922"/>
|
||||
<stop offset="1" stop-color="#34241D"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_1_8834" x1="107.682" y1="295.42" x2="125.858" y2="295.002" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear_1_8834" x1="90.0671" y1="296.644" x2="120.866" y2="322.695" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#B06543"/>
|
||||
<stop offset="0.0309089" stop-color="#AA6343"/>
|
||||
<stop offset="0.3704" stop-color="#754938"/>
|
||||
<stop offset="0.6565" stop-color="#51362C"/>
|
||||
<stop offset="0.875" stop-color="#3C2922"/>
|
||||
<stop offset="1" stop-color="#34241D"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear_1_8834" x1="136.938" y1="306.772" x2="117.942" y2="310.473" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#B06543"/>
|
||||
<stop offset="0.0309089" stop-color="#AA6343"/>
|
||||
<stop offset="0.3704" stop-color="#754938"/>
|
||||
<stop offset="0.6565" stop-color="#51362C"/>
|
||||
<stop offset="0.875" stop-color="#3C2922"/>
|
||||
<stop offset="1" stop-color="#34241D"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint6_linear_1_8834" x1="82.1297" y1="268.543" x2="143.145" y2="278.91" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C23434"/>
|
||||
<stop offset="0.2838" stop-color="#BF3332"/>
|
||||
<stop offset="0.5399" stop-color="#B52F2E"/>
|
||||
<stop offset="0.7843" stop-color="#A62928"/>
|
||||
<stop offset="1" stop-color="#932221"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint7_linear_1_8834" x1="91.0688" y1="265.853" x2="118.44" y2="270.523" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint8_linear_1_8834" x1="146.338" y1="275.674" x2="166.913" y2="279.17" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint9_linear_1_8834" x1="83.2669" y1="281.868" x2="205.953" y2="243.67" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C23434"/>
|
||||
<stop offset="0.2838" stop-color="#BF3332"/>
|
||||
<stop offset="0.5399" stop-color="#B52F2E"/>
|
||||
<stop offset="0.7843" stop-color="#A62928"/>
|
||||
<stop offset="1" stop-color="#932221"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint10_linear_1_8834" x1="8.95017" y1="185.631" x2="235.9" y2="165.075" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C23434"/>
|
||||
<stop offset="0.2838" stop-color="#BF3332"/>
|
||||
<stop offset="0.5399" stop-color="#B52F2E"/>
|
||||
<stop offset="0.7843" stop-color="#A62928"/>
|
||||
<stop offset="1" stop-color="#932221"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint11_linear_1_8834" x1="77.0643" y1="108.496" x2="61.8636" y2="159.798" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C23434"/>
|
||||
<stop offset="0.2521" stop-color="#BE3232"/>
|
||||
<stop offset="0.5412" stop-color="#B22D2D"/>
|
||||
<stop offset="0.8473" stop-color="#9F2626"/>
|
||||
<stop offset="1" stop-color="#932221"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint12_linear_1_8834" x1="28.3691" y1="149.611" x2="111.919" y2="169.705" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint13_linear_1_8834" x1="49.8223" y1="234.334" x2="135.149" y2="240.394" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint14_linear_1_8834" x1="77.1235" y1="206.488" x2="159.377" y2="206.488" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#932221"/>
|
||||
<stop offset="0.1527" stop-color="#9F2626"/>
|
||||
<stop offset="0.4588" stop-color="#B22D2D"/>
|
||||
<stop offset="0.7479" stop-color="#BE3232"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint15_linear_1_8834" x1="82.5143" y1="100.284" x2="83.844" y2="140.365" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint16_linear_1_8834" x1="70.0465" y1="213.26" x2="107.777" y2="223.328" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#B06543"/>
|
||||
<stop offset="0.0309089" stop-color="#AA6343"/>
|
||||
<stop offset="0.3704" stop-color="#754938"/>
|
||||
<stop offset="0.6565" stop-color="#51362C"/>
|
||||
<stop offset="0.875" stop-color="#3C2922"/>
|
||||
<stop offset="1" stop-color="#34241D"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint17_linear_1_8834" x1="143.535" y1="231.027" x2="230.763" y2="170.153" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#34241D"/>
|
||||
<stop offset="0.125" stop-color="#3C2922"/>
|
||||
<stop offset="0.3435" stop-color="#51362C"/>
|
||||
<stop offset="0.6296" stop-color="#754938"/>
|
||||
<stop offset="0.9691" stop-color="#AA6343"/>
|
||||
<stop offset="1" stop-color="#B06543"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint18_linear_1_8834" x1="84.402" y1="222.785" x2="116.117" y2="223.633" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint19_linear_1_8834" x1="119.02" y1="223.255" x2="113.491" y2="223.347" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint20_linear_1_8834" x1="107.057" y1="220.914" x2="151.858" y2="225.677" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint21_linear_1_8834" x1="166.86" y1="229.895" x2="273.055" y2="6.96325" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#3B160F"/>
|
||||
<stop offset="0.3888" stop-color="#552519"/>
|
||||
<stop offset="0.7774" stop-color="#6A301E"/>
|
||||
<stop offset="1" stop-color="#733520"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint22_linear_1_8834" x1="210.269" y1="120.71" x2="226.621" y2="86.3821" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#B85438"/>
|
||||
<stop offset="0.1933" stop-color="#AF5035"/>
|
||||
<stop offset="0.531" stop-color="#98462D"/>
|
||||
<stop offset="0.9707" stop-color="#753621"/>
|
||||
<stop offset="1" stop-color="#733520"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint23_linear_1_8834" x1="169.965" y1="177.254" x2="220.709" y2="156.827" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C23434"/>
|
||||
<stop offset="0.2521" stop-color="#BE3232"/>
|
||||
<stop offset="0.5412" stop-color="#B22D2D"/>
|
||||
<stop offset="0.8473" stop-color="#9F2626"/>
|
||||
<stop offset="1" stop-color="#932221"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint24_linear_1_8834" x1="178.047" y1="179.909" x2="194.058" y2="173.463" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint25_linear_1_8834" x1="157.763" y1="133.165" x2="190.658" y2="147.616" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint26_linear_1_8834" x1="160.932" y1="187.775" x2="169.154" y2="147.161" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#733520"/>
|
||||
<stop offset="0.2226" stop-color="#6A301E"/>
|
||||
<stop offset="0.6112" stop-color="#552519"/>
|
||||
<stop offset="1" stop-color="#3B160F"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint27_linear_1_8834" x1="155.709" y1="160.103" x2="162.33" y2="160.103" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#B85438"/>
|
||||
<stop offset="0.1933" stop-color="#AF5035"/>
|
||||
<stop offset="0.531" stop-color="#98462D"/>
|
||||
<stop offset="0.9707" stop-color="#753621"/>
|
||||
<stop offset="1" stop-color="#733520"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint28_linear_1_8834" x1="143.457" y1="164.343" x2="150.846" y2="164.343" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#B85438"/>
|
||||
<stop offset="0.1933" stop-color="#AF5035"/>
|
||||
<stop offset="0.531" stop-color="#98462D"/>
|
||||
<stop offset="0.9707" stop-color="#753621"/>
|
||||
<stop offset="1" stop-color="#733520"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint29_linear_1_8834" x1="42.4282" y1="64.841" x2="27.0903" y2="90.4985" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint30_linear_1_8834" x1="61.2261" y1="77.8443" x2="43.8792" y2="106.862" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint31_linear_1_8834" x1="49.8737" y1="74.2705" x2="15.6895" y2="131.454" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C23434"/>
|
||||
<stop offset="0.2521" stop-color="#BE3232"/>
|
||||
<stop offset="0.5412" stop-color="#B22D2D"/>
|
||||
<stop offset="0.8473" stop-color="#9F2626"/>
|
||||
<stop offset="1" stop-color="#932221"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint32_linear_1_8834" x1="52.9139" y1="75.1108" x2="35.0292" y2="105.029" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C23434"/>
|
||||
<stop offset="0.2521" stop-color="#BE3232"/>
|
||||
<stop offset="0.5412" stop-color="#B22D2D"/>
|
||||
<stop offset="0.8473" stop-color="#9F2626"/>
|
||||
<stop offset="1" stop-color="#932221"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint33_linear_1_8834" x1="64.2788" y1="72.9095" x2="50.1307" y2="129.502" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint34_linear_1_8834" x1="139.913" y1="101.753" x2="177.395" y2="148.69" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C23434"/>
|
||||
<stop offset="0.2521" stop-color="#BE3232"/>
|
||||
<stop offset="0.5412" stop-color="#B22D2D"/>
|
||||
<stop offset="0.8473" stop-color="#9F2626"/>
|
||||
<stop offset="1" stop-color="#932221"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint35_linear_1_8834" x1="153.087" y1="131.804" x2="168.879" y2="131.804" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint36_linear_1_8834" x1="171.015" y1="-4.13911" x2="181.575" y2="80.3421" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C23434"/>
|
||||
<stop offset="0.2521" stop-color="#BE3232"/>
|
||||
<stop offset="0.5412" stop-color="#B22D2D"/>
|
||||
<stop offset="0.8473" stop-color="#9F2626"/>
|
||||
<stop offset="1" stop-color="#932221"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint37_linear_1_8834" x1="86.878" y1="-9.21647" x2="152.292" y2="38.872" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0195531" stop-color="#CF5353"/>
|
||||
<stop offset="0.2989" stop-color="#CE504F"/>
|
||||
<stop offset="0.619" stop-color="#CA4645"/>
|
||||
<stop offset="0.9581" stop-color="#C33636"/>
|
||||
<stop offset="1" stop-color="#C23434"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint38_linear_1_8834" x1="181.78" y1="74.1131" x2="110.275" y2="74.7661" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#D9635A"/>
|
||||
<stop offset="1" stop-color="#F0A080"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint39_linear_1_8834" x1="112.782" y1="106.367" x2="105.168" y2="70.1713" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#D9635A"/>
|
||||
<stop offset="1" stop-color="#F0A080"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint40_linear_1_8834" x1="94.4218" y1="68.8851" x2="111.653" y2="116.998" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint41_linear_1_8834" x1="124.711" y1="58.0371" x2="141.942" y2="106.15" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint42_linear_1_8834" x1="84.3113" y1="64.7775" x2="163.16" y2="128.119" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint43_linear_1_8834" x1="114.428" y1="103.149" x2="127.873" y2="103.149" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0810056" stop-color="#D9635A"/>
|
||||
<stop offset="1" stop-color="#F0A080"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint44_linear_1_8834" x1="136.207" y1="102.605" x2="123.692" y2="98.3264" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint45_linear_1_8834" x1="99.7425" y1="105.046" x2="154.074" y2="63.412" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0810056" stop-color="#D9635A"/>
|
||||
<stop offset="1" stop-color="#F0A080"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint46_linear_1_8834" x1="139.008" y1="26.708" x2="142.066" y2="60.3443" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint47_linear_1_8834" x1="148.953" y1="36.6657" x2="210.546" y2="64.4046" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#E4E3F3"/>
|
||||
<stop offset="0.3772" stop-color="#DBDBE9"/>
|
||||
<stop offset="1" stop-color="#C5C7CF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 113 KiB |
@@ -1,783 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 25.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 500 500" style="enable-background:new 0 0 500 500;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#F4F3F4;}
|
||||
.st1{fill:#D8D8D4;}
|
||||
.st2{fill:#A2A19F;}
|
||||
.st3{fill:#F9C89F;}
|
||||
.st4{fill:#ECA87F;}
|
||||
.st5{fill:#88412D;}
|
||||
.st6{fill:#E41B16;}
|
||||
.st7{fill:#B91818;}
|
||||
.st8{fill:#571110;}
|
||||
.st9{fill:#FFE119;}
|
||||
.st10{fill:#EBA800;}
|
||||
.st11{fill:#B86317;}
|
||||
.st12{fill:#6C1510;}
|
||||
.st13{fill:#3D1011;}
|
||||
.st14{fill:#EE7677;}
|
||||
.st15{fill:#E65858;}
|
||||
.st16{fill:#C02129;}
|
||||
.st17{fill:#7BB1E1;}
|
||||
.st18{fill:#3D78BD;}
|
||||
.st19{fill:#2A59A5;}
|
||||
.st20{fill:#1F335E;}
|
||||
.st21{fill:#15233B;}
|
||||
.st22{fill:#384E65;}
|
||||
.st23{fill:#EA4E4F;}
|
||||
.st24{fill:#D1D1D1;}
|
||||
.st25{fill:#7C7C7D;}
|
||||
.st26{fill:#DDA376;}
|
||||
.st27{opacity:0.5;fill:#E0F1F7;}
|
||||
.st28{fill:#FFD625;}
|
||||
.st29{fill:#F6A02C;}
|
||||
.st30{opacity:0.5;fill:#F9AE0D;}
|
||||
.st31{fill:#F6A019;}
|
||||
.st32{fill:#7A6B70;}
|
||||
.st33{fill:#FFFFFF;}
|
||||
.st34{fill:#9F9F9F;}
|
||||
.st35{fill:#BABABA;}
|
||||
.st36{fill:#F18513;}
|
||||
.st37{fill:#BB6A15;}
|
||||
.st38{fill:#FAB61D;}
|
||||
.st39{fill:#D09A01;}
|
||||
.st40{opacity:0.4;fill:#FFFFFF;}
|
||||
.st41{fill:#FFF0B1;}
|
||||
.st42{opacity:0.8;fill:#FFD65E;}
|
||||
.st43{fill:#FBDEC5;}
|
||||
</style>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st0" d="M325.8,193.8c-1.5-3.7-3.3-12.6-3.3-12.6l-6.3-6c0,0-5.5,16.8-5.2,26.1c0.3,9.3,2,29.6,2,29.6
|
||||
s8.6,2.1,13.5-1.5c4.8-3.5,3.7-10.4,2-14.4c3.1,2.1,4.6,0,4.6,0s-2.7-4.4-3.7-9.7C328.3,200.1,327.3,197.5,325.8,193.8z"/>
|
||||
<path class="st1" d="M329.3,205.3c-1-5.2-2-7.8-3.5-11.5c-1.5-3.7-3.3-12.6-3.3-12.6l-3.3-3.2c1.6,10.2,3.3,20.3,7.6,30
|
||||
c-1.7-1.8-3.3-3-5-4.1c2.2,4.1,3.3,8.3,1.7,12.4c-1.9,4.6-6.8,5.7-11.3,4.7c0.4,5.6,0.8,9.9,0.8,9.9s8.6,2.1,13.5-1.5
|
||||
c4.8-3.5,3.7-10.4,2-14.4c3.1,2.1,4.6,0,4.6,0S330.4,210.5,329.3,205.3z"/>
|
||||
<path class="st2" d="M329.7,205.2c-1-5.2-2.1-7.9-3.5-11.5l0-0.1c-1.5-3.7-3.2-12.4-3.2-12.5l0-0.1l-6.9-6.6l-0.2,0.6
|
||||
c-0.2,0.7-5.5,17-5.2,26.3c0.3,9.2,1.9,29.4,2,29.6l0,0.3l0.3,0.1c0.1,0,2.6,0.6,5.7,0.6c3.5,0,6.2-0.7,8.1-2.2
|
||||
c4.4-3.2,4.2-9.2,2.6-13.8c0.6,0.3,1.2,0.4,1.7,0.4c1.5,0,2.3-1,2.3-1.1l0.2-0.2l-0.2-0.3C333.4,214.7,330.7,210.3,329.7,205.2z
|
||||
M331,215.4c-0.7,0-1.5-0.3-2.3-0.9l-1.2-0.8l0.6,1.4c1.9,4.4,2.5,10.6-1.9,13.8c-1.8,1.3-4.4,2-7.7,2c-2.4,0-4.4-0.4-5.2-0.5
|
||||
c-0.2-2.7-1.7-20.7-1.9-29.2c-0.2-8.1,4-22.2,5-25.3l5.7,5.5c0.2,1.2,1.8,9,3.2,12.6l0,0.1c1.5,3.7,2.5,6.2,3.5,11.3
|
||||
c0.9,4.5,3,8.4,3.6,9.5C332.3,215.1,331.8,215.4,331,215.4z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M330.3,481.5c-2.9-4.7-5.6-16.1-5.6-20.6c2.6-8.4,9.2-28,4-39.9c-11.6,5.9-24.3,9.3-36.9,8.1
|
||||
c0,0-1.7,12.9,3.3,21.9c5,9,9.6,13.7,10.2,19.1c0.3,2.5-5.4,11.8-3.8,17.6c1.5,4.7,15.3,5.6,22.3,4.7c7-0.9,11.7-4,11.7-4
|
||||
S333.2,486.2,330.3,481.5z"/>
|
||||
<path class="st4" d="M299.2,435.4c0,0,2.7,3.8,7.7,3.7c5-0.1,7.7-2.4,9.3-4.4C312.2,435.3,307.2,438.5,299.2,435.4z"/>
|
||||
<path class="st4" d="M330.3,481.5c-2.9-4.7-5.6-16.1-5.6-20.6c2.6-8.4,9.2-28,4-39.9c-3,1.5-6,2.8-9.1,4
|
||||
c7.1,14.3,0.9,30.8-1.9,45.1c8.1,0.3,10.2,18.9,8.4,21.9c5.7-1.2,9.4-3.6,9.4-3.6S333.2,486.2,330.3,481.5z"/>
|
||||
<path class="st5" d="M330.7,481.3c-2.9-4.7-5.5-15.9-5.5-20.3l0.3-1c2.8-8.9,8.7-27.6,3.7-39.1l-0.2-0.4l-0.4,0.2
|
||||
c-10.8,5.5-21.5,8.3-31.7,8.3c-1.7,0-3.4-0.1-5-0.2l-0.4,0l-0.1,0.4c-0.1,0.5-1.7,13.1,3.4,22.2c1.8,3.1,3.4,5.8,4.9,8.1
|
||||
c2.8,4.3,4.8,7.5,5.2,10.8c0.1,0.8-0.6,2.7-1.4,4.7c-1.5,3.9-3.5,9.2-2.4,13c1.3,3.9,10.1,5.3,17.3,5.3c2,0,3.9-0.1,5.5-0.3
|
||||
c7-0.9,11.7-3.9,11.9-4.1l0.5-0.3l-0.4-0.4C335.9,488,333.5,485.8,330.7,481.3z M323.8,491.9c-1.6,0.2-3.4,0.3-5.4,0.3
|
||||
c-7.4,0-15.4-1.5-16.5-4.7c-1-3.5,0.9-8.7,2.3-12.4c0.9-2.3,1.6-4.1,1.4-5.1c-0.4-3.6-2.4-6.8-5.3-11.2c-1.5-2.3-3.2-4.9-4.9-8
|
||||
c-4.4-7.9-3.5-18.9-3.3-21.2c1.5,0.1,3.1,0.2,4.7,0.2c10.2,0,20.8-2.7,31.7-8.2c4.6,11.3-1.1,29.3-3.9,38.1l-0.3,1.1l0,0.1
|
||||
c0,4.6,2.6,16,5.6,20.9c2.2,3.6,4.1,5.7,4.9,6.5C333.5,489,329.4,491.2,323.8,491.9z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M299.8,436.1c0,0,2.3,3.4,7.1,3.4c5.1,0,8.1-3.5,8.1-3.5C305.8,441.9,300,436.4,299.8,436.1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M319.6,468.4c0,0,3.4-2.2,6.2-9.5l-0.8-0.3C322.3,465.6,319.6,468.3,319.6,468.4z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M307.6,483.9c-4.1-1.1-8.1,0.8-8.9,4.2c-0.8,3.4,1.9,7.1,6,8.2c4.1,1.1,8.1-0.8,8.9-4.2
|
||||
C314.5,488.6,311.8,485,307.6,483.9z"/>
|
||||
<path class="st4" d="M298.7,488c0,0,0,0.1,0,0.1c-0.8,3.4,1.9,7.1,6,8.2c4.1,1.1,8.1-0.8,8.9-4.2c0.1-0.4,0.1-0.7,0.1-1.1
|
||||
C309.2,495.5,302.6,494.4,298.7,488z"/>
|
||||
<path class="st5" d="M307.7,483.5c-0.8-0.2-1.6-0.3-2.4-0.3c-3.5,0-6.3,2-7,4.9c-0.4,1.8,0,3.7,1.2,5.4c1.2,1.6,3,2.8,5.1,3.4
|
||||
c0.8,0.2,1.6,0.3,2.4,0.3c3.5,0,6.3-2,7-4.9c0.4-1.8,0-3.7-1.2-5.4C311.6,485.2,309.8,484,307.7,483.5z M313.3,492
|
||||
c-0.6,2.5-3.1,4.2-6.2,4.2c-0.7,0-1.5-0.1-2.2-0.3c-1.9-0.5-3.6-1.6-4.6-3.1c-1.1-1.4-1.4-3.1-1.1-4.6c0.6-2.5,3.1-4.2,6.2-4.2
|
||||
c0.7,0,1.5,0.1,2.2,0.3c1.9,0.5,3.6,1.6,4.6,3.1C313.2,488.8,313.6,490.4,313.3,492z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M334.2,486.1c-1.1,0.3-1.7,1.9-1.3,3.5c0.4,1.6,1.6,2.7,2.8,2.4c1.1-0.3,1.7-1.9,1.3-3.5
|
||||
C336.6,486.8,335.3,485.7,334.2,486.1z"/>
|
||||
<path class="st4" d="M337,488.4c-0.1-0.4-0.2-0.7-0.4-1c-0.3,2.3-2,3-3.5,2.4c0.5,1.5,1.6,2.5,2.7,2.2
|
||||
C336.8,491.6,337.4,490.1,337,488.4z"/>
|
||||
<path class="st5" d="M334.6,485.6c-0.2,0-0.3,0-0.5,0.1c-1.3,0.4-2,2.2-1.6,4.1c0.4,1.6,1.6,2.8,2.8,2.8c0.2,0,0.3,0,0.5-0.1
|
||||
c1.3-0.4,2-2.2,1.6-4.1C337,486.7,335.8,485.6,334.6,485.6z M335.6,491.5c-0.9,0.2-1.9-0.7-2.2-2.1c-0.3-1.4,0.1-2.7,1-3
|
||||
c0.1,0,0.2,0,0.3,0c0.8,0,1.6,0.9,2,2.1C336.9,489.9,336.5,491.3,335.6,491.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M330.6,486.7c-1.6,0-2.9,1.6-2.9,3.7c0,2,1.3,3.7,2.9,3.7c1.6,0,2.9-1.6,2.9-3.7
|
||||
C333.5,488.3,332.2,486.7,330.6,486.7z"/>
|
||||
<path class="st4" d="M327.8,491.2c0.3,1.6,1.4,2.8,2.8,2.8c1.6,0,2.9-1.6,2.9-3.7c0-0.5-0.1-0.9-0.2-1.4
|
||||
C332.4,491.5,330.6,492.4,327.8,491.2z"/>
|
||||
<path class="st5" d="M330.6,486.2c-1.8,0-3.3,1.8-3.3,4.1s1.5,4.1,3.3,4.1c1.8,0,3.3-1.8,3.3-4.1S332.5,486.2,330.6,486.2z
|
||||
M330.6,493.6c-1.4,0-2.5-1.4-2.5-3.2c0-1.8,1.1-3.2,2.5-3.2c1.4,0,2.5,1.4,2.5,3.2C333.1,492.1,332,493.6,330.6,493.6z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M324.9,488.3c-2,0-3.6,1.8-3.6,4c0,2.2,1.6,4,3.6,4c2,0,3.6-1.8,3.6-4C328.5,490.1,326.9,488.3,324.9,488.3z"
|
||||
/>
|
||||
<path class="st4" d="M321.4,492.9c0.2,2,1.7,3.5,3.5,3.5c2,0,3.6-1.8,3.6-4c0-0.3,0-0.7-0.1-1
|
||||
C326.7,493.5,323.8,494.4,321.4,492.9z"/>
|
||||
<path class="st5" d="M324.9,487.8c-2.2,0-4,2-4,4.5c0,2.5,1.8,4.5,4,4.5s4-2,4-4.5C328.9,489.8,327.1,487.8,324.9,487.8z
|
||||
M324.9,495.9c-1.7,0-3.1-1.6-3.1-3.6c0-2,1.4-3.6,3.1-3.6c1.7,0,3.1,1.6,3.1,3.6C328.1,494.3,326.6,495.9,324.9,495.9z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M317.7,488.6c-2.3,0-4.1,1.9-4.1,4.2c0,2.3,1.8,4.2,4.1,4.2s4.1-1.9,4.1-4.2
|
||||
C321.9,490.5,320,488.6,317.7,488.6z"/>
|
||||
<path class="st4" d="M313.6,492.3c0,0.2,0,0.4,0,0.5c0,2.3,1.8,4.2,4.1,4.2s4.1-1.9,4.1-4.2c0-0.2,0-0.3,0-0.5
|
||||
C319.6,494.6,315.9,495.1,313.6,492.3z"/>
|
||||
<path class="st5" d="M317.7,488.2c-2.5,0-4.5,2.1-4.5,4.6c0,2.5,2,4.6,4.5,4.6c2.5,0,4.5-2.1,4.5-4.6
|
||||
C322.3,490.3,320.2,488.2,317.7,488.2z M317.7,496.5c-2,0-3.7-1.7-3.7-3.7c0-2.1,1.7-3.7,3.7-3.7c2,0,3.7,1.7,3.7,3.7
|
||||
C321.4,494.9,319.8,496.5,317.7,496.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st3" d="M256.6,430.4c-11.1-0.7-37.7-9.4-37.7-9.4s0.1,22.7,9.4,42.6c-5.4,1.4-12.6,7-18.1,11.1
|
||||
c-4,2.6-7,3.4-9.5,3.1c-2.5-0.4-9.5-2-10.7-0.6c-1.2,1.4,0,3.2,0,3.2s-3.4,0.9-2.7,4.8c0.2,1.2,1.7,2.3,1.7,2.3s-1.1,2.4,1,5.3
|
||||
c2.1,3,4.7,3.5,7.4,3.3s5.9-1.1,5.9-1.1s1.7,4.4,9.2,4.1c7.5-0.3,9.3-3.9,13.3-6.5c4-2.6,7.5-1.1,12.7-0.3
|
||||
c5.2,0.8,9.7,1.1,13.2-0.4c3.5-1.5,5.4-6.4,4.6-11.3c-0.7-4.9-3.7-6.2-4.9-10.1c-1.2-3.9-0.4-10,3.3-17.8
|
||||
C258.6,444.6,258.8,436,256.6,430.4z"/>
|
||||
<path class="st4" d="M237,484.4c0,0,7.1,2.7,9-1.4c0.9-2.4-0.7-5-1.8-6.7C244.6,480.8,245.8,485,237,484.4z"/>
|
||||
<path class="st4" d="M196.3,479.9c-1.9-1.6-4.9-1-6.7-2c-0.4,1.2,0.4,2.4,0.4,2.4s-0.1,0-0.2,0.1l0.1,0.1
|
||||
C192,480.4,194.2,479.3,196.3,479.9z"/>
|
||||
<path class="st4" d="M197.4,484c-2.9-2.4-7.1-1.2-9.8-1.8c-0.3,0.7-0.5,1.6-0.3,2.8c0.1,1,1.2,1.8,1.6,2.2
|
||||
C190.4,484,194.4,483.5,197.4,484z"/>
|
||||
<path class="st4" d="M251.5,470.3c-1.2-3.9-0.4-10,3.3-17.8c3.8-7.8,3.9-16.4,1.7-22c-3-0.2-7.1-1-11.6-2
|
||||
c1.1,10.1,3.2,16.3,0.8,31.6c-0.5,3.1-0.8,8.8,0.8,11.8c3.9,4.7,5.2,8.3,4.1,13c-0.8,3.5-6.7,4.6-8.9,4.2
|
||||
c-9.4-1.5-13-3.8-22.5,2.1c-4.1,2.6-12.6,3.1-15.1,0.1c-3.2,1.9-10,3.6-14.4,1.2c0.1,0.1,0.1,0.2,0.2,0.3c2.1,3,4.7,3.5,7.4,3.3
|
||||
s5.9-1.1,5.9-1.1s1.7,4.4,9.2,4.1c7.5-0.3,9.3-3.9,13.3-6.5c4-2.6,7.5-1.1,12.7-0.3c5.2,0.8,9.7,1.1,13.2-0.4
|
||||
c3.5-1.5,5.4-6.4,4.6-11.3C255.7,475.5,252.7,474.2,251.5,470.3z"/>
|
||||
<path class="st5" d="M257,430.2l-0.1-0.3l-0.3,0c-10.9-0.7-37.4-9.3-37.6-9.4l-0.5-0.2l0,0.6c0,0.2,0.2,22.6,9.2,42.3
|
||||
c-5.1,1.5-11.7,6.5-17,10.5l-0.8,0.6c-3.8,2.4-6.7,3.4-9.2,3c-0.4-0.1-0.9-0.2-1.5-0.3c-2.1-0.4-4.9-0.9-6.9-0.9
|
||||
c-1.4,0-2.2,0.2-2.6,0.7c-0.9,1.1-0.7,2.4-0.3,3.2c-1,0.5-3.1,1.8-2.5,5.1c0.2,1.1,1.1,2,1.6,2.4c-0.3,0.8-0.6,2.9,1.1,5.4
|
||||
c1.7,2.3,3.8,3.5,6.6,3.5c0.4,0,0.7,0,1.1-0.1c2.2-0.2,4.8-0.8,5.7-1c0.6,1,2.7,4,8.8,4c0.2,0,0.5,0,0.7,0
|
||||
c5.7-0.2,8.2-2.4,10.7-4.4c0.9-0.7,1.8-1.5,2.8-2.2c1.5-0.9,3-1.4,4.7-1.4c1.5,0,3,0.3,4.8,0.6c0.9,0.2,1.9,0.4,2.9,0.5
|
||||
c3,0.5,5.2,0.7,7.1,0.7h0c2.5,0,4.5-0.4,6.3-1.1c3.6-1.5,5.7-6.5,4.9-11.8c-0.4-2.9-1.6-4.6-2.8-6.2c-0.9-1.2-1.7-2.4-2.2-4
|
||||
c-1.3-4.2-0.1-10.4,3.3-17.5C258.7,445.3,259.4,436.5,257,430.2z M251.1,470.4c0.5,1.8,1.4,3,2.3,4.2c1.1,1.6,2.2,3.1,2.6,5.8
|
||||
c0.7,4.8-1.2,9.5-4.4,10.9c-1.6,0.7-3.6,1-6,1c-1.9,0-4.1-0.2-7-0.6c-1-0.2-2-0.3-2.9-0.5c-1.8-0.3-3.4-0.6-5-0.6
|
||||
c-1.9,0-3.6,0.5-5.2,1.5c-1.1,0.7-2,1.5-2.9,2.2c-2.5,2.1-4.8,4-10.2,4.2c-7.1,0.3-8.8-3.7-8.8-3.8l-0.1-0.3l-0.3,0.1
|
||||
c0,0-3.3,0.8-5.9,1.1c-0.4,0-0.7,0.1-1.1,0.1c-2.6,0-4.4-1-6-3.1c-1.9-2.7-1-4.8-0.9-4.9l0.2-0.4l-0.3-0.2
|
||||
c-0.4-0.3-1.4-1.1-1.5-2c-0.6-3.4,2.3-4.2,2.4-4.3l0.6-0.2l-0.4-0.5c0,0-1-1.5,0-2.6c0.1-0.1,0.5-0.4,2-0.4c2,0,4.8,0.5,6.8,0.9
|
||||
c0.6,0.1,1.1,0.2,1.6,0.3c2.7,0.4,5.7-0.5,9.8-3.1l0.8-0.6c5.4-4.1,12.1-9.2,17.2-10.5l0.5-0.1l-0.2-0.5
|
||||
c-8.3-17.8-9.2-38-9.3-41.8c3.9,1.2,26.7,8.5,37,9.2c2.2,6.1,1.5,14.4-1.8,21.4C251,459.5,249.8,466,251.1,470.4z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M197.7,483.8c-3.4-0.4-7.4-1-9,3.3l0.8,0.3c1.4-3.7,4.9-3.2,8.2-2.8l0.5,0.1c3.5,0.4,7,0.6,7,0.6
|
||||
c0,0-3.5-1-6.9-1.5L197.7,483.8z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M189.9,479.9l0.2,0.9c3.6-1,8-0.5,8-0.5C197.9,480.2,193.7,478.8,189.9,479.9z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M244.2,476.3c0,0.1,3.2,5,1,7.4c-2.3,2.4-8.2,0.7-8.2,0.7c0.2,0.1,2.7,1.2,5.2,1.2c1.3,0,2.6-0.3,3.6-1.3
|
||||
C248.5,481.5,244.2,476.3,244.2,476.3z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st6" d="M327.6,342.4c0,0-63.6,51.2-124.4-0.8c0,0-2.4,56-6.1,74.3c6.7,3.5,35.7,18.7,61.7,17.5
|
||||
c2.8-9.7,5.2-36.2,5.2-36.2s2.5-0.1,4.6-0.4c0.6,5.1,3.4,23.9,3.4,34.9c10,3,43.2,4.4,69.2-15.1c-2.2-12.4-4.3-23.1-8-43
|
||||
C329.4,353.8,327.6,342.4,327.6,342.4z"/>
|
||||
<path class="st7" d="M288.3,383.5c-10.3,11.6-37.4,11.2-55.2,5.9c14.8,9,12.1,28.1,5.5,42.1c6.6,1.4,13.5,2.1,20.1,1.8
|
||||
c2.8-9.7,5.2-36.2,5.2-36.2s2.5-0.1,4.6-0.4c0,0.1,0,0.2,0,0.2C276.5,394.7,288.3,393.9,288.3,383.5z"/>
|
||||
<path class="st7" d="M333.1,373.7c-3.7-19.9-5.6-31.3-5.6-31.3s-8.7,7-22.7,13.2c10.2,9.2,14.5,24.8,16.3,38.7
|
||||
c2,11.6,1.3,25-4.7,34.9c8.3-2.6,16.8-6.6,24.6-12.4C338.9,404.2,336.9,393.6,333.1,373.7z"/>
|
||||
<path class="st8" d="M336.6,389.9c-0.9-4.7-1.9-10.1-3-16.3c-3.7-19.7-5.6-31.2-5.6-31.3l-0.1-0.7l-0.5,0.4
|
||||
c-0.3,0.2-28.3,22.5-64.3,22.5c-21.5,0-41.6-7.8-59.6-23.2l-0.6-0.5l0,0.9c0,0.6-2.5,56.1-6.1,74.2l-0.1,0.3l0.3,0.2
|
||||
c21.5,11.4,42.5,17.7,59,17.7c1,0,2,0,2.9-0.1l0.3,0l0.1-0.3c2.6-9,4.9-32.6,5.2-35.9c0.7,0,2.3-0.1,3.8-0.3
|
||||
c0.1,1.1,0.3,2.6,0.6,4.5c1,8,2.7,21.3,2.7,29.9v0.3l0.3,0.1c3.7,1.1,9.7,1.8,15.9,1.8c11.6,0,34.1-2.2,53.7-16.9l0.2-0.2
|
||||
l-0.1-0.3C340,408,338.6,400.4,336.6,389.9z M287.7,433c-6,0-11.7-0.6-15.4-1.6c0-8.6-1.7-21.8-2.8-29.7c-0.3-2.1-0.5-3.8-0.6-4.9
|
||||
l0-0.4l-0.4,0.1c-2,0.2-4.5,0.4-4.5,0.4l-0.4,0l0,0.4c0,0.3-2.4,26.1-5.1,35.8c-0.9,0-1.7,0.1-2.6,0.1c-16.3,0-37-6.2-58.3-17.4
|
||||
c3.4-17.2,5.7-66,6-73.2c18,15.2,38,22.9,59.4,22.9c33.5,0,60.1-19.1,64.2-22.2c0.5,2.8,2.3,13.7,5.5,30.6
|
||||
c1.2,6.2,2.2,11.5,3,16.3c2,10.4,3.4,18,4.9,26.4C321.3,430.9,299.2,433,287.7,433z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st8" d="M265.6,396.7c-17.5,1.1-33.8-8.1-33.9-8.2c0,0,3.7,3.1,9.9,5.3c5.7,2,13.2,3.9,21.1,3.9c1,0,2,0,3-0.1
|
||||
c5.9-0.4,10.5-1.6,13.9-3c6.9-2.8,8.6-7.3,8.6-7.3C288.1,387.4,283,395.5,265.6,396.7z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st9" d="M197,415.9c6.7,3.5,35.7,18.7,61.7,17.5c0.5-1.8,1.1-4.3,1.5-7.1c-37.1-4.8-56.5-16.7-61.8-20.4
|
||||
C198.1,409.8,197.6,413.2,197,415.9z"/>
|
||||
<path class="st10" d="M258.8,433.4c0.5-1.8,1.1-4.3,1.5-7.1c-6.7-0.9-12.9-2-18.4-3.2c-0.9,2.9-2,5.8-3.2,8.5
|
||||
C245.3,432.9,252.1,433.7,258.8,433.4z"/>
|
||||
<path class="st11" d="M198.8,405.6l-0.6-0.4l-0.1,0.7c-0.5,4.1-1,7.4-1.5,9.9l-0.1,0.3l0.3,0.2c21.5,11.4,42.5,17.7,59,17.7h0
|
||||
c1,0,2,0,2.9-0.1l0.3,0l0.1-0.3c0.5-1.7,1-4.1,1.6-7.2l0.1-0.5l-0.4-0.1C223.3,421.1,203.9,409.1,198.8,405.6z M258.5,433
|
||||
c-0.9,0-1.7,0.1-2.6,0.1h0c-16.3,0-37-6.2-58.3-17.4c0.5-2.3,0.9-5.3,1.4-8.9c5.8,4,25.2,15.3,60.9,20
|
||||
C259.4,429.3,258.9,431.4,258.5,433z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st9" d="M307.5,421.6c-17.8,3.6-30.8,2.8-35.9,2.6c0.2,2.7,0.3,5.3,0.3,7.6c10,3,43.2,4.4,69.2-15.1
|
||||
c-0.6-3.1-1.1-6.1-1.7-9.1C334.4,411.2,323.7,418.3,307.5,421.6z"/>
|
||||
<path class="st10" d="M339.5,407.5c-3.5,2.5-9.6,6.7-18.5,10.1c-0.9,4.1-2.4,8-4.5,11.5c8.3-2.6,16.8-6.6,24.6-12.4
|
||||
C340.6,413.6,340,410.6,339.5,407.5z"/>
|
||||
<path class="st11" d="M339.9,407.4l-0.1-0.7l-0.5,0.4c-9.5,6.9-20.2,11.6-31.8,14c-9.3,1.9-18.5,2.8-27.4,2.8
|
||||
c-3.6,0-6.4-0.2-8.3-0.3l-0.6,0l0,0.5c0.2,2.9,0.3,5.5,0.3,7.6v0.3l0.3,0.1c3.7,1.1,9.7,1.8,15.9,1.8c0,0,0,0,0,0
|
||||
c11.6,0,34.1-2.2,53.7-16.9l0.2-0.2l-0.1-0.3C341,413.5,340.4,410.5,339.9,407.4z M287.7,433L287.7,433c-6,0-11.7-0.6-15.4-1.6
|
||||
c0-1.9-0.1-4.2-0.3-6.8c1.9,0.1,4.6,0.2,8,0.2c9,0,18.2-1,27.5-2.8c11.5-2.3,22.2-7,31.6-13.7c0.5,2.7,1,5.4,1.5,8.2
|
||||
C321.3,430.9,299.2,433,287.7,433z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st3" d="M195.6,235.7c-9.3,9.7-20.6,21.7-20.8,24.4c-6.1-10.2-12.1-16.8-17.8-21.3c2-8.9,1.9-20.2,0-25.4
|
||||
c-1.9-5.2-2.1-6.6-3.4-12.1c-1.3-5.4-5-12.8-9.4-14c-2.9-1-6.5,2.2-5.6,6.4c-1.4-2.8-4.5-4.6-6.9-2.9c-2.4,1.8-2.7,5.4-1.3,8.8
|
||||
c-2.8-2.1-8.8-1.8-7.2,5c-2.2,0.3-5.6,6.8-0.7,11.4c3.4,3.6,4.8,5.9,5.4,7.5c0.1,7.3,0,15.8,12,20.8c0.6,6.8,3.4,53.1,24.6,63.6
|
||||
c5.8,2.8,9.6,0.8,16.4-2.2c8.3-3.8,30-8.9,31.1-28.8c-0.6-18.1,4.8-51.3,4.8-51.3S204.9,226.1,195.6,235.7z"/>
|
||||
<path class="st4" d="M150.6,239.3c13.9,10.1,24,25.4,29.6,42c-0.4-7.6-2.8-14.4-5.4-21.3c0,0.1,0,0.1,0,0.2
|
||||
c-6.1-10.2-12.1-16.8-17.8-21.3c0.4-1.7,0.7-3.4,0.9-5.2C155.8,236.1,153.5,238,150.6,239.3z"/>
|
||||
<path class="st4" d="M156.7,212.9c-1.6-4.6-2-6.2-3.2-11.4c-1.3-5.4-5-12.8-9.4-14c-0.5-0.2-1.1-0.2-1.7-0.1
|
||||
c3,2.7,5.7,5.5,4.9,10.1c4,4.8,6,12,5.5,18.2C154.2,214.7,155.2,213.3,156.7,212.9z"/>
|
||||
<path class="st4" d="M138.4,193c0,0.3,0.1,0.6,0.1,0.8c-1.4-2.7-4.4-4.6-6.8-2.9c4,1.5,7.1,4.8,5.7,9.4c3.7,1.8,3.2,7.1,4.3,10.6
|
||||
c1-1,1.9-2,3.2-2.7C142.9,203.3,141.3,198,138.4,193z"/>
|
||||
<path class="st4" d="M138.3,212.7c-3-4.3-4.2-10-8.1-13.2c0,0.1,0.1,0.2,0.1,0.3c-1.2-0.9-3-1.3-4.5-1c3,1.6,5.1,4.3,5.3,8.7
|
||||
c3.6,0.7,5,4.9,4.5,8.2C136.5,214.6,137.4,213.7,138.3,212.7z"/>
|
||||
<path class="st4" d="M126.6,214.8c2.2,1.1,4.5,2.3,4.7,4.6c0.5-0.7,0.9-1.5,1.3-2.2c-3.5-3.9-4.8-9.6-9.8-12.3
|
||||
c-0.6,0.3-1.2,0.9-1.7,1.8C123.9,208.4,126.3,210.9,126.6,214.8z"/>
|
||||
<path class="st4" d="M214.6,244.6c-9.1,5.2-13.4,27-17.9,37.3c-3.3,7.7-12.8,16.3-20.6,18.1c-2.8,1.2-12.8,5.9-19.7,1.5
|
||||
c2.4,2.8,5.1,5.1,8.2,6.7c5.8,2.8,9.6,0.8,16.4-2.2c8.3-3.8,30-8.9,31.1-28.8C211.8,272.4,214.1,250.6,214.6,244.6z"/>
|
||||
<path class="st5" d="M195.3,235.4c-9.8,10.1-18.9,19.9-20.6,23.7c-5.3-8.8-11-15.5-17.3-20.4c1.9-8.6,1.9-19.9-0.1-25.4
|
||||
c-1.7-4.6-2.1-6.3-3-10.4l-0.4-1.6c-1.2-4.8-4.8-13-9.7-14.3c-0.4-0.1-0.8-0.2-1.2-0.2c-1.4,0-2.9,0.8-3.9,2.1
|
||||
c-0.7,1-1.1,2.1-1.2,3.3c-1.2-1.4-2.7-2.3-4.3-2.3c-0.8,0-1.6,0.3-2.3,0.8c-2.2,1.6-2.9,4.8-1.9,8.2c-0.8-0.4-1.8-0.6-2.7-0.6
|
||||
c-1.5,0-2.8,0.6-3.5,1.6c-0.8,1.1-1,2.7-0.6,4.7c-1.1,0.4-2.2,1.9-2.8,3.8c-0.4,1.4-1,5.1,2.3,8.3c2.9,3.2,4.6,5.6,5.3,7.3l0,0.3
|
||||
c0.1,7.3,0.2,15.7,12,20.7l0.1,0.6c2.6,34.1,11.4,56.5,24.8,63.1c1.9,1,3.7,1.4,5.6,1.4h0c3.2,0,6.2-1.4,10.3-3.3l0.8-0.4
|
||||
c1.2-0.5,2.7-1.1,4.4-1.8c9.7-3.8,26-10.1,27-27.4c-0.6-17.9,4.8-50.9,4.8-51.2l0.1-0.5l-0.5,0
|
||||
C216.6,225.4,204.6,225.8,195.3,235.4z M211.5,277.1c-0.9,16.7-16.9,22.9-26.4,26.6c-1.7,0.7-3.2,1.2-4.4,1.8l-0.8,0.4
|
||||
c-4,1.9-7,3.2-10,3.2c-1.7,0-3.4-0.4-5.2-1.3c-13.1-6.5-21.7-28.6-24.3-62.3l-0.1-1.2l-0.2-0.1c-11.5-4.8-11.6-12.9-11.7-20
|
||||
l0-0.4l0-0.2c-0.7-1.8-2.5-4.3-5.5-7.7c-3-2.8-2.5-6.1-2.1-7.4c0.6-1.9,1.7-3.2,2.5-3.3l0.5-0.1l-0.1-0.5
|
||||
c-0.5-1.9-0.3-3.4,0.4-4.3c0.6-0.8,1.6-1.3,2.9-1.3c1.2,0,2.4,0.4,3.3,1l1.2,0.9l-0.6-1.5c-1.4-3.4-0.9-6.7,1.2-8.2
|
||||
c0.6-0.4,1.2-0.6,1.8-0.6c1.7,0,3.4,1.3,4.4,3.3l1.5,3l-0.7-3.3c-0.3-1.6,0-3.1,0.9-4.3c1.1-1.4,2.7-2.1,4.2-1.6
|
||||
c4.3,1.2,7.9,8.7,9.1,13.7l0.4,1.6c1,4.2,1.4,5.9,3.1,10.5c1.9,5.3,1.9,16.8,0,25.1l-0.1,0.3l0.2,0.2c6.5,5.1,12.3,12,17.7,21.2
|
||||
l0.7,1.1l0.1-1.3c0.2-2.8,14.6-17.8,20.7-24.2c8-8.3,18-9.6,20.4-9.8C215.6,230.7,211,260.4,211.5,277.1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M358.6,254.4c-5-13-16.2-35.6-54-30.6c-37.8,4.9-86,4.6-86,4.6s-19.5,22.8-9.2,55.3
|
||||
c-7.3,10.9-17.1,32.5-9.8,53.5c8.9,25.4,27.3,31.7,53.5,33.8c26.2,2.1,67.5-10.3,75.3-27.8c7.8-17.4-3.9-39.6-3.9-39.6
|
||||
s9.8,15,21.8,25c12,10.1,28.4,9.8,32.3-3.5c3.9-13.3-1.6-22.8-4.8-31C370.6,285.7,363.6,267.4,358.6,254.4z"/>
|
||||
<path class="st4" d="M207.9,278.1l1.5,5.5c0,0,4.1-6.5,15.3-4.6C220.3,275.4,207.9,278.1,207.9,278.1z"/>
|
||||
<path class="st4" d="M326.6,306.5c-3.8-11.1-5-23-7-35.3c-1.1-4.7-2.8-8.9-4.5-13c-1.1,8.3-2.2,20.1-12.3,22.5
|
||||
c-10,2.4-19.5,0-29,1.2c15.6,3,32.7,9.9,34.6,28.4c6,58.6-60.7,62.2-91.4,50.7c9.5,6.3,21.6,8.8,36.2,10
|
||||
c26.2,2.1,67.5-10.3,75.3-27.8c7.8-17.4-3.9-39.6-3.9-39.6S325.3,304.6,326.6,306.5z"/>
|
||||
<path class="st4" d="M373.9,294c-3.3-8.3-10.2-26.6-15.2-39.6c-3.7-9.7-10.9-24.6-29.8-29.6c4,2.9,9.2,6,12,10
|
||||
c11.4,16.7,21.1,36.6,21.2,57.8c9.1,1.1,13.3,14.3,11.7,23c-0.6,4.1-3.3,10.1-7.3,10.6c-8.9,1.8-21.2-1.2-25.1-11.8
|
||||
c-1.5,2.4-1.2,5.3-1.4,8.2c2,2.1,4.2,4.1,6.4,6c12,10.1,28.4,9.8,32.3-3.5C382.6,311.7,377.1,302.2,373.9,294z"/>
|
||||
<path class="st5" d="M374.2,293.8c-2-5-5.3-13.6-8.7-22.7c-2.2-5.9-4.5-11.8-6.5-17c-5.2-13.6-15.5-31.6-44.2-31.6
|
||||
c-3.2,0-6.7,0.2-10.2,0.7c-33.8,4.4-76.2,4.6-84.4,4.6c-1,0-1.6,0-1.6,0l-0.2,0l-0.1,0.1c-0.2,0.2-19.5,23.2-9.4,55.5
|
||||
c-4.5,6.9-17.9,30.2-9.7,53.7c9,25.5,27.3,32,53.9,34.1c1.9,0.2,3.9,0.2,6,0.2c26.9,0,62.4-12.1,69.7-28.3
|
||||
c5.8-12.9,0.9-28.5-2-35.8c3.7,5.1,11,14.5,19.2,21.4c5.4,4.5,11.9,7.1,17.9,7.1c7.5,0,13-4,15.1-10.9
|
||||
c3.4-11.7-0.2-20.3-3.4-27.9C375.2,296,374.7,294.9,374.2,293.8z M378.3,324.9c-1.9,6.5-7.1,10.3-14.3,10.3
|
||||
c-5.8,0-12.1-2.5-17.4-6.9c-11.8-9.9-21.6-24.8-21.7-24.9l-0.7,0.5c0.1,0.2,11.5,22.2,3.9,39.2c-3.3,7.4-13,14.4-27.3,19.8
|
||||
c-13.1,5-28.6,7.9-41.6,7.9c-2.1,0-4.1-0.1-5.9-0.2c-26.3-2.1-44.4-8.4-53.2-33.5c-8.2-23.3,5.4-46.5,9.7-53.1l0.1-0.2l-0.1-0.2
|
||||
c-9.7-30.5,7.4-52.7,9-54.7c0.2,0,0.7,0,1.4,0c8.2,0,50.6-0.2,84.5-4.6c3.5-0.5,6.9-0.7,10.1-0.7c28.2,0,38.3,17.7,43.4,31.1
|
||||
c2,5.1,4.3,11.1,6.5,17c3.5,9.1,6.8,17.7,8.7,22.7c0.4,1.1,0.9,2.3,1.4,3.5C378,305.1,381.6,313.5,378.3,324.9z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M173.2,258.5c5.6,10.5,6.8,23.3,6.8,23.4c0,0,0.3-6.2-1.8-13.4c-1-3.4-2.4-7-4.2-10.5L173.2,258.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M121.7,214.8l-0.4,0.8c0.7,0.3,1.3,0.5,1.9,0.5c2,0,3.4-1.4,3.5-1.5C126.8,214.6,124,215.9,121.7,214.8z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M122.9,205.1c0.1,0.1,6.1,6.5,9.5,12.7l0.7-0.4c-3.5-6.3-9.6-12.8-9.6-12.8L122.9,205.1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M130,200.1c0,0.1,4.8,5.5,7.7,12.8l0.8-0.3c-2.9-7.5-7.8-13-7.9-13.1L130,200.1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M138.1,194.1c0,0.1,4.6,8,6.3,14.5l0.8-0.2c-1.7-6.6-6.3-14.6-6.4-14.7L138.1,194.1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M127.5,223.5l0.7,0.4c6.2-11.1,21.4-17.4,21.6-17.5c0,0-2.1-0.1-4.5,1.2
|
||||
C140.2,210.4,131.8,215.8,127.5,223.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M126.4,208l-0.2,0.9c0.4,0.1,0.7,0.1,1,0.1c2.4,0,4.3-2.4,4.4-2.5C131.6,206.5,128.8,208.7,126.4,208z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M132.4,201.8l-0.1,0.9c0.3,0.1,0.6,0.1,0.9,0.1c3.2,0,5.5-2.9,5.7-3C138.8,199.8,135.6,202.4,132.4,201.8z"
|
||||
/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M141.1,197.8l-0.2,0.8c0.8,0.3,1.7,0.4,2.4,0.4c2.4,0,4.1-1.1,4.2-1.1C147.4,197.8,144.3,198.8,141.1,197.8z
|
||||
"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M137.5,228.5c0-0.1,2.7-7.8,9.8-9.6c0,0-3.3,0.3-4.5,1.1c-2,1.4-3.5,3.2-4.4,4.8
|
||||
C137.2,226.6,137.5,228.5,137.5,228.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M165.4,202.4c-3.8,2.8-3.1,6.1-5.2,8.4c-2.1,2.3-2.5,1.7-6,4.1c-3.5,2.4-4.5,6.5-4.5,6.5l5.2,17.9
|
||||
c11.4-2.9,13.5-19.2,14.9-23.7c0.8-2.6,1.7-3.1,4.3-6.1c2.6-3,5.5-7.7,3.7-9.7C176,197.7,169.2,199.6,165.4,202.4z"/>
|
||||
<path class="st4" d="M169.8,215.6c0.8-2.6,1.7-3.1,4.3-6.1c2.6-3,5.5-7.7,3.7-9.7c-0.2-0.2-0.5-0.4-0.7-0.5
|
||||
c-2,5.3-8.2,7.1-9.2,11.6c-3,9.5-6,20.8-14,26.5l0.6,2.3C165.9,236.8,168.4,220.1,169.8,215.6z"/>
|
||||
<path class="st5" d="M165.1,202c-2.4,1.7-3.1,3.7-3.7,5.5c-0.4,1.1-0.8,2.2-1.6,3c-1.2,1.3-1.8,1.6-2.8,2.2
|
||||
c-0.7,0.4-1.7,0.9-3.1,1.9c-0.4,0.3-0.8,0.6-1.1,0.9c-2.7,2.5-2.7,6.1-2.7,6.1c0,0,1-4,4.3-6.3c1.4-1,2.3-1.5,3-1.8
|
||||
c1.1-0.6,1.8-0.9,3-2.3c0.9-1,1.3-2.1,1.7-3.3c0.6-1.7,1.2-3.5,3.4-5c3.7-2.7,10.3-4.5,11.9-2.6c1.5,1.7-0.9,5.9-3.7,9.1
|
||||
c-0.6,0.6-1,1.1-1.4,1.6c-1.6,1.7-2.3,2.5-3,4.6c-0.2,0.7-0.5,1.8-0.8,3c-1.5,6.5-4.4,18.5-13.8,20.8c0,0,2.8,0,4-0.7
|
||||
c6.9-4.3,9.3-14.2,10.6-19.9c0.3-1.2,0.5-2.3,0.8-3c0.6-1.9,1.2-2.6,2.8-4.3c0.4-0.5,0.9-1,1.4-1.6c2.9-3.4,5.7-8.1,3.7-10.3
|
||||
C176,197.1,168.8,199.4,165.1,202z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st0" d="M254.1,126.6c-21.8-0.4-27.6,9.1-29.2,17.3c0,0-4.6,21.2-4.1,38.4c-0.2,12.2-2.2,17.9-4.5,23.1
|
||||
c-2.2,5.1-6.1,11.9-3.6,23.9c-0.6,8.3,0.9,14.4,5.7,21.3c1.3,7.5,5.5,13.2,8.1,16.5c2.6,3.4,5,9.2,5,9.2s2-2,1.6-6.1
|
||||
c2.7,4.9,6.5,9.4,5.1,17.7c3.9-1,17.3-4.8,22.5-18.4c1.4,5.2-1,10.1-1,10.1s15.1,0.9,21.3-17.6c0.6,3.5-1.1,7.1-1.1,7.1
|
||||
s17-3.5,19.8-19.1c1.4,3,1,6.7,1,6.7s13.5-13.3,10-30c2,4.6,2.4,7.7,2.4,7.7s5-8.7,1.3-31c1.5,1.9,3.3,5.5,3.3,5.5
|
||||
s4.8-21.3-2.3-40.2C313.3,162.7,275.9,126.9,254.1,126.6z"/>
|
||||
<path class="st1" d="M228.1,228.6c0,0-2.2-4.6-2.1-9.5c-2.7,5.4-1.6,11.9,1.6,16.6c0-1.8,0-3.5,0-5.3c1.1,2.7,2.6,7.4,7.4,10.6
|
||||
c-3.7-6.4-5.1-10.4-6.3-18C227.6,224.8,228,227.3,228.1,228.6z"/>
|
||||
<path class="st1" d="M282,219.8c-0.6-2.4-1.1-5.4-2.9-8c0.8,5.4-2.5,18.3-3.7,20.7c3.3-3.2,5.2-6.4,5.4-9.9
|
||||
c1.1,1.8,1.1,3.9,0.6,6.9c2.5-4.8,3.6-7.7,4.6-14c1,3.2,0.3,5.2,0.4,8.7c2.2-6.5,3.3-13.6-1.1-19.5C285.2,210,284.2,215,282,219.8
|
||||
z"/>
|
||||
<path class="st1" d="M315.5,168.6c-0.8-2.1-5.9-7.8-13.2-14.4c3.9,10.9,7.4,21.8,8.4,33.7c-1.7-1.8-2.8-3.5-4.5-5.3
|
||||
c3.3,10.6,5.6,21.9,5,33.1c-3.3-2.4-4.5-6.5-7.8-8.9c0,10.6,0.6,21.3-1.7,31.9c-1.7-4.1-3.9-7.7-6.1-11.8c0,9.5-3.3,19.5-8.9,26.6
|
||||
c0.6-6.5-0.6-13.6-2.8-19.5c-2.8,11.8-6.1,27.2-19,31.3c1.1-7.7,1.1-15.4-2.2-21.9c-3.9,11.8-5.6,24.2-16.7,30.7
|
||||
c-0.6-1.8-1.7-3.5-2.8-4.1c-6.7-5.9-10-13-13.9-20.1c-0.6,4.1-1.7,8.3-1.1,12.4c-6.7-6.5-6.7-16.6-8.4-25.4
|
||||
c-1.7,1.8-2.2,8.3-3.9,4.7c-1.2-2-2.2-4-3.1-6.2c0.4,5.4,2.2,10.1,5.7,15.2c1.3,7.5,5.5,13.2,8.1,16.5c2.6,3.4,5,9.2,5,9.2
|
||||
s2-2,1.6-6.1c2.7,4.9,6.5,9.4,5.1,17.7c3.9-1,17.3-4.8,22.5-18.4c1.4,5.2-1,10.1-1,10.1s15.1,0.9,21.3-17.6
|
||||
c0.6,3.5-1.1,7.1-1.1,7.1s17-3.5,19.8-19.1c1.4,3,1,6.7,1,6.7s13.5-13.3,10-30c2,4.6,2.4,7.7,2.4,7.7s5-8.7,1.3-31
|
||||
c1.5,1.9,3.3,5.5,3.3,5.5S322.6,187.5,315.5,168.6z"/>
|
||||
<path class="st2" d="M254.1,126.1c-0.4,0-0.9,0-1.3,0c-16.6,0-26.1,6-28.3,17.7c0,0.2-4.6,21.5-4.1,38.5
|
||||
c-0.2,12.2-2.2,17.8-4.4,22.9c-0.2,0.5-0.4,1-0.7,1.5c-2.2,4.9-5.3,11.7-3,22.7c-0.6,8.6,1,14.7,5.7,21.5
|
||||
c1.4,7.9,5.9,13.8,8.1,16.6c2.5,3.3,4.9,9,5,9.1l0.2,0.6l0.4-0.4c0.1-0.1,1.6-1.6,1.7-4.8c0.2,0.3,0.4,0.6,0.5,0.9
|
||||
c2.4,4,4.9,8.2,3.7,15.1l-0.1,0.7l0.6-0.2c10.6-2.7,18.5-8.8,22.3-17.4c0.6,4.4-1.2,8.4-1.3,8.4l-0.3,0.6l0.6,0c0,0,0.1,0,0.4,0
|
||||
c2.5,0,14.6-0.8,20.7-16c-0.1,2.6-1.2,4.8-1.2,4.8l-0.4,0.8l0.8-0.2c0.2,0,16.3-3.6,19.8-18c0.7,2.5,0.5,5.1,0.4,5.1l-0.1,1.2
|
||||
l0.8-0.8c0.1-0.1,11.7-11.7,10.7-26.7c0.8,2.5,1,4.1,1,4.1l0.2,1.2l0.6-1.1c0.2-0.4,4.8-8.6,1.6-29.5c1.2,1.8,2.3,3.9,2.3,3.9
|
||||
l0.5,1l0.3-1.1c0-0.2,4.8-21.7-2.3-40.5C313.6,162.4,275.9,126.5,254.1,126.1z M317.6,207.6c-0.7-1.2-1.8-3.2-2.8-4.5l-1-1.3
|
||||
l0.3,1.6c2.9,17.4,0.5,26.5-0.7,29.6c-0.3-1.3-0.9-3.6-2.1-6.5l-1.7-3.9l0.9,4.2c2.9,13.9-6.4,25.6-9.2,28.8
|
||||
c0-1.4-0.1-3.7-1.1-5.7l-0.6-1.2l-0.2,1.3c-2.4,13.1-15.3,17.6-18.7,18.5c0.5-1.3,1.2-3.9,0.8-6.5l-0.3-1.7l-0.5,1.6
|
||||
c-5.4,15.9-17.2,17.2-20.3,17.3c0.6-1.5,1.9-5.5,0.8-9.7l-0.3-1.2l-0.5,1.2c-4.5,11.7-15.2,16.2-21.6,18c0.9-6.8-1.5-11-3.9-15.1
|
||||
c-0.4-0.7-0.9-1.5-1.3-2.3l-1-1.8l0.2,2c0.2,2.7-0.6,4.4-1.1,5.2c-0.7-1.6-2.7-5.9-4.8-8.6c-2.2-2.8-6.7-8.6-8-16.3l0-0.1
|
||||
l-0.1-0.1c-4.6-6.7-6.2-12.6-5.6-21l0-0.1l0-0.1c-2.2-10.7,0.7-17.3,2.9-22.2c0.2-0.5,0.5-1,0.7-1.5c2.3-5.2,4.3-10.9,4.5-23.3
|
||||
c-0.5-17,4-38.1,4.1-38.3c2.1-11.3,11.3-17,27.5-17c0.4,0,0.9,0,1.3,0c21.5,0.4,58.8,35.9,61,41.7
|
||||
C321.1,184.8,318.4,202.9,317.6,207.6z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st3" d="M254.1,126.6c-21.8-0.4-27.6,9.1-29.2,17.3c0,0-4.6,21.2-4.1,38.4c2.8,3.3,6.1,6.7,9.9,9.3
|
||||
c9.9,6.9,42.7,10.3,50.7,5.6c8-4.7,8.4-7.7,8.9-12.1c0.6-4.4,1.4-7.9,7.3-15c3.5-6.8,3.9-12.8,3-17.4
|
||||
C287.3,140.8,267.7,126.8,254.1,126.6z"/>
|
||||
<path class="st1" d="M231.6,150.8c0.4,0,9.2,1.1,10.3-2.3c1.1-3.4,1-8.8-0.6-9c-1.7-0.2-7.5-3.6-17.1,8.5
|
||||
C228.7,149.3,231.6,150.8,231.6,150.8z"/>
|
||||
<path class="st0" d="M240,144.8c1.6-0.6,2.5-2.4,2.3-4.2c-0.2-0.6-0.5-1-1-1.1c-1.5-0.2-6.6-3-14.8,5.8c0.1,0,0.2,0,0.3,0
|
||||
C231.2,144.7,235.7,146.6,240,144.8z"/>
|
||||
<path class="st1" d="M267.4,151.9c0,0-0.1-6.4,1.7-8.5c2.2-2.5,6.7-9,21,1.1c1.3,7.1,1.7,7.3,1.7,7.3H267.4z"/>
|
||||
<path class="st0" d="M269.1,146.1c4,2.1,9.7,1.8,14.1,0.3c-1.9-3.9-5.2-5.9-9-6.8c-2.5,0.9-4,2.8-5.1,3.7
|
||||
c-0.2,0.1-0.3,0.3-0.5,0.5C268.4,144.9,268.6,145.8,269.1,146.1z"/>
|
||||
<path class="st4" d="M227,144.8c0,0,3.9-8.4,17.7-9.5c13.8-1.2,22.4,0.7,30.9,3.8C265.5,129.3,225,124,227,144.8z"/>
|
||||
<path class="st4" d="M300.7,152.7c-3.8-3.4-8-6.9-12.5-10.2c-2.8,14.4,2.5,34.6-6.3,47.8c-5.4,8-13,7.3-21.5,8.8
|
||||
c9.1,0.7,17.5,0.2,21-1.9c8-4.7,8.4-7.7,8.9-12.1c0.6-4.4,1.4-7.9,7.3-15C301.2,163.3,301.5,157.3,300.7,152.7z"/>
|
||||
<path class="st5" d="M301.1,152.4l-0.1-0.1c-6.8-6.1-30.4-25.9-46.8-26.2c-0.4,0-0.9,0-1.3,0c-16.6,0-26.1,6-28.3,17.7
|
||||
c0,0.2-4.6,21.4-4.1,38.5l0,0.2l0.1,0.1c3.3,4,6.7,7.1,9.9,9.4c7,4.9,24.7,7.9,37.2,7.9h0c4.6,0,10.8-0.4,13.9-2.2
|
||||
c8.2-4.8,8.6-8,9.1-12.4c0.5-4.3,1.3-7.7,7.2-14.7l0.1-0.1c3.1-6,4.1-11.9,3.1-17.7L301.1,152.4z M297.3,169.9
|
||||
c-6,7.2-6.8,10.7-7.4,15.2c-0.5,4.3-0.9,7.2-8.7,11.8c-2.3,1.4-7.1,2.1-13.5,2.1h0c-12.3,0-29.9-3-36.7-7.7
|
||||
c-3.2-2.2-6.4-5.3-9.7-9.1c-0.5-16.9,4-37.9,4.1-38.1c2.1-11.3,11.3-17,27.5-17c0.4,0,0.9,0,1.3,0c16,0.3,39.2,19.8,46.2,25.9
|
||||
C301.2,158.4,300.2,164.1,297.3,169.9z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M241.3,194.5l-8,6.6c0,0,1.5,7.7,1.3,14.3c-0.2,6.6-0.5,14,10.1,13.9c10.6-0.1,17.4-9.2,15.8-23.5
|
||||
C255.2,200.9,241.3,194.5,241.3,194.5z"/>
|
||||
<path class="st4" d="M260.5,205.9c-0.7-0.6-1.5-1.3-2.4-2c2.4,8-1,18.1-7.7,21.2c-5.7,2.6-12.9,2.3-15.1-1
|
||||
c1.1,3.1,3.6,5.3,9.4,5.2C255.3,229.2,262.1,220.2,260.5,205.9z"/>
|
||||
<path class="st5" d="M260.9,205.7l-0.1-0.1c-5.3-5-18.8-11.2-19.4-11.4l-0.2-0.1l-8.4,6.9l0.1,0.3c0,0.1,1.5,7.7,1.3,14.2l0,0.1
|
||||
c-0.1,4.1-0.2,8.6,2.3,11.5c1.7,1.8,4.3,2.7,8,2.7l0.2,0c4.9,0,9-1.9,11.9-5.5c3.6-4.3,5.1-10.9,4.3-18.5L260.9,205.7z
|
||||
M256.1,223.7c-2.8,3.3-6.7,5.1-11.3,5.2l-0.2,0c-3.5,0-5.9-0.8-7.4-2.5c-2.3-2.6-2.2-6.8-2.1-10.8l0-0.1c0.2-5.9-1-12.7-1.3-14.1
|
||||
l7.6-6.3c1.8,0.8,13.9,6.5,18.8,11C260.9,213.4,259.5,219.6,256.1,223.7z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st12" d="M240.9,196.2l-4.5,3.5c0,0,2.1,5.2,2.2,10.8c0.1,5.6-1.8,7.6,0,9.1c1.8,1.6,8.2,3.3,13.1-0.7
|
||||
c4.9-3.9,6.3-7.3,4.9-13.2C250.9,203.7,240.9,196.2,240.9,196.2z"/>
|
||||
<path class="st13" d="M256.7,205.8c-2.9-1-6.9-3.4-10.1-5.6c-5,5.6-5.1,14.5-1.6,21.2c2.2-0.1,4.7-0.7,6.8-2.4
|
||||
C256.7,215,258.1,211.7,256.7,205.8z"/>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st14" d="M248.4,211.6c-5.9-1.1-9.1,3.3-10.4,5.8c-0.1,0.9,0.1,1.6,0.7,2.2c1.8,1.6,8.2,3.3,13.1-0.7
|
||||
c4.4-3.5,6-6.5,5.3-11.3C252.7,206.6,250.3,209.2,248.4,211.6z"/>
|
||||
<path class="st15" d="M257.1,207.7c-4.4-1.1-6.8,1.5-8.7,4c-2-0.4-3.7-0.1-5.1,0.5c2.3,0.3,3.3,0.8,3.6,4.2
|
||||
c0.6-3,3.9-5.4,5.7-3.7c1.5,2-1.6,7.3-6,8.6c1.8-0.3,3.6-0.9,5.3-2.3C256.2,215.5,257.8,212.4,257.1,207.7z"/>
|
||||
<path class="st16" d="M257.5,207.3l-0.3-0.1c-0.7-0.2-1.4-0.3-2.1-0.3c-3.2,0-5.2,2-6.9,4.2c-0.6-0.1-1.1-0.1-1.7-0.1
|
||||
c-5,0-7.7,3.9-8.9,6.2l0,0.1l0,0.1c-0.1,0.9,0,1.8,0.9,2.6c1,0.9,3.4,1.8,6.3,1.8h0c1.9,0,4.8-0.4,7.4-2.5
|
||||
c4.7-3.7,6.1-6.9,5.4-11.7L257.5,207.3z M251.6,218.6c-2.4,1.9-5.1,2.3-6.9,2.3c-2.6,0-4.8-0.8-5.7-1.6
|
||||
c-0.5-0.4-0.7-0.9-0.6-1.8c1.1-2.2,3.7-5.7,8.2-5.7c0.6,0,1.2,0.1,1.8,0.2l0.2,0l0.2-0.2c1.6-2.1,3.5-4.1,6.4-4.1
|
||||
c0.5,0,1,0.1,1.6,0.2C257.2,212.3,255.8,215.2,251.6,218.6z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st16" d="M246.9,216.1c0,0,0.6-2.5,2.3-4.8l-0.7-0.6C246.7,213.2,246.9,216.1,246.9,216.1z"/>
|
||||
</g>
|
||||
<path class="st5" d="M257.1,205.4l-0.2-0.1c-5.7-2-15.6-9.4-15.7-9.5l-0.2-0.2l-5,4l0.1,0.3c0,0.1,2.1,5.2,2.2,10.6
|
||||
c0,2.3-0.3,4-0.5,5.3c-0.3,1.9-0.6,3.1,0.6,4.2c1,0.9,3.4,1.8,6.3,1.8h0c1.9,0,4.8-0.4,7.4-2.5c5.2-4.1,6.5-7.7,5.1-13.7
|
||||
L257.1,205.4z M251.6,218.6c-2.4,1.9-5.1,2.3-6.9,2.3c-2.6,0-4.8-0.8-5.7-1.6c-0.8-0.7-0.7-1.4-0.4-3.3c0.2-1.3,0.6-3.1,0.5-5.5
|
||||
c-0.1-4.9-1.7-9.4-2.1-10.6l4-3.1c1.6,1.2,10,7.4,15.4,9.4C257.6,211.6,256.4,214.8,251.6,218.6z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st0" d="M270.5,190.9c-7.1-2.2-16.7-5.2-24.7-3.7c-6.4,0.6-8.4-0.7-12.2-3.4c-3.8-2.7-7.5-2.7-10.4-3.4
|
||||
c-5.3-1.3-7.2-6.8-7.2-6.8s-6.8,9.8,0.8,19.5c0,0-1.2-0.2-2.6-0.6c1.9,3.8,3.5,8.1,11.9,7c-2.5,2.1-3.8,2.3-3.8,2.3
|
||||
s7.8,5.2,17.5-2.8c2.9,4.9,6.5,11.6,20.8,11.5c-2.2-1.6-2.8-3.9-2.8-3.9s5.4,6,18.5-0.1c-1.7-0.4-4.3-1.8-4.3-1.8
|
||||
s11.5,1.3,16.4-13.7C283.2,192.3,277.6,193.2,270.5,190.9z"/>
|
||||
<path class="st1" d="M263.8,200.9c1.7,1.8,2.8,4.1,5,5.3c-6.1,0.6-12.3-1.8-16.2-6.5c-0.6,2.4,0.6,4.1,0.6,6.5
|
||||
c-6.1-2.4-10-8.9-14.5-13.6c-0.6,4.1-5,7.1-8.4,7.1c1.1-1.8,1.7-3.5,1.7-5.3c-3.9,3-8.4,3-12.8,1.8c1.7,0,3.3-0.6,4.5-1.8
|
||||
c-8-1.6-9.7-11.7-8.4-19.3c-1.5,3-4.3,10.6,1.6,18.1c0,0-1.2-0.2-2.6-0.6c1.9,3.8,3.5,8.1,11.9,7c-2.5,2.1-3.8,2.3-3.8,2.3
|
||||
s7.8,5.2,17.5-2.8c2.9,4.9,6.5,11.6,20.8,11.5c-2.2-1.6-2.8-3.9-2.8-3.9s5.4,6,18.5-0.1c-1.7-0.4-4.3-1.8-4.3-1.8
|
||||
s11.5,1.3,16.4-13.7c-0.4,0.1-0.9,0.2-1.3,0.3C282.5,198.7,272.3,202.6,263.8,200.9z"/>
|
||||
<path class="st2" d="M279.1,191.9c-2.8,0-5.6-0.4-8.5-1.3c-5.6-1.7-13.2-4.1-20.2-4.1c-1.7,0-3.2,0.1-4.6,0.4
|
||||
c-1,0.1-1.9,0.1-2.7,0.1c-4.1,0-5.9-1.1-9.2-3.4c-2.9-2.1-5.8-2.6-8.3-3c-0.8-0.1-1.6-0.3-2.3-0.5c-5-1.3-6.8-6.5-6.9-6.5
|
||||
l-0.3-0.8l-0.5,0.7c-0.1,0.1-6.5,9.5,0.2,19.1c-0.4-0.1-0.9-0.2-1.4-0.4l-0.9-0.3l0.7,1.4c1.6,3.2,3.3,6.9,9.6,6.9
|
||||
c0.3,0,0.7,0,1,0c-1.6,1.1-2.4,1.3-2.4,1.3l-1.2,0.1l1,0.7c0.1,0.1,2.6,1.7,6.6,1.7c3.7,0,7.4-1.4,11-4.3l0,0
|
||||
c2.8,4.7,6.7,11.2,20.5,11.2l1.8,0l-1.1-0.8c-0.9-0.7-1.5-1.5-1.9-2.2c1.3,0.8,3.4,1.7,6.7,1.7c3.3,0,7-0.9,11-2.8l1.2-0.6
|
||||
l-1.3-0.3c-0.8-0.2-1.7-0.6-2.5-0.9c3.5-0.3,11.2-2.4,15-14l0.2-0.8l-0.7,0.2C285.7,191.2,282.6,191.9,279.1,191.9z M272.9,204.3
|
||||
c-0.4,0-0.7,0-0.7,0l-2.2-0.2l1.9,1.1c0.1,0,1.6,0.9,3.2,1.5c-3.5,1.5-6.7,2.2-9.5,2.2c-5.1,0-7.4-2.5-7.4-2.5l-1.2-1.3l0.5,1.7
|
||||
c0,0.1,0.5,1.8,2,3.3c-12.7-0.2-16.2-6.1-19-10.8l-0.5-0.9l-0.4,0.3c-3.5,2.9-7.2,4.4-10.8,4.4c-2.4,0-4.3-0.7-5.3-1.1
|
||||
c0.7-0.3,1.7-0.9,3-2l1.1-1l-1.4,0.2c-0.8,0.1-1.6,0.2-2.4,0.2c-5.6,0-7.2-2.9-8.7-6.1c0.9,0.2,1.7,0.4,1.7,0.4l1.1,0.2l-0.7-0.9
|
||||
c-6.3-8-2.6-15.9-1.2-18.3c0.7,1.6,2.8,5.2,7.1,6.3c0.7,0.2,1.5,0.3,2.3,0.5c2.4,0.4,5.1,0.9,7.9,2.9c3.4,2.3,5.3,3.6,9.7,3.6
|
||||
c0.8,0,1.8,0,2.9-0.1c1.4-0.3,2.9-0.4,4.5-0.4c6.9,0,14.4,2.4,20,4.1c3,0.9,5.8,1.4,8.7,1.4c3.2,0,6.2-0.5,8.9-1.2
|
||||
C283.8,203.3,275.5,204.3,272.9,204.3z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M239.3,195.7c0,0.1-0.4,2.7,0.6,4.2l0.7-0.5C239.8,198.2,239.3,195.7,239.3,195.7z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st2" d="M218.1,251.2l0.8-0.1c-0.6-4.4,0.1-8.5,0.1-8.5C219,242.5,217.5,246.6,218.1,251.2z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M212.3,230.2l0.8,0.1c0.4-6.2,2.3-8.5,2.4-8.5C215.5,221.7,212.8,223.6,212.3,230.2z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st17" d="M302.9,150.7c-13.7-4.3-29.8-0.9-34.5-0.2c-4.6,0.7-8.7,2-16.1,1.5c-7.3-0.5-11-2.7-22.4-4.6
|
||||
c-11.4-2-16,1.2-16.2,3.2c-0.4,17.5,4.8,23.2,10.9,24.5c8.7,2.1,15.4-6.8,18.2-12.2c2.8-5.4,4.6-6.1,6.9-6c4.3,0.1,5,2.9,9.3,11.2
|
||||
c4.3,8.4,12.5,13.9,23.5,13.1c14.1-1.1,19-11,20.4-16.8C304.4,158.3,304.5,151.3,302.9,150.7z"/>
|
||||
<path class="st18" d="M302.9,150.7c-13.7-4.3-29.6,0.5-34.3,1.2c-4.6,0.7-9.6,2-16.9,1.5c-7.3-0.5-10.5-2.2-22-4.1
|
||||
c-11.4-2-15.4,1.5-15.5,3.4c-0.4,15.8,4.4,21.1,10.5,22.4c8.7,2.1,15.4-6.8,18.2-12.2c2.8-5.4,4.6-6.1,6.9-6
|
||||
c4.3,0.1,5,2.9,9.3,11.2c4.3,8.4,12.5,13.9,23.5,13.1c14.1-1.1,19-11,20.4-16.8C304.4,158.3,304.5,151.3,302.9,150.7z"/>
|
||||
<path class="st19" d="M302.9,150.7c-0.2-0.1-0.3-0.1-0.5-0.2c1.5,12.9-4.4,26.9-18,28.4c-12.3,1.2-20.8-4.6-27.3-19.5
|
||||
c-2.4-5.4-8.8-6.6-12.7-2.4c-4.5,5.3-6.1,10.5-11.6,14.6c-4.9,3.3-12.5,1.6-16-3c2,3.9,4.9,5.7,7.9,6.4
|
||||
c8.7,2.1,15.4-6.8,18.2-12.2c2.8-5.4,4.6-6.1,6.9-6c4.3,0.1,5,2.9,9.3,11.2c4.3,8.4,12.5,13.9,23.5,13.1c14.1-1.1,19-11,20.4-16.8
|
||||
C304.4,158.3,304.5,151.3,302.9,150.7z"/>
|
||||
<path class="st20" d="M303.1,150.3c-4.5-1.4-9.8-2.2-15.7-2.2c-7.2,0-13.7,1.1-17.2,1.7c-0.7,0.1-1.3,0.2-1.8,0.3
|
||||
c-1.1,0.2-2.1,0.3-3.1,0.5c-2.8,0.5-5.8,1-9.7,1c-1,0-2.1,0-3.2-0.1c-3.9-0.3-6.8-1-10.4-2c-3.1-0.8-6.7-1.8-12-2.7
|
||||
c-2.4-0.4-4.7-0.6-6.7-0.6c-7,0-9.8,2.5-9.9,4.2c-0.3,15,3.3,23.2,11.2,25c0.9,0.2,1.8,0.3,2.7,0.3c7,0,12.8-6.6,16-12.8
|
||||
c2.8-5.4,4.4-5.8,6.3-5.8l0.2,0c3.5,0.1,4.4,1.9,7.5,8c0.4,0.9,0.9,1.9,1.5,3c4.4,8.5,12.3,13.4,21.7,13.4c0.7,0,1.4,0,2.2-0.1
|
||||
c15.8-1.2,19.9-13.4,20.7-17.1C304.6,159.2,305.2,151.1,303.1,150.3z M302.5,164.3c-0.8,3.6-4.8,15.3-20,16.4
|
||||
c-10.1,0.7-18.6-4-23.1-12.9c-0.5-1.1-1-2.1-1.5-2.9c-3.1-6.1-4.2-8.4-8.2-8.5l-0.2,0c-2.5,0-4.3,1-7,6.2
|
||||
c-1.1,2.1-6.8,12.3-15.3,12.3c-0.8,0-1.7-0.1-2.5-0.3c-7.4-1.7-10.9-9.6-10.5-24.1c0.1-1.1,2.5-3.4,9.1-3.4c2,0,4.2,0.2,6.6,0.6
|
||||
c5.2,0.9,8.8,1.8,11.9,2.6c3.7,1,6.5,1.7,10.6,2c1.1,0.1,2.2,0.1,3.2,0.1c4,0,7-0.5,9.8-1.1c1.1-0.2,2.1-0.4,3.1-0.5
|
||||
c0.5-0.1,1.1-0.2,1.8-0.3c3.5-0.6,10-1.7,17.1-1.7c5.8,0,11,0.7,15.4,2.1C303.8,151.5,304.1,157.6,302.5,164.3z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st21" d="M216.8,152.5c-0.3,11.5,4.8,18.5,7.6,19c4,0.6,6.6-0.8,10.5-5.4c3.9-4.6,7.8-10.8,7.8-10.8
|
||||
C238.7,152.4,220.1,149.6,216.8,152.5z"/>
|
||||
<path class="st22" d="M241.3,154.5c-5.8-2.6-21.5-4.7-24.5-2c-0.2,5.3,0.9,9.6,2.3,12.8C223.6,158.2,231.9,153.9,241.3,154.5z"/>
|
||||
<path class="st20" d="M223.2,150.8c-3.4,0-5.6,0.5-6.6,1.4l-0.1,0.1l0,0.2c-0.4,11.9,5,19,8,19.4c0.6,0.1,1.1,0.1,1.7,0.1
|
||||
c3.1,0,5.6-1.5,9.1-5.7c3.9-4.6,7.8-10.8,7.9-10.8l0.2-0.4l-0.3-0.2C240.1,152.9,230.3,150.8,223.2,150.8z M234.6,165.8
|
||||
c-3.4,4-5.6,5.4-8.5,5.4c-0.5,0-1,0-1.6-0.1c-2.6-0.4-7.5-7.2-7.3-18.3c0.9-0.7,3-1,6-1c6.6,0,15.9,1.8,19,3.7
|
||||
C241.2,156.9,237.8,162,234.6,165.8z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st21" d="M275,153.6c-7.3,1-16.1,3.1-16.1,3.1s5.3,20.2,24.1,20c12.2-0.2,18.3-13.3,17-23.6
|
||||
C292.9,151.2,282.4,152.6,275,153.6z"/>
|
||||
<path class="st22" d="M275,153.6c-7.3,1-16.1,3.1-16.1,3.1s2.3,8.8,9.3,14.7c0.3-3.4,2.7-6.4,5.1-9c7.1-5.7,15.4-9,23.8-10
|
||||
C290.2,151.6,281.4,152.7,275,153.6z"/>
|
||||
<path class="st20" d="M300.4,152.7l-0.3-0.1c-2.3-0.6-5.3-0.9-8.7-0.9c-5.8,0-11.9,0.8-16.5,1.4c-7.3,1-16.1,3.1-16.2,3.1
|
||||
l-0.4,0.1l0.1,0.4c0.1,0.2,5.5,20.3,24.1,20.3c0.1,0,0.3,0,0.4,0c4.9-0.1,9.2-2.2,12.4-6.2c3.9-4.7,5.8-11.6,5-17.9L300.4,152.7z
|
||||
M294.8,170.3c-3.1,3.8-7.2,5.8-11.8,5.9l-0.4,0c-16.4,0-22.3-16.3-23.2-19.2c1.9-0.4,9.3-2.1,15.6-3c4.5-0.6,10.7-1.4,16.4-1.4
|
||||
c3.2,0,6,0.3,8.2,0.8C300.3,159.4,298.5,165.8,294.8,170.3z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M272,140.1c-4.7,2.5-4.6,8.6-4.6,8.6c0-0.1,0.6-5.5,4.9-7.9c4.1-2.2,10.1-1,17.8,3.7l0.4-0.8
|
||||
C282.6,139,276.3,137.7,272,140.1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M239.3,138.3c-6.1-0.9-13.1,6.3-13.4,6.6l0.6,0.6c0.1-0.1,7-7.2,12.7-6.4c1.3,0.2,2.1,0.8,2.7,1.7
|
||||
c1.6,2.7,0,7.5,0,7.6c0,0,2.5-5,0.7-8.1C241.9,139.3,240.8,138.6,239.3,138.3z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st6" d="M345.1,171.3c0-21.9,1-24.1-0.3-32.6c-1.3-8.5-16.4-16-16.4-16s-5.4-9.8-12.7-13.5
|
||||
c-7.4-3.7-34.7-15.4-61.1-1.2c12.4,0.8,71.9,19.3,71.1,81c0,0,7,15.2,27.5,13.4c1.5-2.3,1.5-2.3,1.5-2.3S345.1,193.2,345.1,171.3
|
||||
z"/>
|
||||
<path class="st23" d="M332.6,131c5.7-0.6,8.3,4.5,9.9,10.2c1.5,4.2,1.4,11,2.8,16.2c0.2-9.6,0.5-12.4-0.4-18.6
|
||||
c-1.3-8.5-16.4-16-16.4-16s-5.4-9.8-12.7-13.5c-7.4-3.7-34.7-15.4-61.1-1.2c2.1,0.1,5.6,0.8,9.9,2.1
|
||||
C287.7,99.7,322,109.6,332.6,131z"/>
|
||||
<path class="st7" d="M340,190.2c-12.8-21.9-2-53.2-24.4-67.4c0.9,7.2,0.3,14.8-5.3,18c9.1,11.9,15.6,27.6,15.3,48.2
|
||||
c0,0,7,15.2,27.5,13.4c0.6-0.8,0.9-1.4,1.2-1.7C349.8,199.5,342.6,194.7,340,190.2z"/>
|
||||
<path class="st8" d="M345.5,171.3c0-8.4,0.1-13.9,0.2-17.9c0.2-6.5,0.2-9.4-0.5-14.7c-1.2-8.3-15-15.5-16.5-16.3
|
||||
c-0.7-1.2-5.8-10-12.9-13.5c-4.9-2.4-17.8-8.1-33.5-8.1c-10,0-19.4,2.3-27.9,6.9l-1.4,0.7l1.5,0.1c6.1,0.4,24.1,5.3,40.3,17.6
|
||||
c14.1,10.7,30.8,30.4,30.4,62.9l0,0.1l0,0.1c0.1,0.1,6.5,13.8,24.5,13.8h0c1.1,0,2.2-0.1,3.4-0.2l0.2,0l1.9-2.8l-0.4-0.3
|
||||
C354.8,199.7,345.5,192.6,345.5,171.3z M352.9,202c-1.1,0.1-2.1,0.1-3.1,0.1h0c-16.7,0-23.1-12-23.7-13.2
|
||||
c0.4-32.9-16.5-52.7-30.8-63.6c-15.2-11.6-32-16.6-39.2-17.6c8-4.1,16.9-6.1,26.2-6.1c15.5,0,28.4,5.6,33.2,8
|
||||
c7.2,3.6,12.5,13.2,12.6,13.3l0.1,0.1l0.1,0.1c0.1,0.1,14.9,7.5,16.2,15.7c0.8,5.2,0.7,7.9,0.5,14.6c-0.1,4-0.2,9.6-0.2,18
|
||||
c0,19.8,7.7,27.4,9.5,28.9L352.9,202z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st8" d="M327.8,122.5c3.2,6,4.7,10.3,4.7,10.3c0,0-0.8-4.7-4-10.7L327.8,122.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st8" d="M319,126.8c0.1,0.1,10.2,14.9,5.1,32.8l0.8,0.3c1.9-6.6,1.7-12.8,0.8-18C324,132.6,319,126.8,319,126.8z"/>
|
||||
</g>
|
||||
<g>
|
||||
<ellipse class="st0" cx="362.5" cy="205.8" rx="11.3" ry="12"/>
|
||||
<path class="st24" d="M352,201.3c-0.5,1.4-0.8,2.9-0.8,4.4c0,6.6,5.1,12,11.3,12c5.6,0,10.2-4.2,11.1-9.8
|
||||
C364.5,217.2,352.9,209.4,352,201.3z"/>
|
||||
<path class="st25" d="M362.5,193.3c-6.5,0-11.8,5.6-11.8,12.5c0,6.9,5.3,12.5,11.8,12.5c6.5,0,11.8-5.6,11.8-12.5
|
||||
C374.3,198.9,369,193.3,362.5,193.3z M362.5,217.4c-6,0-10.9-5.2-10.9-11.6c0-6.4,4.9-11.6,10.9-11.6c6,0,10.9,5.2,10.9,11.6
|
||||
C373.4,212.2,368.5,217.4,362.5,217.4z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M271,282.3c0.4,0,37,0.3,55,25.4l0.7-0.5C308.5,281.7,271,282.3,271,282.3z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M237.5,321.6c0,0-2.7,5.6-3,13.6c-0.2,5.3,0.3,11.7,2.4,18.1c1,2.9,4.7,8.1,4.7,8.1
|
||||
C230.5,343.3,237.5,321.8,237.5,321.6z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M208.2,284.8l0.7,0.5c5.4-7.6,15.8-6.3,15.9-6.3C224.7,279,213.9,276.8,208.2,284.8z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st26" d="M218.3,270.1c-1.3,0-2.4,0.9-2.4,1.9s1.1,1.9,2.4,1.9c1.3,0,2.4-0.9,2.4-1.9S219.6,270.1,218.3,270.1z"/>
|
||||
<path class="st5" d="M218.3,269.6c-1.6,0-2.8,1.1-2.8,2.4s1.3,2.4,2.8,2.4c1.6,0,2.8-1.1,2.8-2.4S219.8,269.6,218.3,269.6z
|
||||
M218.3,273.5c-1.1,0-2-0.7-2-1.5s0.9-1.5,2-1.5c1.1,0,2,0.7,2,1.5S219.4,273.5,218.3,273.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<ellipse class="st26" cx="290.8" cy="275.9" rx="2.4" ry="1.9"/>
|
||||
<path class="st5" d="M290.8,273.5c-1.6,0-2.8,1.1-2.8,2.4c0,1.3,1.3,2.4,2.8,2.4c1.6,0,2.8-1.1,2.8-2.4
|
||||
C293.6,274.6,292.3,273.5,290.8,273.5z M290.8,277.4c-1.1,0-2-0.7-2-1.5c0-0.8,0.9-1.5,2-1.5c1.1,0,2,0.7,2,1.5
|
||||
C292.8,276.7,291.9,277.4,290.8,277.4z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M344,302.2l0.6,0.6c14.6-17.4,27.5-5.9,28-5.4c0,0-2.4-3.3-7-4.4C360.2,291.6,352.3,292.4,344,302.2z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M350.3,279.8c-7.1-2.2-15.5,5.8-18.8,17.9s-0.1,23.6,7,25.7c7.1,2.2,15.5-5.8,18.8-17.9
|
||||
C360.6,293.5,357.5,282,350.3,279.8z"/>
|
||||
<path class="st4" d="M357.6,288.6c0.1,6.4-0.7,14.7-5.6,18.4c-7.1,4.7-15.3,1.9-21.6-2.4c-0.7,9.3,2.4,17.1,8.2,18.8
|
||||
c7.1,2.2,15.5-5.8,18.8-17.9C359,299.4,359,293.3,357.6,288.6z"/>
|
||||
<path class="st5" d="M350.5,279.4c-0.8-0.2-1.7-0.4-2.5-0.4c-6.8,0-13.9,7.8-16.8,18.6c-3.3,12.3-0.1,24,7.3,26.3
|
||||
c0.8,0.2,1.7,0.4,2.5,0.4c6.8,0,13.9-7.8,16.8-18.6c1.6-5.9,1.7-11.9,0.4-16.8C356.8,283.8,354,280.5,350.5,279.4z M356.9,305.4
|
||||
c-2.8,10.4-9.5,17.9-16,17.9c-0.8,0-1.5-0.1-2.3-0.3c-6.9-2.1-9.9-13.4-6.7-25.2c2.8-10.4,9.5-17.9,16-17.9c0.8,0,1.5,0.1,2.3,0.3
|
||||
c3.3,1,5.8,4.1,7.1,8.9C358.6,293.9,358.5,299.7,356.9,305.4z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st27" d="M349.1,266.5C349.1,266.5,349.1,266.5,349.1,266.5L349.1,266.5c-0.3-1.3-8.6-2.2-18.7-2.1
|
||||
c-10.2,0.1-18.5,1.3-18.6,2.5l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0.2,2.2,5.5,56.8,6.7,57.8c2.7,2.3,25.2,1.4,25.8,0
|
||||
C344.9,323.5,348.9,269,349.1,266.5C349.1,266.6,349.1,266.6,349.1,266.5C349.1,266.5,349.1,266.5,349.1,266.5z"/>
|
||||
<path class="st28" d="M314,289.4c1.7,16,3.8,34.9,4.4,35.4c2.7,2.3,25.2,1.4,25.8,0c0.4-0.8,1.8-18.8,3-34.7L314,289.4z"/>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st29" d="M318.6,324.9c3.1,2.1,24.1,1.3,25.6,0c-1.1-1.1-6.4-1.9-12.8-1.9C325,323,319.7,323.8,318.6,324.9z"/>
|
||||
</g>
|
||||
</g>
|
||||
<path class="st30" d="M340.1,290c-0.3,17.2-3.5,36-21.8,34.5c0.1,0.2,0.1,0.3,0.2,0.4c2.7,2.3,25.2,1.4,25.8,0
|
||||
c0.4-0.8,1.8-18.8,3-34.7L340.1,290z"/>
|
||||
<g>
|
||||
<path class="st31" d="M330.6,286.9c-9.1,0-16.5,1.2-16.5,2.6c0,1.4,7.2,3,16.3,3c9.1,0,16.7-1.6,16.7-3
|
||||
C347.1,288.1,339.7,286.9,330.6,286.9z"/>
|
||||
</g>
|
||||
<path class="st32" d="M349.5,266l-0.9,1.3c-1.7,22.4-4.2,55.5-4.7,57.3c-0.8,0.5-6.9,1.2-13.9,1.2c-6,0-10.3-0.5-11.3-1.3
|
||||
c-0.7-1.5-2.9-21.2-4.9-40.4H313c1.9,18.3,4.3,40.3,5.2,41c1.5,1.3,8.1,1.5,11.8,1.5c0.1,0,13.9,0,14.6-1.6
|
||||
c0.6-1.4,4.2-49,4.9-58.5L349.5,266L349.5,266z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st32" d="M332.2,264c-0.6,0-1.2,0-1.8,0c-0.7,0-17.6,0.2-19,2.7l0.8,0.3c0.7-0.8,7.4-2,18.2-2.1c0.6,0,1.2,0,1.8,0
|
||||
c9.8,0,15.8,1,16.4,1.7c-0.1,0.1-0.3,0.2-0.6,0.4l0.2,0.8c0.8-0.3,1.3-0.7,1.3-1.2C349.5,264.1,335.1,264,332.2,264z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st33" d="M338.7,242.6c-1.7,0-1.8,1.6-1.5,3c-2.2,0.2-1.2,2.6-1.2,2.6l-11.7,44l4.6-0.1l11.1-42.5
|
||||
c0,0,1.4-0.7,1.4-2.1c1.3-0.2,1.2-2.1,1.2-2.1l25.8-20l-2-3.8C366.6,221.4,340.6,240.8,338.7,242.6z"/>
|
||||
<path class="st24" d="M368.6,225.2l-0.9-1.7l-27,20.7c0.4,1.3-0.3,1.9-1.5,2.1c0.6,0.6,0.5,2.8-1.2,2.5l-11.2,43.2l2.2-0.1
|
||||
l11.1-42.5c0,0,1.4-0.7,1.4-2.1c1.3-0.2,1.2-2.1,1.2-2.1L368.6,225.2z"/>
|
||||
<g>
|
||||
<path class="st34" d="M335.8,248.5c0.1,0.1,2.2,1.2,4.3,1.4l0.1-0.9c-1.8-0.1-3.9-1.3-3.9-1.3L335.8,248.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st34" d="M337.1,246c0,0,2.9,0.9,4.2,1.8l0.4-0.8c-1.4-0.9-4.3-1.9-4.4-1.9L337.1,246z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st34" d="M338.5,243c0,0,3.1,1.8,4,2.6l0.6-0.7c-0.9-0.9-4-2.7-4.1-2.7L338.5,243z"/>
|
||||
</g>
|
||||
<path class="st34" d="M324,292.4l11.6-44.2c-0.1-0.4-0.4-1.4,0-2.1c0.2-0.4,0.6-0.7,1.1-0.8c-0.1-0.8-0.1-1.7,0.4-2.3
|
||||
c0.3-0.4,0.8-0.7,1.4-0.7c2.6-2.3,26.7-20.4,27.7-21.1l0.4-0.3l2.4,4.6l-25.9,20.1c0,0.8-0.3,1.9-1.3,2.3
|
||||
c-0.2,1.1-1.1,1.8-1.5,2l-11.1,42.6L324,292.4z M338.7,243.1c-0.4,0-0.8,0.1-1,0.4c-0.3,0.4-0.4,1.1-0.2,2l0.1,0.5l-0.5,0
|
||||
c-0.5,0-0.8,0.2-0.9,0.5c-0.3,0.5,0,1.2,0.1,1.5l0.1,0.1l0,0.2l-11.5,43.4l3.8-0.1l11.1-42.4l0.2-0.1c0,0,1.2-0.6,1.2-1.7V247
|
||||
l0.3-0.1c0.9-0.2,0.9-1.7,0.9-1.7l0-0.2l25.7-19.9l-1.6-3.1c-3.2,2.4-25.7,19.3-27.4,20.9l-0.1,0.1H338.7z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st35" d="M367,221.1c-0.5,0.2-0.5,1.4,0,2.5c0.5,1.2,1.3,1.9,1.8,1.7c0.5-0.2,0.5-1.4,0-2.5
|
||||
C368.2,221.6,367.4,220.9,367,221.1z"/>
|
||||
<path class="st34" d="M367.2,220.6c-0.1,0-0.2,0-0.4,0.1c-0.8,0.4-0.7,1.9-0.2,3.1c0.4,1,1.2,2,2,2c0.1,0,0.2,0,0.4-0.1
|
||||
c0.2-0.1,0.6-0.4,0.6-1.3c0-0.5-0.2-1.2-0.4-1.8C368.7,221.6,367.9,220.6,367.2,220.6z M368.9,225.2
|
||||
C368.9,225.2,368.9,225.2,368.9,225.2c-0.3,0-1-0.6-1.5-1.8c-0.6-1.3-0.4-2.3-0.3-2.3c0.3,0,1,0.6,1.4,1.8
|
||||
c0.3,0.6,0.4,1.2,0.4,1.7C369,225,368.9,225.2,368.9,225.2z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st31" d="M311.8,250.6c-11.6-1.9-19.9,10.9-13.9,21.8c4.9,8.9,15.1,7,15.1,7l-1.1-12c0,0,0.7,0.4,4.7,1.1
|
||||
c1.9,0.3,6.6,0.5,6.6,0.5S324.7,252.7,311.8,250.6z"/>
|
||||
<path class="st36" d="M318.3,253.7c1.4,3,1.9,6.5,0.7,9.8c-1.7,4.7-7,2.7-8.5,2.6c-0.5,0.4-0.2,6.3-3.3,8.5
|
||||
c-3,2.6-8.3-1.2-10.4-4.7c0.3,0.8,0.7,1.7,1.1,2.5c4.9,8.9,15.1,7,15.1,7l-1.1-12c0,0,0.7,0.4,4.7,1.1c1.9,0.3,6.6,0.5,6.6,0.5
|
||||
S324.1,259.1,318.3,253.7z"/>
|
||||
<path class="st37" d="M311.8,250.2c-0.8-0.1-1.6-0.2-2.3-0.2c-5.1,0-9.6,2.8-12.1,7.4c-2.5,4.7-2.5,10.4,0.2,15.2
|
||||
c3.5,6.5,9.8,7.4,13.2,7.4h0c1.4,0,2.3-0.2,2.4-0.2l0.3,0l-1.1-12c0.7,0.2,2,0.8,4.3,1.2c1.9,0.3,6.5,0.5,6.6,0.5l0.4,0l0-0.4
|
||||
C323.7,268.9,325,252.3,311.8,250.2z M322.9,268.6c-1.2-0.1-4.6-0.2-6.1-0.5c-3.8-0.6-4.6-1-4.6-1l-0.7-0.4l1.1,12.4
|
||||
c-0.4,0-1,0.1-1.8,0.1h0c-3.2,0-9.1-0.9-12.5-7c-2.5-4.6-2.6-9.9-0.2-14.3c2.4-4.4,6.6-7,11.4-7c0.7,0,1.5,0.1,2.2,0.2
|
||||
C323.1,252.9,323,266,322.9,268.6z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st28" d="M314.4,256.3c-1.2-3.3-5.9-4-8.1-1.5c-2.3-0.9-6.6,1.5-6,5.3c0,0-2.9,3.6,0,8c-0.4,3,2.4,6.7,5.6,5.8
|
||||
c1.8,3,4.6,3.5,6.7,1.6c0,0-0.5-5.2-0.7-8.1c3.9,1.3,7.3,1.5,7.3,1.5c1.7-1.1,1.1-4.5,0-6C320.1,260.3,317.8,255.6,314.4,256.3z"
|
||||
/>
|
||||
<path class="st38" d="M310.2,266.3c-0.7,3.1-1.9,6.2-3.6,8.7c1.8,2,4.1,2.2,5.9,0.5c0,0-0.5-5.2-0.7-8.1c3.9,1.3,7.3,1.5,7.3,1.5
|
||||
c1.3-0.9,1.3-3.2,0.6-4.9C317.7,266.8,313.7,266.8,310.2,266.3z"/>
|
||||
<path class="st39" d="M318.8,258c-1-1.6-2.5-2.4-4.1-2.3c-0.8-1.8-2.7-2.9-4.9-2.9c-1.4,0-2.8,0.5-3.7,1.5
|
||||
c-0.3-0.1-0.6-0.1-0.9-0.1c-1.5,0-3.3,0.9-4.3,2.2c-0.9,1.1-1.2,2.3-1.1,3.7c-0.6,0.8-2.5,4.2,0,8.3c-0.1,1.5,0.4,3.2,1.5,4.4
|
||||
c1.2,1.5,2.8,2.1,4.4,1.8c1.1,1.7,2.7,2.6,4.2,2.6c1.1,0,2.1-0.4,3-1.2l0.2-0.2l-0.3-0.4c0,0-0.3-4.6-0.5-7.6
|
||||
c3.6,1.1,6.7,1.1,6.8,1.1l0.3,0.2l0,0.3c0.7-0.4,1.1-1.2,1.2-2.2c0.2-1.4-0.2-3.2-0.9-4.4C320.1,261.4,319.7,259.5,318.8,258z
|
||||
M319.6,267c-0.1,0.4-0.2,1-0.7,1.3c-0.7-0.1-3.6-0.3-7-1.4l-0.7-0.2l0,0.8c0.2,2.5,0.6,6.8,0.7,7.9c-0.7,0.5-1.4,0.8-2.2,0.8
|
||||
c-1.4,0-2.6-0.9-3.6-2.5l-0.2-0.3l-0.3,0.1c-1.3,0.4-2.7-0.2-3.8-1.4c-0.9-1.1-1.4-2.6-1.2-3.8l0-0.2l-0.1-0.2
|
||||
c-2.6-4-0.1-7.2,0-7.3l0.2-0.2l0-0.2c-0.2-1.4,0.3-2.4,0.8-3c0.9-1.1,2.3-1.8,3.6-1.8c0.3,0,0.6,0.1,0.9,0.2l0.3,0.1l0.2-0.3
|
||||
c0.7-0.9,1.9-1.4,3.2-1.4c1.6,0,3.5,0.8,4.1,2.7l0.1,0.4l0.4-0.1c0.2,0,0.4-0.1,0.6-0.1c1.5,0,2.5,1.1,2.9,1.8
|
||||
c0.8,1.3,1.1,3,0.7,4.1l-0.1,0.3l0.2,0.2C319.3,264,319.8,265.6,319.6,267z"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st39" points="300.1,267.6 300.4,268.6 319.2,263.4 319,262.4 "/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st39" points="305.8,255 309.1,265.5 305.4,273.7 306.3,274.2 310.2,265.5 306.7,254.7 "/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st39" points="300,260.6 309.4,266 309.9,265 300.5,259.7 "/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st39" points="313.9,256 309,265.6 311.5,267.8 312.2,267 310.3,265.4 314.8,256.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M234.8,342c-2.6,1.8-2.4,6.9,0,9.3c2.4,2.4,6.6-1,6.6-1V343C241.3,343,237.4,340.2,234.8,342z"/>
|
||||
<path class="st4" d="M232.9,345.3c0,0,0.2,6.2,3.6,6.8c3.3,0.6,4.9-2.2,5.8-4.3C238.2,350.2,233.3,347.3,232.9,345.3z"/>
|
||||
<path class="st5" d="M235.1,351c-1.2-1.2-1.9-3.4-1.7-5.3c0.1-1.5,0.7-2.6,1.7-3.3c2.4-1.6,6.1,1,6.1,1c0,0-3.7-3.7-6.5-1.8
|
||||
c-1.2,0.8-1.9,2.2-2,3.9c-0.2,2.3,0.6,4.7,2,6.1c0.7,0.7,1.5,1,2.4,1c2.3,0,4.2-2.7,4.2-2.7C241.1,350,237.2,353.1,235.1,351z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M345.5,306.6c-3,0-5.5,1.6-5.5,3.6c0,2,2.5,3.6,5.5,3.6s5.5-1.6,5.5-3.6C351,308.2,348.5,306.6,345.5,306.6z"
|
||||
/>
|
||||
<path class="st4" d="M340,309.8c0,0.1,0,0.2,0,0.4c0,2,2.5,3.6,5.5,3.6s5.5-1.6,5.5-3.6c0-0.2,0-0.3-0.1-0.5
|
||||
C348.1,312.1,343.6,312.1,340,309.8z"/>
|
||||
<path class="st5" d="M345.5,306.1c-3.3,0-5.9,1.8-5.9,4s2.6,4,5.9,4c3.3,0,5.9-1.8,5.9-4S348.8,306.1,345.5,306.1z M345.5,313.3
|
||||
c-2.7,0-5.1-1.4-5.1-3.2c0-1.7,2.3-3.2,5.1-3.2c2.7,0,5.1,1.4,5.1,3.2C350.6,311.9,348.2,313.3,345.5,313.3z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M345,297.7c-4.3,0-7.7,2-7.7,4.4c0,2.5,3.5,4.4,7.7,4.4c4.3,0,7.7-2,7.7-4.4
|
||||
C352.8,299.7,349.3,297.7,345,297.7z"/>
|
||||
<path class="st4" d="M337.5,301.2c-0.1,0.3-0.2,0.6-0.2,0.9c0,2.5,3.5,4.4,7.7,4.4c4.3,0,7.7-2,7.7-4.4c0-0.6-0.2-1.1-0.5-1.6
|
||||
C349.1,304.6,340.9,304.7,337.5,301.2z"/>
|
||||
<path class="st5" d="M345,297.2c-4.6,0-8.1,2.1-8.1,4.9c0,2.7,3.6,4.9,8.1,4.9s8.1-2.1,8.1-4.9C353.2,299.4,349.6,297.2,345,297.2
|
||||
z M345,306.1c-4,0-7.3-1.8-7.3-4c0-2.2,3.3-4,7.3-4c4,0,7.3,1.8,7.3,4C352.3,304.3,349,306.1,345,306.1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M345.1,289c-4.7,0-8.6,2.2-8.6,5c0,2.8,3.8,5,8.6,5c4.7,0,8.6-2.2,8.6-5C353.7,291.3,349.9,289,345.1,289z"/>
|
||||
<path class="st4" d="M336.8,292.9c-0.1,0.4-0.2,0.7-0.2,1.1c0,2.8,3.8,5,8.6,5c4.7,0,8.6-2.2,8.6-5c0-0.4-0.1-0.8-0.2-1.1
|
||||
C348.2,296.1,342.6,297.4,336.8,292.9z"/>
|
||||
<path class="st5" d="M345.1,288.6c-5,0-9,2.4-9,5.5s3.9,5.5,9,5.5c5,0,9-2.4,9-5.5S350.2,288.6,345.1,288.6z M345.1,298.6
|
||||
c-4.4,0-8.1-2.1-8.1-4.6c0-2.5,3.7-4.6,8.1-4.6c4.4,0,8.1,2.1,8.1,4.6C353.3,296.5,349.5,298.6,345.1,298.6z"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<ellipse transform="matrix(0.1064 -0.9943 0.9943 0.1064 27.4873 598.238)" class="st3" cx="346.6" cy="283.8" rx="5.7" ry="8.7"/>
|
||||
<path class="st4" d="M337.9,282.7c0,0.1,0,0.2-0.1,0.3c-0.3,3.1,3.4,6,8.2,6.5c4.8,0.5,8.9-1.7,9.2-4.8c0-0.1,0-0.2,0-0.2
|
||||
C349.8,287.1,343,286.2,337.9,282.7z"/>
|
||||
<path class="st5" d="M347.1,277.7c-0.5,0-0.9-0.1-1.4-0.1c-4.5,0-8,2.2-8.3,5.3c-0.1,1.7,0.7,3.3,2.4,4.6c1.6,1.3,3.8,2.1,6.2,2.3
|
||||
c0.5,0,0.9,0.1,1.4,0.1c4.5,0,8-2.2,8.3-5.3C356,281.4,352.1,278.2,347.1,277.7z M354.8,284.6c-0.2,2.5-3.4,4.4-7.4,4.4
|
||||
c-0.4,0-0.9,0-1.3-0.1c-2.2-0.2-4.3-1-5.8-2.2c-1.4-1.1-2.1-2.5-2-3.8c0.2-2.5,3.4-4.4,7.4-4.4c0.4,0,0.9,0,1.3,0.1
|
||||
C351.6,279.1,355.1,281.8,354.8,284.6z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st0" d="M319.4,145.3c-20.7-30.5-49.1-39.6-66.6-37.7c-17.4,1.9-19,9-19,12.3c0,0-8.5,7.9-10.8,15.3
|
||||
c-2.3,7.4-1.3,11,1.4,11c2.6,0,3-5,3.2-7.4c29.3-20.5,57.8,7.4,57.8,7.4c19.7,14.5,36.3,38,40.4,47c6.7-5,2-16,2-16
|
||||
C330.4,176.9,333.4,165.9,319.4,145.3z"/>
|
||||
<path class="st24" d="M319.4,145.3c-0.5-0.8-1.1-1.5-1.6-2.3c2,5.3,5,11.1,4.3,17.2c-0.6,1.8-6.4-0.7-8-2.5
|
||||
c2.5,3.2,3.9,7.4,1.1,8.3c-1.4-0.1-6.7-7.1-10-11.2c-19.9-24-59.6-41.9-82.9-16.5c-1.1,5.3-0.1,8,2.2,7.9c2.6,0,3-5,3.2-7.4
|
||||
c29.3-20.5,57.8,7.4,57.8,7.4c19.7,14.5,36.3,38,40.4,47c6.7-5,2-16,2-16C330.4,176.9,333.4,165.9,319.4,145.3z"/>
|
||||
<path class="st25" d="M329.7,175.8c1.9-4.6,0.5-15.4-10-30.8c-19.1-28.1-44.7-38.1-62.3-38.1c-1.6,0-3.1,0.1-4.6,0.2
|
||||
c-15.8,1.7-19.2,7.7-19.3,12.5c-1.2,1.1-8.6,8.4-10.8,15.4c-1.5,4.9-1.7,8.6-0.5,10.4c0.5,0.8,1.3,1.2,2.2,1.2h0
|
||||
c3,0,3.4-5.5,3.6-7.6c7-4.9,14.6-7.4,22.5-7.3c19.2,0,34.4,14.6,34.6,14.8l0,0c19.8,14.5,36.2,38.1,40.3,46.9l0.2,0.5l0.4-0.3
|
||||
c6.1-4.5,3.1-13.8,2.3-16C328.9,177.2,329.3,176.6,329.7,175.8z M327.7,176.8l-0.6,0.1l0.2,0.6c0,0.1,4.3,10.2-1.4,15.1
|
||||
c-4.4-9.2-20.8-32.4-40.3-46.7c-0.7-0.7-15.9-15-35.1-15c-8.2,0-16,2.6-23.2,7.6l-0.2,0.1l0,0.2c-0.3,4.6-1.2,6.9-2.8,7
|
||||
c-0.6,0-1.2-0.3-1.5-0.8c-1-1.5-0.8-5,0.6-9.6c2.2-7.2,10.6-15,10.7-15.1l0.1-0.1v-0.2c0-6.4,6.4-10.5,18.6-11.8
|
||||
c1.5-0.2,3-0.2,4.5-0.2c17.4,0,42.7,9.9,61.7,37.8c11,16.1,11.4,26.4,9.9,29.9C328.6,176.2,328.1,176.7,327.7,176.8z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st25" d="M233.6,119.5l0.5,0.7c4.4-3,10.8-4.5,10.8-4.5C244.6,115.8,238.1,116.3,233.6,119.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st25" d="M320.4,166.8c0.1,0.1,5.5,7,7.7,12.5l0.8-0.3C326.6,173.3,320.4,166.8,320.4,166.8z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st25" d="M225.3,141.3c0,0,1.4-1.6,3.4-2.8l-0.4-0.8C226.2,139.1,225.3,141.3,225.3,141.3z"/>
|
||||
</g>
|
||||
</g>
|
||||
<path class="st32" d="M330.5,268.7c-0.6,0-1.2,0-1.8,0c-1.5,0-3,0-4.3-0.1l0.1,0.9c1.9,0.1,3.4,0.1,4.2,0.1c0.6,0,1.2,0,1.8,0
|
||||
c0.7,0,13.6-0.2,17.8-1.9l-0.2-0.8C346.1,267.7,339.8,268.6,330.5,268.7z"/>
|
||||
<path class="st40" d="M317.1,269c0,0,4.9,0.4,6.5,0.4c-0.2,6.7,2.6,56.2,2.6,56.2c-2.2,0-2.6-0.1-4.1-0.3
|
||||
C321.4,319.8,317.1,269,317.1,269z"/>
|
||||
<path class="st41" d="M302.1,263.4c0,0-0.9-0.9-1.2-0.4C300.6,263.5,301.3,263.6,302.1,263.4z"/>
|
||||
<path class="st41" d="M303.9,264.6c0,0-0.9-0.9-1.2-0.4C302.5,264.7,303.1,264.9,303.9,264.6z"/>
|
||||
<path class="st41" d="M306.4,264.9c0,0-1.2-0.7-1.3-0.1C305,265.4,306.1,265,306.4,264.9z"/>
|
||||
<path class="st41" d="M302.1,265.3c0,0-1.6-0.8-1.7,0C300.3,266.1,301.6,265.6,302.1,265.3z"/>
|
||||
<path class="st41" d="M304.3,265.7c0,0-1.5-0.2-1.4,0.3C303,266.6,303.8,266.4,304.3,265.7z"/>
|
||||
<path class="st41" d="M303.2,269.3c0,0-1.3,0-1.1,0.6C302.2,270.4,302.8,270,303.2,269.3z"/>
|
||||
<path class="st41" d="M305.4,268.8c0,0-1.3,0-1.1,0.6C304.4,270,304.9,269.6,305.4,268.8z"/>
|
||||
<path class="st41" d="M307.3,267.2c0,0-1.3,0.3-1,0.8C306.7,268.6,307.2,267.5,307.3,267.2z"/>
|
||||
<path class="st41" d="M304.4,270.7c0,0-1.6,0.6-1.2,1.2C303.7,272.5,304.3,271.2,304.4,270.7z"/>
|
||||
<path class="st41" d="M306.3,269.4c0,0-1.2,1-0.8,1.2C306,270.9,306.4,270.2,306.3,269.4z"/>
|
||||
<path class="st41" d="M308.5,272.7c0,0-0.8,1.1-0.3,1.3C308.7,274.2,308.8,273.5,308.5,272.7z"/>
|
||||
<path class="st41" d="M309.6,270.7c0,0-0.8,1.1-0.3,1.3C309.8,272.2,309.8,271.5,309.6,270.7z"/>
|
||||
<path class="st41" d="M309.6,268c0,0-0.6,1.3,0,1.3C310.2,269.4,309.7,268.3,309.6,268z"/>
|
||||
<path class="st41" d="M310.3,272.6c0,0-0.6,1.7,0.1,1.8C311.2,274.4,310.6,273,310.3,272.6z"/>
|
||||
<path class="st41" d="M310.5,270.2c0,0-0.1,1.6,0.3,1.5C311.5,271.4,311.2,270.6,310.5,270.2z"/>
|
||||
<path class="st41" d="M317.2,267.4c0,0,1.1,0.7,1.2,0.2C318.6,267.1,317.9,267.1,317.2,267.4z"/>
|
||||
<path class="st41" d="M315.2,266.5c0,0,1.1,0.7,1.2,0.2C316.6,266.1,315.9,266.1,315.2,266.5z"/>
|
||||
<path class="st41" d="M312.7,266.6c0,0,1.3,0.5,1.3-0.1C314,265.9,312.9,266.5,312.7,266.6z"/>
|
||||
<path class="st41" d="M316.9,265.5c0,0,1.7,0.5,1.6-0.3C318.6,264.4,317.3,265.2,316.9,265.5z"/>
|
||||
<path class="st41" d="M314.7,265.5c0,0,1.5-0.1,1.3-0.5C315.8,264.4,315,264.7,314.7,265.5z"/>
|
||||
<path class="st41" d="M316.6,261.3c0,0,1.3-0.1,1.1-0.6C317.5,260.1,317,260.5,316.6,261.3z"/>
|
||||
<path class="st41" d="M314.4,261.8c0,0,1.3-0.1,1.1-0.6C315.3,260.6,314.8,261,314.4,261.8z"/>
|
||||
<path class="st41" d="M312.5,263.4c0,0,1.3-0.4,1-0.9C313.1,262.1,312.6,263.2,312.5,263.4z"/>
|
||||
<path class="st41" d="M315.3,259.9c0,0,1.6-0.6,1.2-1.3C316,258,315.4,259.4,315.3,259.9z"/>
|
||||
<path class="st41" d="M313.4,261.3c0,0,1.2-1,0.8-1.2C313.7,259.7,313.3,260.5,313.4,261.3z"/>
|
||||
<path class="st41" d="M311.2,256.6c0,0,0.7-1.1,0.2-1.3S310.9,255.8,311.2,256.6z"/>
|
||||
<path class="st41" d="M310.2,258.7c0,0,0.7-1.1,0.2-1.3C310,257.2,309.9,257.9,310.2,258.7z"/>
|
||||
<path class="st41" d="M310.2,261.3c0,0,0.6-1.3,0-1.3C309.6,259.9,310.1,261.1,310.2,261.3z"/>
|
||||
<path class="st41" d="M309.4,256.8c0,0,0.6-1.7-0.2-1.8C308.5,255,309.1,256.4,309.4,256.8z"/>
|
||||
<path class="st41" d="M309.2,259.2c0,0,0-1.6-0.4-1.5C308.3,257.9,308.6,258.7,309.2,259.2z"/>
|
||||
<path class="st41" d="M304.8,257.7c0,0-0.3-1.3-0.7-1.1C303.6,256.9,304,257.4,304.8,257.7z"/>
|
||||
<path class="st41" d="M305.5,259.9c0,0-0.3-1.3-0.7-1.1C304.3,259.1,304.8,259.6,305.5,259.9z"/>
|
||||
<path class="st41" d="M307.4,261.7c0,0-0.5-1.3-0.9-0.9C306,261.2,307.1,261.6,307.4,261.7z"/>
|
||||
<path class="st41" d="M303.7,259.3c0,0-0.8-1.6-1.3-1C301.8,258.8,303.2,259.2,303.7,259.3z"/>
|
||||
<path class="st41" d="M305.2,261c0,0-1.1-1.1-1.3-0.7C303.7,260.9,304.5,261.2,305.2,261z"/>
|
||||
<path class="st32" d="M312.2,267.4l0.1,0l-1-0.9l-0.1,0l0,0.5c0.4,4.5,1,10.7,1.7,17.3h0.8C313.3,278.4,312.7,272.6,312.2,267.4z"
|
||||
/>
|
||||
<path class="st32" d="M311.3,267c0,1.8,7.8,2.4,13.1,2.5v-0.9c-7.3-0.2-11.7-1-12.2-1.6c0,0,0,0,0,0l-0.8-0.3
|
||||
C311.4,266.8,311.3,266.9,311.3,267z"/>
|
||||
<path class="st42" d="M297.6,269c0,0-2.8-6.3,2.3-13c5-6.6,14.4-3.5,14.4-3.5S296.8,248.3,297.6,269z"/>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st3" d="M259.7,173.7c-4-0.5-5.1,3-5.1,3l-7.6-7.5c0,0-8.4-3-13.2,3.7c-3.4,5.5-2.1,15,5.4,17.6
|
||||
c7.5,2.7,10.9-0.6,12.9-2.4c2.2,0.1,5.9,1,9.7-3C265.7,181.3,264,174.4,259.7,173.7z"/>
|
||||
<path class="st4" d="M262.5,175.4c1.9,7.6-5.2,10-6.7,5.9c-4.8,6.6-16.7,9.1-23,2.7c1,3,3.1,5.5,6.5,6.7
|
||||
c7.5,2.7,10.9-0.6,12.9-2.4c2.2,0.1,5.9,1,9.7-3C264.7,182.4,264.5,177.8,262.5,175.4z"/>
|
||||
<path class="st5" d="M259.8,173.3c-1.1-0.1-2,0-2.7,0.3c-2.2,0.8-2.1,3.3-2.1,3.3c0-0.1,1-3.2,4.6-2.7c1.7,0.3,3,1.7,3.6,3.6
|
||||
c0.7,2.5,0.1,5.3-1.7,7.2c-3.2,3.3-6.2,3.1-8.5,2.9c-0.3,0-0.6-0.1-0.9-0.1l-0.2,0l-0.3,0.3c-2.1,1.8-5.3,4.6-12.3,2.1
|
||||
c-3-1.1-5.3-3.4-6.3-6.6c-1.1-3.5-0.7-7.5,1.1-10.4c4.5-6.4,12.6-3.6,12.7-3.6c0,0-2.6-1.8-6-1.4c-2.5,0.3-5.3,1.5-7.4,4.5
|
||||
c-2,3.2-2.4,7.4-1.2,11.2c1.1,3.4,3.5,6,6.8,7.1c2.1,0.7,3.9,1,5.4,1c3.9,0,6.2-2,7.7-3.3l0.1-0.1c0.2,0,0.5,0,0.7,0.1
|
||||
c2.2,0.2,5.6,0.5,9.1-3.1c2-2.1,2.8-5.2,1.9-8.1C263.4,175.2,261.8,173.6,259.8,173.3z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M251.1,188.6l0.5,0.7c2.1-1.5,4.1-5.6,4.2-5.8C255.7,183.6,253,187.3,251.1,188.6z"/>
|
||||
</g>
|
||||
</g>
|
||||
<path class="st43" d="M240.7,175.4c-2.5,0.7-4.8,0.3-5.1-1c-0.3-1.2,1.5-2.8,4-3.5c2.5-0.7,4.8-0.3,5.1,1
|
||||
C245,173.1,243.2,174.7,240.7,175.4z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 56 KiB |
@@ -1,7 +0,0 @@
|
||||
<svg width="35" height="39" viewBox="0 0 35 39" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M25.1864 30.603C24.8028 30.603 24.414 30.5757 24.0323 30.5216C19.2444 29.8442 15.9414 25.1062 16.6694 19.9593C17.33 15.2922 21.1339 11.7725 25.5186 11.7725C25.9023 11.7725 26.2908 11.7999 26.6727 11.8541C31.4604 12.5315 34.7635 17.2695 34.0355 22.416C33.3751 27.0833 29.5712 30.603 25.1864 30.603ZM25.5185 15.1239C22.7932 15.1239 20.4156 17.4045 19.988 20.4287C19.5186 23.7457 21.5434 26.7848 24.5012 27.2032C24.7285 27.2353 24.9588 27.2517 25.1864 27.2517C27.9116 27.2517 30.289 24.971 30.7169 21.9465C31.1863 18.6298 29.1615 15.591 26.2036 15.1722C25.9761 15.1403 25.7459 15.1239 25.5185 15.1239Z" fill="#F78E39"/>
|
||||
<path d="M24.4479 31.2558C24.4479 32.6373 23.3279 33.7571 21.9464 33.7571H2.50148C1.11998 33.7571 0 32.6373 0 31.2558V7.44959C0 6.06809 1.11998 4.94824 2.50148 4.94824H21.9465C23.3281 4.94824 24.448 6.06809 24.448 7.44959L24.4479 31.2558Z" fill="#F78E39"/>
|
||||
<path d="M12.2759 13.5729C19.0318 13.5729 24.5085 10.5345 24.5085 6.78647C24.5085 3.03841 19.0318 0 12.2759 0C5.51997 0 0.0432129 3.03841 0.0432129 6.78647C0.0432129 10.5345 5.51997 13.5729 12.2759 13.5729Z" fill="#FFA44A"/>
|
||||
<path d="M12.2758 11.2589C17.4121 11.2589 21.5759 9.25681 21.5759 6.78715C21.5759 4.31749 17.4121 2.31543 12.2758 2.31543C7.13951 2.31543 2.97571 4.31749 2.97571 6.78715C2.97571 9.25681 7.13951 11.2589 12.2758 11.2589Z" fill="#824D29"/>
|
||||
<path d="M12.2759 38.3727C19.0318 38.3727 24.5085 35.3343 24.5085 31.5863C24.5085 27.8382 19.0318 24.7998 12.2759 24.7998C5.51997 24.7998 0.0432129 27.8382 0.0432129 31.5863C0.0432129 35.3343 5.51997 38.3727 12.2759 38.3727Z" fill="#F78E39"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 4.8 MiB |
@@ -1,372 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 25.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 2800 2800" style="enable-background:new 0 0 2800 2800;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:none;}
|
||||
.st1{fill:#BE7539;}
|
||||
.st2{fill:#603813;}
|
||||
.st3{fill:#FFFFFF;}
|
||||
</style>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st0" d="M1397.6,1914c75.7,0.8,155.4-6.4,221.4-19.8c-76.6-52.7-155.9-110.7-232.1-172.4
|
||||
c-54.5,58.5-116.9,117.4-182.4,172.4C1265.8,1906.7,1330.6,1913.3,1397.6,1914z"/>
|
||||
<path class="st0" d="M1211.4,1086.2l1.1-1.3c6.2-7,12.8-12.3,19.6-16c-137.6-155.7-293-159.3-299.9-159.3c-2.6,0-4.1,0.1-4.8,0.1
|
||||
c-46.5,3.4-146.7,43.9-217.5,138.1c-75.7,100.9-96.8,232.6-62.7,391.4c24.9,116.1,89.1,212.8,196.1,295.2
|
||||
c38.8-23.6,79.8-50,122.5-80.7c77.3-55.7,136.4-109,190.4-171.6c-16.1-40.3-23.9-87.5-23.3-141.1
|
||||
C1134.4,1193.2,1208.3,1090.5,1211.4,1086.2z"/>
|
||||
<path class="st0" d="M1852.5,1611.2c63.7,42.8,118.8,76.9,167,104.9c120.1-113.4,179.5-268.3,176.5-460.8
|
||||
c-1.3-83.9-26.1-162.9-69.9-222.3c-44.7-60.7-105.8-94.5-172.1-95.2c-14.8-0.2-30,1.3-45.3,4.3c-59.4,11.7-152.9,61.3-221.7,117.1
|
||||
c6.3,22.7,12.2,51.6,14.5,84.9c4.8,72.2-7.8,179.3-91.8,286.7C1694.2,1501.8,1788.2,1568,1852.5,1611.2z"/>
|
||||
<path class="st1" d="M580.5,1900.9c0.3-0.3,0.5-0.6,0.8-0.9c0.5-0.5,1.1-1,1.6-1.5c1.7-1.6,3.3-3.2,5.1-4.8c0.5-0.5,1-0.9,1.5-1.4
|
||||
c6.6-5.9,13.7-11.7,21.3-17.6c0.5-0.3,0.9-0.7,1.4-1c2.1-1.6,4.3-3.2,6.5-4.8c1.1-0.8,2.1-1.5,3.2-2.3c2-1.4,4-2.9,6.1-4.3
|
||||
c1.4-1,2.8-1.9,4.2-2.9c1.9-1.3,3.9-2.6,5.8-3.9c1.7-1.1,3.4-2.3,5.2-3.4c1.8-1.2,3.6-2.3,5.4-3.5c2.4-1.5,4.9-3.1,7.3-4.6
|
||||
c1.3-0.8,2.5-1.6,3.8-2.4c3.8-2.4,7.7-4.7,11.7-7.1c1.2-0.7,2.4-1.4,3.5-2.1c3-1.8,5.9-3.6,9-5.4c1.5-0.9,2.9-1.7,4.4-2.6
|
||||
c2.8-1.7,5.7-3.3,8.6-5c1.6-0.9,3.2-1.9,4.8-2.8c2.9-1.7,5.8-3.3,8.7-5c1.7-1,3.4-2,5.1-3c2.7-1.5,5.4-3.1,8.1-4.6
|
||||
c6.4-3.7,12.9-7.4,19.6-11.2c10.6-6,21.3-12.2,32.3-18.4c0.2-0.1,0.3-0.2,0.4-0.3c11-6.3,22.2-12.8,33.6-19.5
|
||||
c-106.1-85.3-172.7-188.7-198.2-307.7c-25-116.7-33.3-284.5,69.3-421.2c44.1-58.7,96-94.6,131.8-114.3
|
||||
c39.6-21.8,81.6-36.2,112.4-38.4c2.2-0.2,4.9-0.2,7.9-0.2c71.7,0.8,224.7,42.8,346.4,194.7c25.5,10.8,51.8,39.4,85.9,84.1
|
||||
c0,0,0,0.1,0.1,0.1c1.5,1.9,2.9,3.8,4.4,5.8c0.2,0.3,0.4,0.5,0.6,0.8c1.4,1.9,2.9,3.8,4.4,5.8c0.1,0.2,0.3,0.4,0.5,0.6
|
||||
c6.3,8.4,12.9,17.4,19.8,26.8c0.1,0.1,0.2,0.2,0.3,0.4c7,9.6,14.4,19.8,22.1,30.4c5.6,7.7,11.3,15.5,17.1,23.5
|
||||
c7.2,9.9,14.6,20,22.3,30.5c0,0.1,0.1,0.1,0.1,0.2c2.2,3,4.5,6,6.9,9c1.1,1.4,2.2,2.8,3.3,4.2c0.9,1.1,1.8,2.2,2.7,3.3
|
||||
c27,33.4,64.8,71.6,110.8,112.4c0.5,0.5,1.1,0.9,1.6,1.4c139.1-179.2,64.8-358.3,53.8-382.3c-0.6-1.4-1.1-2.2-1.2-2.6
|
||||
c-2.7-4.9-58.6-105.1-174.2-207c-97.7-85.9-254.1-186.7-471.6-217.6c-16.2-2.3-32.9-3.6-49.9-3.7C800.4,592,645.1,662.1,523.2,781
|
||||
c-133.4,130.1-211.3,299.6-219.3,477.2c-6.9,152.7,17.4,290.8,72.1,410.5c43.8,95.5,107,179.7,188.1,250.5c0.5-0.7,1.1-1.3,1.6-2
|
||||
c0.9-1.1,1.9-2.3,2.8-3.4c1.4-1.6,2.7-3.2,4.2-4.8c0.8-0.9,1.7-1.8,2.6-2.8C577,1904.4,578.7,1902.7,580.5,1900.9z M680.1,1758.3
|
||||
c0.9-35.1,23.6-7.2,23.6-7.2s10.9,31.5,3,35.2C706.7,1786.3,679.2,1793.4,680.1,1758.3z M602.8,1693.7c15-2.8,26.4,51.1-3.3,29.9
|
||||
C599.5,1723.5,587.8,1696.5,602.8,1693.7z M1549.7,1306.5c-10.7,14-17.6-0.2-17.6-0.2s-10.4-21.3,7.3-21.1
|
||||
C1557,1285.4,1560.4,1292.5,1549.7,1306.5z M1541.5,1001.1c14.7,0.2,43.9,22.6,21.7,37.1c-22.2,14.5-29.3-11.4-29.3-11.4
|
||||
S1526.8,1001,1541.5,1001.1z M1510,1137c5.5-1.8,15.9,4,19,10.3c4.3,8.8,6.5,19-7.7,17.4c0,0-17.1-5.1-19.4-17.4
|
||||
C1500.8,1141.5,1505.1,1138.5,1510,1137z M1438.6,870.3c14.7,0.2,25.6,11.3,21.8,22.3c-1.9,5.5-7.5,9.1-12.5,11.4
|
||||
c-5.1,2.2-12.7-4.5-14.5-12.8C1431.2,881.2,1430.6,870.2,1438.6,870.3z M1362.4,1047c11.2-16.4,42.4-0.9,36.6,21.1
|
||||
c-2.4,9.3-2.2,15.6-14.9,12.2C1384.2,1080.4,1351.2,1063.5,1362.4,1047z M1273.9,894.5c-15.5,16.3-24.6,9.6-24.6,9.6l-4.7-17.2
|
||||
c0,0,2.6-12.2,14.9-12.1C1271.7,874.9,1283.8,884.2,1273.9,894.5z M1223.6,737.9c0,0,14.1-10.3,23.6-2.9
|
||||
c9.5,7.4,12.2,15.6,2.1,16.8C1239.2,753.1,1221.5,748.4,1223.6,737.9z M1132.4,675.3c0,0,20.7,15.4,13.3,37.5
|
||||
c-7.3,22.1-22.8,5.9-31-13.9C1106.7,679.1,1132.4,675.3,1132.4,675.3z M1065.4,768.7c9.8-2.3,19.7-7.2,19.7-7.2s4.7,17.2-2.7,19.6
|
||||
c-7.4,2.4-14.8,2.3-14.8,2.3S1055.6,771,1065.4,768.7z M894.3,706c8.5-1.6,16.2-1.7,22.1-1.3c7.4,0.5,16.7,9.3,19,17
|
||||
c2.3,7.6,2.2,15.2-7.3,15.1c-19-0.2-37.8-11.8-37.8-11.8S875.3,709.6,894.3,706z M824,791.6c20.3,11.4,20.3,11.4,20.3,11.4
|
||||
s13.2,28.8-13.5,31.1C804.1,836.4,803.7,780.1,824,791.6z M352,1315.3c-7.5,9.7-14.8,9.7-24.5-7.6c0,0-3.7-8.5,12.4-12.1
|
||||
C340,1295.5,359.5,1305.5,352,1315.3z M689.5,719.4c5.8-2.5,12.9-4.9,18.1-5c6-0.1,6.3,6.2,5.5,11.5c-0.6,4-6,9.2-11.3,11.3
|
||||
c-5.1,2-11.3,4.3-15.9,6c-5.3,1.9-6.7-4.4-7-10.2C678.7,728.6,683.7,721.9,689.5,719.4z M589.4,823.3c0.7-7.3,7.8-4.2,12,3.5
|
||||
c0,0,8,20.4-9.3,21.3C574.7,849.1,588.7,830.7,589.4,823.3z M577.3,964.6c17.2,0.2,2.3,12.3,2.3,12.3l4.8,12.3
|
||||
c-6.1,12-12.3,4.8-12.3,4.8S560.1,964.5,577.3,964.6z M428.1,1440.8c0,0-15.2,20.2-19.9,3.5
|
||||
C403.5,1427.6,437.1,1412.6,428.1,1440.8z M410.2,1152.1c0,0,12.3,26,0.3,29.6C398.4,1185.2,386.3,1134.5,410.2,1152.1z
|
||||
M436.6,1591.5c-2.4,18.6-39.6,13.9-30.7-16.2C409.2,1564,438.9,1572.8,436.6,1591.5z M455.4,1036.5c-8.4-1.7-3.9-9.6,5.7-13.4
|
||||
c0,0,24.7-6.6,23.5,13.6C483.4,1056.8,463.8,1038.2,455.4,1036.5z M509.2,1686c-10.7,14-17.6-0.2-17.6-0.2s-10.4-21.3,7.3-21.1
|
||||
C516.5,1664.9,519.9,1672,509.2,1686z M516.2,1361.5c-1.7,23.2-20.7,11.3-33.4-6c-7.2-9.8-2.6-17.2,2.7-21.8
|
||||
c4.1-3.5,14.6-2.9,20.3,2.5C511.6,1341.6,517.1,1349.9,516.2,1361.5z M520.4,1180.6c0,0,0.2-20.2,9.4-22
|
||||
c9.2-1.7,22,11.3,14.5,20.4C536.8,1188.2,520.4,1180.6,520.4,1180.6z M554.7,1810.3c-19-6.5-19-6.5-19-6.5s-9.3-19.1,9.7-15.8
|
||||
C564.4,1791.4,573.6,1816.8,554.7,1810.3z M553.2,1578.7c-7.3-5-4.2-19.9-0.1-22.2c8.5-4.8,21.6-8.3,22.2,15
|
||||
C575.7,1583.8,560.5,1583.6,553.2,1578.7z"/>
|
||||
<path class="st1" d="M2197.9,1854.3c-1.1-0.6-2.3-1.2-3.4-1.8c-0.7-0.4-1.4-0.8-2.2-1.1c-1.6-0.9-3.3-1.8-5-2.6
|
||||
c-0.2-0.1-0.3-0.2-0.5-0.2c-9.8-5.1-20.3-10.6-31.5-16.5c-6-3.1-12.3-6.4-18.8-9.8c-1.1-0.6-2.3-1.2-3.4-1.8
|
||||
c-0.2-0.1-0.3-0.2-0.5-0.2c-36.9-19.2-80-42.2-131-71.9l-10.8-6.2l0.1-0.1c-46.3-27.2-98.9-59.9-159-100.3
|
||||
c-238.6-160.3-348.5-269.7-399-335.3c-0.1-0.1-0.2-0.3-0.3-0.4c-2.1-2.7-4.1-5.4-6-8c-11.1-15.1-21.5-29.4-31.5-43.2
|
||||
c-2.7-3.7-5.4-7.4-8-11c-54.4-75.1-97.4-134.5-125-143.4l-1.4-0.5c-1.4-0.3-2.8-0.6-4.2-0.6c-1.8,0-7.3-0.1-15.8,9.2
|
||||
c-6.1,8.7-69.6,103.1-71,232.8c-0.6,52.9,7.7,98.4,24.6,136.1l0.2,0.4c1.2,2.6,2.4,5.1,3.6,7.6c0.4,0.7,0.7,1.5,1.1,2.2
|
||||
c1.2,2.4,2.4,4.7,3.7,7c0.4,0.8,0.9,1.6,1.3,2.3c3.9,6.7,8,13.2,12.5,19.3c1,1.4,2.1,2.8,3.1,4.2c1,1.4,2.1,2.7,3.2,4
|
||||
c1.4,1.7,2.8,3.4,4.2,5c0.9,1,1.8,2.1,2.7,3.1c2.4,2.7,4.9,5.3,7.4,7.8l0,0l0,0c0.1,0.1,0.3,0.2,0.4,0.4
|
||||
c4.1,4.1,8.4,8.2,12.6,12.2c58.1,55.8,195.6,179.3,416.6,329.8l0.5-0.1l7,4.7c150.4,101.4,286.5,180.1,354.2,218l11.3,6.3
|
||||
c7.1,3.9,14.3,7.9,21.5,11.9c27.8,15.2,49.4,26,75.3,26.3h0c19,0.2,39.7-5.3,63.5-16.9c104.2-50.7,109.4-167.3,96.7-195.7
|
||||
C2282,1903.8,2252.2,1883.4,2197.9,1854.3z M1260.5,1370.9c-3.2,6.7-7.5,11.9-11.9,5.6c-8.3-11.6-7.7-29.4,6.2-25.7
|
||||
C1257.8,1351.6,1263.6,1364.4,1260.5,1370.9z M1277.5,1242.2c0,0-1.6-23.1,12.4-12.1c0,0,19.5,10,12.1,19.8
|
||||
C1294.5,1259.6,1287.1,1259.5,1277.5,1242.2z M1326,1510.2c-3.1,11.9-21.1,11.7-21.1,11.7s-11.6-33,3.4-35.9
|
||||
C1323.3,1483.2,1329.1,1498.3,1326,1510.2z M1385.1,1391.5c-5.2-16.6-26.2-37.7,2.8-35.5c0,0,21.6,14.7,20.8,24.3
|
||||
C1407.9,1390,1390.3,1408.1,1385.1,1391.5z M1407.9,1585.9c-4.7-16.7,19.6-17.2,19.9-3.5
|
||||
C1427.8,1582.4,1412.7,1602.6,1407.9,1585.9z M1540.1,1641.6c0,0-38.8,20.8-34.9-26c1.1-13.6,28.4,1.3,28.4,1.3s10.8-5.3,16.1,3.4
|
||||
C1564,1643.7,1540.1,1641.6,1540.1,1641.6z M1661.6,1806.2c0,0-12-22.2,5.1-19.6C1683.9,1789.3,1683.5,1826.1,1661.6,1806.2z
|
||||
M1685.1,1715.8c0,0-29.3,0-33.7-15.5c-4.4-15.5,9.9-23.8,23.8-19.4c13.8,4.4,29.9,16.6,29.3,29.3
|
||||
C1703.9,1723,1685.1,1715.8,1685.1,1715.8z M1793.3,1888.5c-5.1,6.6-12.9,7.7-18.8,7.3c-4.8-0.3-8.8-6.3-8.5-12.1
|
||||
c0.6-9.7,3.1-22.6,12.5-22.5C1793.6,1861.3,1802.5,1876.5,1793.3,1888.5z M1834.7,1753.1c-13.4,5.5-16.9-7.1-16.9-7.1
|
||||
s5.1-16,9.4-18.3c8.9-4.8,12.7,0.4,14.2,6.9C1842.9,1741.1,1836.9,1752.2,1834.7,1753.1z M1896.9,1837c0,0-3-19.4,9.9-19.2
|
||||
C1919.7,1817.9,1925.6,1863.1,1896.9,1837z M1967.1,1981.4c-22-7.6-22-7.6-22-7.6s-18.1-26,7.7-33.1
|
||||
C1978.6,1933.7,1989.1,1989,1967.1,1981.4z M2042.3,1869.9c0,0,0.2-13.8,11.7-13.7c11.5,0.1,13.6,16.3,4.4,18.5
|
||||
C2049.1,1876.8,2042.3,1869.9,2042.3,1869.9z M2090.2,2010.2c-7.8,6.6-28.9-13.2-28.9-13.2c-6.3-13,16.3-19.2,29.1-12.6
|
||||
C2103.3,1991,2090.2,2010.2,2090.2,2010.2z M2133.3,2091c-21.6-4.6,0.7-15.2,5.8-19.4c5.1-4.2,10.7-10.1,21.5,4.7
|
||||
C2160.7,2076.2,2154.9,2095.5,2133.3,2091z M2171.3,1959.2c-7.4-9.3,3.4-17.1,10.6-17c7.2,0.1,11.9,19.5,11.9,19.5
|
||||
S2185,1976.3,2171.3,1959.2z"/>
|
||||
<path class="st1" d="M2519.2,1166.9c-23.5-218-136.3-352-226.8-426c-122.1-99.8-257.1-136.4-342.7-137.3
|
||||
c-10.4-0.1-20.5,0.3-30.1,1.1c-217.7,19.7-348.6,113.4-422.4,193.9c3.2,2.9,6.4,5.8,9.4,8.7c3.8,3.5,7.5,7.1,11.1,10.6
|
||||
c0.5,0.5,1,1,1.5,1.5c2.7,2.6,5.4,5.3,8,7.9c1.1,1.1,2.1,2.1,3.2,3.2c2,2,4,4.1,6,6.1c1.4,1.4,2.8,2.9,4.2,4.3
|
||||
c1.6,1.6,3.1,3.2,4.7,4.8c1.6,1.7,3.2,3.4,4.8,5c1.3,1.3,2.6,2.7,3.8,4c1.7,1.8,3.4,3.7,5.1,5.5c1.1,1.2,2.1,2.3,3.2,3.5
|
||||
c1.8,1.9,3.5,3.9,5.2,5.8c0.9,1,1.8,2,2.7,3c1.8,2,3.5,4,5.3,6c0.8,0.9,1.6,1.8,2.3,2.7c1.8,2.1,3.5,4.1,5.2,6.1
|
||||
c0.7,0.8,1.4,1.6,2,2.4c1.8,2.1,3.5,4.1,5.2,6.1c0.6,0.7,1.2,1.5,1.8,2.2c1.7,2.1,3.4,4.1,5,6.1c0.5,0.7,1.1,1.4,1.6,2
|
||||
c1.6,2,3.2,4,4.8,6c0.5,0.6,1,1.3,1.5,1.9c1.6,2,3.1,3.9,4.6,5.9c0.5,0.6,1,1.2,1.4,1.9c1.5,1.9,2.9,3.8,4.3,5.7
|
||||
c0.5,0.6,0.9,1.2,1.4,1.8c1.4,1.8,2.8,3.7,4.1,5.4c0.4,0.6,0.9,1.2,1.3,1.8c1.3,1.8,2.6,3.5,3.8,5.2c0.4,0.6,0.9,1.2,1.3,1.8
|
||||
c1.2,1.7,2.4,3.3,3.5,4.9c0.4,0.6,0.8,1.2,1.2,1.8c1.1,1.6,2.2,3.1,3.3,4.6c0.4,0.6,0.8,1.2,1.2,1.8c1,1.5,2,2.9,3,4.3
|
||||
c0.4,0.6,0.8,1.2,1.2,1.8c0.9,1.3,1.8,2.7,2.7,4c0.4,0.6,0.8,1.2,1.2,1.8c0.8,1.2,1.6,2.4,2.4,3.6c0.4,0.6,0.8,1.2,1.2,1.9
|
||||
c0.7,1.1,1.4,2.1,2.1,3.2c0.4,0.7,0.8,1.3,1.3,2c0.6,0.9,1.2,1.8,1.7,2.7c0.4,0.7,0.9,1.4,1.3,2.1c0.5,0.8,0.9,1.5,1.4,2.2
|
||||
c0.5,0.7,0.9,1.4,1.3,2.1c0.4,0.6,0.7,1.2,1.1,1.7c0.5,0.8,0.9,1.5,1.4,2.2c0.2,0.4,0.5,0.8,0.7,1.2c0.5,0.9,1,1.7,1.4,2.4
|
||||
c0.1,0.2,0.2,0.4,0.3,0.6c0.5,0.9,1,1.7,1.5,2.5c0,0,0,0.1,0.1,0.1c1.9,3.3,3,5.3,3.2,5.8l0.2,0.3c0.4,0.7,3.4,6.7,7.5,17.1
|
||||
c64.6-50,157.1-102.3,227-116.1c17.8-3.5,35.6-5.2,52.9-5c78.1,0.8,149.7,40,201.4,110.2c48.3,65.6,75.7,152.1,77.1,243.6
|
||||
c3,199-57.5,360.5-180,480.5c40.8,23,76.1,41.6,106.2,57.2c1.9,1,3.8,2,5.7,2.9c0.5,0.2,0.9,0.5,1.4,0.7c2.2,1.1,4.3,2.2,6.4,3.3
|
||||
c19.8,10.3,37.5,19.5,53.4,28.2c0.3,0.2,0.5,0.3,0.8,0.5c2.9,1.6,5.7,3.1,8.4,4.7c0.2,0.1,0.4,0.2,0.6,0.3
|
||||
c2.8,1.6,5.5,3.2,8.2,4.7c0.5,0.3,0.9,0.6,1.4,0.8c2.2,1.3,4.4,2.6,6.5,3.9c0.5,0.3,1.1,0.7,1.6,1c2.4,1.5,4.7,2.9,7,4.4
|
||||
c0.6,0.4,1.1,0.7,1.6,1.1c1.8,1.2,3.5,2.3,5.3,3.5c0.7,0.4,1.3,0.9,2,1.3c2.1,1.4,4.1,2.9,6.1,4.3c0.5,0.3,0.9,0.7,1.4,1
|
||||
c1.6,1.2,3.2,2.3,4.7,3.5c0.6,0.5,1.2,0.9,1.8,1.4c1.9,1.5,3.8,3,5.6,4.5c0.2,0.2,0.5,0.4,0.7,0.6c1.6,1.4,3.2,2.8,4.8,4.2
|
||||
c0.4,0.4,0.9,0.8,1.3,1.2c3.6,3.3,6.9,6.6,10.1,10.1c0.1,0.1,0.3,0.3,0.4,0.4C2394.5,1792.6,2561.7,1561.6,2519.2,1166.9z
|
||||
M1645.8,884.4c-12,3.6-24.1-47.1-0.3-29.6C1645.6,854.9,1657.8,880.9,1645.8,884.4z M1733.6,715.1c-12.7,4.9-28.1,22.5-27.8-0.3
|
||||
c0,0,10.3-17.6,17.9-17.5C1731.3,697.3,1746.3,710.2,1733.6,715.1z M1810.9,847.4c0,0-28.2,22.1-34.7,15.4
|
||||
c0,0-16.9-25.4,19.1-36.8C1831.3,814.5,1810.9,847.4,1810.9,847.4z M1882.9,745.3c-22-7.6-22-7.6-22-7.6s-18.1-26,7.7-33.1
|
||||
C1894.5,697.5,1905,752.9,1882.9,745.3z M1992.8,694c-11-0.1-22-11.3-22-11.3s3.9-18.4,22.3-18.2
|
||||
C2011.5,664.8,2003.8,694.1,1992.8,694z M2028.5,793.8c-11.2,18.3-29.4-0.3-29.4-0.3s0.3-25.8,22.4-32.9
|
||||
C2043.7,753.5,2039.7,775.5,2028.5,793.8z M2139,787.6c18.4-3.5,36.6,22.5-0.2,22.1C2138.8,809.7,2120.6,791.1,2139,787.6z
|
||||
M2171.6,943.5c0,0-36.8-0.4-18.1-26c18.7-25.6,7.5-14.6,22.1,0.2C2190.2,932.7,2171.6,943.5,2171.6,943.5z M2167.1,1770.7
|
||||
c0,0-2.3-14.5,0.2-21.7c2.5-7.2,15.5-3.9,13.8,11.2c-0.5,4.3,0.5,8.3,0.5,10.7C2181.5,1778.2,2167.1,1770.7,2167.1,1770.7z
|
||||
M2241.5,1680c-11.2,18.3-22.1,3.4-22.1,3.4s-21.8-22.3,0.3-29.5C2241.9,1646.9,2252.7,1661.8,2241.5,1680z M2429.3,1345.7
|
||||
c18.4,3.9,10.6,40.6-18.7,29.3C2399.7,1370.8,2410.9,1341.9,2429.3,1345.7z M2400.7,991.7c12.3-2.3,19.1,49.3-2.8,29.4
|
||||
C2397.9,1021.2,2388.4,994.1,2400.7,991.7z M2332.1,978.7c17.2,2.6,16.8,39.5-5.1,19.6C2326.9,998.3,2314.9,976.1,2332.1,978.7z
|
||||
M2301.4,1759.8c-19.7-6.8-19.7-6.8-19.7-6.8s-9.7-19.9,10.1-16.4C2311.5,1740.2,2321.1,1766.7,2301.4,1759.8z M2312.4,1480.8
|
||||
c-7.5,9.1-23.9,1.6-23.9,1.6s0.2-20.2,9.4-22C2307.1,1458.7,2319.8,1471.7,2312.4,1480.8z M2314.9,863.2l-14.8,7.2
|
||||
c0,0-21.8-22.3-3.3-36.9C2315.4,819,2314.9,863.2,2314.9,863.2z M2340.8,1582.7c-0.1,5.5-0.2,16.6-7.5,16.5
|
||||
c-7.4-0.1-7.3-7.4-7.3-7.4s2.1-22.1,9.4-22C2342.8,1569.8,2340.8,1577.2,2340.8,1582.7z M2351.4,1289.1
|
||||
c-7.5,9.7-14.9,12.1-22.2,7.1c-7.3-5-7.2-17.3-7.2-17.3l5-4c0,0,9.1-7.6,17.6-2.7C2350.7,1275.8,2355.7,1283.4,2351.4,1289.1z
|
||||
M2388.8,1175.7c0,0-9.6-19.7,7.6-22c17.2-2.3,4.7,17.2,4.6,24.6C2401,1185.6,2393.7,1183.1,2388.8,1175.7z M2420.2,1667.3
|
||||
l-22-3.9c0,0,0.2-18.4,14.9-18.2C2427.8,1645.3,2420.2,1667.3,2420.2,1667.3z M2450.9,1506.1c-7.5,9.1-13.3,14.1-22.3,16.3
|
||||
c-20,5-20.2-7.6-20.2-7.6s14.9-18.2,26-20C2445.5,1493.2,2458.3,1497,2450.9,1506.1z M2488,1255.8c-7.5,9.7-14.8,9.7-24.5-7.6
|
||||
l12.4-12.1C2476,1236,2495.5,1246,2488,1255.8z"/>
|
||||
<path class="st1" d="M1397.2,1950.8c-79.9-0.9-156.9-9.9-228.9-26.8l-16.9,13.8c-7.6,6.2-15,12.2-22.2,18.1
|
||||
c-0.7,0.6-1.4,1.2-2.2,1.7c-3,2.4-6,4.8-8.9,7.2c-2.2,1.8-4.4,3.5-6.5,5.3c-1,0.8-1.9,1.6-2.9,2.4c-2.4,2-4.9,3.9-7.3,5.9
|
||||
c0,0-0.1,0.1-0.1,0.1c-68.8,55.5-120.6,95.3-182.5,133.2c95.5,41.7,253.6,86.8,497.9,94.6c3.7,0.1,7.4,0.2,11.3,0.2
|
||||
c130.2,1.4,363.8-35.7,447.3-60.7c9.7-2.9,20.8-5.9,32.5-9c19.4-5.2,41.9-11.3,67.4-19.4c-77.4-44.2-190.8-111.8-314.4-194.8
|
||||
C1586.5,1941.3,1488.8,1951.8,1397.2,1950.8z M1060.4,2085.6c-3.7,1.2-9.8-2.6-12.3,2.3c-2.5,4.9-7.3-8.7-7.3-8.7
|
||||
s12.4-15.8,19.7-9.6C1067.9,2075.8,1064.1,2084.4,1060.4,2085.6z M1174.3,2136.4l-30.1,3c0,0-2.9-36.7,13.7-36.6
|
||||
C1174.7,2103.1,1174.3,2136.4,1174.3,2136.4z M1184.9,2047.5c-0.5,3-6.5,3.4-12.7,1.1c-7.8-2.9-17.7-6.6-22.2-8.7
|
||||
c-8-3.8,7.7-16,7.7-16s17.3,5,24.1,11.5C1185.4,2039,1185.5,2043.9,1184.9,2047.5z M1290.9,2006.3c-2.6-12,2.3-17.6,21.7-13.7
|
||||
l1.2,17.3C1313.8,2010,1293.5,2018.3,1290.9,2006.3z M1366.4,2129.9c-8.1,13.9-29.1,5.3-25.4-7.4c1.6-5.4,4.8-9.1,8.1-11.6
|
||||
c4.4-3.4,13-2.1,16.1,2C1368.3,2117.1,1370.4,2123,1366.4,2129.9z M1425.8,2058c0,0-15.1-10.3-2.4-12.7
|
||||
c12.7-2.4,17.6,7.8,17.6,7.8S1428.2,2070.7,1425.8,2058z M1540,2151c-5.5,8.9-12.6,9.1-18.5,6.9c-6.2-2.3-10.9-13.2-8.4-20.2
|
||||
c2.7-7.5,8.3-16.2,19.8-19.9C1555.2,2110.7,1551.3,2132.7,1540,2151z M1577,2033.3c0,0-14.3,10.1-23.7,2.6
|
||||
c-9.4-7.5-12-15.8-1.9-16.9C1561.6,2017.9,1579.2,2022.8,1577,2033.3z M1784.2,2070.1c0,0,25.1-11.7,24.6,2.3
|
||||
c-0.5,14-14.4,3.6-17.5,10.8c-1.6,3.6-5.8,2.8-9.7,1.1C1777.6,2082.5,1784.2,2070.1,1784.2,2070.1z M1679.8,2122.4
|
||||
c7.7,3.7,17.6,10.5,11.3,19.5c-8.1,11.7-41.1-6.3-30.2-17.4C1663,2122.5,1675.6,2120.4,1679.8,2122.4z"/>
|
||||
<path class="st1" d="M1091.7,1938.7c1.6-1.3,3.2-2.6,4.9-3.9c2.2-1.8,4.4-3.6,6.7-5.4c0.9-0.7,1.8-1.4,2.7-2.2
|
||||
c7.2-5.8,14.5-11.8,22.1-17.9l25.9-21c73.5-59.7,143.9-125,204.4-189.8c-38.5-32-76-64.8-111.7-98.3c-0.9-0.8-1.8-1.7-2.7-2.5
|
||||
c-4.4-4.2-8.9-8.4-13.2-12.6c-1.2-1.1-2.4-2.3-3.6-3.4c-5.2-5-10.4-10-15.5-15.1c-3.6-3.5-7-7.1-10.3-10.8
|
||||
c-0.6-0.6-1.1-1.3-1.6-1.9c-2.8-3.2-5.5-6.5-8.2-9.8c-0.4-0.5-0.7-1-1.1-1.5c-2.8-3.6-5.5-7.3-8.1-11.1c-0.2-0.3-0.4-0.6-0.6-0.8
|
||||
c-2.8-4.1-5.4-8.3-8-12.6l0-0.1c-53.1,59.8-111.6,111.7-186.4,165.6c-38.7,27.9-76.5,52.5-112.3,74.6l0.2,0.1l-23.5,14.1
|
||||
c-13.6,8.2-26.7,15.9-39.5,23.3c-0.3,0.2-0.6,0.3-0.8,0.5c-3.7,2.1-7.4,4.3-11,6.4c-1.1,0.6-2.2,1.3-3.3,1.9
|
||||
c-2.5,1.4-5,2.9-7.4,4.3c-2,1.2-4,2.3-6,3.5c-0.6,0.3-1.2,0.7-1.7,1c-6.9,4-13.8,7.9-20.4,11.6c-57.6,32.8-102.2,58.9-133.5,83.5
|
||||
c-19.7,15.5-34.7,31-43.9,47.2l-1.2,2.1c-11,20.7-12.7,42.8-4.8,69.4c18.1,61.2,98.1,115.6,171.2,116.4l0,0
|
||||
c22.8,0.2,44-4.6,62.9-14.3c19.2-9.9,37-19.5,53.9-29.1l1.9-1.1c1-0.5,1.9-1.1,2.8-1.6c76.8-44.2,134.8-88.8,217.1-155.4
|
||||
C1089.1,1940.9,1090.4,1939.8,1091.7,1938.7z M1279.6,1671.2c7.4,0.1,8,8.1,5.4,12.9c-2.7,5.2-0.2,16.6-7.5,16.5
|
||||
c-7.4-0.1-7.3-7.4-7.3-7.4S1272.3,1671.1,1279.6,1671.2z M1169,1631.3c3.8,0,7.2,3.8,9.8,8c3.2,5,4,12.3,2,14
|
||||
c-4,3.6-11.3,7-18.2-5.5C1162.6,1647.8,1160.7,1631.2,1169,1631.3z M1152.4,1744.2c10.2-4.9,31.1,3.4,36.2,10.5
|
||||
c8.3,11.6-15.9,11.6-15.9,11.6l-10.6-1.8C1145.9,1760.8,1142.2,1749,1152.4,1744.2z M679.1,1962.9c-3.7-1.3-6.5-2.3-8.7-3
|
||||
c-6.5-2.2-7.8-5-8.2-7.9c-0.5-4,0.7-8.4,9.4-6.9C686.8,1947.8,694.2,1968.1,679.1,1962.9z M765.3,2007.8
|
||||
c-3.3,9.6-3.5,22.5-13.2,25.6c-9.7,3.1-22.5-6.7-22.5-6.7s3.4-16.1,16.4-28.8C759.1,1985.2,768.6,1998.2,765.3,2007.8z
|
||||
M877.2,2006.3c-1.6,5.9-6.8,8.9-11.6,10.3c-4.9,1.5-11-3-12.2-8.8c-2.1-10-3.3-23.8,6.2-25.6
|
||||
C874.5,1979.3,880.3,1994.3,877.2,2006.3z M918.2,1898.9c-1.7,6.4-7.6,9.8-13.7,11.7c-7.3,2.2-16.3-8-16.3-8l-1.7-11
|
||||
c0,0-3.3-17.7,17.8-17.4C925.5,1874.2,921.9,1884.8,918.2,1898.9z M987.9,1981.7c-1.3,3.8-6.5,0.5-10.3-2.6
|
||||
c-2.3-1.9-1.1-12.5-1.1-12.5l3.4-9.9c0,0,6.2-2,8.2,4.2C990.1,1967.2,990,1975.5,987.9,1981.7z M1016.1,1827.4
|
||||
c-16.3,16.9-21.1-0.2-21.1-0.2s4.8-16.8,9.4-18.3c4.6-1.5,12.2,7.8,12.2,7.8C1020.7,1819.7,1016.1,1827.4,1016.1,1827.4z
|
||||
M1066,1908.9c-7.4,7.9-14.8,9.8-22.2,5.7c-7.3-4.1-7.2-14-7.2-14s4.6-8.4,14.8-9.8C1051.5,1890.8,1073.4,1901,1066,1908.9z"/>
|
||||
<path class="st2" d="M2327.5,1915.7c90.9-92.8,273.3-335.2,228.3-752.8c-43.4-402.7-387.1-593.8-605.7-596.1
|
||||
c-11.6-0.1-23,0.3-33.8,1.3c-229.9,20.8-368.5,120.7-446.7,206.3c-102.6-86.5-260.4-182.9-475.8-213.6
|
||||
c-17.7-2.5-36.1-3.9-54.6-4.1c-147.8-1.6-312.8,72.4-441.6,198c-140.1,136.7-221.9,314.9-230.4,501.9
|
||||
c-7.2,158.6,18.2,302.4,75.5,427.4c46.9,102.3,115,192.2,202.6,267.3c-11.1,26.5-11.8,54.8-2.5,86.3
|
||||
c22.6,76.4,117,141.8,206.1,142.7l0,0c28.9,0.3,55.8-5.9,80.1-18.3c18.2-9.3,35.1-18.4,51.1-27.5c95.7,45.8,264.3,100,535.4,108.6
|
||||
c3.9,0.1,8,0.2,12.1,0.3c133.3,1.4,372.7-36.6,458.3-62.3c9.2-2.8,19.5-5.5,31.4-8.7c27.4-7.4,61.2-16.5,100.8-30.7
|
||||
c9.7,5.4,18.3,10.2,25.8,14.3c26,14.2,55.5,30.4,92.6,30.8l0,0c24.8,0.3,51-6.5,80-20.6c66.9-32.6,96.9-86.5,110.4-126
|
||||
c16.9-49.7,14.1-95,3.9-117.8C2329.6,1920,2328.6,1917.8,2327.5,1915.7z M568.6,1913.8c-1,1.1-1.9,2.3-2.8,3.4
|
||||
c-0.5,0.7-1.1,1.3-1.6,2c-81.1-70.8-144.4-155-188.1-250.5c-54.8-119.7-79.1-257.7-72.1-410.5c8-177.6,85.9-347.1,219.3-477.2
|
||||
c121.9-118.9,277.2-189,415.5-187.5c16.9,0.2,33.7,1.4,49.9,3.7c217.4,30.9,373.8,131.7,471.6,217.6
|
||||
c115.6,101.9,171.5,202,174.2,207c0.2,0.3,0.6,1.2,1.2,2.6c11,24,85.3,203.2-53.8,382.3c-0.5-0.5-1.1-0.9-1.6-1.4
|
||||
c-46.1-40.7-83.8-79-110.8-112.4c-0.9-1.1-1.8-2.2-2.7-3.3c-1.1-1.4-2.2-2.8-3.3-4.2c-2.3-3-4.7-6-6.9-9c0-0.1-0.1-0.1-0.1-0.2
|
||||
c-7.7-10.5-15.1-20.7-22.3-30.5c-5.8-8-11.5-15.8-17.1-23.5c-7.7-10.6-15-20.8-22.1-30.4c-0.1-0.1-0.2-0.2-0.3-0.4
|
||||
c-6.9-9.4-13.5-18.4-19.8-26.8c-0.2-0.2-0.3-0.4-0.5-0.6c-1.5-2-2.9-3.9-4.4-5.8c-0.2-0.3-0.4-0.5-0.6-0.8c-1.5-2-2.9-3.9-4.4-5.8
|
||||
c0,0,0-0.1-0.1-0.1c-34.1-44.7-60.4-73.4-85.9-84.1c-121.7-151.9-274.7-193.9-346.4-194.7c-3,0-5.6,0-7.9,0.2
|
||||
c-30.8,2.2-72.8,16.6-112.4,38.4c-35.8,19.7-87.7,55.6-131.8,114.3c-102.6,136.7-94.3,304.5-69.3,421.2
|
||||
c25.5,119.1,92.2,222.5,198.2,307.7c-11.4,6.7-22.6,13.2-33.6,19.5c-0.2,0.1-0.3,0.2-0.4,0.3c-10.9,6.3-21.7,12.4-32.3,18.4
|
||||
c-6.7,3.8-13.2,7.5-19.6,11.2c-2.7,1.6-5.4,3.1-8.1,4.6c-1.7,1-3.4,2-5.1,3c-2.9,1.7-5.8,3.4-8.7,5c-1.6,0.9-3.2,1.9-4.8,2.8
|
||||
c-2.9,1.7-5.8,3.4-8.6,5c-1.5,0.9-3,1.7-4.4,2.6c-3,1.8-6,3.6-9,5.4c-1.2,0.7-2.4,1.4-3.5,2.1c-4,2.4-7.9,4.8-11.7,7.1
|
||||
c-1.3,0.8-2.5,1.6-3.8,2.4c-2.5,1.5-4.9,3.1-7.3,4.6c-1.8,1.2-3.6,2.3-5.4,3.5c-1.7,1.1-3.5,2.3-5.2,3.4c-2,1.3-3.9,2.6-5.8,3.9
|
||||
c-1.4,1-2.8,1.9-4.2,2.9c-2.1,1.4-4.1,2.9-6.1,4.3c-1.1,0.8-2.1,1.5-3.2,2.3c-2.2,1.6-4.4,3.2-6.5,4.8c-0.5,0.3-0.9,0.7-1.4,1
|
||||
c-7.6,5.8-14.8,11.6-21.3,17.6c-0.5,0.5-1,0.9-1.5,1.4c-1.7,1.6-3.4,3.2-5.1,4.8c-0.5,0.5-1.1,1-1.6,1.5c-0.3,0.3-0.5,0.6-0.8,0.9
|
||||
c-1.8,1.8-3.5,3.5-5.1,5.3c-0.9,0.9-1.7,1.8-2.6,2.8C571.3,1910.6,570,1912.2,568.6,1913.8z M1701.4,1144
|
||||
c-2.2-33.4-8.1-62.2-14.5-84.9c68.8-55.8,162.2-105.4,221.7-117.1c15.3-3,30.6-4.5,45.3-4.3c66.3,0.7,127.4,34.5,172.1,95.2
|
||||
c43.8,59.5,68.6,138.4,69.9,222.3c2.9,192.5-56.5,347.5-176.5,460.8c-48.1-28-103.3-62.1-167-104.9
|
||||
c-64.3-43.2-158.3-109.4-242.8-180.5C1693.6,1323.3,1706.2,1216.3,1701.4,1144z M1156.2,1482.1
|
||||
c-53.9,62.6-113.1,115.9-190.4,171.6c-42.7,30.8-83.6,57.1-122.5,80.7c-107-82.4-171.2-179.1-196.1-295.2
|
||||
c-34.1-158.9-13-290.6,62.7-391.4c70.7-94.3,170.9-134.8,217.5-138.1c0.7,0,2.2-0.1,4.8-0.1c6.9,0.1,162.3,3.6,299.9,159.3
|
||||
c-6.9,3.7-13.4,9-19.6,16l-1.1,1.3c-3.1,4.3-77,107-78.6,254.8C1132.3,1394.6,1140.1,1441.8,1156.2,1482.1z M870.6,2097.4
|
||||
c-0.9,0.5-1.9,1.1-2.8,1.6l-1.9,1.1c-16.8,9.6-34.6,19.2-53.9,29.1c-18.9,9.7-40,14.5-62.9,14.3l0,0
|
||||
c-73.1-0.8-153.1-55.2-171.2-116.4c-7.9-26.6-6.2-48.7,4.8-69.4l1.2-2.1c9.2-16.2,24.2-31.7,43.9-47.2
|
||||
c31.3-24.6,75.9-50.6,133.5-83.5c6.6-3.8,13.4-7.7,20.4-11.6c0.6-0.3,1.2-0.7,1.7-1c2-1.1,4-2.3,6-3.5c2.5-1.4,4.9-2.8,7.4-4.3
|
||||
c1.1-0.6,2.2-1.3,3.3-1.9c3.6-2.1,7.3-4.2,11-6.4c0.3-0.2,0.6-0.3,0.8-0.5c12.8-7.5,26-15.2,39.5-23.3l23.5-14.1l-0.2-0.1
|
||||
c35.8-22.1,73.6-46.7,112.3-74.6c74.9-53.9,133.3-105.8,186.4-165.6l0,0.1c2.5,4.3,5.2,8.5,8,12.6c0.2,0.3,0.4,0.6,0.6,0.8
|
||||
c2.6,3.8,5.3,7.5,8.1,11.1c0.4,0.5,0.7,1,1.1,1.5c2.6,3.4,5.4,6.6,8.2,9.8c0.5,0.6,1.1,1.3,1.6,1.9c3.3,3.7,6.7,7.3,10.3,10.8
|
||||
c5.1,5,10.3,10.1,15.5,15.1c1.2,1.1,2.4,2.3,3.6,3.4c4.4,4.2,8.8,8.4,13.2,12.6c0.9,0.8,1.8,1.7,2.7,2.5
|
||||
c35.7,33.5,73.2,66.3,111.7,98.3c-60.6,64.8-130.9,130.2-204.4,189.8l-25.9,21c-7.6,6.2-14.9,12.1-22.1,17.9
|
||||
c-0.9,0.7-1.8,1.4-2.7,2.2c-2.2,1.8-4.5,3.6-6.7,5.4c-1.6,1.3-3.2,2.6-4.9,3.9c-1.3,1.1-2.7,2.2-4,3.2
|
||||
C1005.4,2008.5,947.4,2053.2,870.6,2097.4z M1386.8,1721.9c76.2,61.6,155.5,119.7,232.1,172.4c-66,13.3-145.7,20.6-221.4,19.8
|
||||
c-67-0.7-131.8-7.4-193.1-19.8C1270,1839.3,1332.3,1780.4,1386.8,1721.9z M1907.7,2136.8c-11.7,3.1-22.7,6.1-32.5,9
|
||||
c-83.5,25-317.1,62.1-447.3,60.7c-3.9,0-7.7-0.1-11.3-0.2c-244.2-7.7-402.3-52.9-497.9-94.6c61.9-38,113.6-77.7,182.5-133.2
|
||||
c0,0,0.1-0.1,0.1-0.1c2.4-1.9,4.8-3.9,7.3-5.9c1-0.8,1.9-1.6,2.9-2.4c2.2-1.8,4.3-3.5,6.5-5.3c2.9-2.4,5.9-4.8,8.9-7.2
|
||||
c0.7-0.6,1.4-1.2,2.2-1.7c7.2-5.9,14.6-11.9,22.2-18.1l16.9-13.8c72,16.9,149,25.9,228.9,26.8c91.6,1,189.3-9.5,263.5-28.3
|
||||
c123.6,83,237,150.6,314.4,194.8C1949.6,2125.5,1927,2131.6,1907.7,2136.8z M2200.3,2133c-23.7,11.6-44.5,17.1-63.5,16.9h0
|
||||
c-25.9-0.3-47.6-11.1-75.3-26.3c-7.2-4-14.4-7.9-21.5-11.9l-11.3-6.3c-67.7-37.9-203.8-116.7-354.2-218l-7-4.7l-0.5,0.1
|
||||
c-221-150.5-358.5-274-416.6-329.8c-4.2-4.1-8.5-8.2-12.6-12.2c-0.1-0.1-0.3-0.2-0.4-0.4l0,0l0,0c-2.6-2.5-5-5.1-7.4-7.8
|
||||
c-0.9-1-1.8-2-2.7-3.1c-1.4-1.6-2.8-3.3-4.2-5c-1.1-1.3-2.1-2.7-3.2-4c-1.1-1.4-2.1-2.8-3.1-4.2c-4.5-6.1-8.7-12.6-12.5-19.3
|
||||
c-0.4-0.8-0.9-1.6-1.3-2.3c-1.3-2.3-2.5-4.6-3.7-7c-0.4-0.7-0.7-1.5-1.1-2.2c-1.2-2.5-2.5-5.1-3.6-7.6l-0.2-0.4
|
||||
c-16.9-37.7-25.2-83.2-24.6-136.1c1.4-129.7,65-224.1,71-232.8c8.5-9.3,14-9.2,15.8-9.2c1.3,0,2.7,0.2,4.2,0.6l1.4,0.5
|
||||
c27.6,9,70.6,68.3,125,143.4c2.6,3.6,5.3,7.3,8,11c10,13.8,20.4,28.1,31.5,43.2c1.9,2.6,3.9,5.2,6,8c0.1,0.1,0.2,0.3,0.3,0.4
|
||||
c50.5,65.5,160.3,175,399,335.3c60.1,40.4,112.7,73.1,159,100.3l-0.1,0.1l10.8,6.2c51,29.7,94.1,52.6,131,71.9
|
||||
c0.2,0.1,0.3,0.2,0.5,0.2c1.1,0.6,2.3,1.2,3.4,1.8c6.5,3.4,12.8,6.6,18.8,9.8c11.3,5.9,21.8,11.3,31.5,16.5
|
||||
c0.2,0.1,0.3,0.2,0.5,0.2c1.7,0.9,3.4,1.8,5,2.6c0.7,0.4,1.4,0.8,2.2,1.1c1.1,0.6,2.3,1.2,3.4,1.8c54.3,29.1,84.1,49.5,99.1,83
|
||||
C2309.8,1965.7,2304.5,2082.3,2200.3,2133z M2306.2,1884.8c-0.1-0.1-0.3-0.3-0.4-0.4c-3.2-3.5-6.5-6.8-10.1-10.1
|
||||
c-0.4-0.4-0.9-0.8-1.3-1.2c-1.6-1.4-3.1-2.8-4.8-4.2c-0.2-0.2-0.5-0.4-0.7-0.6c-1.8-1.5-3.7-3-5.6-4.5c-0.6-0.5-1.2-0.9-1.8-1.4
|
||||
c-1.5-1.2-3.1-2.4-4.7-3.5c-0.5-0.3-0.9-0.7-1.4-1c-2-1.4-4-2.9-6.1-4.3c-0.6-0.4-1.3-0.9-2-1.3c-1.7-1.2-3.5-2.3-5.3-3.5
|
||||
c-0.6-0.4-1.1-0.7-1.6-1.1c-2.3-1.5-4.6-2.9-7-4.4c-0.5-0.3-1.1-0.7-1.6-1c-2.1-1.3-4.3-2.6-6.5-3.9c-0.5-0.3-0.9-0.6-1.4-0.8
|
||||
c-2.7-1.6-5.4-3.1-8.2-4.7c-0.2-0.1-0.4-0.2-0.6-0.3c-2.8-1.6-5.6-3.1-8.4-4.7c-0.3-0.2-0.5-0.3-0.8-0.5
|
||||
c-15.9-8.7-33.6-17.9-53.4-28.2c-2.1-1.1-4.2-2.2-6.4-3.3c-0.5-0.2-0.9-0.5-1.4-0.7c-1.9-1-3.8-2-5.7-2.9
|
||||
c-30-15.6-65.4-34.2-106.2-57.2c122.5-119.9,183.1-281.4,180-480.5c-1.4-91.5-28.8-178-77.1-243.6
|
||||
c-51.7-70.2-123.2-109.3-201.4-110.2c-17.3-0.2-35.1,1.5-52.9,5c-69.9,13.8-162.4,66.1-227,116.1c-4.1-10.4-7.1-16.4-7.5-17.1
|
||||
l-0.2-0.3c-0.3-0.5-1.4-2.5-3.2-5.8c0,0,0-0.1-0.1-0.1c-0.4-0.8-0.9-1.6-1.5-2.5c-0.1-0.2-0.2-0.4-0.3-0.6
|
||||
c-0.5-0.8-0.9-1.6-1.4-2.4c-0.2-0.4-0.5-0.8-0.7-1.2c-0.4-0.7-0.9-1.5-1.4-2.2c-0.3-0.6-0.7-1.2-1.1-1.7c-0.4-0.7-0.9-1.4-1.3-2.1
|
||||
c-0.4-0.7-0.9-1.5-1.4-2.2c-0.4-0.7-0.8-1.3-1.3-2.1c-0.5-0.9-1.1-1.8-1.7-2.7c-0.4-0.6-0.8-1.3-1.3-2c-0.7-1-1.4-2.1-2.1-3.2
|
||||
c-0.4-0.6-0.8-1.2-1.2-1.9c-0.8-1.2-1.6-2.4-2.4-3.6c-0.4-0.6-0.8-1.2-1.2-1.8c-0.9-1.3-1.8-2.6-2.7-4c-0.4-0.6-0.8-1.2-1.2-1.8
|
||||
c-1-1.4-1.9-2.8-3-4.3c-0.4-0.6-0.8-1.2-1.2-1.8c-1.1-1.5-2.1-3.1-3.3-4.6c-0.4-0.6-0.8-1.2-1.2-1.8c-1.2-1.6-2.3-3.3-3.5-4.9
|
||||
c-0.4-0.6-0.9-1.2-1.3-1.8c-1.2-1.7-2.5-3.4-3.8-5.2c-0.4-0.6-0.9-1.2-1.3-1.8c-1.3-1.8-2.7-3.6-4.1-5.4c-0.5-0.6-0.9-1.2-1.4-1.8
|
||||
c-1.4-1.9-2.9-3.8-4.3-5.7c-0.5-0.6-1-1.2-1.4-1.9c-1.5-1.9-3-3.9-4.6-5.9c-0.5-0.6-1-1.3-1.5-1.9c-1.6-2-3.2-4-4.8-6
|
||||
c-0.5-0.7-1.1-1.3-1.6-2c-1.6-2-3.3-4-5-6.1c-0.6-0.7-1.2-1.5-1.8-2.2c-1.7-2-3.4-4.1-5.2-6.1c-0.7-0.8-1.4-1.6-2-2.4
|
||||
c-1.7-2-3.5-4.1-5.2-6.1c-0.8-0.9-1.6-1.8-2.3-2.7c-1.7-2-3.5-4-5.3-6c-0.9-1-1.8-2-2.7-3c-1.7-1.9-3.5-3.9-5.2-5.8
|
||||
c-1-1.1-2.1-2.3-3.2-3.5c-1.7-1.8-3.4-3.7-5.1-5.5c-1.2-1.3-2.5-2.7-3.8-4c-1.6-1.7-3.2-3.3-4.8-5c-1.5-1.6-3.1-3.2-4.7-4.8
|
||||
c-1.4-1.4-2.8-2.9-4.2-4.3c-2-2-4-4-6-6.1c-1.1-1.1-2.1-2.1-3.2-3.2c-2.6-2.6-5.3-5.2-8-7.9c-0.5-0.5-1-1-1.5-1.5
|
||||
c-3.6-3.5-7.3-7-11.1-10.6c-3.1-2.9-6.2-5.8-9.4-8.7c73.7-80.5,204.6-174.2,422.4-193.9c9.6-0.9,19.7-1.2,30.1-1.1
|
||||
c85.7,0.9,220.7,37.5,342.7,137.3c90.5,74,203.3,208,226.8,426C2561.7,1561.6,2394.5,1792.6,2306.2,1884.8z"/>
|
||||
<path class="st2" d="M1237.4,1540.4L1237.4,1540.4c0.1,0.1,0.3,0.3,0.4,0.4C1237.6,1540.6,1237.5,1540.5,1237.4,1540.4
|
||||
L1237.4,1540.4z"/>
|
||||
<path class="st2" d="M1250.4,1553c-4.2-4.1-8.5-8.2-12.6-12.2C1241.9,1544.8,1246.1,1548.9,1250.4,1553z"/>
|
||||
<path class="st3" d="M2153.5,917.5c-18.7,25.6,18.1,26,18.1,26s18.5-10.8,4-25.7C2161,902.9,2172.2,892,2153.5,917.5z"/>
|
||||
<path class="st3" d="M1868.7,704.6c-25.8,7.1-7.7,33.1-7.7,33.1s0,0,22,7.6C1905,752.9,1894.5,697.5,1868.7,704.6z"/>
|
||||
<path class="st3" d="M830.8,834.1c26.7-2.3,13.5-31.1,13.5-31.1s0,0-20.3-11.4C803.7,780.1,804.1,836.4,830.8,834.1z"/>
|
||||
<path class="st3" d="M1993.1,664.6c-18.4-0.2-22.3,18.2-22.3,18.2s10.9,11.2,22,11.3C2003.8,694.1,2011.5,664.8,1993.1,664.6z"/>
|
||||
<path class="st3" d="M2021.5,760.6c-22.2,7.1-22.4,32.9-22.4,32.9s18.2,18.6,29.4,0.3C2039.7,775.5,2043.7,753.5,2021.5,760.6z"/>
|
||||
<path class="st3" d="M1145.8,712.8c7.3-22.1-13.3-37.5-13.3-37.5s-25.8,3.7-17.6,23.6C1123,718.8,1138.5,734.9,1145.8,712.8z"/>
|
||||
<path class="st3" d="M485.5,1333.7c-5.3,4.6-9.9,12-2.7,21.8c12.7,17.3,31.7,29.2,33.4,6c0.9-11.6-4.6-19.9-10.4-25.3
|
||||
C500.1,1330.9,489.6,1330.2,485.5,1333.7z"/>
|
||||
<path class="st3" d="M1563.2,1038.2c22.2-14.5-7-36.9-21.7-37.1c-14.7-0.2-7.6,25.7-7.6,25.7S1540.9,1052.7,1563.2,1038.2z"/>
|
||||
<path class="st3" d="M2139,787.6c-18.4,3.5-0.2,22.1-0.2,22.1C2175.6,810.1,2157.5,784.2,2139,787.6z"/>
|
||||
<path class="st3" d="M1447.9,904c5.1-2.2,10.6-5.9,12.5-11.4c3.8-11-7.1-22.2-21.8-22.3c-8-0.1-7.4,10.9-5.2,20.9
|
||||
C1435.3,899.5,1442.9,906.2,1447.9,904z"/>
|
||||
<path class="st3" d="M1795.3,825.9c-36,11.4-19.1,36.8-19.1,36.8c6.5,6.7,34.7-15.4,34.7-15.4S1831.3,814.5,1795.3,825.9z"/>
|
||||
<path class="st3" d="M706.7,1786.3c7.9-3.7-3-35.2-3-35.2s-22.7-27.9-23.6,7.2C679.2,1793.4,706.7,1786.3,706.7,1786.3z"/>
|
||||
<path class="st3" d="M2219.7,1654c-22.2,7.1-0.3,29.5-0.3,29.5s10.9,14.8,22.1-3.4C2252.7,1661.8,2241.9,1646.9,2219.7,1654z"/>
|
||||
<path class="st3" d="M2296.8,833.5c-18.6,14.5,3.3,36.9,3.3,36.9l14.8-7.2C2314.9,863.2,2315.4,819,2296.8,833.5z"/>
|
||||
<path class="st3" d="M2332.1,978.7c-17.2-2.6-5.1,19.6-5.1,19.6C2348.8,1018.2,2349.2,981.4,2332.1,978.7z"/>
|
||||
<path class="st3" d="M408.2,1444.3c4.7,16.7,19.9-3.5,19.9-3.5C437.1,1412.6,403.5,1427.6,408.2,1444.3z"/>
|
||||
<path class="st3" d="M1254.8,1350.8c-13.9-3.6-14.5,14.1-6.2,25.7c4.5,6.2,8.8,1,11.9-5.6
|
||||
C1263.6,1364.4,1257.8,1351.6,1254.8,1350.8z"/>
|
||||
<path class="st3" d="M1407.9,1585.9c4.7,16.7,19.9-3.5,19.9-3.5C1427.5,1568.7,1403.2,1569.2,1407.9,1585.9z"/>
|
||||
<path class="st3" d="M1666.7,1786.6c-17.2-2.6-5.1,19.6-5.1,19.6C1683.5,1826.1,1683.9,1789.3,1666.7,1786.6z"/>
|
||||
<path class="st3" d="M2344.6,1272.2c-8.5-4.9-17.6,2.7-17.6,2.7l-5,4c0,0-0.1,12.3,7.2,17.3c7.3,5,14.7,2.6,22.2-7.1
|
||||
C2355.7,1283.4,2350.7,1275.8,2344.6,1272.2z"/>
|
||||
<path class="st3" d="M1051.5,1890.8c-10.3,1.4-14.8,9.8-14.8,9.8s-0.1,10,7.2,14c7.3,4.1,14.7,2.2,22.2-5.7
|
||||
C1073.4,1901,1051.5,1890.8,1051.5,1890.8z"/>
|
||||
<path class="st3" d="M553.1,1556.5c-4.1,2.3-7.2,17.2,0.1,22.2c7.3,5,22.5,5.1,22.2-7.1C574.7,1548.2,561.6,1551.7,553.1,1556.5z"
|
||||
/>
|
||||
<path class="st3" d="M2476,1236l-12.4,12.1c9.6,17.3,17,17.4,24.5,7.6C2495.5,1246,2476,1236,2476,1236z"/>
|
||||
<path class="st3" d="M340,1295.5c-16.1,3.6-12.4,12.1-12.4,12.1c9.6,17.3,17,17.4,24.5,7.6C359.5,1305.5,340,1295.5,340,1295.5z"
|
||||
/>
|
||||
<path class="st3" d="M1289.9,1230.1c-14-11-12.4,12.1-12.4,12.1c9.6,17.3,17,17.4,24.5,7.6
|
||||
C1309.4,1240.1,1289.9,1230.1,1289.9,1230.1z"/>
|
||||
<path class="st3" d="M1290.9,2006.3c2.6,12,22.9,3.6,22.9,3.6l-1.2-17.3C1293.2,1988.8,1288.3,1994.3,1290.9,2006.3z"/>
|
||||
<path class="st3" d="M2400.7,991.7c-12.3,2.3-2.8,29.4-2.8,29.4C2419.8,1041,2413,989.4,2400.7,991.7z"/>
|
||||
<path class="st3" d="M410.4,1181.6c12-3.6-0.3-29.6-0.3-29.6C386.3,1134.5,398.4,1185.2,410.4,1181.6z"/>
|
||||
<path class="st3" d="M1645.8,884.4c12-3.6-0.3-29.6-0.3-29.6C1621.7,837.4,1633.8,888,1645.8,884.4z"/>
|
||||
<path class="st3" d="M1521.3,1164.7c14.2,1.6,12-8.6,7.7-17.4c-3.1-6.4-13.6-12.1-19-10.3c-4.9,1.6-9.2,4.6-8.1,10.4
|
||||
C1504.2,1159.6,1521.3,1164.7,1521.3,1164.7z"/>
|
||||
<path class="st3" d="M1244.5,886.9l4.7,17.2c0,0,9.2,6.7,24.6-9.6c9.9-10.4-2.2-19.7-14.5-19.8
|
||||
C1247.1,874.6,1244.5,886.9,1244.5,886.9z"/>
|
||||
<path class="st3" d="M2401.1,1178.3c0.1-7.4,12.6-26.9-4.6-24.6c-17.2,2.3-7.6,22-7.6,22C2393.7,1183.1,2401,1185.6,2401.1,1178.3
|
||||
z"/>
|
||||
<path class="st3" d="M484.6,1036.6c1.2-20.2-23.5-13.6-23.5-13.6c-9.6,3.9-14.1,11.7-5.7,13.4
|
||||
C463.8,1038.2,483.4,1056.8,484.6,1036.6z"/>
|
||||
<path class="st3" d="M592.1,848.2c17.3-0.9,9.3-21.3,9.3-21.3c-4.2-7.8-11.3-10.9-12-3.5C588.7,830.7,574.7,849.1,592.1,848.2z"/>
|
||||
<path class="st3" d="M2410.6,1375c29.3,11.4,37.1-25.4,18.7-29.3C2410.9,1341.9,2399.7,1370.8,2410.6,1375z"/>
|
||||
<path class="st3" d="M405.9,1575.2c-8.9,30.2,28.3,34.9,30.7,16.2C438.9,1572.8,409.2,1564,405.9,1575.2z"/>
|
||||
<path class="st3" d="M2413.1,1645.1c-14.7-0.2-14.9,18.2-14.9,18.2l22,3.9C2420.2,1667.3,2427.8,1645.3,2413.1,1645.1z"/>
|
||||
<path class="st3" d="M2181.1,1760.2c1.8-15.1-11.3-18.4-13.8-11.2c-2.5,7.2-0.2,21.7-0.2,21.7s14.4,7.4,14.5,0.2
|
||||
C2181.6,1768.5,2180.5,1764.5,2181.1,1760.2z"/>
|
||||
<path class="st3" d="M685.8,743.2c4.6-1.6,10.8-4,15.9-6c5.3-2.1,10.7-7.3,11.3-11.3c0.9-5.4,0.6-11.6-5.5-11.5
|
||||
c-5.3,0.1-12.4,2.6-18.1,5c-5.8,2.5-10.8,9.1-10.6,13.6C679.1,738.8,680.5,745.1,685.8,743.2z"/>
|
||||
<path class="st3" d="M1157.7,2023.9c0,0-15.7,12.2-7.7,16c4.5,2.1,14.3,5.8,22.2,8.7c6.2,2.3,12.2,1.8,12.7-1.1
|
||||
c0.6-3.6,0.5-8.5-3.2-12.1C1175,2028.9,1157.7,2023.9,1157.7,2023.9z"/>
|
||||
<path class="st3" d="M1249.3,751.8c10.1-1.3,7.4-9.5-2.1-16.8c-9.5-7.4-23.6,2.9-23.6,2.9C1221.5,748.4,1239.2,753.1,1249.3,751.8
|
||||
z"/>
|
||||
<path class="st3" d="M1551.4,2019c-10.2,1.1-7.5,9.4,1.9,16.9c9.4,7.5,23.7-2.6,23.7-2.6C1579.2,2022.8,1561.6,2017.9,1551.4,2019
|
||||
z"/>
|
||||
<path class="st3" d="M2139.1,2071.6c-5.1,4.2-27.4,14.8-5.8,19.4c21.6,4.6,27.4-14.7,27.4-14.7
|
||||
C2149.8,2061.4,2144.2,2067.4,2139.1,2071.6z"/>
|
||||
<path class="st3" d="M1778.5,1861.1c-9.4-0.1-11.9,12.8-12.5,22.5c-0.3,5.9,3.7,11.8,8.5,12.1c5.9,0.4,13.7-0.7,18.8-7.3
|
||||
C1802.5,1876.5,1793.6,1861.3,1778.5,1861.1z"/>
|
||||
<path class="st3" d="M859.5,1982.1c-9.5,1.8-8.3,15.7-6.2,25.6c1.2,5.8,7.3,10.3,12.2,8.8c4.9-1.4,10.1-4.4,11.6-10.3
|
||||
C880.3,1994.3,874.5,1979.3,859.5,1982.1z"/>
|
||||
<path class="st3" d="M1308.3,1486.1c-15,2.8-3.4,35.9-3.4,35.9s17.9,0.2,21.1-11.7C1329.1,1498.3,1323.3,1483.2,1308.3,1486.1z"/>
|
||||
<path class="st3" d="M602.8,1693.7c-15,2.8-3.3,29.9-3.3,29.9C629.2,1744.8,617.8,1690.8,602.8,1693.7z"/>
|
||||
<path class="st3" d="M2090.5,1984.4c-12.8-6.6-35.4-0.4-29.1,12.6c0,0,21,19.8,28.9,13.2C2090.2,2010.2,2103.3,1991,2090.5,1984.4
|
||||
z"/>
|
||||
<path class="st3" d="M1723.7,697.3c-7.6-0.1-17.9,17.5-17.9,17.5c-0.2,22.8,15.1,5.2,27.8,0.3
|
||||
C1746.3,710.2,1731.3,697.3,1723.7,697.3z"/>
|
||||
<path class="st3" d="M1387.9,1356c-29-2.3-8,18.8-2.8,35.5c5.2,16.6,22.8-1.5,23.6-11.1C1409.4,1370.7,1387.9,1356,1387.9,1356z"
|
||||
/>
|
||||
<path class="st3" d="M2434.4,1494.9c-11.1,1.7-26,20-26,20s0.2,12.6,20.2,7.6c8.9-2.2,14.8-7.2,22.3-16.3
|
||||
C2458.3,1497,2445.5,1493.2,2434.4,1494.9z"/>
|
||||
<path class="st3" d="M2291.7,1736.7c-19.8-3.5-10.1,16.4-10.1,16.4s0,0,19.7,6.8C2321.1,1766.7,2311.5,1740.2,2291.7,1736.7z"/>
|
||||
<path class="st3" d="M545.4,1788c-19-3.4-9.7,15.8-9.7,15.8s0,0,19,6.5C573.6,1816.8,564.4,1791.4,545.4,1788z"/>
|
||||
<path class="st3" d="M671.7,1945.1c-8.7-1.6-10,2.8-9.4,6.9c0.4,3,1.7,5.7,8.2,7.9c2.1,0.7,4.9,1.7,8.7,3
|
||||
C694.2,1968.1,686.8,1947.8,671.7,1945.1z"/>
|
||||
<path class="st3" d="M1675.1,1681c-13.8-4.4-28.2,3.9-23.8,19.4c4.4,15.5,33.7,15.5,33.7,15.5s18.8,7.2,19.4-5.5
|
||||
C1705,1697.5,1688.9,1685.4,1675.1,1681z"/>
|
||||
<path class="st3" d="M2335.4,1569.8c-7.4-0.1-9.4,22-9.4,22s-0.1,7.4,7.3,7.4c7.4,0.1,7.5-11,7.5-16.5
|
||||
C2340.8,1577.2,2342.8,1569.8,2335.4,1569.8z"/>
|
||||
<path class="st3" d="M1277.5,1700.6c7.4,0.1,4.8-11.3,7.5-16.5c2.6-4.9,2-12.9-5.4-12.9c-7.4-0.1-9.4,22-9.4,22
|
||||
S1270.1,1700.6,1277.5,1700.6z"/>
|
||||
<path class="st3" d="M2297.9,1460.4c-9.2,1.7-9.4,22-9.4,22s16.5,7.5,23.9-1.6C2319.8,1471.7,2307.1,1458.7,2297.9,1460.4z"/>
|
||||
<path class="st3" d="M544.3,1179c7.5-9.1-5.3-22.1-14.5-20.4c-9.2,1.7-9.4,22-9.4,22S536.8,1188.2,544.3,1179z"/>
|
||||
<path class="st3" d="M2053.9,1856.2c-11.5-0.1-11.7,13.7-11.7,13.7s6.8,7,16.1,4.8C2067.6,1872.4,2065.4,1856.3,2053.9,1856.2z"/>
|
||||
<path class="st3" d="M1906.8,1817.8c-12.9-0.1-9.9,19.2-9.9,19.2C1925.6,1863.1,1919.7,1817.9,1906.8,1817.8z"/>
|
||||
<path class="st3" d="M2182,1942.1c-7.2-0.1-18.1,7.7-10.6,17c13.7,17.1,22.5,2.4,22.5,2.4S2189.2,1942.2,2182,1942.1z"/>
|
||||
<path class="st3" d="M1952.8,1940.7c-25.8,7.1-7.7,33.1-7.7,33.1s0,0,22,7.6C1989.1,1989,1978.6,1933.7,1952.8,1940.7z"/>
|
||||
<path class="st3" d="M584.4,989.3l-4.8-12.3c0,0,14.9-12.1-2.3-12.3c-17.2-0.2-5.2,29.4-5.2,29.4S578.3,1001.2,584.4,989.3z"/>
|
||||
<path class="st3" d="M1082.4,781.1c7.4-2.4,2.7-19.6,2.7-19.6s-9.9,4.8-19.7,7.2c-9.8,2.3,2.3,14.8,2.3,14.8
|
||||
S1075.1,783.5,1082.4,781.1z"/>
|
||||
<path class="st3" d="M1533.6,1616.8c0,0-27.3-14.9-28.4-1.3c-3.9,46.8,34.9,26,34.9,26s23.9,2.1,9.6-21.4
|
||||
C1544.4,1611.5,1533.6,1616.8,1533.6,1616.8z"/>
|
||||
<path class="st3" d="M979.9,1956.7l-3.4,9.9c0,0-1.2,10.5,1.1,12.5c3.8,3.1,9,6.4,10.3,2.6c2.1-6.2,2.2-14.5,0.2-20.7
|
||||
C986.1,1954.7,979.9,1956.7,979.9,1956.7z"/>
|
||||
<path class="st3" d="M1060.6,2069.6c-7.3-6.2-19.7,9.6-19.7,9.6s4.8,13.6,7.3,8.7c2.5-4.9,8.6-1.1,12.3-2.3
|
||||
C1064.1,2084.4,1067.9,2075.8,1060.6,2069.6z"/>
|
||||
<path class="st3" d="M904.4,1874c-21.2-0.2-17.8,17.4-17.8,17.4l1.7,11c0,0,9,10.3,16.3,8c6-1.8,12-5.3,13.7-11.7
|
||||
C921.9,1884.8,925.5,1874.2,904.4,1874z"/>
|
||||
<path class="st3" d="M746.1,1997.9c-13,12.7-16.4,28.8-16.4,28.8s12.8,9.8,22.5,6.7c9.7-3.1,9.8-16,13.2-25.6
|
||||
C768.6,1998.2,759.1,1985.2,746.1,1997.9z"/>
|
||||
<path class="st3" d="M1016.7,1816.6c0,0-7.6-9.3-12.2-7.8c-4.6,1.5-9.4,18.3-9.4,18.3s4.8,17.1,21.1,0.2
|
||||
C1016.1,1827.4,1020.7,1819.7,1016.7,1816.6z"/>
|
||||
<path class="st3" d="M1827.2,1727.7c-4.3,2.3-9.4,18.3-9.4,18.3s3.5,12.6,16.9,7.1c2.2-0.9,8.2-12.1,6.7-18.5
|
||||
C1839.9,1728.1,1836.2,1722.8,1827.2,1727.7z"/>
|
||||
<path class="st3" d="M1162.1,1764.4l10.6,1.8c0,0,24.3,0,15.9-11.6c-5.1-7-25.9-15.3-36.2-10.5
|
||||
C1142.2,1749,1145.9,1760.8,1162.1,1764.4z"/>
|
||||
<path class="st3" d="M1180.8,1653.3c2-1.8,1.2-9-2-14c-2.6-4.1-6.1-7.9-9.8-8c-8.3-0.1-6.4,16.5-6.4,16.5
|
||||
C1169.5,1660.3,1176.8,1656.9,1180.8,1653.3z"/>
|
||||
<path class="st3" d="M928.2,736.8c9.5,0.1,9.6-7.5,7.3-15.1c-2.3-7.6-11.6-16.5-19-17c-5.9-0.4-13.6-0.3-22.1,1.3
|
||||
c-19,3.6-4,18.9-4,18.9S909.2,736.6,928.2,736.8z"/>
|
||||
<path class="st3" d="M1781.5,2084.2c3.9,1.7,8.1,2.5,9.7-1.1c3.2-7.1,17.1,3.3,17.5-10.8c0.5-14-24.6-2.3-24.6-2.3
|
||||
S1777.6,2082.5,1781.5,2084.2z"/>
|
||||
<path class="st3" d="M1423.4,2045.4c-12.7,2.4,2.4,12.7,2.4,12.7c2.4,12.7,15.2-4.9,15.2-4.9S1436.1,2043,1423.4,2045.4z"/>
|
||||
<path class="st3" d="M1384.2,1080.4c12.7,3.3,12.5-2.9,14.9-12.2c5.8-22-25.4-37.6-36.6-21.1
|
||||
C1351.2,1063.5,1384.2,1080.4,1384.2,1080.4z"/>
|
||||
<path class="st3" d="M1539.3,1285.2c-17.6-0.2-7.3,21.1-7.3,21.1s6.9,14.2,17.6,0.2C1560.4,1292.5,1557,1285.4,1539.3,1285.2z"/>
|
||||
<path class="st3" d="M498.8,1664.7c-17.6-0.2-7.3,21.1-7.3,21.1s6.9,14.2,17.6,0.2C519.9,1672,516.5,1664.9,498.8,1664.7z"/>
|
||||
<path class="st3" d="M1533,2117.8c-11.5,3.7-17.1,12.4-19.8,19.9c-2.5,7,2.2,17.9,8.4,20.2c5.9,2.2,13,2,18.5-6.9
|
||||
C1551.3,2132.7,1555.2,2110.7,1533,2117.8z"/>
|
||||
<path class="st3" d="M1691.1,2141.9c6.2-9-3.6-15.8-11.3-19.5c-4.2-2-16.8,0-18.8,2.1C1650.1,2135.6,1683,2153.6,1691.1,2141.9z"
|
||||
/>
|
||||
<path class="st3" d="M1349,2110.9c-3.2,2.5-6.5,6.2-8.1,11.6c-3.7,12.7,17.3,21.2,25.4,7.4c4-6.9,1.9-12.8-1.2-17
|
||||
C1362,2108.8,1353.4,2107.5,1349,2110.9z"/>
|
||||
<path class="st3" d="M1158,2102.9c-16.7-0.2-13.7,36.6-13.7,36.6l30.1-3C1174.3,2136.4,1174.7,2103.1,1158,2102.9z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 484 KiB |
|
Before Width: | Height: | Size: 642 KiB |
@@ -1,35 +0,0 @@
|
||||
import { useState } from "react";
|
||||
import { Outlet } from "react-router-dom";
|
||||
|
||||
import Navbar from "./components/navbar";
|
||||
import Footer from "./components/footer";
|
||||
import Hud from "./components/Hud/Hud";
|
||||
|
||||
import "./scss/root.scss";
|
||||
import "./scss/components/footer.scss";
|
||||
|
||||
import navData from "./data/NavBarData.json";
|
||||
|
||||
function App() {
|
||||
const [isVisible, setIsVisible] = useState(false);
|
||||
const [toggleSnow, setToggleSnow] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Navbar
|
||||
navData={navData}
|
||||
isVisible={isVisible}
|
||||
setIsVisible={setIsVisible}
|
||||
toggleSnow={toggleSnow}
|
||||
setToggleSnow={setToggleSnow}
|
||||
/>
|
||||
<Hud isVisible={isVisible} setIsVisible={setIsVisible} />
|
||||
<main>
|
||||
<Outlet context={[toggleSnow, setToggleSnow]} />
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
53
Frontend/src/__tests__/balance.test.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { postCapstoneCost, treeResetCost } from "../lib/core/balance";
|
||||
|
||||
describe("postCapstoneCost", () => {
|
||||
it("first purchase = base cost (no multiplier)", () => {
|
||||
expect(postCapstoneCost(500, 0)).toBe(500);
|
||||
});
|
||||
|
||||
it("applies ×1.5 for purchases 1-5", () => {
|
||||
expect(postCapstoneCost(500, 1)).toBe(750);
|
||||
expect(postCapstoneCost(500, 2)).toBe(Math.floor(500 * 1.5 * 1.5));
|
||||
});
|
||||
|
||||
it("uses ×1.8 tier for purchases 5-9", () => {
|
||||
const at5 = postCapstoneCost(500, 5);
|
||||
const at6 = postCapstoneCost(500, 6);
|
||||
// Ratio should be ~1.8 (floor rounding tolerance ±1)
|
||||
expect(at6 / at5).toBeCloseTo(1.8, 1);
|
||||
});
|
||||
|
||||
it("uses ×2.0 tier for purchases 10+", () => {
|
||||
const at10 = postCapstoneCost(500, 10);
|
||||
const at11 = postCapstoneCost(500, 11);
|
||||
expect(at11 / at10).toBeCloseTo(2.0, 1);
|
||||
});
|
||||
|
||||
it("cost always increases", () => {
|
||||
let prev = 0;
|
||||
for (let i = 0; i < 15; i++) {
|
||||
const cost = postCapstoneCost(500, i);
|
||||
expect(cost).toBeGreaterThan(prev);
|
||||
prev = cost;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("treeResetCost", () => {
|
||||
it("free reset costs 0", () => {
|
||||
expect(treeResetCost(true, 0)).toBe(0);
|
||||
expect(treeResetCost(true, 5)).toBe(0);
|
||||
});
|
||||
|
||||
it("first paid reset costs 5 ADN", () => {
|
||||
expect(treeResetCost(false, 0)).toBe(5);
|
||||
});
|
||||
|
||||
it("scales linearly", () => {
|
||||
expect(treeResetCost(false, 0)).toBe(5);
|
||||
expect(treeResetCost(false, 1)).toBe(10);
|
||||
expect(treeResetCost(false, 2)).toBe(15);
|
||||
expect(treeResetCost(false, 3)).toBe(20);
|
||||
});
|
||||
});
|
||||
127
Frontend/src/__tests__/cosmetics.test.ts
Normal file
@@ -0,0 +1,127 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import {
|
||||
COSMETICS,
|
||||
shouldUnlockCosmetic,
|
||||
computeNewUnlocks,
|
||||
equipCosmetic,
|
||||
unequipSlot,
|
||||
addToInventory,
|
||||
DEFAULT_COSMETIC_STATE,
|
||||
} from "../lib/core/cosmetics";
|
||||
import { DEFAULT_STATE } from "../lib/core/economy";
|
||||
|
||||
describe("Cosmetics system", () => {
|
||||
describe("COSMETICS catalog", () => {
|
||||
it("a 10 cosmétiques", () => {
|
||||
expect(COSMETICS.length).toBe(10);
|
||||
});
|
||||
|
||||
it("2 cosmétiques par slot", () => {
|
||||
const slots = ["hat", "eyes", "body", "tail", "accessory"];
|
||||
for (const slot of slots) {
|
||||
expect(COSMETICS.filter((c) => c.slot === slot).length).toBe(2);
|
||||
}
|
||||
});
|
||||
|
||||
it("ids uniques", () => {
|
||||
const ids = COSMETICS.map((c) => c.id);
|
||||
expect(new Set(ids).size).toBe(ids.length);
|
||||
});
|
||||
});
|
||||
|
||||
describe("shouldUnlockCosmetic", () => {
|
||||
it("unlock prestige_3 si prestigeCount >= 3", () => {
|
||||
const cos = COSMETICS.find((c) => c.sourceId === "prestige_3")!;
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 3 };
|
||||
expect(shouldUnlockCosmetic(cos, state)).toBe(true);
|
||||
});
|
||||
|
||||
it("pas d'unlock prestige_10 si prestigeCount < 10", () => {
|
||||
const cos = COSMETICS.find((c) => c.sourceId === "prestige_10")!;
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 5 };
|
||||
expect(shouldUnlockCosmetic(cos, state)).toBe(false);
|
||||
});
|
||||
|
||||
it("unlock achievement 'first_prestige' si prestigeCount >= 1", () => {
|
||||
const cos = COSMETICS.find((c) => c.sourceId === "first_prestige")!;
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 1 };
|
||||
expect(shouldUnlockCosmetic(cos, state)).toBe(true);
|
||||
});
|
||||
|
||||
it("pas d'unlock achievement si condition non remplie", () => {
|
||||
const cos = COSMETICS.find((c) => c.sourceId === "empire")!;
|
||||
expect(shouldUnlockCosmetic(cos, DEFAULT_STATE)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("computeNewUnlocks", () => {
|
||||
it("retourne les cosmétiques nouvellement débloqués", () => {
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 5 };
|
||||
const newUnlocks = computeNewUnlocks(state, DEFAULT_COSMETIC_STATE);
|
||||
// prestige_3 (particles_gold) + prestige_5 (glasses_savant) + first_prestige (ribbon) + veteran (aura_swamp)
|
||||
expect(newUnlocks).toContain("particles_gold");
|
||||
expect(newUnlocks).toContain("glasses_savant");
|
||||
expect(newUnlocks).toContain("ribbon");
|
||||
});
|
||||
|
||||
it("ne retourne pas les cosmétiques déjà dans l'inventaire", () => {
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 5 };
|
||||
const cosState = { ...DEFAULT_COSMETIC_STATE, inventory: ["particles_gold"] };
|
||||
const newUnlocks = computeNewUnlocks(state, cosState);
|
||||
expect(newUnlocks).not.toContain("particles_gold");
|
||||
});
|
||||
|
||||
it("retourne vide si rien à débloquer", () => {
|
||||
expect(computeNewUnlocks(DEFAULT_STATE, DEFAULT_COSMETIC_STATE)).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("equipCosmetic", () => {
|
||||
it("équipe un cosmétique dans le bon slot", () => {
|
||||
const cosState = { inventory: ["ribbon"], equipped: {} };
|
||||
const result = equipCosmetic(cosState, "ribbon");
|
||||
expect(result.equipped.tail).toBe("ribbon");
|
||||
});
|
||||
|
||||
it("ne fait rien si cosmétique pas dans l'inventaire", () => {
|
||||
const result = equipCosmetic(DEFAULT_COSMETIC_STATE, "ribbon");
|
||||
expect(result.equipped).toEqual({});
|
||||
});
|
||||
|
||||
it("remplace le cosmétique déjà équipé dans le même slot", () => {
|
||||
const cosState = { inventory: ["ribbon", "flame_tail"], equipped: { tail: "ribbon" } };
|
||||
const result = equipCosmetic(cosState, "flame_tail");
|
||||
expect(result.equipped.tail).toBe("flame_tail");
|
||||
});
|
||||
});
|
||||
|
||||
describe("unequipSlot", () => {
|
||||
it("retire le cosmétique du slot", () => {
|
||||
const cosState = { inventory: ["ribbon"], equipped: { tail: "ribbon" } };
|
||||
const result = unequipSlot(cosState, "tail");
|
||||
expect(result.equipped.tail).toBeUndefined();
|
||||
});
|
||||
|
||||
it("ne touche pas les autres slots", () => {
|
||||
const cosState = {
|
||||
inventory: ["ribbon", "crown"],
|
||||
equipped: { tail: "ribbon", hat: "crown" },
|
||||
};
|
||||
const result = unequipSlot(cosState, "tail");
|
||||
expect(result.equipped.hat).toBe("crown");
|
||||
});
|
||||
});
|
||||
|
||||
describe("addToInventory", () => {
|
||||
it("ajoute des ids", () => {
|
||||
const result = addToInventory(DEFAULT_COSMETIC_STATE, ["ribbon", "crown"]);
|
||||
expect(result.inventory).toEqual(["ribbon", "crown"]);
|
||||
});
|
||||
|
||||
it("pas de doublons", () => {
|
||||
const cosState = { ...DEFAULT_COSMETIC_STATE, inventory: ["ribbon"] };
|
||||
const result = addToInventory(cosState, ["ribbon", "crown"]);
|
||||
expect(result.inventory).toEqual(["ribbon", "crown"]);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -7,13 +7,26 @@ import {
|
||||
buyGenerator,
|
||||
applyPrestige,
|
||||
canPrestige,
|
||||
getPrestigeThreshold,
|
||||
computePrestigeDna,
|
||||
canBuyEvolutionNode,
|
||||
buyEvolutionNode,
|
||||
resetEvolutionTree,
|
||||
getClickMultiplierFromTree,
|
||||
getProductionMultiplierFromTree,
|
||||
getStartBonusFromTree,
|
||||
getPrestigeDnaBonus,
|
||||
getCostReduction,
|
||||
getAutoClicksPerSecond,
|
||||
offlineEfficiency,
|
||||
computeOfflineGains,
|
||||
DEFAULT_STATE,
|
||||
DEFAULT_GENERATORS,
|
||||
} from "../core/economy";
|
||||
DEFAULT_EVOLUTION_TREE,
|
||||
} from "../lib/core/economy";
|
||||
|
||||
// --- PrestigePanel visibility ---
|
||||
|
||||
// PrestigePanel visibility guard — canPrestige drives render condition
|
||||
// Ces tests valident l'invariant : le panneau prestige ne doit jamais être
|
||||
// visible (canPrestige = false) si les ressources sont inférieures au seuil.
|
||||
describe("PrestigePanel visibility (canPrestige guard)", () => {
|
||||
it("canPrestige = false pour resources = 0 → panneau non visible", () => {
|
||||
expect(canPrestige({ ...DEFAULT_STATE, resources: 0 })).toBe(false);
|
||||
@@ -28,6 +41,8 @@ describe("PrestigePanel visibility (canPrestige guard)", () => {
|
||||
});
|
||||
});
|
||||
|
||||
// --- Prestige reset ---
|
||||
|
||||
describe("applyPrestige — post-prestige state", () => {
|
||||
const prestigeState = {
|
||||
...DEFAULT_STATE,
|
||||
@@ -35,9 +50,10 @@ describe("applyPrestige — post-prestige state", () => {
|
||||
generators: DEFAULT_STATE.generators.map((g) => ({ ...g, owned: 3 })),
|
||||
prestigeCount: 0,
|
||||
prestigeMultiplier: 1,
|
||||
lifetimeTadpoles: 2_000_000_000,
|
||||
};
|
||||
|
||||
it("ressources = 0 après prestige", () => {
|
||||
it("ressources = startBonus (0 sans nœud Mémoire Génétique) après prestige", () => {
|
||||
expect(applyPrestige(prestigeState).resources).toBe(0);
|
||||
});
|
||||
|
||||
@@ -53,8 +69,43 @@ describe("applyPrestige — post-prestige state", () => {
|
||||
it("prestigeCount incrémenté à 1 après premier prestige", () => {
|
||||
expect(applyPrestige(prestigeState).prestigeCount).toBe(1);
|
||||
});
|
||||
|
||||
it("gagne de l'ADN Ancestral au prestige", () => {
|
||||
const result = applyPrestige(prestigeState);
|
||||
const expectedDna = computePrestigeDna(2_000_000_000);
|
||||
expect(result.ancestralDna).toBe(expectedDna);
|
||||
expect(expectedDna).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it("lifetimeTadpoles reset à 0 après prestige", () => {
|
||||
expect(applyPrestige(prestigeState).lifetimeTadpoles).toBe(0);
|
||||
});
|
||||
|
||||
it("arbre d'évolution persiste après prestige", () => {
|
||||
const stateWithNode = {
|
||||
...prestigeState,
|
||||
evolutionTree: prestigeState.evolutionTree.map((n) =>
|
||||
n.id === "ponte_amelioree" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
const result = applyPrestige(stateWithNode);
|
||||
expect(result.evolutionTree.find((n) => n.id === "ponte_amelioree")!.unlocked).toBe(true);
|
||||
});
|
||||
|
||||
it("startBonus appliqué si Mémoire Génétique débloquée", () => {
|
||||
const stateWithMemory = {
|
||||
...prestigeState,
|
||||
evolutionTree: prestigeState.evolutionTree.map((n) =>
|
||||
n.id === "memoire_genetique" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
const result = applyPrestige(stateWithMemory);
|
||||
expect(result.resources).toBe(100);
|
||||
});
|
||||
});
|
||||
|
||||
// --- Generator cost ---
|
||||
|
||||
describe("generatorCost", () => {
|
||||
it("retourne baseCost quand owned = 0", () => {
|
||||
const gen = { ...DEFAULT_GENERATORS[0], owned: 0 };
|
||||
@@ -67,6 +118,8 @@ describe("generatorCost", () => {
|
||||
});
|
||||
});
|
||||
|
||||
// --- Production ---
|
||||
|
||||
describe("totalProductionPerSecond", () => {
|
||||
it("retourne 0 si aucun générateur acheté", () => {
|
||||
expect(totalProductionPerSecond(DEFAULT_STATE)).toBe(0);
|
||||
@@ -87,8 +140,21 @@ describe("totalProductionPerSecond", () => {
|
||||
const state = { ...DEFAULT_STATE, generators: DEFAULT_STATE.generators.map((g, i) => i === 0 ? { ...g, owned: 1 } : g), prestigeMultiplier: 1.5 };
|
||||
expect(totalProductionPerSecond(state)).toBeCloseTo(DEFAULT_GENERATORS[0].baseProduction * 1.5);
|
||||
});
|
||||
|
||||
it("applique le multiplicateur arbre d'évolution", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
generators: DEFAULT_STATE.generators.map((g, i) => i === 0 ? { ...g, owned: 1 } : g),
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "instinct_gregaire" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
expect(totalProductionPerSecond(state)).toBeCloseTo(DEFAULT_GENERATORS[0].baseProduction * 1.5);
|
||||
});
|
||||
});
|
||||
|
||||
// --- Idle gains ---
|
||||
|
||||
describe("computeIdleGains (lazy calculation)", () => {
|
||||
it("calcule les gains proportionnellement au temps écoulé", () => {
|
||||
const state = {
|
||||
@@ -108,29 +174,100 @@ describe("computeIdleGains (lazy calculation)", () => {
|
||||
});
|
||||
});
|
||||
|
||||
// --- Click (avec double + crit) ---
|
||||
|
||||
describe("applyClick", () => {
|
||||
it("augmente les ressources du clickMultiplier × prestigeMultiplier", () => {
|
||||
const state = { ...DEFAULT_STATE, clickMultiplier: 3, prestigeMultiplier: 2 };
|
||||
const result = applyClick(state);
|
||||
expect(result.resources).toBe(6);
|
||||
const result = applyClick(state, 0.99); // rng high → no double, no crit
|
||||
expect(result.state.resources).toBe(6);
|
||||
expect(result.isDouble).toBe(false);
|
||||
expect(result.isCrit).toBe(false);
|
||||
});
|
||||
|
||||
it("applique le multiplicateur click de l'arbre", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
clickMultiplier: 1,
|
||||
prestigeMultiplier: 1,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "ponte_amelioree" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
const result = applyClick(state, 0.99);
|
||||
expect(result.state.resources).toBe(2);
|
||||
});
|
||||
|
||||
it("incrémente lifetimeTadpoles", () => {
|
||||
const state = { ...DEFAULT_STATE, clickMultiplier: 5, prestigeMultiplier: 1 };
|
||||
const result = applyClick(state, 0.99);
|
||||
expect(result.state.lifetimeTadpoles).toBe(5);
|
||||
});
|
||||
|
||||
it("double ponte x2 quand rng < doubleClickChance", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
clickMultiplier: 1,
|
||||
prestigeMultiplier: 1,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "double_ponte" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
// double_ponte = 10% chance, rng=0.05 < 0.10 → double
|
||||
const result = applyClick(state, 0.05);
|
||||
expect(result.isDouble).toBe(true);
|
||||
expect(result.gain).toBe(2);
|
||||
});
|
||||
|
||||
it("pas de double ponte quand rng > doubleClickChance", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
clickMultiplier: 1,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "double_ponte" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
const result = applyClick(state, 0.50);
|
||||
expect(result.isDouble).toBe(false);
|
||||
expect(result.gain).toBe(1);
|
||||
});
|
||||
|
||||
it("crit x10 quand critRng < critClickChance", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
clickMultiplier: 1,
|
||||
prestigeMultiplier: 1,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "ponte_critique" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
// ponte_critique = 5% chance, need critRng = (rng * 7.13) % 1 < 0.05
|
||||
// rng = 0.007 → critRng = 0.04991 < 0.05 → crit!
|
||||
const result = applyClick(state, 0.007);
|
||||
expect(result.isCrit).toBe(true);
|
||||
expect(result.gain).toBe(10);
|
||||
});
|
||||
});
|
||||
|
||||
// --- Buy generator ---
|
||||
|
||||
describe("buyGenerator", () => {
|
||||
it("retourne null si fonds insuffisants", () => {
|
||||
const result = buyGenerator(DEFAULT_STATE, "manic");
|
||||
expect(result).toBeNull(); // 0 ressources, coût = 15
|
||||
const result = buyGenerator(DEFAULT_STATE, "nid");
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
|
||||
it("achète correctement et déduit le coût", () => {
|
||||
const state = { ...DEFAULT_STATE, resources: 100 };
|
||||
const result = buyGenerator(state, "manic");
|
||||
const result = buyGenerator(state, "nid");
|
||||
expect(result).not.toBeNull();
|
||||
expect(result!.generators.find((g) => g.id === "manic")!.owned).toBe(1);
|
||||
expect(result!.generators.find((g) => g.id === "nid")!.owned).toBe(1);
|
||||
expect(result!.resources).toBe(100 - DEFAULT_GENERATORS[0].baseCost);
|
||||
});
|
||||
});
|
||||
|
||||
// --- Prestige legacy ---
|
||||
|
||||
describe("prestige", () => {
|
||||
it("canPrestige retourne false si < 1 000 000 ressources", () => {
|
||||
expect(canPrestige({ ...DEFAULT_STATE, resources: 999_999 })).toBe(false);
|
||||
@@ -154,3 +291,361 @@ describe("prestige", () => {
|
||||
expect(result.generators.every((g) => g.owned === 0)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
// --- ADN Ancestral ---
|
||||
|
||||
describe("computePrestigeDna", () => {
|
||||
it("retourne 0 pour 0 têtards", () => {
|
||||
expect(computePrestigeDna(0)).toBe(0);
|
||||
});
|
||||
|
||||
it("retourne 0 sous le seuil de 1M", () => {
|
||||
expect(computePrestigeDna(999_999)).toBe(0);
|
||||
});
|
||||
|
||||
it("retourne 1 (clamp) à exactement 1M têtards", () => {
|
||||
expect(computePrestigeDna(1e6)).toBe(1);
|
||||
});
|
||||
|
||||
it("retourne 50 pour 10M têtards (log10(10) = 1)", () => {
|
||||
expect(computePrestigeDna(10e6)).toBe(50);
|
||||
});
|
||||
|
||||
it("scaling log — 10M→100M donne 2× ADN (log10(100) = 2)", () => {
|
||||
const dna10m = computePrestigeDna(10e6);
|
||||
const dna100m = computePrestigeDna(100e6);
|
||||
expect(dna100m / dna10m).toBeCloseTo(2, 1);
|
||||
});
|
||||
|
||||
it("prestige bonus augmente le gain (+5% par prestige)", () => {
|
||||
const base = computePrestigeDna(10e6, 0);
|
||||
const with10 = computePrestigeDna(10e6, 10);
|
||||
expect(with10).toBe(Math.max(1, Math.floor(50 * 1 * 1.5))); // 75
|
||||
expect(with10).toBeGreaterThan(base);
|
||||
});
|
||||
|
||||
it("prestige bonus cappé à ×4 (80+ prestiges)", () => {
|
||||
const at80 = computePrestigeDna(10e6, 80);
|
||||
const at100 = computePrestigeDna(10e6, 100);
|
||||
expect(at80).toBe(at100); // cap atteint
|
||||
});
|
||||
});
|
||||
|
||||
// --- Arbre d'Évolution 3 voies ---
|
||||
|
||||
describe("Evolution Tree (3 branches)", () => {
|
||||
it("arbre V2 : 3 branches + cross (~30 nœuds)", () => {
|
||||
const ponte = DEFAULT_EVOLUTION_TREE.filter((n) => n.branch === "ponte");
|
||||
const marais = DEFAULT_EVOLUTION_TREE.filter((n) => n.branch === "marais");
|
||||
const adaptation = DEFAULT_EVOLUTION_TREE.filter((n) => n.branch === "adaptation");
|
||||
const cross = DEFAULT_EVOLUTION_TREE.filter((n) => n.branch === "cross");
|
||||
expect(ponte.length).toBe(8);
|
||||
expect(marais.length).toBe(8);
|
||||
expect(adaptation.length).toBe(8);
|
||||
expect(cross.length).toBe(1);
|
||||
expect(DEFAULT_EVOLUTION_TREE.length).toBe(25);
|
||||
});
|
||||
|
||||
describe("canBuyEvolutionNode", () => {
|
||||
it("peut acheter un nœud racine avec assez d'ADN", () => {
|
||||
const state = { ...DEFAULT_STATE, ancestralDna: 5 };
|
||||
expect(canBuyEvolutionNode(state, "ponte_amelioree")).toBe(true);
|
||||
expect(canBuyEvolutionNode(state, "instinct_gregaire")).toBe(true);
|
||||
expect(canBuyEvolutionNode(state, "memoire_genetique")).toBe(true);
|
||||
});
|
||||
|
||||
it("ne peut pas acheter sans assez d'ADN", () => {
|
||||
expect(canBuyEvolutionNode(DEFAULT_STATE, "ponte_amelioree")).toBe(false);
|
||||
});
|
||||
|
||||
it("ne peut pas acheter un nœud dont le prérequis n'est pas débloqué", () => {
|
||||
const state = { ...DEFAULT_STATE, ancestralDna: 100 };
|
||||
expect(canBuyEvolutionNode(state, "double_ponte")).toBe(false);
|
||||
});
|
||||
|
||||
it("peut acheter un nœud si le prérequis est débloqué", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
ancestralDna: 100,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "ponte_amelioree" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
expect(canBuyEvolutionNode(state, "double_ponte")).toBe(true);
|
||||
});
|
||||
|
||||
it("ne peut pas acheter un nœud exclusif si l'alternative est débloquée", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
ancestralDna: 100,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "double_ponte" || n.id === "ponte_amelioree" ? { ...n, unlocked: true } :
|
||||
n.id === "ponte_frenetique" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
// concentration exclusive_with ponte_frenetique → locked
|
||||
expect(canBuyEvolutionNode(state, "concentration")).toBe(false);
|
||||
});
|
||||
|
||||
it("peut acheter un nœud exclusif si l'alternative n'est pas débloquée", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
ancestralDna: 100,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "double_ponte" || n.id === "ponte_amelioree" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
expect(canBuyEvolutionNode(state, "concentration")).toBe(true);
|
||||
expect(canBuyEvolutionNode(state, "ponte_frenetique")).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("buyEvolutionNode", () => {
|
||||
it("débloque le nœud et déduit l'ADN", () => {
|
||||
const state = { ...DEFAULT_STATE, ancestralDna: 5 };
|
||||
const result = buyEvolutionNode(state, "ponte_amelioree");
|
||||
expect(result).not.toBeNull();
|
||||
expect(result!.ancestralDna).toBe(4);
|
||||
expect(result!.evolutionTree.find((n) => n.id === "ponte_amelioree")!.unlocked).toBe(true);
|
||||
});
|
||||
|
||||
it("retourne null si impossible", () => {
|
||||
expect(buyEvolutionNode(DEFAULT_STATE, "ponte_amelioree")).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("resetEvolutionTree", () => {
|
||||
it("rembourse tout l'ADN dépensé et relock tous les nœuds", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
ancestralDna: 50,
|
||||
prestigeCount: 1,
|
||||
freeResetAvailable: true,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "ponte_amelioree" || n.id === "instinct_gregaire"
|
||||
? { ...n, unlocked: true }
|
||||
: n
|
||||
),
|
||||
};
|
||||
// ponte_amelioree (1) + instinct_gregaire (3) = 4 ADN spent, free reset
|
||||
const result = resetEvolutionTree(state);
|
||||
expect(result.ancestralDna).toBe(54);
|
||||
expect(result.evolutionTree.every((n) => !n.unlocked)).toBe(true);
|
||||
});
|
||||
|
||||
it("ne change rien si aucun nœud débloqué", () => {
|
||||
const result = resetEvolutionTree({ ...DEFAULT_STATE, ancestralDna: 10 });
|
||||
expect(result.ancestralDna).toBe(10);
|
||||
});
|
||||
});
|
||||
|
||||
describe("getClickMultiplierFromTree", () => {
|
||||
it("retourne 1 si aucun nœud click débloqué", () => {
|
||||
expect(getClickMultiplierFromTree(DEFAULT_EVOLUTION_TREE)).toBe(1);
|
||||
});
|
||||
|
||||
it("retourne 2 si Ponte Améliorée débloquée", () => {
|
||||
const tree = DEFAULT_EVOLUTION_TREE.map((n) =>
|
||||
n.id === "ponte_amelioree" ? { ...n, unlocked: true } : n
|
||||
);
|
||||
expect(getClickMultiplierFromTree(tree)).toBe(2);
|
||||
});
|
||||
|
||||
it("multiplie si plusieurs nœuds click débloqués (2 × 3 = 6)", () => {
|
||||
const tree = DEFAULT_EVOLUTION_TREE.map((n) =>
|
||||
n.id === "ponte_amelioree" || n.id === "ponte_frenetique" ? { ...n, unlocked: true } : n
|
||||
);
|
||||
expect(getClickMultiplierFromTree(tree)).toBe(6);
|
||||
});
|
||||
});
|
||||
|
||||
describe("getProductionMultiplierFromTree", () => {
|
||||
it("retourne 1 si aucun nœud production débloqué", () => {
|
||||
expect(getProductionMultiplierFromTree(DEFAULT_EVOLUTION_TREE)).toBe(1);
|
||||
});
|
||||
|
||||
it("retourne 1.5 si Instinct Grégaire débloqué", () => {
|
||||
const tree = DEFAULT_EVOLUTION_TREE.map((n) =>
|
||||
n.id === "instinct_gregaire" ? { ...n, unlocked: true } : n
|
||||
);
|
||||
expect(getProductionMultiplierFromTree(tree)).toBe(1.5);
|
||||
});
|
||||
});
|
||||
|
||||
describe("getStartBonusFromTree", () => {
|
||||
it("retourne 0 si aucun nœud start débloqué", () => {
|
||||
expect(getStartBonusFromTree(DEFAULT_EVOLUTION_TREE)).toBe(0);
|
||||
});
|
||||
|
||||
it("retourne 100 si Mémoire Génétique débloquée", () => {
|
||||
const tree = DEFAULT_EVOLUTION_TREE.map((n) =>
|
||||
n.id === "memoire_genetique" ? { ...n, unlocked: true } : n
|
||||
);
|
||||
expect(getStartBonusFromTree(tree)).toBe(100);
|
||||
});
|
||||
});
|
||||
|
||||
describe("prestige_dna_bonus", () => {
|
||||
it("ADN Renforcé + Héritage = +75% ADN", () => {
|
||||
const tree = DEFAULT_EVOLUTION_TREE.map((n) =>
|
||||
n.id === "adn_renforce" || n.id === "heritage" ? { ...n, unlocked: true } : n
|
||||
);
|
||||
expect(getPrestigeDnaBonus(tree)).toBeCloseTo(0.75);
|
||||
});
|
||||
});
|
||||
|
||||
describe("cost_reduction", () => {
|
||||
it("Marée Haute = -20% coût générateurs", () => {
|
||||
const tree = DEFAULT_EVOLUTION_TREE.map((n) =>
|
||||
n.id === "maree_haute" ? { ...n, unlocked: true } : n
|
||||
);
|
||||
expect(getCostReduction(tree)).toBeCloseTo(0.20);
|
||||
});
|
||||
|
||||
it("coût réduit appliqué via generatorCost", () => {
|
||||
const tree = DEFAULT_EVOLUTION_TREE.map((n) =>
|
||||
n.id === "maree_haute" ? { ...n, unlocked: true } : n
|
||||
);
|
||||
const gen = { ...DEFAULT_GENERATORS[0], owned: 0 };
|
||||
const baseCost = generatorCost(gen);
|
||||
const reducedCost = generatorCost(gen, tree);
|
||||
expect(reducedCost).toBe(Math.floor(baseCost * 0.8));
|
||||
});
|
||||
});
|
||||
|
||||
describe("prestige reset generators", () => {
|
||||
it("prestige remet les générateurs à 0", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
resources: 2_000_000,
|
||||
lifetimeTadpoles: 2_000_000,
|
||||
generators: DEFAULT_STATE.generators.map((g) => ({ ...g, owned: 5 })),
|
||||
};
|
||||
const result = applyPrestige(state);
|
||||
expect(result.generators.every((g) => g.owned === 0)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("auto_click (getAutoClicksPerSecond)", () => {
|
||||
it("retourne 0 si capstone ponte non débloqué", () => {
|
||||
expect(getAutoClicksPerSecond(DEFAULT_EVOLUTION_TREE)).toBe(0);
|
||||
});
|
||||
|
||||
it("retourne 1 si capstone Ponte Automatique débloqué", () => {
|
||||
const tree = DEFAULT_EVOLUTION_TREE.map((n) =>
|
||||
n.id === "ponte_auto" ? { ...n, unlocked: true } : n
|
||||
);
|
||||
expect(getAutoClicksPerSecond(tree)).toBe(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe("prestige threshold reduction", () => {
|
||||
it("Transcendance réduit le seuil de 50%", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "transcendance" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
expect(getPrestigeThreshold(state)).toBe(500_000);
|
||||
});
|
||||
|
||||
it("canPrestige utilise le seuil réduit", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
resources: 600_000,
|
||||
evolutionTree: DEFAULT_STATE.evolutionTree.map((n) =>
|
||||
n.id === "transcendance" ? { ...n, unlocked: true } : n
|
||||
),
|
||||
};
|
||||
expect(canPrestige(state)).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// --- Offline gains (courbe inversée) ---
|
||||
|
||||
describe("offlineEfficiency", () => {
|
||||
it("retourne 1.0 pour absence < 60s (pas offline)", () => {
|
||||
expect(offlineEfficiency(30_000)).toBe(1);
|
||||
});
|
||||
|
||||
it("retourne 1.0 pour absence de 10min (phase 100%)", () => {
|
||||
expect(offlineEfficiency(10 * 60_000)).toBe(1);
|
||||
});
|
||||
|
||||
it("retourne 1.0 à exactement 15min", () => {
|
||||
expect(offlineEfficiency(15 * 60_000)).toBe(1);
|
||||
});
|
||||
|
||||
it("retourne ~0.625 à 30min (milieu decay 1.0→0.25)", () => {
|
||||
const eff = offlineEfficiency(30 * 60_000);
|
||||
// 30min = 15min dans la phase decay (15min-1h = 45min total)
|
||||
// t = 15/45 = 0.333 → eff = 1 - 0.333 * 0.75 = 0.75
|
||||
expect(eff).toBeCloseTo(0.75, 1);
|
||||
});
|
||||
|
||||
it("retourne 0.25 à exactement 1h (fin du decay)", () => {
|
||||
expect(offlineEfficiency(60 * 60_000)).toBeCloseTo(0.25);
|
||||
});
|
||||
|
||||
it("retourne ~0.125 à 1h30 (milieu 0.25→0)", () => {
|
||||
const eff = offlineEfficiency(90 * 60_000);
|
||||
expect(eff).toBeCloseTo(0.125, 1);
|
||||
});
|
||||
|
||||
it("retourne 0 à exactement 2h", () => {
|
||||
expect(offlineEfficiency(2 * 60 * 60_000)).toBe(0);
|
||||
});
|
||||
|
||||
it("retourne 0 après 2h (cap)", () => {
|
||||
expect(offlineEfficiency(5 * 60 * 60_000)).toBe(0);
|
||||
});
|
||||
|
||||
it("courbe monotone décroissante", () => {
|
||||
const points = [0, 10, 15, 30, 45, 60, 90, 120, 180].map(
|
||||
(min) => offlineEfficiency(min * 60_000)
|
||||
);
|
||||
for (let i = 1; i < points.length; i++) {
|
||||
expect(points[i]).toBeLessThanOrEqual(points[i - 1]);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("computeOfflineGains", () => {
|
||||
const stateWithProd = {
|
||||
...DEFAULT_STATE,
|
||||
generators: DEFAULT_STATE.generators.map((g, i) =>
|
||||
i === 0 ? { ...g, owned: 10 } : g
|
||||
),
|
||||
lastTick: 0,
|
||||
lastOnline: 0,
|
||||
};
|
||||
const pps = DEFAULT_GENERATORS[0].baseProduction * 10; // 1/s
|
||||
|
||||
it("gains normaux si absence < 60s", () => {
|
||||
const gains = computeOfflineGains(stateWithProd, 30_000);
|
||||
// < threshold → computeIdleGains classique
|
||||
expect(gains).toBeCloseTo(pps * 30);
|
||||
});
|
||||
|
||||
it("gains < idle pur pour absence de 1h", () => {
|
||||
const gains = computeOfflineGains(stateWithProd, 60 * 60_000);
|
||||
const fullIdleGains = pps * 3600;
|
||||
expect(gains).toBeLessThan(fullIdleGains);
|
||||
expect(gains).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it("gains = 0 pour absence > 2h si prod constante", () => {
|
||||
// > 2h : tout tombe à 0%, mais les premières 2h produisent encore
|
||||
const gains = computeOfflineGains(stateWithProd, 3 * 60 * 60_000);
|
||||
const gainsAt2h = computeOfflineGains(stateWithProd, 2 * 60 * 60_000);
|
||||
// gains at 3h should equal gains at 2h (nothing added after 2h)
|
||||
expect(gains).toBeCloseTo(gainsAt2h, 0);
|
||||
});
|
||||
|
||||
it("retourne 0 si aucune production", () => {
|
||||
const gains = computeOfflineGains({ ...DEFAULT_STATE, lastTick: 0 }, 60 * 60_000);
|
||||
expect(gains).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
123
Frontend/src/__tests__/migrateSave.test.ts
Normal file
@@ -0,0 +1,123 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { migrateSave } from "../lib/core/migrateSave";
|
||||
import { DEFAULT_EVOLUTION_TREE, DEFAULT_GENERATORS } from "../lib/core/economy";
|
||||
import { CURRENT_SAVE_VERSION } from "../lib/core/balance";
|
||||
|
||||
// Minimal Sprint 2 save (v1 — no saveVersion field)
|
||||
function makeV1Save(overrides: Record<string, unknown> = {}) {
|
||||
return {
|
||||
resources: 1234,
|
||||
clickMultiplier: 1,
|
||||
generators: DEFAULT_GENERATORS.map((g) => ({ ...g, owned: 5 })),
|
||||
lastTick: Date.now() - 60_000,
|
||||
lastOnline: Date.now() - 60_000,
|
||||
prestigeCount: 3,
|
||||
prestigeMultiplier: 1.3,
|
||||
ancestralDna: 42,
|
||||
evolutionTree: DEFAULT_EVOLUTION_TREE.slice(0, 18).map((n, i) => ({
|
||||
...n,
|
||||
unlocked: i < 2, // first 2 nodes unlocked
|
||||
})),
|
||||
lifetimeTadpoles: 5_000_000,
|
||||
cosmeticInventory: ["hat_lily"],
|
||||
cosmeticEquipped: { hat: "hat_lily" },
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
describe("migrateSave", () => {
|
||||
describe("v1 → v2", () => {
|
||||
it("sets saveVersion to current", () => {
|
||||
const result = migrateSave(makeV1Save());
|
||||
expect(result.saveVersion).toBe(CURRENT_SAVE_VERSION);
|
||||
});
|
||||
|
||||
it("adds runStats with defaults", () => {
|
||||
const result = migrateSave(makeV1Save());
|
||||
expect(result.runStats).toBeDefined();
|
||||
expect(result.runStats.tadpolesProduced).toBe(0);
|
||||
expect(result.runStats.bestRun).toBeNull();
|
||||
});
|
||||
|
||||
it("adds freeResetAvailable and extraResetsUsed", () => {
|
||||
const result = migrateSave(makeV1Save());
|
||||
expect(result.freeResetAvailable).toBe(true);
|
||||
expect(result.extraResetsUsed).toBe(0);
|
||||
});
|
||||
|
||||
it("preserves unlocked state of existing tree nodes", () => {
|
||||
const result = migrateSave(makeV1Save());
|
||||
const node0 = result.evolutionTree.find((n) => n.id === "ponte_amelioree");
|
||||
const node2 = result.evolutionTree.find((n) => n.id === "ponte_frenetique");
|
||||
expect(node0?.unlocked).toBe(true);
|
||||
expect(node2?.unlocked).toBe(false);
|
||||
});
|
||||
|
||||
it("preserves generator owned counts", () => {
|
||||
const result = migrateSave(makeV1Save());
|
||||
expect(result.generators[0].owned).toBe(5);
|
||||
});
|
||||
|
||||
it("preserves resources, ancestralDna, prestigeCount", () => {
|
||||
const result = migrateSave(makeV1Save());
|
||||
expect(result.resources).toBe(1234);
|
||||
expect(result.ancestralDna).toBe(42);
|
||||
expect(result.prestigeCount).toBe(3);
|
||||
});
|
||||
|
||||
it("preserves cosmetics", () => {
|
||||
const result = migrateSave(makeV1Save());
|
||||
expect(result.cosmeticInventory).toContain("hat_lily");
|
||||
expect(result.cosmeticEquipped.hat).toBe("hat_lily");
|
||||
});
|
||||
});
|
||||
|
||||
describe("backfill missing fields", () => {
|
||||
it("backfills lastOnline from lastTick", () => {
|
||||
const save = makeV1Save();
|
||||
delete (save as Record<string, unknown>).lastOnline;
|
||||
const result = migrateSave(save);
|
||||
expect(result.lastOnline).toBe(save.lastTick);
|
||||
});
|
||||
|
||||
it("backfills empty cosmeticInventory", () => {
|
||||
const save = makeV1Save();
|
||||
delete (save as Record<string, unknown>).cosmeticInventory;
|
||||
const result = migrateSave(save);
|
||||
expect(result.cosmeticInventory).toEqual([]);
|
||||
});
|
||||
|
||||
it("backfills empty cosmeticEquipped", () => {
|
||||
const save = makeV1Save();
|
||||
delete (save as Record<string, unknown>).cosmeticEquipped;
|
||||
const result = migrateSave(save);
|
||||
expect(result.cosmeticEquipped).toEqual({});
|
||||
});
|
||||
});
|
||||
|
||||
describe("v2 passthrough", () => {
|
||||
it("does not re-migrate a v2 save", () => {
|
||||
const v2 = migrateSave(makeV1Save());
|
||||
const result = migrateSave(v2 as unknown as Record<string, unknown>);
|
||||
expect(result.saveVersion).toBe(CURRENT_SAVE_VERSION);
|
||||
expect(result).toEqual(v2);
|
||||
});
|
||||
});
|
||||
|
||||
describe("edge cases", () => {
|
||||
it("handles save with no evolutionTree (corrupted)", () => {
|
||||
const save = makeV1Save();
|
||||
delete (save as Record<string, unknown>).evolutionTree;
|
||||
const result = migrateSave(save);
|
||||
expect(result.evolutionTree.length).toBe(DEFAULT_EVOLUTION_TREE.length);
|
||||
});
|
||||
|
||||
it("handles save with no generators (corrupted)", () => {
|
||||
const save = makeV1Save();
|
||||
delete (save as Record<string, unknown>).generators;
|
||||
const result = migrateSave(save);
|
||||
expect(result.generators.length).toBe(DEFAULT_GENERATORS.length);
|
||||
expect(result.generators[0].owned).toBe(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
101
Frontend/src/__tests__/milestones.test.ts
Normal file
@@ -0,0 +1,101 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import {
|
||||
DEFAULT_STATE,
|
||||
getClaimableMilestones,
|
||||
getNextMilestone,
|
||||
claimMilestone,
|
||||
getMilestoneStartNid,
|
||||
getMilestoneOfflineBonus,
|
||||
} from "../lib/core/economy";
|
||||
|
||||
describe("Prestige Milestones", () => {
|
||||
it("no claimable milestones at 0 prestiges", () => {
|
||||
expect(getClaimableMilestones(DEFAULT_STATE)).toEqual([]);
|
||||
});
|
||||
|
||||
it("milestone_1 claimable at 1 prestige", () => {
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 1 };
|
||||
const claimable = getClaimableMilestones(state);
|
||||
expect(claimable.length).toBe(1);
|
||||
expect(claimable[0].id).toBe("milestone_1");
|
||||
});
|
||||
|
||||
it("multiple milestones claimable at 5 prestiges", () => {
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 5 };
|
||||
const claimable = getClaimableMilestones(state);
|
||||
expect(claimable.length).toBe(3); // 1, 3, 5
|
||||
});
|
||||
|
||||
it("already claimed milestones not returned", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
prestigeCount: 5,
|
||||
claimedMilestones: ["milestone_1", "milestone_3"],
|
||||
};
|
||||
const claimable = getClaimableMilestones(state);
|
||||
expect(claimable.length).toBe(1);
|
||||
expect(claimable[0].id).toBe("milestone_5");
|
||||
});
|
||||
|
||||
it("getNextMilestone returns first unachieved", () => {
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 2 };
|
||||
const next = getNextMilestone(state);
|
||||
expect(next?.id).toBe("milestone_3");
|
||||
expect(next?.threshold).toBe(3);
|
||||
});
|
||||
|
||||
it("getNextMilestone returns null when all achieved", () => {
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 200 };
|
||||
expect(getNextMilestone(state)).toBeNull();
|
||||
});
|
||||
|
||||
describe("claimMilestone", () => {
|
||||
it("claims successfully and adds to claimedMilestones", () => {
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 1 };
|
||||
const result = claimMilestone(state, "milestone_1");
|
||||
expect(result).not.toBeNull();
|
||||
expect(result!.claimedMilestones).toContain("milestone_1");
|
||||
});
|
||||
|
||||
it("cosmetic reward adds to inventory", () => {
|
||||
const state = { ...DEFAULT_STATE, prestigeCount: 1 };
|
||||
const result = claimMilestone(state, "milestone_1");
|
||||
expect(result!.cosmeticInventory).toContain("ribbon");
|
||||
});
|
||||
|
||||
it("cannot claim milestone not yet reached", () => {
|
||||
const result = claimMilestone(DEFAULT_STATE, "milestone_1");
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
|
||||
it("cannot claim already claimed milestone", () => {
|
||||
const state = {
|
||||
...DEFAULT_STATE,
|
||||
prestigeCount: 1,
|
||||
claimedMilestones: ["milestone_1"],
|
||||
};
|
||||
const result = claimMilestone(state, "milestone_1");
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("milestone bonuses", () => {
|
||||
it("getMilestoneStartNid returns 0 without milestone_5", () => {
|
||||
expect(getMilestoneStartNid(DEFAULT_STATE)).toBe(0);
|
||||
});
|
||||
|
||||
it("getMilestoneStartNid returns 1 with milestone_5 claimed", () => {
|
||||
const state = { ...DEFAULT_STATE, claimedMilestones: ["milestone_5"] };
|
||||
expect(getMilestoneStartNid(state)).toBe(1);
|
||||
});
|
||||
|
||||
it("getMilestoneOfflineBonus returns 0 without milestone_15", () => {
|
||||
expect(getMilestoneOfflineBonus(DEFAULT_STATE)).toBe(0);
|
||||
});
|
||||
|
||||
it("getMilestoneOfflineBonus returns 0.05 with milestone_15 claimed", () => {
|
||||
const state = { ...DEFAULT_STATE, claimedMilestones: ["milestone_15"] };
|
||||
expect(getMilestoneOfflineBonus(state)).toBe(0.05);
|
||||
});
|
||||
});
|
||||
});
|
||||
123
Frontend/src/__tests__/save-validation.test.ts
Normal file
@@ -0,0 +1,123 @@
|
||||
// save-validation.test.ts — Tests anti-cheat validation logic
|
||||
// Ported from backend saveControllers.validateGameState for unit testing
|
||||
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { DEFAULT_STATE } from "../lib/core/economy";
|
||||
|
||||
// Reproduce the validation logic client-side for testing
|
||||
const MAX_PRODUCTION_PER_SECOND = 750_000;
|
||||
const CHEAT_MARGIN = 1.1;
|
||||
|
||||
interface PreviousSave {
|
||||
last_save: string;
|
||||
game_state: { resources: number };
|
||||
}
|
||||
|
||||
function validateGameState(
|
||||
gameState: { resources: number; generators?: unknown[] },
|
||||
previousSave: PreviousSave | null
|
||||
): { valid: boolean; reason?: string } {
|
||||
if (!gameState || typeof gameState !== "object") {
|
||||
return { valid: false, reason: "Invalid game state format" };
|
||||
}
|
||||
|
||||
if (typeof gameState.resources !== "number" || gameState.resources < 0) {
|
||||
return { valid: false, reason: "Invalid resources value" };
|
||||
}
|
||||
|
||||
if (!Array.isArray(gameState.generators)) {
|
||||
return { valid: false, reason: "Invalid generators" };
|
||||
}
|
||||
|
||||
if (!previousSave) {
|
||||
return { valid: true };
|
||||
}
|
||||
|
||||
const lastSaveTime = new Date(previousSave.last_save).getTime();
|
||||
const now = Date.now();
|
||||
const elapsedSeconds = Math.max((now - lastSaveTime) / 1000, 0);
|
||||
|
||||
const maxPossibleResources =
|
||||
MAX_PRODUCTION_PER_SECOND * elapsedSeconds * CHEAT_MARGIN;
|
||||
|
||||
const previousResources = previousSave.game_state?.resources ?? 0;
|
||||
const resourceDelta = gameState.resources - previousResources;
|
||||
|
||||
if (resourceDelta > maxPossibleResources && resourceDelta > 0) {
|
||||
return {
|
||||
valid: false,
|
||||
reason: `Resource gain exceeds maximum possible`,
|
||||
};
|
||||
}
|
||||
|
||||
return { valid: true };
|
||||
}
|
||||
|
||||
describe("Anti-cheat validation", () => {
|
||||
it("accepts first save (no previous)", () => {
|
||||
const result = validateGameState(
|
||||
{ ...DEFAULT_STATE, resources: 1000 },
|
||||
null
|
||||
);
|
||||
expect(result.valid).toBe(true);
|
||||
});
|
||||
|
||||
it("accepts legitimate resource gain", () => {
|
||||
const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString();
|
||||
const result = validateGameState(
|
||||
{ ...DEFAULT_STATE, resources: 100_000 },
|
||||
{ last_save: fiveMinutesAgo, game_state: { resources: 50_000 } }
|
||||
);
|
||||
expect(result.valid).toBe(true);
|
||||
});
|
||||
|
||||
it("rejects impossibly large resource gain", () => {
|
||||
const oneSecondAgo = new Date(Date.now() - 1000).toISOString();
|
||||
const result = validateGameState(
|
||||
{ ...DEFAULT_STATE, resources: 999_999_999_999 },
|
||||
{ last_save: oneSecondAgo, game_state: { resources: 0 } }
|
||||
);
|
||||
expect(result.valid).toBe(false);
|
||||
expect(result.reason).toContain("exceeds maximum");
|
||||
});
|
||||
|
||||
it("rejects negative resources", () => {
|
||||
const result = validateGameState(
|
||||
{ ...DEFAULT_STATE, resources: -100 },
|
||||
null
|
||||
);
|
||||
expect(result.valid).toBe(false);
|
||||
});
|
||||
|
||||
it("rejects invalid game state format", () => {
|
||||
const result = validateGameState(null as any, null);
|
||||
expect(result.valid).toBe(false);
|
||||
});
|
||||
|
||||
it("rejects missing generators array", () => {
|
||||
const result = validateGameState(
|
||||
{ resources: 100, generators: "not an array" } as any,
|
||||
null
|
||||
);
|
||||
expect(result.valid).toBe(false);
|
||||
});
|
||||
|
||||
it("accepts resource loss (spending on generators)", () => {
|
||||
const oneMinuteAgo = new Date(Date.now() - 60 * 1000).toISOString();
|
||||
const result = validateGameState(
|
||||
{ ...DEFAULT_STATE, resources: 1000 },
|
||||
{ last_save: oneMinuteAgo, game_state: { resources: 5000 } }
|
||||
);
|
||||
expect(result.valid).toBe(true); // delta < 0, so always OK
|
||||
});
|
||||
|
||||
it("accepts gains within max production window", () => {
|
||||
const tenMinutesAgo = new Date(Date.now() - 10 * 60 * 1000).toISOString();
|
||||
// 10 min × 750,000/s × 1.1 = 495,000,000
|
||||
const result = validateGameState(
|
||||
{ ...DEFAULT_STATE, resources: 400_000_000 },
|
||||
{ last_save: tenMinutesAgo, game_state: { resources: 0 } }
|
||||
);
|
||||
expect(result.valid).toBe(true);
|
||||
});
|
||||
});
|
||||
616
Frontend/src/app.css
Normal file
@@ -0,0 +1,616 @@
|
||||
@import "tailwindcss";
|
||||
|
||||
/* -- Tailwind v4 theme -- tokens du jeu -- */
|
||||
@theme {
|
||||
--color-blue-light: #dcecf3;
|
||||
--color-purple-light: #e4e3f3;
|
||||
--color-red-light: #c33636;
|
||||
--color-light: #eaeaea;
|
||||
--color-grey: #202020;
|
||||
--color-grey-hover: #606060;
|
||||
|
||||
--color-gp-bg: rgba(17, 17, 17, 0.75);
|
||||
--color-gp-bg-hover: rgba(17, 17, 17, 0.85);
|
||||
--color-gp-border: rgba(255, 255, 255, 0.08);
|
||||
--color-gp-text: rgba(255, 255, 255, 0.9);
|
||||
--color-gp-text-muted: rgba(255, 255, 255, 0.5);
|
||||
--color-gp-accent-green: #34d399;
|
||||
--color-gp-accent-purple: #a78bfa;
|
||||
--color-gp-accent-amber: #fbbf24;
|
||||
--color-gp-accent-green-bg: rgba(16, 185, 129, 0.12);
|
||||
--color-gp-accent-purple-bg: rgba(139, 92, 246, 0.12);
|
||||
--color-gp-accent-amber-bg: rgba(251, 191, 36, 0.12);
|
||||
--color-gp-btn: #059669;
|
||||
--color-gp-btn-hover: #10b981;
|
||||
--color-gp-btn-disabled: rgba(255, 255, 255, 0.08);
|
||||
--color-gp-btn-text-disabled: rgba(255, 255, 255, 0.3);
|
||||
|
||||
--radius-gp: 0.75rem;
|
||||
--spacing-gp: 0.75rem;
|
||||
--spacing-gp-gap: 0.5rem;
|
||||
|
||||
--font-size-gp-title: 0.8rem;
|
||||
--font-size-gp-text: 0.75rem;
|
||||
--font-size-gp-sm: 0.65rem;
|
||||
|
||||
--animate-gp-pulse: gp-pulse 2s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes gp-pulse {
|
||||
0%, 100% { box-shadow: 0 0 0 0 rgba(124, 58, 237, 0.4); }
|
||||
50% { box-shadow: 0 0 0 6px rgba(124, 58, 237, 0); }
|
||||
}
|
||||
|
||||
/* -- Global reset & base -- */
|
||||
@layer base {
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
:root {
|
||||
--font: "Hanken Grotesk", sans-serif;
|
||||
--bg-color: var(--color-blue-light);
|
||||
}
|
||||
|
||||
a { text-decoration: none; }
|
||||
|
||||
/* a11y — focus-visible ring */
|
||||
:focus-visible {
|
||||
outline: 2px solid var(--color-gp-accent-green);
|
||||
outline-offset: 2px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
/* Skip keyboard focus ring on mouse clicks */
|
||||
:focus:not(:focus-visible) {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 1px;
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* -- Zone system (biomes) -- */
|
||||
@layer components {
|
||||
.zone {
|
||||
width: 100%;
|
||||
min-height: 92vh;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
justify-content: center;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
transition: background-image 0.5s ease;
|
||||
}
|
||||
|
||||
[data-zone="swamp"] {
|
||||
background-image: url("/webp/bg-cover.webp");
|
||||
background-position: center 70%;
|
||||
}
|
||||
|
||||
[data-zone="landing"] {
|
||||
background: var(--bg-color);
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
[data-zone="page"] {
|
||||
background: var(--bg-color);
|
||||
align-items: flex-start;
|
||||
min-height: auto;
|
||||
}
|
||||
|
||||
/* -- Game panels design system -- */
|
||||
|
||||
.gp {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--spacing-gp-gap);
|
||||
padding: var(--spacing-gp);
|
||||
background: var(--color-gp-bg);
|
||||
backdrop-filter: blur(8px);
|
||||
border: 1px solid var(--color-gp-border);
|
||||
border-radius: var(--radius-gp);
|
||||
}
|
||||
|
||||
.gp-title {
|
||||
font-family: var(--font);
|
||||
font-size: var(--font-size-gp-title);
|
||||
font-weight: 700;
|
||||
color: var(--color-gp-text);
|
||||
letter-spacing: 0.02em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.gp-label {
|
||||
font-family: var(--font);
|
||||
font-size: var(--font-size-gp-sm);
|
||||
font-weight: 500;
|
||||
color: var(--color-gp-text-muted);
|
||||
}
|
||||
|
||||
.gp-value {
|
||||
font-family: var(--font);
|
||||
font-size: var(--font-size-gp-text);
|
||||
font-weight: 600;
|
||||
color: var(--color-gp-text);
|
||||
}
|
||||
|
||||
.gp-accent-green { color: var(--color-gp-accent-green); }
|
||||
.gp-accent-purple { color: var(--color-gp-accent-purple); }
|
||||
.gp-accent-amber { color: var(--color-gp-accent-amber); }
|
||||
|
||||
.gp-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 0.4rem;
|
||||
padding: 0.4rem 0.5rem;
|
||||
border-radius: calc(var(--radius-gp) - 0.15rem);
|
||||
border: 1px solid transparent;
|
||||
transition: background 0.15s ease, border-color 0.15s ease;
|
||||
}
|
||||
|
||||
.gp-row--active {
|
||||
border-color: rgba(16, 185, 129, 0.3);
|
||||
background: var(--color-gp-accent-green-bg);
|
||||
}
|
||||
.gp-row--active:hover { background: rgba(16, 185, 129, 0.18); }
|
||||
|
||||
.gp-row--locked {
|
||||
border-color: var(--color-gp-border);
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.gp-row--evolution {
|
||||
border-color: rgba(251, 191, 36, 0.3);
|
||||
background: var(--color-gp-accent-amber-bg);
|
||||
}
|
||||
|
||||
.gp-row--unlocked {
|
||||
border-color: rgba(16, 185, 129, 0.3);
|
||||
background: var(--color-gp-accent-green-bg);
|
||||
}
|
||||
|
||||
.gp-btn {
|
||||
font-family: var(--font);
|
||||
font-size: var(--font-size-gp-sm);
|
||||
font-weight: 600;
|
||||
padding: 0.3rem 0.6rem;
|
||||
border-radius: 0.4rem;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: background 0.15s ease;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.gp-btn--buy {
|
||||
background: var(--color-gp-btn);
|
||||
color: white;
|
||||
}
|
||||
.gp-btn--buy:hover { background: var(--color-gp-btn-hover); }
|
||||
|
||||
.gp-btn--disabled {
|
||||
background: var(--color-gp-btn-disabled);
|
||||
color: var(--color-gp-btn-text-disabled);
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.gp-btn--prestige {
|
||||
background: #7c3aed;
|
||||
color: white;
|
||||
padding: 0.4rem 0.8rem;
|
||||
font-size: var(--font-size-gp-text);
|
||||
animation: var(--animate-gp-pulse);
|
||||
}
|
||||
.gp-btn--prestige:hover { background: #8b5cf6; }
|
||||
|
||||
.gp-cockpit-header {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(5, 1fr);
|
||||
gap: 0.2rem;
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.gp-stat {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 0.05rem;
|
||||
}
|
||||
|
||||
.gp-progress {
|
||||
height: 0.35rem;
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
border-radius: 1rem;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.gp-progress-fill {
|
||||
height: 100%;
|
||||
border-radius: 1rem;
|
||||
transition: width 0.5s ease;
|
||||
}
|
||||
|
||||
.gp-sep {
|
||||
height: 1px;
|
||||
background: var(--color-gp-border);
|
||||
margin: 0.15rem 0;
|
||||
}
|
||||
|
||||
.gp-zone-label {
|
||||
font-family: var(--font);
|
||||
font-size: var(--font-size-gp-sm);
|
||||
font-weight: 600;
|
||||
color: var(--color-gp-text-muted);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
padding-left: 0.2rem;
|
||||
}
|
||||
|
||||
/* -- Home / Game view -- */
|
||||
|
||||
.click-zone {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 1rem;
|
||||
padding-bottom: 2vh;
|
||||
cursor: pointer;
|
||||
flex: 1;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
.click-zone { padding-right: 22rem; }
|
||||
}
|
||||
|
||||
.click-zone:active img {
|
||||
transform: scale(0.95) rotate(2deg);
|
||||
}
|
||||
|
||||
.click-zone-counter {
|
||||
font-family: var(--font);
|
||||
font-size: 2rem;
|
||||
font-weight: 800;
|
||||
color: white;
|
||||
text-shadow: 0 0 12px rgba(52, 211, 153, 0.5), 0 2px 6px rgba(0, 0, 0, 0.7);
|
||||
pointer-events: none;
|
||||
user-select: none;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
.click-zone-counter { font-size: 2.5rem; }
|
||||
}
|
||||
|
||||
.achieve-badge {
|
||||
display: block;
|
||||
text-align: center;
|
||||
padding: 0.4rem;
|
||||
border-radius: var(--radius-gp);
|
||||
background: var(--color-gp-accent-green-bg);
|
||||
border: 1px solid rgba(16, 185, 129, 0.2);
|
||||
font-family: var(--font);
|
||||
font-size: var(--font-size-gp-sm);
|
||||
font-weight: 600;
|
||||
color: var(--color-gp-accent-green);
|
||||
text-decoration: none;
|
||||
transition: all 0.15s ease;
|
||||
}
|
||||
.achieve-badge:hover { background: rgba(16, 185, 129, 0.2); }
|
||||
|
||||
.click-particle {
|
||||
position: fixed;
|
||||
pointer-events: none;
|
||||
font-family: var(--font);
|
||||
font-size: 1.6rem;
|
||||
font-weight: 800;
|
||||
color: #34d399;
|
||||
text-shadow: 0 0 8px rgba(52, 211, 153, 0.6), 0 2px 4px rgba(0, 0, 0, 0.7);
|
||||
z-index: 100;
|
||||
animation: float-up 1.2s ease-out forwards;
|
||||
}
|
||||
|
||||
.game-sidebar {
|
||||
position: fixed;
|
||||
right: 0.75rem;
|
||||
top: 5.5rem;
|
||||
bottom: 0.75rem;
|
||||
width: 20rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
overflow-y: auto;
|
||||
z-index: 10;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.game-sidebar {
|
||||
right: 0;
|
||||
left: 0;
|
||||
top: auto;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
max-height: 45vh;
|
||||
padding: 0.75rem;
|
||||
background: rgba(0, 0, 0, 0.85);
|
||||
backdrop-filter: blur(8px);
|
||||
border-top-left-radius: 1rem;
|
||||
border-top-right-radius: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slide-in {
|
||||
from { opacity: 0; transform: translateX(100%) scale(0.95); }
|
||||
to { opacity: 1; transform: translateX(0) scale(1); }
|
||||
}
|
||||
|
||||
@keyframes float-up {
|
||||
0% { opacity: 1; transform: translateY(0) scale(1.2); }
|
||||
60% { opacity: 0.9; }
|
||||
100% { opacity: 0; transform: translateY(-80px) scale(1.5); }
|
||||
}
|
||||
|
||||
/* -- Navbar -- */
|
||||
@layer components {
|
||||
.header-main {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 80px;
|
||||
padding: 0 2rem;
|
||||
top: 0;
|
||||
background-color: var(--bg-color);
|
||||
z-index: 99;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
@media (max-width: 999px) {
|
||||
.header-main { padding: 0 0.4rem; }
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 5rem;
|
||||
content: url(/svg/tadpole.svg);
|
||||
transition: 0.2s;
|
||||
}
|
||||
.logo:hover { transform: scale(0.9); }
|
||||
|
||||
.navbar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 1rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.nav-list {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 1.6rem;
|
||||
align-items: center;
|
||||
list-style-type: none;
|
||||
}
|
||||
@media (max-width: 999px) {
|
||||
.nav-list { display: none; }
|
||||
}
|
||||
|
||||
.nav-list li {
|
||||
list-style: none;
|
||||
font-family: var(--font);
|
||||
font-weight: 300;
|
||||
font-size: 1rem;
|
||||
color: white;
|
||||
float: left;
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.mainLink {
|
||||
text-decoration: none;
|
||||
color: var(--color-grey);
|
||||
font-weight: 500;
|
||||
padding: 30px 0;
|
||||
}
|
||||
.mainLink:hover { color: var(--color-red-light); }
|
||||
|
||||
.auth-nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.6rem;
|
||||
font-family: var(--font);
|
||||
}
|
||||
.auth-nickname {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
color: var(--color-grey);
|
||||
}
|
||||
.auth-btn {
|
||||
padding: 0.3rem 0.8rem;
|
||||
border: 1px solid var(--color-grey);
|
||||
border-radius: 0.4rem;
|
||||
background: none;
|
||||
font-family: var(--font);
|
||||
font-size: 0.8rem;
|
||||
color: var(--color-grey);
|
||||
cursor: pointer;
|
||||
transition: all 0.15s ease;
|
||||
}
|
||||
.auth-btn:hover {
|
||||
background: var(--color-grey);
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
|
||||
/* -- Buttons -- */
|
||||
@layer components {
|
||||
.primary-button {
|
||||
display: flex;
|
||||
padding: 0.6rem 1rem;
|
||||
height: fit-content;
|
||||
background-color: var(--color-red-light);
|
||||
border-radius: 0.6rem;
|
||||
justify-content: center;
|
||||
text-decoration: none;
|
||||
font-family: var(--font);
|
||||
color: white !important;
|
||||
text-align: center;
|
||||
font-size: 1rem;
|
||||
font-weight: 400;
|
||||
transition: transform 0.1s ease-in-out;
|
||||
border: none;
|
||||
}
|
||||
.primary-button:hover { transform: scale(0.95); }
|
||||
|
||||
.secondary-button {
|
||||
display: flex;
|
||||
padding: 1rem;
|
||||
background-color: white;
|
||||
border-radius: 0.6rem;
|
||||
justify-content: center;
|
||||
width: fit-content;
|
||||
height: fit-content;
|
||||
text-decoration: none;
|
||||
font-family: var(--font);
|
||||
color: var(--color-grey) !important;
|
||||
text-align: center;
|
||||
font-size: 1rem;
|
||||
transition: transform 0.1s ease-in-out;
|
||||
border: none;
|
||||
}
|
||||
.secondary-button:hover {
|
||||
transform: scale(0.95);
|
||||
background-color: var(--color-grey-hover);
|
||||
}
|
||||
}
|
||||
|
||||
/* -- Footer -- */
|
||||
@layer components {
|
||||
.footer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
align-items: center;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
background-color: var(--bg-color);
|
||||
border-top: solid 1px var(--color-grey);
|
||||
padding: 2rem 0;
|
||||
gap: 2rem;
|
||||
}
|
||||
.footer-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
width: 90%;
|
||||
gap: 2rem;
|
||||
}
|
||||
.footer-logo {
|
||||
background-image: url(/svg/tadpole.svg);
|
||||
background-size: contain;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
width: 250px;
|
||||
height: 100px;
|
||||
transition: all 0.15s ease-in-out;
|
||||
}
|
||||
.footer-logo:hover { transform: scale(0.9); }
|
||||
.copyright {
|
||||
font-family: var(--font);
|
||||
font-size: 0.8rem;
|
||||
font-weight: 300;
|
||||
color: var(--color-grey);
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
/* -- Pages layout -- */
|
||||
@layer components {
|
||||
.container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
max-width: 132ch;
|
||||
width: 80%;
|
||||
gap: 3rem;
|
||||
margin: 150px auto 50px;
|
||||
}
|
||||
.container h1 {
|
||||
font-family: var(--font);
|
||||
color: var(--color-grey);
|
||||
font-size: 1.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
.container h2 {
|
||||
font-family: var(--font);
|
||||
font-size: 2rem;
|
||||
font-weight: 600;
|
||||
color: var(--color-grey);
|
||||
}
|
||||
|
||||
/* -- Achievements -- */
|
||||
.fullachieve {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-top: 6rem;
|
||||
padding-bottom: 3rem;
|
||||
background-color: var(--color-blue-light);
|
||||
width: 100%;
|
||||
max-width: 1280px;
|
||||
margin: 0 auto;
|
||||
min-height: 80vh;
|
||||
}
|
||||
.fullachieve h1 {
|
||||
text-align: center;
|
||||
font-family: var(--font);
|
||||
font-size: 2.5rem;
|
||||
color: var(--color-grey);
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
.achieve-counter {
|
||||
text-align: center;
|
||||
font-family: var(--font);
|
||||
font-size: 1.1rem;
|
||||
color: var(--color-grey);
|
||||
opacity: 0.7;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
.achievementscardcontainer {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
min-height: 200px;
|
||||
gap: 1rem;
|
||||
width: 100%;
|
||||
padding: 0 2rem;
|
||||
}
|
||||
.achieve-card {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
padding: 1rem 1.2rem;
|
||||
border-radius: 0.75rem;
|
||||
width: 100%;
|
||||
max-width: 380px;
|
||||
transition: transform 0.15s ease;
|
||||
}
|
||||
.achieve-card:hover { transform: translateY(-2px); }
|
||||
.achieve-unlocked {
|
||||
background: rgba(16, 185, 129, 0.12);
|
||||
border: 1px solid rgba(16, 185, 129, 0.3);
|
||||
}
|
||||
.achieve-locked {
|
||||
background: rgba(107, 114, 128, 0.08);
|
||||
border: 1px solid rgba(107, 114, 128, 0.15);
|
||||
opacity: 0.5;
|
||||
}
|
||||
.achieve-icon { font-size: 2rem; flex-shrink: 0; width: 3rem; text-align: center; }
|
||||
.achieve-info { display: flex; flex-direction: column; gap: 0.2rem; }
|
||||
.achieve-name { font-family: var(--font); font-size: 1rem; font-weight: 600; color: var(--color-grey); }
|
||||
.achieve-desc { font-family: var(--font); font-size: 0.85rem; color: var(--color-grey); opacity: 0.7; }
|
||||
}
|
||||
13
Frontend/src/app.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
// See https://svelte.dev/docs/kit/types#app.d.ts
|
||||
// for information about these interfaces
|
||||
declare global {
|
||||
namespace App {
|
||||
// interface Error {}
|
||||
// interface Locals {}
|
||||
// interface PageData {}
|
||||
// interface PageState {}
|
||||
// interface Platform {}
|
||||
}
|
||||
}
|
||||
|
||||
export {};
|
||||
15
Frontend/src/app.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!doctype html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="icon" href="/svg/tadpole.svg" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous" />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:wght@300;400;500;600;700;800&display=swap" rel="stylesheet" />
|
||||
%sveltekit.head%
|
||||
</head>
|
||||
<body data-sveltekit-preload-data="hover">
|
||||
<div style="display: contents">%sveltekit.body%</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,28 +0,0 @@
|
||||
import "../scss/components/achievementscard.scss";
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
function AchievementsCard({ name, description, image, key }) {
|
||||
AchievementsCard.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
description: PropTypes.string.isRequired,
|
||||
image: PropTypes.string.isRequired,
|
||||
key: PropTypes.number.isRequired,
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="achievCardcontainer">
|
||||
<img
|
||||
className="achievecardpicture"
|
||||
key={key}
|
||||
src={image}
|
||||
alt="cartes speciales"
|
||||
/>
|
||||
<div className="achievetitle">
|
||||
<p className="achievname">{name}</p>
|
||||
<p className="achievdescription">{description}</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default AchievementsCard;
|
||||
@@ -1,130 +0,0 @@
|
||||
import { useWildCoin } from "./WildCoin/WildCoinContext";
|
||||
import "../scss/components/boutiquecard.scss";
|
||||
import "../scss/components/buttons.scss";
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
export default function BoutiqueCard({
|
||||
name,
|
||||
price,
|
||||
incrementValue,
|
||||
description,
|
||||
image,
|
||||
link,
|
||||
type,
|
||||
buyed,
|
||||
}) {
|
||||
BoutiqueCard.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
price: PropTypes.number.isRequired,
|
||||
incrementValue: PropTypes.number.isRequired,
|
||||
description: PropTypes.string.isRequired,
|
||||
image: PropTypes.string.isRequired,
|
||||
link: PropTypes.string.isRequired,
|
||||
type: PropTypes.string.isRequired,
|
||||
buyed: PropTypes.bool.isRequired,
|
||||
};
|
||||
|
||||
const {
|
||||
wildCoin,
|
||||
incrementClick,
|
||||
setWildCoin,
|
||||
setIncrementClick,
|
||||
incrementPerSecond,
|
||||
setIncrementPerSecond,
|
||||
setCoffee,
|
||||
setSantaDrunk,
|
||||
setManic,
|
||||
setSnowman,
|
||||
setBonnet,
|
||||
setSugar,
|
||||
setCookie,
|
||||
setCouronne,
|
||||
setEpice,
|
||||
setBiere,
|
||||
} = useWildCoin();
|
||||
|
||||
const acheterAmelioration = (type, price, name) => {
|
||||
const prices = price;
|
||||
const value = prices;
|
||||
|
||||
|
||||
|
||||
if (wildCoin >= value) {
|
||||
if (type === "actif") {
|
||||
setIncrementClick(incrementClick + incrementValue);
|
||||
} else if (type === "passif") {
|
||||
setIncrementPerSecond(incrementPerSecond + incrementValue);
|
||||
}
|
||||
setWildCoin(wildCoin - value);
|
||||
switch (name) {
|
||||
case "Tasse à café":
|
||||
setCoffee((prevCoffee) => [true, prevCoffee[1] + 1]);
|
||||
break;
|
||||
case "Manic":
|
||||
setManic((prevManic) => [true, prevManic[1] + 1]);
|
||||
break;
|
||||
case "Bonnet":
|
||||
setBonnet((prevBonnet) => [true, prevBonnet[1] + 1]);
|
||||
break;
|
||||
case "Mr Bonhomme":
|
||||
setSnowman((prevSnowman) => [true, prevSnowman[1] + 1]);
|
||||
break;
|
||||
case "Canne en sucre":
|
||||
setSugar((prevSugar) => [true, prevSugar[1] + 1]);
|
||||
break;
|
||||
case "Cookie":
|
||||
setCookie((prevCookie) => [true, prevCookie[1] + 1]);
|
||||
break;
|
||||
case "Couronne d'hiver":
|
||||
setCouronne((prevCouronne) => [true, prevCouronne[1] + 1]);
|
||||
break;
|
||||
case "Mr pain d'épice":
|
||||
setEpice((prevEpice) => [true, prevEpice[1] + 1]);
|
||||
break;
|
||||
case "Bière":
|
||||
setBiere((prevBiere) => [true, prevBiere[1] + 1]);
|
||||
setSantaDrunk(true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
console.log("Pas assez de WildCoin pour acheter cette amélioration.");
|
||||
}
|
||||
};
|
||||
return (
|
||||
<div className="shopcardcontainer">
|
||||
<div className="shopcontainer">
|
||||
<div
|
||||
className="cardpicture"
|
||||
style={{ backgroundImage: `url(${image})` }}
|
||||
alt={`image de ${name}`}
|
||||
/>
|
||||
<div>
|
||||
<div className="titlesection">
|
||||
<p className="itemname">{name}</p>
|
||||
<div className="price">
|
||||
<p className="itemprice">{price}</p>
|
||||
|
||||
<div className="priceicon" />
|
||||
</div>
|
||||
</div>
|
||||
<div className="description">
|
||||
<p className="itemdesc">
|
||||
<em>
|
||||
{type} + {incrementValue}
|
||||
</em>
|
||||
</p>
|
||||
<p className="itemdesc">{description}</p>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
onClick={() => acheterAmelioration(type, price, name)}
|
||||
className="primary-button"
|
||||
>
|
||||
Acheter
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,157 +0,0 @@
|
||||
import "../../scss/components/Hud.scss";
|
||||
import { useWildCoin } from "../WildCoin/WildCoinContext";
|
||||
import Timer from "../timer/Timer";
|
||||
import propTypes from "prop-types";
|
||||
|
||||
function Hud({ isVisible }) {
|
||||
Hud.propTypes = {
|
||||
isVisible: propTypes.bool.isRequired,
|
||||
};
|
||||
|
||||
const {
|
||||
manic,
|
||||
snowman,
|
||||
bonnet,
|
||||
sugar,
|
||||
cookie,
|
||||
couronne,
|
||||
epice,
|
||||
biere,
|
||||
coffee,
|
||||
} = useWildCoin();
|
||||
|
||||
const { incrementClick, incrementPerSecond } = useWildCoin();
|
||||
const hiddenDiv = isVisible ? "none" : null;
|
||||
|
||||
return (
|
||||
<div className="hudContainer">
|
||||
<div style={{ display: hiddenDiv }} className="hudStats">
|
||||
<div className="time section">
|
||||
<p>Temps de jeu</p>
|
||||
<p><Timer /></p>
|
||||
</div>
|
||||
<div className="auto section">
|
||||
<p>Auto CPS</p>
|
||||
<p>{incrementPerSecond}</p>
|
||||
</div>
|
||||
<div className="player section">
|
||||
<p>Player Click</p>
|
||||
<p>{incrementClick}</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div className="hudBooster">
|
||||
{coffee[0] === true ? (
|
||||
<div className="boosterItem">
|
||||
<div
|
||||
className="boosterIcon"
|
||||
style={{ backgroundImage: `url(/svg/Tasse.svg)` }}
|
||||
alt="coffee"
|
||||
/>
|
||||
<div className="countbox">
|
||||
<p className="boosterCount">{coffee[1]}</p>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
{manic[0] === true ? (
|
||||
<div className="boosterItem">
|
||||
<div
|
||||
className="boosterIcon"
|
||||
style={{ backgroundImage: `url(/svg/Hand.svg)` }}
|
||||
alt="coffee"
|
||||
/>
|
||||
<div className="countbox">
|
||||
<p className="boosterCount">{manic[1]}</p>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
{snowman[0] === true ? (
|
||||
<div className="boosterItem">
|
||||
<div
|
||||
className="boosterIcon"
|
||||
style={{ backgroundImage: `url(/svg/Bonhome.svg)` }}
|
||||
alt="coffee"
|
||||
/>
|
||||
<div className="countbox">
|
||||
<p className="boosterCount">{snowman[1]}</p>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
{bonnet[0] === true ? (
|
||||
<div className="boosterItem">
|
||||
<div
|
||||
className="boosterIcon"
|
||||
style={{ backgroundImage: `url(/svg/Bonnet.svg)` }}
|
||||
alt="coffee"
|
||||
/>
|
||||
<div className="countbox">
|
||||
<p className="boosterCount">{bonnet[1]}</p>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
{sugar[0] === true ? (
|
||||
<div className="boosterItem">
|
||||
<div
|
||||
className="boosterIcon"
|
||||
style={{ backgroundImage: `url(/svg/Canne.svg)` }}
|
||||
alt="coffee"
|
||||
/>
|
||||
<div className="countbox">
|
||||
<p className="boosterCount">{sugar[1]}</p>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
{cookie[0] === true ? (
|
||||
<div className="boosterItem">
|
||||
<div
|
||||
className="boosterIcon"
|
||||
style={{ backgroundImage: `url(/svg/Cookie.svg)` }}
|
||||
alt="coffee"
|
||||
/>
|
||||
<div className="countbox">
|
||||
<p className="boosterCount">{cookie[1]}</p>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
{couronne[0] === true ? (
|
||||
<div className="boosterItem">
|
||||
<div
|
||||
className="boosterIcon"
|
||||
style={{ backgroundImage: `url(/svg/Courone.svg)` }}
|
||||
alt="coffee"
|
||||
/>
|
||||
<div className="countbox">
|
||||
<p className="boosterCount">{couronne[1]}</p>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
{epice[0] === true ? (
|
||||
<div className="boosterItem">
|
||||
<div
|
||||
className="boosterIcon"
|
||||
style={{ backgroundImage: `url(/svg/PainDep.svg)` }}
|
||||
alt="coffee"
|
||||
/>
|
||||
<div className="countbox">
|
||||
<p className="boosterCount">{epice[1]}</p>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
{biere[0] === true ? (
|
||||
<div className="boosterItem">
|
||||
<div
|
||||
className="boosterIcon"
|
||||
style={{ backgroundImage: `url(/svg/Beer.svg)` }}
|
||||
alt="coffee"
|
||||
/>
|
||||
<div className="countbox">
|
||||
<p className="boosterCount">{biere[1]}</p>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Hud;
|
||||
@@ -1,50 +0,0 @@
|
||||
// MilestoneBar.tsx — Progression vers le prochain prestige
|
||||
// Barre visuelle ressources / 1 000 000 + indicateur restant
|
||||
|
||||
import React from "react";
|
||||
|
||||
const PRESTIGE_THRESHOLD = 1_000_000;
|
||||
|
||||
interface MilestoneBarProps {
|
||||
resources: number;
|
||||
}
|
||||
|
||||
export function MilestoneBar({ resources }: MilestoneBarProps) {
|
||||
const progress = Math.min(resources / PRESTIGE_THRESHOLD, 1);
|
||||
const progressPercent = (progress * 100).toFixed(1);
|
||||
const remaining = Math.max(PRESTIGE_THRESHOLD - resources, 0);
|
||||
|
||||
const formatNumber = (n: number): string => {
|
||||
if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(2)}M`;
|
||||
if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;
|
||||
return Math.floor(n).toString();
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="milestone-bar" aria-label="Progression vers le prestige">
|
||||
<div className="milestone-label">
|
||||
Prochain prestige : {formatNumber(resources)} / {formatNumber(PRESTIGE_THRESHOLD)}
|
||||
</div>
|
||||
<div
|
||||
className="milestone-track"
|
||||
role="progressbar"
|
||||
aria-valuenow={Math.floor(progress * 100)}
|
||||
aria-valuemin={0}
|
||||
aria-valuemax={100}
|
||||
>
|
||||
<div
|
||||
className="milestone-fill"
|
||||
style={{ width: `${progressPercent}%` }}
|
||||
/>
|
||||
</div>
|
||||
{remaining > 0 && (
|
||||
<div className="milestone-remaining">
|
||||
{formatNumber(remaining)} ressources restantes
|
||||
</div>
|
||||
)}
|
||||
{remaining === 0 && (
|
||||
<div className="milestone-ready">Prestige disponible !</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
// PrestigePanel.tsx — Boucle de prestige long terme
|
||||
// Visible uniquement quand canPrestige = true (ressources ≥ 1 000 000)
|
||||
|
||||
import React from "react";
|
||||
|
||||
interface PrestigePanelProps {
|
||||
prestigeCount: number;
|
||||
prestigeMultiplier: number;
|
||||
canPrestige: boolean;
|
||||
onPrestige: () => void;
|
||||
}
|
||||
|
||||
export function PrestigePanel({
|
||||
prestigeCount,
|
||||
prestigeMultiplier,
|
||||
canPrestige,
|
||||
onPrestige,
|
||||
}: PrestigePanelProps) {
|
||||
const handlePrestige = () => {
|
||||
const confirmed = window.confirm(
|
||||
`Prestige — Reset total : ressources et générateurs à zéro.\n` +
|
||||
`Récompense : +0.1× multiplicateur permanent.\n\n` +
|
||||
`Multiplicateur actuel : ×${prestigeMultiplier.toFixed(1)}\n` +
|
||||
`Multiplicateur après : ×${(prestigeMultiplier + 0.1).toFixed(1)}\n\n` +
|
||||
`Confirmer le prestige ?`
|
||||
);
|
||||
if (confirmed) {
|
||||
onPrestige();
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="prestige-panel">
|
||||
<div className="prestige-stats">
|
||||
<span className="prestige-count">Prestiges : {prestigeCount}</span>
|
||||
<span className="prestige-multiplier">
|
||||
Multiplicateur : ×{prestigeMultiplier.toFixed(1)}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
{canPrestige && (
|
||||
<div className="prestige-action">
|
||||
<div className="prestige-reward">
|
||||
Récompense disponible : <strong>+0.1× multiplicateur permanent</strong>
|
||||
</div>
|
||||
<button
|
||||
className="prestige-button"
|
||||
onClick={handlePrestige}
|
||||
aria-label="Déclencher le prestige"
|
||||
>
|
||||
Prestige
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
import { useWildCoin } from "./WildCoinContext";
|
||||
|
||||
function Ameliorations() {
|
||||
const {
|
||||
wildCoin,
|
||||
incrementClick,
|
||||
setWildCoin,
|
||||
setIncrementClick,
|
||||
incrementPerSecond,
|
||||
setIncrementPerSecond,
|
||||
} = useWildCoin();
|
||||
|
||||
const activePrices = [5, 15, 50, 500]; // prix
|
||||
const passivePrices = [5, 15, 50, 500];
|
||||
const activeIncrementValues = [1, 3, 10, 100]; // boost = incrementValue
|
||||
const passiveIncrementValues = [1, 3, 10, 100]; // = incrementValue
|
||||
|
||||
const acheterAmelioration = (type, amount) => {
|
||||
const prices = type === "actif" ? activePrices : passivePrices;
|
||||
const incrementValues =
|
||||
type === "actif" ? activeIncrementValues : passiveIncrementValues;
|
||||
|
||||
const price = prices[amount - 1];
|
||||
const incrementValue = incrementValues[amount - 1];
|
||||
|
||||
if (wildCoin >= price) {
|
||||
if (type === "actif") {
|
||||
setIncrementClick(incrementClick + incrementValue);
|
||||
} else if (type === "passif") {
|
||||
setIncrementPerSecond(incrementPerSecond + incrementValue);
|
||||
}
|
||||
setWildCoin(wildCoin - price);
|
||||
} else {
|
||||
console.log("Pas assez de WildCoin pour acheter cette amélioration.");
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="divMagasinAmelio">
|
||||
<h2>Magasin d'Améliorations</h2>
|
||||
<div className="divAmelioActives">
|
||||
<p>Améliorations Actives :</p>
|
||||
{[1, 2, 3, 4].map((amount) => (
|
||||
<div key={amount}>
|
||||
Price: {activePrices[amount - 1]} - (+
|
||||
{activeIncrementValues[amount - 1]})
|
||||
<button
|
||||
className="amelioActives"
|
||||
onClick={() => acheterAmelioration("actif", amount)}
|
||||
>
|
||||
Acheter
|
||||
</button>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="divAmelioPassives">
|
||||
<p>Améliorations Passives :</p>
|
||||
{[1, 2, 3, 4].map((amount) => (
|
||||
<div key={amount}>
|
||||
Price: {passivePrices[amount - 1]} - (+
|
||||
{passiveIncrementValues[amount - 1]})
|
||||
<button
|
||||
className="amelioPassives"
|
||||
onClick={() => acheterAmelioration("passif", amount)}
|
||||
>
|
||||
Acheter
|
||||
</button>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Ameliorations;
|
||||
@@ -1,43 +0,0 @@
|
||||
import { createContext, useContext, useState, useEffect } from "react";
|
||||
|
||||
export const WildCoinContext = createContext();
|
||||
|
||||
export const useWildCoin = () => {
|
||||
return useContext(WildCoinContext);
|
||||
};
|
||||
|
||||
export function WildCoinProvider({ children }) {
|
||||
// Value of coin
|
||||
const [wildCoin, setWildCoin] = useState(0);
|
||||
// increment by click state
|
||||
const [incrementClick, setIncrementClick] = useState(1);
|
||||
// increment inner useEffect state
|
||||
const [incrementPerSecond, setIncrementPerSecond] = useState(1);
|
||||
|
||||
const incrementWildCoin = (amount) => {
|
||||
setWildCoin((prevWildCoin) => prevWildCoin + amount);
|
||||
};
|
||||
/**
|
||||
* @passiveGenerationInterval incre per sec wild coin in wildCoin
|
||||
* */
|
||||
useEffect(() => {
|
||||
const passiveGenerationInterval = setInterval(() => {
|
||||
incrementWildCoin(incrementPerSecond);
|
||||
}, 1000);
|
||||
|
||||
return () => clearInterval(passiveGenerationInterval);
|
||||
}, [incrementPerSecond]);
|
||||
|
||||
const value = {
|
||||
wildCoin,
|
||||
setWildCoin,
|
||||
incrementClick,
|
||||
incrementWildCoin,
|
||||
};
|
||||
|
||||
return (
|
||||
<WildCoinContext.Provider value={value}>
|
||||
{children}
|
||||
</WildCoinContext.Provider>
|
||||
);
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
import { createContext, useContext, useState, useEffect } from "react";
|
||||
|
||||
export const WildCoinContext = createContext();
|
||||
export const useWildCoin = () => {
|
||||
return useContext(WildCoinContext);
|
||||
};
|
||||
|
||||
export function WildCoinProvider({ children }) {
|
||||
const initialState = {
|
||||
wildCoin: 0,
|
||||
incrementClick: 1,
|
||||
incrementPerSecond: 0,
|
||||
};
|
||||
|
||||
const [state, setState] = useState(() => {
|
||||
const storedContext = JSON.parse(localStorage.getItem("wildCoinContext"));
|
||||
return {
|
||||
...initialState,
|
||||
...(storedContext || {}),
|
||||
};
|
||||
});
|
||||
|
||||
const [coffee, setCoffee] = useState([false, 0]);
|
||||
const [manic, setManic] = useState([false, 0]);
|
||||
const [snowman, setSnowman] = useState([false, 0]);
|
||||
const [bonnet, setBonnet] = useState([false, 0]);
|
||||
const [sugar, setSugar] = useState([false, 0]);
|
||||
const [cookie, setCookie] = useState([false, 0]);
|
||||
const [couronne, setCouronne] = useState([false, 0]);
|
||||
const [epice, setEpice] = useState([false, 0]);
|
||||
const [biere, setBiere] = useState([false, 0]);
|
||||
|
||||
const [santaDrunk, setSantaDrunk] = useState(false);
|
||||
|
||||
const updateWildCoin = (amount) => {
|
||||
setState((prev) => ({
|
||||
...prev,
|
||||
wildCoin: prev.wildCoin + amount,
|
||||
}));
|
||||
};
|
||||
|
||||
const incrementWildCoin = (amount) => {
|
||||
updateWildCoin(amount);
|
||||
};
|
||||
|
||||
const setIncrementClick = (amount) => {
|
||||
setState((prev) => ({
|
||||
...prev,
|
||||
incrementClick: amount,
|
||||
}));
|
||||
};
|
||||
|
||||
const setIncrementPerSecond = (amount) => {
|
||||
setState((prev) => ({
|
||||
...prev,
|
||||
incrementPerSecond: amount,
|
||||
}));
|
||||
};
|
||||
|
||||
const setWildCoin = (amount) => {
|
||||
setState((prev) => ({
|
||||
...prev,
|
||||
wildCoin: amount,
|
||||
}));
|
||||
};
|
||||
|
||||
const [seconds, setSeconds] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
const intervalId = setInterval(() => {
|
||||
setSeconds((prevSeconds) => prevSeconds + 1);
|
||||
}, 1000);
|
||||
|
||||
return () => clearInterval(intervalId);
|
||||
}, []);
|
||||
|
||||
const formatTime = (time) => {
|
||||
const hours = Math.floor(time / 3600);
|
||||
const minutes = Math.floor((time % 3600) / 60);
|
||||
const seconds = time % 60;
|
||||
|
||||
const formattedTime = `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
|
||||
|
||||
return formattedTime;
|
||||
};
|
||||
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
localStorage.setItem("wildCoinContext", JSON.stringify(state));
|
||||
}, [state]);
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
const passiveGenerationInterval = setInterval(() => {
|
||||
updateWildCoin(state.incrementPerSecond);
|
||||
}, 1000);
|
||||
|
||||
return () => clearInterval(passiveGenerationInterval);
|
||||
}, [state.incrementPerSecond]);
|
||||
|
||||
const contextValue = {
|
||||
...state,
|
||||
incrementWildCoin,
|
||||
setIncrementClick,
|
||||
setIncrementPerSecond,
|
||||
setWildCoin,
|
||||
coffee,
|
||||
setCoffee,
|
||||
manic,
|
||||
setManic,
|
||||
snowman,
|
||||
setSnowman,
|
||||
bonnet,
|
||||
setBonnet,
|
||||
sugar,
|
||||
setSugar,
|
||||
cookie,
|
||||
setCookie,
|
||||
couronne,
|
||||
setCouronne,
|
||||
epice,
|
||||
setEpice,
|
||||
biere,
|
||||
setBiere,
|
||||
setSantaDrunk,
|
||||
santaDrunk,
|
||||
seconds,
|
||||
setSeconds,
|
||||
formatTime,
|
||||
};
|
||||
|
||||
return (
|
||||
<WildCoinContext.Provider value={contextValue}>
|
||||
{children}
|
||||
</WildCoinContext.Provider>
|
||||
);
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
import { useWildCoin } from "./WildCoinContext";
|
||||
import WildCoinS from "../../../public/WildCoin.svg";
|
||||
|
||||
function WildCoinIncrementAction() {
|
||||
const { incrementClick, incrementWildCoin } = useWildCoin();
|
||||
|
||||
const handleIncrement = () => {
|
||||
incrementWildCoin(incrementClick);
|
||||
};
|
||||
|
||||
return (
|
||||
<img src={WildCoinS} className="wildCoinBtn" style={{width:"40px", height:"40px"}} alt="Clique pour augmenter le score" aria-label="Clique pour augmenter le score" onClick={handleIncrement} />
|
||||
);
|
||||
}
|
||||
|
||||
export default WildCoinIncrementAction;
|
||||
@@ -1,76 +0,0 @@
|
||||
import { NavLink as Link } from "react-router-dom";
|
||||
import PropTypes from "prop-types";
|
||||
import "../scss/components/navbar.scss";
|
||||
|
||||
import "../scss/root.scss";
|
||||
import PrimaryButton from "./buttons/PrimaryButton";
|
||||
|
||||
export default function Burger({ navData }) {
|
||||
return (
|
||||
<nav className="menuToggle">
|
||||
|
||||
<input type="checkbox" aria-label="Menu" />
|
||||
<span />
|
||||
<span />
|
||||
<span />
|
||||
<ul className="menu">
|
||||
{navData.map((navIndex) => {
|
||||
if (navIndex.dropdown === undefined) {
|
||||
return navIndex.btn === false ? (
|
||||
<li key={navIndex.id}>
|
||||
<Link className="mainLink" to={navIndex.linkurl}>
|
||||
{navIndex.linkname}
|
||||
</Link>
|
||||
</li>
|
||||
) : (
|
||||
<li key={navIndex.id}>
|
||||
<PrimaryButton
|
||||
btnText={navIndex.linkname}
|
||||
btnLink={navIndex.linkurl}
|
||||
/>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<li key={navIndex.id} className="dropdown">
|
||||
<Link className="mainLink" to={navIndex.linkurl}>
|
||||
{navIndex.linkname}
|
||||
</Link>
|
||||
<ul className="sousmenu">
|
||||
{navIndex.dropdown.map((dropdown) => (
|
||||
<li key={dropdown.id}>
|
||||
<Link
|
||||
className="dropLink"
|
||||
to={navIndex.linkurl + dropdown.linkurl}
|
||||
>
|
||||
{dropdown.linkname}
|
||||
</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
</nav>
|
||||
);
|
||||
}
|
||||
|
||||
Burger.propTypes = {
|
||||
navData: PropTypes.arrayOf(
|
||||
PropTypes.shape({
|
||||
btn: PropTypes.bool,
|
||||
id: PropTypes.string.isRequired,
|
||||
linkname: PropTypes.string.isRequired,
|
||||
linkurl: PropTypes.string.isRequired,
|
||||
dropdown: PropTypes.arrayOf(
|
||||
PropTypes.shape({
|
||||
btn: PropTypes.bool,
|
||||
id: PropTypes.string.isRequired,
|
||||
linkname: PropTypes.string.isRequired,
|
||||
linkurl: PropTypes.string.isRequired,
|
||||
})
|
||||
),
|
||||
})
|
||||
),
|
||||
}.isRequired;
|
||||
@@ -1,16 +0,0 @@
|
||||
import PropTypes from "prop-types";
|
||||
import "../../scss/components/buttons.scss";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
export default function PrimaryButton({ btnText, btnLink }) {
|
||||
PrimaryButton.propTypes = {
|
||||
btnText: PropTypes.string.isRequired,
|
||||
btnLink: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
return (
|
||||
<Link className="primary-button" to={btnLink}>
|
||||
{btnText}
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
import "../../scss/components/buttons.scss";
|
||||
import PropTypes from "prop-types";
|
||||
import { Link } from "react-router";
|
||||
|
||||
export default function SecondaryButton({ btnText, btnLink }) {
|
||||
SecondaryButton.propTypes = {
|
||||
btnText: PropTypes.string.isRequired,
|
||||
btnLink: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
return (
|
||||
<Link className="secondary-button" to={btnLink}>
|
||||
{btnText}
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
import { Link } from "react-router-dom";
|
||||
import PropTypes from "prop-types";
|
||||
import "../../scss/components/CardContact.scss";
|
||||
|
||||
CardContact.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
gitHub: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
function CardContact({ name, gitHub }) {
|
||||
return (
|
||||
<div className="cardContact">
|
||||
<Link to={gitHub} target="_blank">
|
||||
<button className="Btn">
|
||||
<svg
|
||||
className="svgIcon"
|
||||
viewBox="0 0 496 512"
|
||||
height="1.4em"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path>
|
||||
</svg>
|
||||
<span className="text">GitHub</span>
|
||||
</button>
|
||||
</Link>
|
||||
<p>{name}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
export default CardContact;
|
||||
@@ -1,84 +0,0 @@
|
||||
import "../scss/components/footer.scss";
|
||||
import { NavLink as Link } from "react-router-dom";
|
||||
import CardContact from "./cardsContact/CardContact";
|
||||
|
||||
const infoDev = [
|
||||
{
|
||||
id: "1",
|
||||
name: "Alix C",
|
||||
gitHub: "https://github.com/Halicksse",
|
||||
},
|
||||
{
|
||||
id: "2",
|
||||
name: "Sebatien L",
|
||||
gitHub: "https://github.com/Lambseb",
|
||||
},
|
||||
{
|
||||
id: "3",
|
||||
name: "Baptiste S",
|
||||
gitHub: "https://github.com/Batsave",
|
||||
},
|
||||
{
|
||||
id: "4",
|
||||
name: "Kevin T",
|
||||
gitHub: "https://github.com/tetardtek",
|
||||
},
|
||||
{
|
||||
id: "5",
|
||||
name: "Nicolas DF",
|
||||
gitHub: "https://github.com/Defreitasnicolas",
|
||||
},
|
||||
];
|
||||
|
||||
export default function Footer() {
|
||||
return (
|
||||
<footer className="footer">
|
||||
<div className="footer-container">
|
||||
<Link
|
||||
to="/#home"
|
||||
className="footer-logo"
|
||||
alt="Logo"
|
||||
aria-label="Logo Officiel"
|
||||
title="Aller à la page d'accueil"
|
||||
/>
|
||||
<div className="section">
|
||||
<p className="section-title">A Propos</p>
|
||||
<p className="section-text">
|
||||
Ce site est un prototype d'exercice développé lors d'un Hackathon
|
||||
dans le cadre d’une formation de Développeur Web et Mobile au sein
|
||||
de la Wild Code School sur le campus Remote de Septembre 2023.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="section">
|
||||
<p className="section-title">Légale</p>
|
||||
<ul className="section-list">
|
||||
<li className="section-item">
|
||||
<Link
|
||||
to="/mentionslegales"
|
||||
title="Aller à la page Mentions Légales"
|
||||
>
|
||||
Mentions Légales
|
||||
</Link>
|
||||
</li>
|
||||
<li className="section-item">
|
||||
<Link to="/cookies" title="Aller à la page Cookies">
|
||||
Cookies
|
||||
</Link>
|
||||
</li>
|
||||
<li className="section-item"></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div className="spacing" />
|
||||
</div>
|
||||
<div className="footer-section">
|
||||
<div className="cardContactContainer">
|
||||
{infoDev.map((info) => (
|
||||
<CardContact key={info.id} name={info.name} gitHub={info.gitHub} />
|
||||
))}
|
||||
</div>
|
||||
<p className="copyright">© 2023 | TrueQuiLeaks. Tous droits réservés.</p>
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
}
|
||||
@@ -1,146 +0,0 @@
|
||||
import { NavLink as Link } from "react-router-dom";
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
import "../scss/components/navbar.scss";
|
||||
import "../scss/root.scss";
|
||||
|
||||
import PrimaryButton from "./buttons/PrimaryButton";
|
||||
import Burger from "./burger";
|
||||
import { useWildCoin } from "./WildCoin/WildCoinContext";
|
||||
import HUDON from "../../public/NavBar/HUDON.svg";
|
||||
import HUDOFF from "../../public/NavBar/HUDOFF.svg";
|
||||
import SnowOn from "../../public/NavBar/SnowOn.svg";
|
||||
import SnowOff from "../../public/NavBar/SnowOff.svg";
|
||||
import { useState } from "react";
|
||||
|
||||
export default function Navbar({
|
||||
navData,
|
||||
isVisible,
|
||||
setIsVisible,
|
||||
toggleSnow,
|
||||
setToggleSnow,
|
||||
}) {
|
||||
Navbar.propTypes = {
|
||||
isVisible: PropTypes.bool,
|
||||
setIsVisible: PropTypes.function,
|
||||
setToggleSnow: PropTypes.function,
|
||||
toggleSnow: PropTypes.bool,
|
||||
}.isRequired;
|
||||
|
||||
const { wildCoin } = useWildCoin();
|
||||
const [imageSrc, setImageSrc] = useState(HUDON);
|
||||
const [snowImageSrc, setSnowImageSrc] = useState(SnowOff);
|
||||
const [timerVisible, setTimerVisible] = useState(false);
|
||||
const handleClickWildCoin = () => {
|
||||
setTimerVisible(true);
|
||||
};
|
||||
|
||||
const toggleHud = () => {
|
||||
if (!isVisible) {
|
||||
setIsVisible(true);
|
||||
setImageSrc(HUDOFF);
|
||||
} else {
|
||||
setIsVisible(false);
|
||||
setImageSrc(HUDON);
|
||||
}
|
||||
};
|
||||
function toggleSnowBtn() {
|
||||
if (toggleSnow === false) {
|
||||
setToggleSnow(true);
|
||||
setSnowImageSrc(SnowOn);
|
||||
} else {
|
||||
setToggleSnow(false);
|
||||
setSnowImageSrc(SnowOff);
|
||||
}
|
||||
}
|
||||
return (
|
||||
<nav className="header-main">
|
||||
<Link
|
||||
className="logo"
|
||||
to="/"
|
||||
aria-label="Retourner à la page d'accueil"
|
||||
title="Logo XmassClick"
|
||||
/>
|
||||
<div className="navbar">
|
||||
<div className="wildCoin">
|
||||
{new Intl.NumberFormat().format(wildCoin)}
|
||||
</div>
|
||||
<ul className="nav-list">
|
||||
{navData.map((navIndex) => {
|
||||
if (navIndex.dropdown === undefined) {
|
||||
return navIndex.btn === false ? (
|
||||
<li key={navIndex.id}>
|
||||
<Link className="mainLink" to={navIndex.linkurl}>
|
||||
{navIndex.linkname}
|
||||
</Link>
|
||||
</li>
|
||||
) : (
|
||||
<li key={navIndex.id}>
|
||||
<PrimaryButton
|
||||
btnText={navIndex.linkname}
|
||||
btnLink={navIndex.linkurl}
|
||||
/>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<li key={navIndex.id} className="dropdown">
|
||||
<Link className="mainLink" to={navIndex.linkurl}>
|
||||
{navIndex.linkname}
|
||||
</Link>
|
||||
<ul className="dropdown-content">
|
||||
{navIndex.dropdown.map((dropdown) => (
|
||||
<li key={dropdown.id}>
|
||||
<Link
|
||||
className="dropLink"
|
||||
to={navIndex.linkurl + dropdown.linkurl}
|
||||
>
|
||||
{dropdown.linkname}
|
||||
</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
<img
|
||||
onClick={() => toggleHud()}
|
||||
src={imageSrc}
|
||||
style={{ height: "28px" }}
|
||||
alt="boutton on"
|
||||
/>
|
||||
<img
|
||||
onClick={() => toggleSnowBtn()}
|
||||
src={snowImageSrc}
|
||||
style={{ height: "28px" }}
|
||||
alt="boutton on"
|
||||
/>
|
||||
<Burger navData={navData} />
|
||||
</div>
|
||||
</nav>
|
||||
);
|
||||
}
|
||||
|
||||
Navbar.propTypes = {
|
||||
navData: PropTypes.arrayOf(
|
||||
PropTypes.shape({
|
||||
btn: PropTypes.bool,
|
||||
id: PropTypes.string,
|
||||
linkname: PropTypes.string,
|
||||
linkurl: PropTypes.string,
|
||||
dropdown: PropTypes.arrayOf(
|
||||
PropTypes.shape({
|
||||
btn: PropTypes.bool,
|
||||
id: PropTypes.string,
|
||||
linkname: PropTypes.string,
|
||||
linkurl: PropTypes.string,
|
||||
})
|
||||
),
|
||||
})
|
||||
),
|
||||
};
|
||||
|
||||
Navbar.defaultProps = {
|
||||
navData: [],
|
||||
};
|
||||
@@ -1,13 +0,0 @@
|
||||
import { useWildCoin } from "../WildCoin/WildCoinContext";
|
||||
|
||||
function Timer() {
|
||||
const { formatTime, seconds } = useWildCoin();
|
||||
|
||||
return (
|
||||
<div>
|
||||
<p>{formatTime(seconds)}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Timer;
|
||||
@@ -1,142 +0,0 @@
|
||||
import React, {
|
||||
createContext,
|
||||
useContext,
|
||||
useState,
|
||||
useMemo,
|
||||
useEffect,
|
||||
} from "react";
|
||||
import PropTypes from "prop-types";
|
||||
import axios from "axios";
|
||||
import { jwtDecode } from "jwt-decode";
|
||||
|
||||
const AuthContext = createContext();
|
||||
|
||||
const AuthProvider = ({ children }) => {
|
||||
const [user, setUser] = useState(null);
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
useEffect(() => {
|
||||
const fetchData = async () => {
|
||||
const jwtToken = localStorage.getItem("token");
|
||||
|
||||
if (jwtToken) {
|
||||
try {
|
||||
const decodedPayload = jwtDecode(jwtToken);
|
||||
const res = await axios.get(
|
||||
`${import.meta.env.VITE_BACKEND_URL}/api/users/${decodedPayload.user}`
|
||||
);
|
||||
setUser(res.data);
|
||||
} catch (error) {
|
||||
console.error("Error fetching user data:", error);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
} else {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
fetchData();
|
||||
}, []);
|
||||
|
||||
|
||||
const logout = () => {
|
||||
localStorage.removeItem("token");
|
||||
setUser(null);
|
||||
};
|
||||
const editUser = async (updatedFields) => {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${import.meta.env.VITE_BACKEND_URL}/api/users/${user.id}`,
|
||||
{
|
||||
method: "PUT",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: `Bearer ${localStorage.getItem("token")}`,
|
||||
},
|
||||
body: JSON.stringify(updatedFields),
|
||||
}
|
||||
);
|
||||
|
||||
if (response.ok) {
|
||||
const updatedUser = await response.json();
|
||||
setUser((prevUser) => ({
|
||||
...prevUser,
|
||||
...updatedUser.user,
|
||||
}));
|
||||
return "User updated successfully";
|
||||
}
|
||||
if (response.status === 400) {
|
||||
console.error("Bad Request:", response.statusText);
|
||||
throw new Error("Bad Request");
|
||||
} else if (response.status === 401) {
|
||||
console.error("Unauthorized:", response.statusText);
|
||||
throw new Error("Unauthorized");
|
||||
} else {
|
||||
console.error("Error updating user:", response.statusText);
|
||||
throw new Error("Error updating user");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error updating user:", error);
|
||||
throw new Error("An error occurred during user update");
|
||||
}
|
||||
};
|
||||
|
||||
const sendPasswordResetEmail = async (email) => {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${import.meta.env.VITE_BACKEND_URL}/api/forgot-password`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({ mail: email }),
|
||||
}
|
||||
);
|
||||
|
||||
if (response.ok) {
|
||||
return "Password reset email sent successfully";
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
throw new Error(data.message || "Error sending password reset email");
|
||||
} catch (error) {
|
||||
console.error("Error sending password reset email:", error);
|
||||
throw new Error(
|
||||
"An error occurred while sending the password reset email"
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const authContextValue = useMemo(() => {
|
||||
return {
|
||||
user,
|
||||
loading,
|
||||
logout,
|
||||
editUser,
|
||||
sendPasswordResetEmail,
|
||||
setUser: (newUser) => {
|
||||
setUser(newUser);
|
||||
},
|
||||
};
|
||||
}, [user, loading, logout]);
|
||||
|
||||
return (
|
||||
<AuthContext.Provider value={authContextValue}>
|
||||
{children}
|
||||
</AuthContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
AuthProvider.propTypes = {
|
||||
children: PropTypes.node.isRequired,
|
||||
};
|
||||
|
||||
const useAuth = () => {
|
||||
const context = useContext(AuthContext);
|
||||
if (!context) {
|
||||
throw new Error("useAuth must be used within an AuthProvider");
|
||||
}
|
||||
return context;
|
||||
};
|
||||
@@ -1,111 +0,0 @@
|
||||
// economy.ts — Core clicker logic (lazy calculation pattern)
|
||||
// Jamais de timer actif : tout est calculé au read depuis lastTick
|
||||
|
||||
export interface Generator {
|
||||
id: string;
|
||||
name: string;
|
||||
baseCost: number;
|
||||
baseProduction: number; // ressource/s
|
||||
owned: number;
|
||||
}
|
||||
|
||||
export interface GameState {
|
||||
resources: number;
|
||||
clickMultiplier: number;
|
||||
generators: Generator[];
|
||||
lastTick: number; // timestamp ms — lazy calc reference
|
||||
prestigeCount: number;
|
||||
prestigeMultiplier: number; // 1 + prestigeCount * 0.1
|
||||
}
|
||||
|
||||
// Coût d'achat du N-ième générateur : baseCost × 1.15^owned
|
||||
export function generatorCost(gen: Generator): number {
|
||||
return Math.floor(gen.baseCost * Math.pow(1.15, gen.owned));
|
||||
}
|
||||
|
||||
// Production totale par seconde de tous les générateurs
|
||||
export function totalProductionPerSecond(state: GameState): number {
|
||||
const base = state.generators.reduce(
|
||||
(sum, gen) => sum + gen.baseProduction * gen.owned,
|
||||
0
|
||||
);
|
||||
return base * state.prestigeMultiplier;
|
||||
}
|
||||
|
||||
// Lazy calculation : ressources accumulées depuis lastTick
|
||||
export function computeIdleGains(state: GameState, now: number): number {
|
||||
const elapsedSeconds = (now - state.lastTick) / 1000;
|
||||
return totalProductionPerSecond(state) * elapsedSeconds;
|
||||
}
|
||||
|
||||
// Applique les gains idle et met à jour lastTick
|
||||
export function applyIdleGains(state: GameState, now: number): GameState {
|
||||
const gains = computeIdleGains(state, now);
|
||||
return {
|
||||
...state,
|
||||
resources: state.resources + gains,
|
||||
lastTick: now,
|
||||
};
|
||||
}
|
||||
|
||||
// Clic manuel
|
||||
export function applyClick(state: GameState): GameState {
|
||||
return {
|
||||
...state,
|
||||
resources: state.resources + state.clickMultiplier * state.prestigeMultiplier,
|
||||
};
|
||||
}
|
||||
|
||||
// Achat d'un générateur (retourne null si fonds insuffisants)
|
||||
export function buyGenerator(state: GameState, genId: string): GameState | null {
|
||||
const genIndex = state.generators.findIndex((g) => g.id === genId);
|
||||
if (genIndex === -1) return null;
|
||||
|
||||
const gen = state.generators[genIndex];
|
||||
const cost = generatorCost(gen);
|
||||
if (state.resources < cost) return null;
|
||||
|
||||
const updatedGenerators = [...state.generators];
|
||||
updatedGenerators[genIndex] = { ...gen, owned: gen.owned + 1 };
|
||||
|
||||
return {
|
||||
...state,
|
||||
resources: state.resources - cost,
|
||||
generators: updatedGenerators,
|
||||
};
|
||||
}
|
||||
|
||||
// Prestige : reset ressources + générateurs, +0.1× multiplicateur permanent
|
||||
export function canPrestige(state: GameState): boolean {
|
||||
return state.resources >= 1_000_000;
|
||||
}
|
||||
|
||||
export function applyPrestige(state: GameState): GameState {
|
||||
const newPrestigeCount = state.prestigeCount + 1;
|
||||
return {
|
||||
...state,
|
||||
resources: 0,
|
||||
generators: state.generators.map((g) => ({ ...g, owned: 0 })),
|
||||
prestigeCount: newPrestigeCount,
|
||||
prestigeMultiplier: 1 + newPrestigeCount * 0.1,
|
||||
lastTick: Date.now(),
|
||||
};
|
||||
}
|
||||
|
||||
// Valeurs par défaut — 5 tiers alignés GDD (x10 coût / tier, x5 production)
|
||||
export const DEFAULT_GENERATORS: Generator[] = [
|
||||
{ id: "manic", name: "Manic", baseCost: 10, baseProduction: 0.1, owned: 0 },
|
||||
{ id: "coffee", name: "Tasse à café", baseCost: 100, baseProduction: 0.5, owned: 0 },
|
||||
{ id: "sugar", name: "Sucre", baseCost: 1_000, baseProduction: 3, owned: 0 },
|
||||
{ id: "factory", name: "Usine", baseCost: 10_000, baseProduction: 20, owned: 0 },
|
||||
{ id: "portal", name: "Portail", baseCost: 100_000, baseProduction: 150, owned: 0 },
|
||||
];
|
||||
|
||||
export const DEFAULT_STATE: GameState = {
|
||||
resources: 0,
|
||||
clickMultiplier: 1,
|
||||
generators: DEFAULT_GENERATORS,
|
||||
lastTick: Date.now(),
|
||||
prestigeCount: 0,
|
||||
prestigeMultiplier: 1,
|
||||
};
|
||||
@@ -1,229 +0,0 @@
|
||||
{
|
||||
"v": "5.4.4",
|
||||
"fr": 29.9700012207031,
|
||||
"ip": 0,
|
||||
"op": 120.0000048877,
|
||||
"w": 1080,
|
||||
"h": 620,
|
||||
"nm": "Comp 2",
|
||||
"ddd": 0,
|
||||
"assets": [],
|
||||
"layers": [
|
||||
{
|
||||
"ddd": 0,
|
||||
"ind": 1,
|
||||
"ty": 4,
|
||||
"nm": "Shape Layer 1",
|
||||
"sr": 1,
|
||||
"ks": {
|
||||
"o": { "a": 0, "k": 100, "ix": 11 },
|
||||
"r": { "a": 0, "k": 0, "ix": 10 },
|
||||
"p": { "a": 0, "k": [539.5, 310, 0], "ix": 2 },
|
||||
"a": { "a": 0, "k": [0, 0, 0], "ix": 1 },
|
||||
"s": { "a": 0, "k": [100, 100, 100], "ix": 6 }
|
||||
},
|
||||
"ao": 0,
|
||||
"shapes": [
|
||||
{
|
||||
"ty": "gr",
|
||||
"it": [
|
||||
{
|
||||
"ind": 0,
|
||||
"ty": "sh",
|
||||
"ix": 1,
|
||||
"ks": {
|
||||
"a": 0,
|
||||
"k": {
|
||||
"i": [
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 81],
|
||||
[0, 0],
|
||||
[-77, 0],
|
||||
[0, -39],
|
||||
[0, 0],
|
||||
[17, -20],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0]
|
||||
],
|
||||
"o": [
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, -81],
|
||||
[0, 0],
|
||||
[77, 0],
|
||||
[0, 39],
|
||||
[0, 0],
|
||||
[-17, 20],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0],
|
||||
[0, 0]
|
||||
],
|
||||
"v": [
|
||||
[-539.25, 234],
|
||||
[-244, 234],
|
||||
[-244, 126],
|
||||
[-385, 126],
|
||||
[-385, 62],
|
||||
[-263, -238],
|
||||
[-178, -238],
|
||||
[-178, 54],
|
||||
[-150, 54],
|
||||
[-150, 120],
|
||||
[-176, 120],
|
||||
[-176, 234],
|
||||
[-59, 234],
|
||||
[-101, 143],
|
||||
[-101, -160],
|
||||
[-9, -248],
|
||||
[100, -165],
|
||||
[101, 157],
|
||||
[80, 220],
|
||||
[50, 240],
|
||||
[288, 240],
|
||||
[287, 123],
|
||||
[148, 123],
|
||||
[148, 56],
|
||||
[268, -239],
|
||||
[357, -239],
|
||||
[357, 51],
|
||||
[380, 51],
|
||||
[380, 122],
|
||||
[359, 122],
|
||||
[359, 241.75],
|
||||
[540.5, 242]
|
||||
],
|
||||
"c": false
|
||||
},
|
||||
"ix": 2
|
||||
},
|
||||
"nm": "Path 1",
|
||||
"mn": "ADBE Vector Shape - Group",
|
||||
"hd": false
|
||||
},
|
||||
{
|
||||
"ty": "st",
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [0.1, 0.1, 0.1, 1],
|
||||
"ix": 3
|
||||
},
|
||||
"o": { "a": 0, "k": 100, "ix": 4 },
|
||||
"w": { "a": 0, "k": 5, "ix": 5 },
|
||||
"lc": 1,
|
||||
"lj": 1,
|
||||
"ml": 4,
|
||||
"bm": 0,
|
||||
"nm": "Stroke 1",
|
||||
"mn": "ADBE Vector Graphic - Stroke",
|
||||
"hd": false
|
||||
},
|
||||
{
|
||||
"ty": "tr",
|
||||
"p": { "a": 0, "k": [0, 0], "ix": 2 },
|
||||
"a": { "a": 0, "k": [0, 0], "ix": 1 },
|
||||
"s": { "a": 0, "k": [100, 100], "ix": 3 },
|
||||
"r": { "a": 0, "k": 0, "ix": 6 },
|
||||
"o": { "a": 0, "k": 100, "ix": 7 },
|
||||
"sk": { "a": 0, "k": 0, "ix": 4 },
|
||||
"sa": { "a": 0, "k": 0, "ix": 5 },
|
||||
"nm": "Transform"
|
||||
}
|
||||
],
|
||||
"nm": "Shape 1",
|
||||
"np": 3,
|
||||
"cix": 2,
|
||||
"bm": 0,
|
||||
"ix": 1,
|
||||
"mn": "ADBE Vector Group",
|
||||
"hd": false
|
||||
},
|
||||
{
|
||||
"ty": "tm",
|
||||
"s": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"i": { "x": [0.667], "y": [0.992] },
|
||||
"o": { "x": [0.534], "y": [0.224] },
|
||||
"t": 47,
|
||||
"s": [0],
|
||||
"e": [100]
|
||||
},
|
||||
{ "t": 95.0000038694293 }
|
||||
],
|
||||
"ix": 1
|
||||
},
|
||||
"e": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"i": { "x": [0.667], "y": [0.96] },
|
||||
"o": { "x": [0.677], "y": [0.024] },
|
||||
"t": 15,
|
||||
"s": [0],
|
||||
"e": [100]
|
||||
},
|
||||
{ "t": 82.0000033399285 }
|
||||
],
|
||||
"ix": 2
|
||||
},
|
||||
"o": { "a": 0, "k": 0, "ix": 3 },
|
||||
"m": 1,
|
||||
"ix": 2,
|
||||
"nm": "Trim Paths 1",
|
||||
"mn": "ADBE Vector Filter - Trim",
|
||||
"hd": false
|
||||
}
|
||||
],
|
||||
"ip": 0,
|
||||
"op": 120.0000048877,
|
||||
"st": 0,
|
||||
"bm": 0
|
||||
}
|
||||
],
|
||||
"markers": []
|
||||
}
|
||||
@@ -1,386 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Véritable cactus en peluche",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/n0tuti.jpg"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Brosse à dents sans poil",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/hd42tk.jpg"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Un jour, Dark Vador s’est attaqué à Chuck Norris. Depuis, il fait de l’asthme."
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "Photo d'Ayoub",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/fpanvh.jpg"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Pourquoi on met une selle sur un cheval ? Parce qu'en dessous, elle tomberait."
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"name": "Parapluie invisible",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/b8ms4o.jpg"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Qu'est-ce qui est plus merveilleux que de faire tourner un enfant sur un tourniquet ? L'arrêter avec une pelle."
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"name": "Savon qui gratte",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/oeefev.jpg"
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Pourquoi les moutons aiment le chewing-gum ? Car c'est bon pour la laine."
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"name": "Moule à glaçons géant",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/2sdm53.png"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Quand Chuck Norris fait un programme, il installe les modules, code et vend le programme... ensuite il demande à quoi il doit servir."
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"name": "Casquette avec ventilateur intégré",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/wjhe5i.jpg"
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Chuck Norris a invité Albert Einstein...à son dîner de cons."
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"name": "Game boy color de tonton",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/w82iwu.jpg"
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Vous savez pourquoi les pets puent ? Pour que les sourds en profitent !"
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"name": "Mug moustache",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/csu9z1.jpg"
|
||||
},
|
||||
{
|
||||
"id": 17,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Qu'est ce qui est jaune et qui n'attend pas ? Un citron pressé"
|
||||
},
|
||||
{
|
||||
"id": 18,
|
||||
"name": "un pull de noël",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/uwjwn1.jpg"
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Que met un développeur sur sa voiture en hiver ? Une bash."
|
||||
},
|
||||
{
|
||||
"id": 20,
|
||||
"name": "Stickers Gnia gnia gnia 5 minutes la présentation",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/8jids3.png"
|
||||
},
|
||||
{
|
||||
"id": 21,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Comment une blonde fait-elle pour faire un double de ses clefs ? Elle les photocopie."
|
||||
},
|
||||
{
|
||||
"id": 22,
|
||||
"name": "Photo de ta mamie...",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/htqzwa.jpg"
|
||||
},
|
||||
{
|
||||
"id": 23,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Qu'est-ce qu'un cochon volant ? Un aéroport."
|
||||
},
|
||||
{
|
||||
"id": 24,
|
||||
"name": "Livre de names de Tonton",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/avr4b4.png"
|
||||
},
|
||||
{
|
||||
"id": 25,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Mon grand-père avait prédit que le Titanic coulerait, il l'avait répété maintes fois...Mais on a préféré le virer de la salle de cinéma"
|
||||
},
|
||||
{
|
||||
"id": 26,
|
||||
"name": "Oreiller qui ronfle",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/4ydby9.png"
|
||||
},
|
||||
{
|
||||
"id": 27,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Un jour, les Power Rangers ont combattu Chuck Norris. Depuis, on les appelle les Teletubbies."
|
||||
},
|
||||
{
|
||||
"id": 28,
|
||||
"name": "Haut-parleur de douche non étanche",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/ugqwdj.jpg"
|
||||
},
|
||||
{
|
||||
"id": 29,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Qu'est-ce qui a deux pattes et qui saigne ? Un demi-chien..."
|
||||
},
|
||||
{
|
||||
"id": 30,
|
||||
"name": "Calendrier de l'Avent avec des chocolats au wasabi et moutarde forte",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/dakyj9.png"
|
||||
},
|
||||
{
|
||||
"id": 31,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Sur quel site internet peut-on trouver un lave-vaisselle pas cher ? Meetic."
|
||||
},
|
||||
{
|
||||
"id": 32,
|
||||
"name": "Lunettes de soleil pour joueur de valorant",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/dxjicl.png"
|
||||
},
|
||||
{
|
||||
"id": 33,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Chuck Norris mine de la crypto-monnaie...avec la calculette de sa montre Casio"
|
||||
},
|
||||
{
|
||||
"id": 34,
|
||||
"name": "Parfum au PHP: aucune odeur",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/o2435t.png"
|
||||
},
|
||||
{
|
||||
"id": 35,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Quand Google ne trouve pas quelque chose, Il demande à Chuck Norris."
|
||||
},
|
||||
{
|
||||
"id": 36,
|
||||
"name": "Chapeau de Noël clignotant",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/d4su7e.png"
|
||||
},
|
||||
{
|
||||
"id": 37,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Quelles sont les choses les plus lourdes de l'univers ? Soleil, Étoiles, Trou noir...et node_modules..."
|
||||
},
|
||||
{
|
||||
"id": 38,
|
||||
"name": "Kit de survie pour la fin du monde",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/ltcik6.png"
|
||||
},
|
||||
{
|
||||
"id": 39,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Quelle est la fée la plus paresseuse ? La fée Néante"
|
||||
},
|
||||
{
|
||||
"id": 40,
|
||||
"name": "Bougie parfumée à l'essence de pizza",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/a3hv8n.jpg"
|
||||
},
|
||||
{
|
||||
"id": 41,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Que mettre dans un kit de survie pour la fin du monde ? Du chocolat, des cookies et un DVD de !"
|
||||
},
|
||||
{
|
||||
"id": 42,
|
||||
"name": "Le livre mein... craft",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/fuy8kq.png"
|
||||
},
|
||||
{
|
||||
"id": 43,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Un jour Hulk s’est battu contre Chuck Norris. Depuis, il fait de la pub pour du maïs."
|
||||
},
|
||||
{
|
||||
"id": 44,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Pourquoi les chaussettes ont-elles des orteils séparés ? Parce que même les pieds ont besoin d'intimité !"
|
||||
},
|
||||
{
|
||||
"id": 45,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "J'ai dit non ! Mon gynécologue m'a dit pas de sexe pendant 3 semaines. Et que t'as dit ton dentiste ?"
|
||||
},
|
||||
{
|
||||
"id": 46,
|
||||
"name": "Chaussettes avec orteils séparés",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/vn3xht.png"
|
||||
},
|
||||
{
|
||||
"id": 47,
|
||||
"name": "Blague:",
|
||||
"founded": false,
|
||||
"image": "https://images.pexels.com/photos/1115680/pexels-photo-1115680.jpeg",
|
||||
"description": "Quel est le jeu préféré des Portugais ?Call of d'outils"
|
||||
},
|
||||
|
||||
{
|
||||
"id": 48,
|
||||
"name": "Christopher",
|
||||
"description": "Un ange parmi les cieux, un nuage subtil et un glorieux soldat",
|
||||
"founded": false,
|
||||
"image": "./png/chris.png"
|
||||
},
|
||||
{
|
||||
"id": 49,
|
||||
"name": "Marie-Hermine",
|
||||
"description": "La logique, le franc parlé, sans nul doute une perle dans un monde de brutes ",
|
||||
"founded": false,
|
||||
"image": "./png/m-h.png"
|
||||
},
|
||||
{
|
||||
"id": 50,
|
||||
"name": "Yavuz",
|
||||
"description": "L'innovation culinaire, le cuisinier au grand coeur, l'avion petillant, l'or du Bayou. Il sait faire la fete, on l'appelle le PHP. ",
|
||||
"founded": false,
|
||||
"image": "./png/yavuz.png"
|
||||
},
|
||||
{
|
||||
"id": 51,
|
||||
"name": "Ayoub",
|
||||
"description": "Un ami cher, loyal et de bon conseil, il saura vous épauler, vous ecouter, mais gare à toi, âme sensible ses mots peuvent etre francs et coupants mais toujours bienveillants. Un ami quoi!",
|
||||
"founded": false,
|
||||
"image": "./png/ayoub.png"
|
||||
},
|
||||
{
|
||||
"id": 52,
|
||||
"name": "Anthony",
|
||||
"description": "Cupidon et Apollon n'ont qu'à bien se tenir, connu pour son physique legendaire, gardez vos femmes et vos hommes a double tour, a son passage c'est un ravage.",
|
||||
"founded": false,
|
||||
"image": "./png/antho.png"
|
||||
},
|
||||
{
|
||||
"id": 53,
|
||||
"name": "Vincent",
|
||||
"description": "L'âme voyageuse, le vagabond au grand coeur et la main sur la bouteille. Il est le compagnon idéal pour un voyage animé. Et vogue, vogue la galère...",
|
||||
"founded": false,
|
||||
"image": "./png/vincent.png"
|
||||
},
|
||||
{
|
||||
"id": 54,
|
||||
"name": "Julien",
|
||||
"description": "Il est l'élu, celui qui voit au dela de ce que vous voyez.",
|
||||
"founded": false,
|
||||
"image": "./png/julien.png"
|
||||
},
|
||||
{
|
||||
"id": 55,
|
||||
"name": "Benoit",
|
||||
"description": "Maitre du temps, maitre de l'espace, sa parole est d'or et si tu ne respectes pas son temps, tu sors. ",
|
||||
"founded": false,
|
||||
"image": "./png/benoit.png"
|
||||
},
|
||||
{
|
||||
"id": 56,
|
||||
"name": "Samuel",
|
||||
"description": "Des yeux perçants, les crocs acérés, tu le rencontreras dans la pénombre ou une foret enchantée. N'aies pas peur de ses canines affutées, son sourire et sa gentillesse sauront te rassurer. ",
|
||||
"founded": false,
|
||||
"image": "./png/samuel.png"
|
||||
},
|
||||
|
||||
{
|
||||
"id": 57,
|
||||
"name": "Ayoub Ultime",
|
||||
"description": "La carte ultime, c'est l'immunité à toutes épreuves! Un style, une classe, un élan d'élégance et une intelligence raffraîchissante. La meilleure carte. Tout simplement. ",
|
||||
"founded": false,
|
||||
"image": "./png/ayoub-ultimate.png"
|
||||
},
|
||||
{
|
||||
"id": 58,
|
||||
"name": "Une photo des formateurs de la Wild",
|
||||
"founded": false,
|
||||
"image": "https://i.goopics.net/8m6t45.jpg"
|
||||
}
|
||||
]
|
||||
@@ -1,20 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "1",
|
||||
"linkname": "Jeu",
|
||||
"linkurl": "/",
|
||||
"btn": false
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"linkname": "Boutique",
|
||||
"linkurl": "/boutique",
|
||||
"btn": false
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"linkname": "Succès",
|
||||
"linkurl": "/achievements",
|
||||
"btn": false
|
||||
}
|
||||
]
|
||||