Commit 9b30774e authored by H.M.C. Nadunithara Wijerathne's avatar H.M.C. Nadunithara Wijerathne

Merge branch 'it19243122' into 'master'

keystroke authentication ui front end

See merge request !1
parents b4557e66 fa5e865d
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -10,11 +10,16 @@ ...@@ -10,11 +10,16 @@
"@types/node": "^16.18.8", "@types/node": "^16.18.8",
"@types/react": "^18.0.26", "@types/react": "^18.0.26",
"@types/react-dom": "^18.0.9", "@types/react-dom": "^18.0.9",
"axios": "^1.3.4",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-redux": "^8.0.5",
"react-router-dom": "^6.4.5", "react-router-dom": "^6.4.5",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"recharts": "^2.2.0", "recharts": "^2.2.0",
"redux": "^4.2.1",
"redux-persist": "^6.0.0",
"redux-saga": "^1.2.2",
"typescript": "^4.9.4", "typescript": "^4.9.4",
"web-vitals": "^2.1.4" "web-vitals": "^2.1.4"
}, },
...@@ -44,5 +49,6 @@ ...@@ -44,5 +49,6 @@
}, },
"devDependencies": { "devDependencies": {
"sass": "^1.56.2" "sass": "^1.56.2"
} },
"proxy": "http://localhost:5000"
} }
import React from "react"; import React from "react";
import { Routes, BrowserRouter as Router, Route } from "react-router-dom"; import { Routes, BrowserRouter as Router, Route } from "react-router-dom";
import SignUp from "./components/SignUp"; import Landing from "./views/Landing.view";
import Login from "./components/Login"; import Home from "./views/Home.view";
import Settings from "./views/Settings.view";
import AppState from "./components/AppState";
import "./app.scss"; import "./app.scss";
import "./components.scss";
import ProtectedRoutes from "./components/ProtectedRoute";
function App() { function App() {
return ( return (
<Router> <Router>
<Routes> <Routes>
<Route path="/" element={<SignUp />} /> <Route path="/" element={<Landing />} />
<Route path="/login" element={<Login />} /> <Route element={<ProtectedRoutes />}>
<Route path="/home" element={<Home />} />
<Route path="/settings" element={<Settings />} />
</Route>
</Routes> </Routes>
<AppState />
</Router> </Router>
); );
} }
......
...@@ -5,3 +5,28 @@ body { ...@@ -5,3 +5,28 @@ body {
p { p {
margin: 0; margin: 0;
} }
.landing {
background: rgb(131, 58, 180);
background: linear-gradient(
160deg,
rgba(131, 58, 180, 1) 0%,
rgba(143, 244, 241, 1) 0%,
rgba(119, 122, 255, 1) 100%
);
}
.navbar {
background-color: #5b8ddf;
.collapse {
img {
height: 35px;
width: 35px;
border-radius: 35px;
}
.dropdown-toggle::after {
display: none;
}
}
}
import { ACTIONS } from ".";
import { ControlsType, Reducers, UpdatePasswordPayload } from "../types";
export const setAppState = (payload: Reducers["auth"]["appState"]) => ({
type: ACTIONS.SET_APP_STATE,
payload,
});
export const updateKeystrokeSettings = (payload: ControlsType) => ({
type: ACTIONS.UPDATE_KEYSTROKE_SETTINGS,
payload,
});
export const changePassword = (payload: UpdatePasswordPayload) => ({
type: ACTIONS.CHANGE_PASSWORD,
payload,
});
export enum ACTIONS {
SET_AUTH = "SET_AUTH",
SIGN_OUT_USER = "SIGN_OUT_USER",
UPDATE_KEYSTROKE_SETTINGS = "UPDATE_KEYSTROKE_SETTINGS",
CHANGE_PASSWORD = "CHANGE_PASSWORD",
SET_APP_STATE = "SET_APP_STATE",
}
import { request } from "../lib/api";
import {
SignUpPayload,
SignInPayload,
ControlsType,
UpdatePasswordPayload,
} from "../types";
export default class AuthAPI {
static signup = (payload: SignUpPayload) =>
request("<BASE_URL>/auth/signup", "POST", payload, true);
static signin = (payload: SignInPayload) =>
request("<BASE_URL>/auth/login", "POST", payload, true);
static updateControls = (payload: ControlsType) =>
request("<BASE_URL>/auth/update", "POST", payload);
static updatePassword = (payload: UpdatePasswordPayload) =>
request("<BASE_URL>/auth/change-pwd", "POST", payload);
}
export const BASE_URL = "http://localhost:5000";
export const DEFAULT_CONTROLS = {
standard: {
sd: 1.5,
threshold: 65,
use: true,
},
fullStandard: {
threshold: 1,
use: true,
},
};
import axios, { AxiosError, AxiosResponse, AxiosRequestConfig } from "axios";
import { BASE_URL } from "../config";
import { logger } from "./util";
import { store } from "../../store";
const getToken = () => {
const token = store.getState().auth.token;
return token;
};
axios.interceptors.response.use(
(response) => response,
(error: AxiosError) => {
return Promise.reject(error);
}
);
export const request = (
url: AxiosRequestConfig["url"],
method: AxiosRequestConfig["method"],
requestData?: AxiosRequestConfig["data"] | AxiosRequestConfig["params"],
isGuest?: boolean,
contentType?: string
) =>
new Promise(async (resolve, reject) => {
const endpoint = url?.replace?.("<BASE_URL>", BASE_URL);
const params = method === "GET" ? requestData : null;
const data = method === "GET" ? null : requestData;
const auth_token = !isGuest ? await getToken() : null;
const headers = {
auth_token,
"Content-Type": contentType || "application/json",
};
logger("REQUEST: ", method, endpoint, headers, requestData);
axios({
url: endpoint,
method,
data,
params,
headers,
timeout: 30000,
})
.then(async (response: AxiosResponse) => {
logger("RESPONSE: ", response);
resolve(response.data);
})
.catch(async (error: AxiosError) => {
if (error?.response) {
logger("ERROR RESPONSE: ", error?.response);
return reject(error?.response?.data);
} else if (error?.request) {
logger("NO RESPONSE: ", error?.request);
} else {
logger("SETUP ISSUE: ", error?.message);
}
reject(error);
});
});
export const logger = (log: any, ...optionalparams: any[]) => {
console.log(log, ...optionalparams);
};
// 16 - Shift // 16 - Shift
// 17 - Ctrl // 17 - Ctrl
// 18 - Alt // 18 - Alt
......
import { ACTIONS } from "../actions/index";
import { AuthReducer, USER_TYPE } from "../types";
const INITIAL_STATE: AuthReducer = {
token: null,
candidate: {},
organization: {},
userType: USER_TYPE.CANDIDATE,
userId: "",
appState: null,
};
const authReducer = (
state = INITIAL_STATE,
{ type, payload }: { type: ACTIONS; payload: any }
): AuthReducer => {
switch (type) {
case ACTIONS.SET_AUTH:
return { ...state, ...(payload as AuthReducer) };
case ACTIONS.SET_APP_STATE:
return { ...state, appState: payload };
case ACTIONS.SIGN_OUT_USER:
return { ...state, token: null };
default:
return state;
}
};
export default authReducer;
import { combineReducers } from "redux";
import { persistReducer } from "redux-persist";
import storage from "redux-persist/lib/storage";
import authReducer from "../reducers/auth";
const AuthPersistConfig = {
storage,
key: "auth",
};
export default combineReducers({
auth: persistReducer(AuthPersistConfig, authReducer),
});
import { takeLeading, call, put, select } from "redux-saga/effects";
import { ACTIONS } from "../actions";
import AuthAPI from "../apis/auth";
import {
APP_STATE,
ControlsType,
KeystrokeResultType,
Reducers,
UpdatePasswordPayload,
} from "../types";
function* updateKeystrokeSettings({
payload,
}: {
type: typeof ACTIONS.UPDATE_KEYSTROKE_SETTINGS;
payload: ControlsType;
}) {
try {
yield put({
type: ACTIONS.SET_APP_STATE,
payload: { state: APP_STATE.LOADING },
});
yield call(AuthAPI.updateControls, payload);
const keystrokeResult: KeystrokeResultType = yield select(
(state: Reducers) => state.auth.keystrokeResult
);
yield put({
type: ACTIONS.SET_AUTH,
payload: { keystrokeResult: { ...keystrokeResult, controls: payload } },
});
yield put({
type: ACTIONS.SET_APP_STATE,
payload: { state: APP_STATE.SUCCESS },
});
} catch (error) {
yield put({
type: ACTIONS.SET_APP_STATE,
payload: { state: APP_STATE.FAILED, msg: error },
});
}
}
function* changePassword({
payload,
}: {
type: typeof ACTIONS.CHANGE_PASSWORD;
payload: UpdatePasswordPayload;
}) {
try {
yield put({
type: ACTIONS.SET_APP_STATE,
payload: { state: APP_STATE.LOADING },
});
yield call(AuthAPI.updatePassword, payload);
yield put({
type: ACTIONS.SET_APP_STATE,
payload: { state: APP_STATE.SUCCESS },
});
} catch (error) {
yield put({
type: ACTIONS.SET_APP_STATE,
payload: { state: APP_STATE.FAILED, msg: error },
});
}
}
export default function* authSaga() {
yield takeLeading(ACTIONS.UPDATE_KEYSTROKE_SETTINGS, updateKeystrokeSettings);
yield takeLeading(ACTIONS.CHANGE_PASSWORD, changePassword);
}
import { all } from "redux-saga/effects";
import Auth from "./auth";
export default function* rootSaga() {
yield all([Auth()]);
}
export enum USER_TYPE {
ORGANIZATION = "ORGANIZATION",
CANDIDATE = "CANDIDATE",
}
export enum APP_STATE {
LOADING = "loading",
FAILED = "failed",
SUCCESS = "success",
}
export type KeyDetails = { export type KeyDetails = {
key: any; key: any;
code: any; code: any;
...@@ -55,9 +66,100 @@ export type KeystrokeType = { ...@@ -55,9 +66,100 @@ export type KeystrokeType = {
full: number[]; full: number[];
}; };
export type Result = { export type KeystrokeResultType = {
attempt: KeystrokeType; attempt: KeystrokeType;
db: KeystrokeType; db: KeystrokeType;
filteredDb: KeystrokeType; filteredDb: KeystrokeType;
result: Stat | null; result: Stat | null;
controls: ControlsType;
};
export type AddressType = {
addressLine: string;
city: string;
country: string;
};
export type CandidateType = {
_id?: string;
name: string;
bio: string;
contacts: {
email: string;
phone: string;
address: AddressType;
residentialAddress?: AddressType;
};
dateOfBirth: string;
jobIds: string[];
profilePicture: string;
};
export type OrganizationType = {
_id?: string;
name: string;
description: string;
contacts: {
email: string;
phone: string[];
address: AddressType;
website: string;
};
profilePicture: string;
};
export type ControlsType = {
standard: {
sd: number;
threshold: number;
use: boolean;
};
fullStandard: {
threshold: number;
use: boolean;
};
};
//PAYLOADS
export type SignUpPayload = {
passwords: string[];
keydown: KeyDetails[][];
keyup: KeyDetails[][];
email: string;
userType: USER_TYPE;
candidate?: CandidateType | {};
organization?: OrganizationType | {};
};
export type SignInPayload = {
password: string;
keydown: KeyDetails[];
keyup: KeyDetails[];
email: string;
userType: USER_TYPE;
};
export type UpdatePasswordPayload = {
passwords: string[];
keydown: KeyDetails[][];
keyup: KeyDetails[][];
oldPassword: string;
};
//REDUCERS
export type AuthReducer = {
token: string | null;
candidate: CandidateType | {};
organization: OrganizationType | {};
userType: USER_TYPE;
userId: string;
keystrokeResult?: KeystrokeResultType;
appState?: {
state: APP_STATE;
msg?: string;
} | null;
};
export type Reducers = {
auth: AuthReducer;
}; };
.card {
border: none;
box-shadow: 0 0 20px 0 rgb(86 153 196 / 15%);
border-radius: 15px;
}
.onboard {
width: 400px;
float: right;
margin-top: 100px;
.usertype-selector {
margin-top: -10px;
margin-bottom: 15px;
.btn {
border-radius: 0;
border-width: 0 0 2px 0;
background-color: white;
font-weight: 500;
color: #0d6efd;
border-bottom-color: #0d6efd;
&.deactive {
color: #d9d9d9;
border-bottom-color: #d9d9d9;
}
}
}
section {
margin-top: 10px;
.btn {
padding: 0;
margin-left: 10px;
font-size: 16px;
margin-bottom: 4px;
}
}
}
.avatar {
background-color: #8eb4f2;
display: flex;
align-items: center;
justify-content: center;
color: white;
margin: auto;
&.lg {
height: 100px;
width: 100px;
border-radius: 100px;
font-size: 60px;
}
&.sm {
height: 35px;
width: 35px;
border-radius: 35px;
font-size: 20px;
}
}
.alert {
button {
&:active,
&:focus {
border: none;
outline: none;
box-shadow: none;
}
}
}
.keystrokes {
.keystrokes-settings {
margin-bottom: 10px;
.form-switch {
margin-top: 5px;
margin-bottom: 5px;
.form-check-label {
font-weight: 500;
}
}
}
}
.appstate {
padding: 10px 20px;
background-color: red;
max-width: 350px;
border-radius: 15px;
box-shadow: 0 0 10px 0 rgba(83, 83, 83, 0.662);
position: fixed;
width: 350px;
bottom: 30px;
right: 30px;
section {
p {
font-weight: bold;
}
}
&.failed {
background: rgb(131, 58, 180);
background: linear-gradient(
153deg,
rgba(131, 58, 180, 1) 0%,
rgba(255, 71, 71, 1) 0%,
rgba(255, 155, 119, 1) 100%
);
}
&.success {
background: rgb(131, 58, 180);
background: linear-gradient(
153deg,
rgba(131, 58, 180, 1) 0%,
rgba(46, 197, 198, 1) 0%,
rgba(216, 255, 134, 1) 100%
);
}
&.loading {
background: rgb(131, 58, 180);
background: linear-gradient(
153deg,
rgba(131, 58, 180, 1) 0%,
rgba(189, 189, 189, 1) 0%,
rgba(134, 188, 255, 1) 100%
);
}
}
import React from "react";
type OwnProps = {
alert?: string | null;
setAlert: (value: string | null) => void;
};
const Alert = ({ alert, setAlert }: OwnProps) => {
const onClose = () => setAlert(null);
if (!alert) return null;
return (
<div className="alert alert-warning alert-dismissible fade show mt-3">
{alert}
<button type="button" className="btn-close" onClick={onClose}></button>
</div>
);
};
export default Alert;
import React, { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import { setAppState } from "../common/actions/auth";
import { APP_STATE, Reducers } from "../common/types";
const AppState = () => {
const dispatch = useDispatch();
const appState = useSelector((state: Reducers) => state.auth.appState);
useEffect(() => {
if (appState?.state !== APP_STATE.LOADING) {
setTimeout(() => {
dispatch(setAppState(null));
}, 5000);
}
}, [appState?.state, dispatch]);
if (!appState) return null;
const state =
appState.state === APP_STATE.LOADING
? "Loading..."
: appState.state === APP_STATE.FAILED
? "Failed"
: "Success";
return (
<div className={`appstate ${appState?.state}`}>
<section>
<p>{state}</p>
</section>
<p>{appState?.msg}</p>
</div>
);
};
export default AppState;
import React from "react";
const Avatar = ({
url,
name,
size = "sm",
}: {
url?: string;
name: string;
size?: "sm" | "md" | "lg";
}) => {
if (url) return <img src={url} alt={name} className={`avatar img ${size}`} />;
return <div className={`avatar ${size}`}>{name[0]}</div>;
};
export default Avatar;
import React, { useRef, useEffect, useState } from "react";
import { KeyDetails, UpdatePasswordPayload } from "../common/types";
import Alert from "../components/Alert";
import { keyEvent } from "../common/lib/util";
import { useDispatch } from "react-redux";
import { changePassword } from "../common/actions/auth";
const ChangePassword = () => {
const dispatch = useDispatch();
const keydownArray = useRef<KeyDetails[][]>([]);
const keyupArray = useRef<KeyDetails[][]>([]);
const keyCount = useRef<number[]>([]);
const [alert, setAlert] = useState<string | null>(null);
const [credentials, setCredentials] = useState({
oldPassword: "",
password: "",
confrimPassword: "",
twoFAPassword: "",
});
useEffect(() => {
resetData();
}, []);
const resetData = () => {
for (let i = 0; i < 3; i++) {
keydownArray.current.push([]);
keyupArray.current.push([]);
keyCount.current.push(0);
}
};
const onChangeCredentials = (e: React.ChangeEvent<HTMLInputElement>) => {
setCredentials({ ...credentials, [e.target.name]: e.target.value });
};
const clearField = (index: number) => {
if (index === 0) {
setCredentials({ ...credentials, password: "" });
} else if (index === 1) {
setCredentials({ ...credentials, confrimPassword: "" });
} else {
setCredentials({ ...credentials, twoFAPassword: "" });
}
keydownArray.current[index] = [];
keyupArray.current[index] = [];
keyCount.current[index] = 0;
};
const onKeyDown = (e: any) => {
const field = e.target.id;
const index = Number(field.substr(field.length - 1));
let details = keyEvent(e);
if (!details) return;
if (
["Backspace"].includes(details.code) ||
["Backspace"].includes(details.code)
) {
return clearField(index);
}
if (
["Tab", "NumpadEnter"].includes(details.code) ||
["Tab"].includes(details.key)
) {
details = {
...details,
code: "Enter",
key: "Enter",
};
}
keydownArray.current[index].push(details);
keyupArray.current[index].push({ ...details, time: null });
keyCount.current[index]++;
};
const onKeyUp = (e: any) => {
const field = e.target.id;
const index = Number(field.substr(field.length - 1));
let details = keyEvent(e);
if (!details) return;
if (!details.time) details.time = Date.now();
if (
["Backspace"].includes(details.code) ||
["Backspace"].includes(details.code)
) {
return clearField(index);
}
if (
["Tab", "NumpadEnter"].includes(details.code) ||
["Tab"].includes(details.key)
) {
details = {
...details,
code: "Enter",
key: "Enter",
};
}
let reqdUpKeystroke = keyupArray.current[index].find(
(element) => element.code === details?.code && !element.time
);
if (reqdUpKeystroke) reqdUpKeystroke.time = details.time;
};
const onSumit = () => {
setAlert(null);
if (credentials.password !== credentials.confrimPassword) {
return setAlert("Passwords do not match");
}
const payload: UpdatePasswordPayload = {
oldPassword: credentials.oldPassword,
passwords: [
credentials.password,
credentials.confrimPassword,
credentials.twoFAPassword,
],
keydown: keydownArray.current,
keyup: keyupArray.current,
};
resetData();
dispatch(changePassword(payload));
};
return (
<div className="card p-4">
<h5>Change password</h5>
<div className="mb-3 row">
<label className="col-sm-3 col-form-label">Old password</label>
<div className="col-sm-5">
<input
type="password"
className="form-control"
name="oldPassword"
onChange={onChangeCredentials}
onKeyDown={onKeyDown}
onKeyUp={onKeyUp}
/>
</div>
</div>
<div className="mb-3 row">
<label className="col-sm-3 col-form-label">New password</label>
<div className="col-sm-5">
<input
type="password"
className="form-control"
name="password"
onChange={onChangeCredentials}
onKeyDown={onKeyDown}
onKeyUp={onKeyUp}
/>
</div>
</div>
<div className="mb-3 row">
<label className="col-sm-3 col-form-label">Confirm new password</label>
<div className="col-sm-5">
<input
type="password"
className="form-control"
name="confrimPassword"
onChange={onChangeCredentials}
onKeyDown={onKeyDown}
onKeyUp={onKeyUp}
/>
</div>
</div>
<div className="mb-3 row">
<label className="col-sm-3 col-form-label">2FA confirm password</label>
<div className="col-sm-5">
<input
type="password"
className="form-control"
name="twoFAPassword"
onChange={onChangeCredentials}
onKeyDown={onKeyDown}
onKeyUp={onKeyUp}
/>
</div>
</div>
<button
type="button"
className="btn btn-primary"
style={{ margin: "auto", width: "300px" }}
onClick={onSumit}
>
Save Password
</button>
<Alert alert={alert} setAlert={setAlert} />
</div>
);
};
export default ChangePassword;
...@@ -16,8 +16,8 @@ const Charts = ({ real, attempts, title }: DataType) => { ...@@ -16,8 +16,8 @@ const Charts = ({ real, attempts, title }: DataType) => {
})); }));
return ( return (
<div className="mt-5"> <div className="mt-2">
<h4>{title}</h4> <h6>{title}</h6>
<ResponsiveContainer height={280} width="100%"> <ResponsiveContainer height={280} width="100%">
<AreaChart data={data}> <AreaChart data={data}>
<Tooltip /> <Tooltip />
......
import React from "react";
import { useSelector } from "react-redux";
import { Reducers } from "../common/types";
import Charts from "./Charts";
import ResultTable from "./ResultTable";
const KeystrokeResults = () => {
const keystrokeResult = useSelector(
(state: Reducers) => state.auth.keystrokeResult
);
return (
<div className="container">
<div className="row mt-5">
<div className="col-lg">
<ResultTable data={keystrokeResult?.result} />
</div>
</div>
<div className="row mt-5 ">
<Charts
title="Overall keystroke"
real={keystrokeResult?.db.full}
attempts={keystrokeResult?.attempt.full}
/>
</div>
<div className="row">
<Charts
title="DD keystroke"
real={keystrokeResult?.db.dd}
attempts={keystrokeResult?.attempt.dd}
/>
<Charts
title="Hold keystroke"
real={keystrokeResult?.db.hold}
attempts={keystrokeResult?.attempt.hold}
/>
<Charts
title="Flight keystroke"
real={keystrokeResult?.db.flight}
attempts={keystrokeResult?.attempt.flight}
/>
</div>
</div>
);
};
export default KeystrokeResults;
import React from "react";
import NavBar from "./NavBar";
type OwnProps = {
title: string;
children?: JSX.Element | JSX.Element[];
};
const Layout = ({ title, children }: OwnProps) => {
return (
<>
<NavBar />
<div className="container pb-5">
<h4 className="mb-3">{title}</h4>
{children}
</div>
</>
);
};
export default Layout;
import React, { useState, useRef, useEffect } from "react"; import React, { useState, useRef } from "react";
import { initialiseControls } from "../util/controls"; import { useDispatch } from "react-redux";
import { keyEvent } from "../util/keystrokeLogger"; import { useNavigate } from "react-router-dom";
import { KeyDetails, Result } from "../util/types"; import { ACTIONS } from "../common/actions";
import Charts from "./Charts"; import AuthAPI from "../common/apis/auth";
import ResultTable from "./ResultTable"; import { keyEvent } from "../common/lib/util";
import { KeyDetails, SignInPayload, USER_TYPE } from "../common/types";
const controls = {
standard: { type OwnProps = {
sd: 1.5, setAlert: (alert: string) => void;
threshold: 65, userType: USER_TYPE;
use: true,
},
fullStandard: {
threshold: 1,
use: true,
},
}; };
const Login = () => { const Login = ({ userType, setAlert }: OwnProps) => {
const dispatch = useDispatch();
const navigate = useNavigate();
const [credentials, setCredentials] = useState({ const [credentials, setCredentials] = useState({
userName: "", email: "",
password: "", password: "",
}); });
const [result, setResult] = useState<Result | null>(null);
const keyCount = useRef<number>(0); const keyCount = useRef<number>(0);
const keydownArray = useRef<KeyDetails[]>([]); const keydownArray = useRef<KeyDetails[]>([]);
const keyupArray = useRef<KeyDetails[]>([]); const keyupArray = useRef<KeyDetails[]>([]);
...@@ -33,10 +27,6 @@ const Login = () => { ...@@ -33,10 +27,6 @@ const Login = () => {
setCredentials({ ...credentials, [e.target.name]: e.target.value }); setCredentials({ ...credentials, [e.target.name]: e.target.value });
}; };
useEffect(() => {
initialiseControls(controls);
}, []);
const clearData = () => { const clearData = () => {
setCredentials({ ...credentials, password: "" }); setCredentials({ ...credentials, password: "" });
keyCount.current = 0; keyCount.current = 0;
...@@ -45,30 +35,30 @@ const Login = () => { ...@@ -45,30 +35,30 @@ const Login = () => {
}; };
const submit = () => { const submit = () => {
const data = { const data: SignInPayload = {
username: credentials.userName, email: credentials.email,
password: credentials.password, password: credentials.password,
keydown: keydownArray.current, keydown: keydownArray.current,
keyup: keyupArray.current, keyup: keyupArray.current,
controls, userType,
}; };
clearData(); clearData();
fetch("http://localhost:3001/user/login", { AuthAPI.signin(data)
method: "POST", .then((res: any) => {
mode: "cors", if (res.success) {
headers: { const payload = {
"Content-Type": "application/json", ...res,
}, organization: userType === USER_TYPE.ORGANIZATION ? res.user : {},
body: JSON.stringify(data), candidate: userType === USER_TYPE.CANDIDATE ? res.user : {},
}).then(async (res) => { };
let response: Result = await res.json(); dispatch({ type: ACTIONS.SET_AUTH, payload });
if (res.ok) { navigate("/home");
setResult(response); }
} else { })
console.log(response); .catch((_) => {
} setAlert("Attempt failed! Try again");
}); });
}; };
const onKeyDown = (e: any) => { const onKeyDown = (e: any) => {
...@@ -108,81 +98,48 @@ const Login = () => { ...@@ -108,81 +98,48 @@ const Login = () => {
if (details.code === "Enter") submit(); if (details.code === "Enter") submit();
}; };
const disable = credentials.userName === "" || credentials.password === ""; const disable = credentials.email === "" || credentials.password === "";
return ( return (
<div className="container"> <>
<div className="row mt-5"> <h5 className="card-title">Sign in</h5>
<div className="col-lg-4"> <div className="mb-3">
<div className="card card-body pt-4 pb-4"> <label htmlFor="exampleFormControlInput1" className="form-label">
<h5 className="card-title">Login</h5> Email
<div className="mb-3"> </label>
<label htmlFor="exampleFormControlInput1" className="form-label"> <input
User name className="form-control"
</label> type="email"
<input aria-label=".form-control-lg example"
className="form-control" name="email"
type="text" onChange={onChangeCredentials}
aria-label=".form-control-lg example"
name="userName"
onChange={onChangeCredentials}
/>
</div>
<div className="mb-3">
<label htmlFor="exampleFormControlInput1" className="form-label">
Password
</label>
<input
className="form-control"
type="password"
aria-label=".form-control-lg example"
name="password"
id="password"
onChange={onChangeCredentials}
onKeyDown={onKeyDown}
onKeyUp={onKeyUp}
/>
</div>
<button
type="button"
className="btn btn-primary"
onClick={submit}
disabled={disable}
>
Login
</button>
</div>
</div>
<div className="col-lg">
<ResultTable data={result?.result} />
</div>
</div>
<div className="row mt-5 ">
<Charts
title="Overall keystroke"
real={result?.db.full}
attempts={result?.attempt.full}
/> />
</div> </div>
<div className="row">
<Charts <div className="mb-3">
title="DD keystroke" <label htmlFor="exampleFormControlInput1" className="form-label">
real={result?.db.dd} Password
attempts={result?.attempt.dd} </label>
/> <input
<Charts className="form-control"
title="Hold keystroke" type="password"
real={result?.db.hold} aria-label=".form-control-lg example"
attempts={result?.attempt.hold} name="password"
/> id="password"
<Charts onChange={onChangeCredentials}
title="Flight keystroke" onKeyDown={onKeyDown}
real={result?.db.flight} onKeyUp={onKeyUp}
attempts={result?.attempt.flight}
/> />
</div> </div>
</div> <button
type="button"
className="btn btn-primary"
onClick={submit}
disabled={disable}
>
Login
</button>
</>
); );
}; };
......
/* eslint-disable jsx-a11y/anchor-is-valid */
import React from "react";
import { useDispatch } from "react-redux";
import { ACTIONS } from "../common/actions";
import Avatar from "./Avatar";
const NavBar = () => {
const dispatch = useDispatch();
const onClickLogout = () => dispatch({ type: ACTIONS.SIGN_OUT_USER });
return (
<nav className="navbar navbar-expand-lg navbar-dark mb-3">
<div className="container">
<a className="navbar-brand" href="/home">
Smart Recruite
</a>
<button
className="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span className="navbar-toggler-icon"></span>
</button>
<div className="collapse navbar-collapse" id="navbarSupportedContent">
<ul className="navbar-nav me-auto mb-2 mb-lg-0">
<li className="nav-item">
<a className="nav-link" href="/">
Link
</a>
</li>
</ul>
<nav className="nav-item dropdown">
<a
className="nav-link dropdown-toggle"
href="/"
role="button"
data-bs-toggle="dropdown"
aria-expanded="false"
>
<Avatar name="Hashan" size="sm" />
</a>
<ul className="dropdown-menu">
<li>
<a className="dropdown-item" href="/">
Action
</a>
</li>
<li>
<a className="dropdown-item" href="/settings">
Settings
</a>
</li>
<li>
<hr className="dropdown-divider" />
</li>
<li>
<a className="dropdown-item" onClick={onClickLogout}>
Logout
</a>
</li>
</ul>
</nav>
</div>
</div>
</nav>
);
};
export default NavBar;
import { useSelector } from "react-redux";
import { Navigate, Outlet } from "react-router-dom";
import { Reducers } from "../common/types";
export default function ProtectedRoutes() {
const auth = useSelector((state: Reducers) => state.auth?.token);
if (auth) return <Outlet />;
return <Navigate to="/" />;
}
import React from "react"; import React from "react";
import { Stat } from "../util/types"; import { Stat } from "../common/types";
const ResultTable = ({ data }: { data?: Stat | null }) => { const ResultTable = ({ data }: { data?: Stat | null }) => {
if (!data) return null; if (!data) return null;
...@@ -9,7 +9,7 @@ const ResultTable = ({ data }: { data?: Stat | null }) => { ...@@ -9,7 +9,7 @@ const ResultTable = ({ data }: { data?: Stat | null }) => {
<tr> <tr>
<th></th> <th></th>
<th>Standard</th> <th>Standard</th>
<th>Standard (Full)</th> <th>Advance (Full)</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
......
import React, { useState, useRef, useEffect } from "react"; import React, { useState, useRef, useEffect } from "react";
import { keyEvent } from "../util/keystrokeLogger"; import AuthAPI from "../common/apis/auth";
import { KeyDetails } from "../util/types"; import { keyEvent } from "../common/lib/util";
import { KeyDetails, SignUpPayload, USER_TYPE } from "../common/types";
const SignUp = () => { type OwnProps = {
const [alert, setAlert] = useState<string | null>(null); setAlert: (alert: string) => void;
userType: USER_TYPE;
setForm: (form: "sign-in" | "sign-up") => void;
};
const SignUp = ({ userType, setAlert, setForm }: OwnProps) => {
const [is2FAenabled, setis2FAenabled] = useState<boolean>(false); const [is2FAenabled, setis2FAenabled] = useState<boolean>(false);
const [credentials, setCredentials] = useState({ const [credentials, setCredentials] = useState({
userName: "", name: "",
email: "",
password: "", password: "",
confrimPassword: "", confrimPassword: "",
twoFAPassword: "", twoFAPassword: "",
...@@ -38,8 +45,12 @@ const SignUp = () => { ...@@ -38,8 +45,12 @@ const SignUp = () => {
return setAlert("Passwords do not match"); return setAlert("Passwords do not match");
} }
const data = { if (!/^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/.test(credentials.email)) {
username: credentials.userName, return setAlert("Invalid email address");
}
const payload: SignUpPayload = {
email: credentials.email,
passwords: [ passwords: [
credentials.password, credentials.password,
credentials.confrimPassword, credentials.confrimPassword,
...@@ -47,28 +58,29 @@ const SignUp = () => { ...@@ -47,28 +58,29 @@ const SignUp = () => {
], ],
keydown: keydownArray.current, keydown: keydownArray.current,
keyup: keyupArray.current, keyup: keyupArray.current,
userType,
candidate:
userType === USER_TYPE.CANDIDATE
? { name: credentials.name, contacts: { email: credentials.email } }
: undefined,
organization:
userType === USER_TYPE.ORGANIZATION
? { name: credentials.name, contacts: { email: credentials.email } }
: undefined,
}; };
console.log("DATA ", data);
resetData(); resetData();
fetch("http://localhost:3001/user/signup", { AuthAPI.signup(payload)
method: "POST", .then((res: any) => {
mode: "cors", if (res.success) {
headers: { setForm("sign-in");
"Content-Type": "application/json", setAlert("Successfully signed up. Please login");
}, }
body: JSON.stringify(data), })
}).then(async (res) => { .catch((error) => {
const response = await res.json(); setAlert(error.msg);
});
if (response.success) {
setAlert(`${response.username} signed up successfully`);
} else {
setAlert(response.msg);
}
});
}; };
const clearField = (index: number) => { const clearField = (index: number) => {
...@@ -146,132 +158,119 @@ const SignUp = () => { ...@@ -146,132 +158,119 @@ const SignUp = () => {
); );
if (reqdUpKeystroke) reqdUpKeystroke.time = details.time; if (reqdUpKeystroke) reqdUpKeystroke.time = details.time;
if (index === 2) {
onSumit();
}
}; };
const disableSubmit = const disableSubmit =
credentials.userName === "" || credentials.password === "" || !is2FAenabled; credentials.email === "" ||
credentials.password === "" ||
!is2FAenabled ||
credentials.name === "";
const renderAlert = alert && ( const nameLabel =
<div userType === USER_TYPE.CANDIDATE ? "User name" : "Organization name";
className="alert alert-warning alert-dismissible fade show mt-3"
role="alert"
>
{alert}
<button
type="button"
className="btn-close"
data-bs-dismiss="alert"
aria-label="Close"
onClick={() => setAlert(null)}
></button>
</div>
);
return ( return (
<div className="container"> <>
<div className=" row"> <h5 className="card-title">Sign up</h5>
<div className="col-lg"></div> <div className="mb-3">
<div className="col-lg"> <label htmlFor="exampleFormControlInput1" className="form-label">
<div className="card card-body mt-5 pt-4 pb-4"> {nameLabel}
<h5 className="card-title">SignUp</h5> </label>
<div className="mb-3"> <input
<label htmlFor="exampleFormControlInput1" className="form-label"> className="form-control"
User name type="text"
</label> aria-label=".form-control-lg example"
<input onChange={onChangeCredentials}
className="form-control" name="name"
type="text" />
aria-label=".form-control-lg example" </div>
onChange={onChangeCredentials}
name="userName"
/>
</div>
<div className="mb-3"> <div className="mb-3">
<label htmlFor="exampleFormControlInput1" className="form-label"> <label htmlFor="exampleFormControlInput1" className="form-label">
Password Email
</label> </label>
<input <input
className="form-control" className="form-control"
type="password" type="email"
aria-label=".form-control-lg example" aria-label=".form-control-lg example"
name="password" onChange={onChangeCredentials}
onChange={onChangeCredentials} name="email"
onKeyDown={onKeyDown} />
onKeyUp={onKeyUp} </div>
id="password-0"
value={credentials.password}
/>
</div>
<div className="mb-3">
<label htmlFor="exampleFormControlInput1" className="form-label">
Confirm Password
</label>
<input
className="form-control"
type="password"
aria-label=".form-control-lg example"
name="confrimPassword"
onChange={onChangeCredentials}
value={credentials.confrimPassword}
onKeyDown={onKeyDown}
onKeyUp={onKeyUp}
id="password-1"
/>
</div>
<div className="form-check mb-3"> <div className="mb-3">
<input <label htmlFor="exampleFormControlInput1" className="form-label">
className="form-check-input" Password
type="checkbox" </label>
name="2FA" <input
id="flexCheckDefault" className="form-control"
checked={is2FAenabled} type="password"
onChange={onChange2FAconcent} aria-label=".form-control-lg example"
/> name="password"
<label className="form-check-label" htmlFor="flexCheckDefault"> onChange={onChangeCredentials}
Enable keystroke dynamics 2FA onKeyDown={onKeyDown}
</label> onKeyUp={onKeyUp}
</div> id="password-0"
{is2FAenabled && ( value={credentials.password}
<div className="mb-3"> />
<label </div>
htmlFor="exampleFormControlInput1" <div className="mb-3">
className="form-label" <label htmlFor="exampleFormControlInput1" className="form-label">
> Confirm Password
Enter your password again </label>
</label> <input
<input className="form-control"
className="form-control" type="password"
type="password" aria-label=".form-control-lg example"
aria-label=".form-control-lg example" name="confrimPassword"
name="twoFAPassword" onChange={onChangeCredentials}
onChange={onChangeCredentials} value={credentials.confrimPassword}
value={credentials.twoFAPassword} onKeyDown={onKeyDown}
onKeyDown={onKeyDown} onKeyUp={onKeyUp}
onKeyUp={onKeyUp} id="password-1"
id="password-2" />
/>
</div>
)}
<button
type="button"
className="btn btn-primary"
disabled={disableSubmit}
onClick={onSumit}
>
Sign up
</button>
{renderAlert}
</div>
</div>
<div className="col-lg"></div>
</div> </div>
</div>
<div className="form-check mb-3">
<input
className="form-check-input"
type="checkbox"
name="2FA"
id="flexCheckDefault"
checked={is2FAenabled}
onChange={onChange2FAconcent}
/>
<label className="form-check-label" htmlFor="flexCheckDefault">
Enable keystroke dynamics 2FA
</label>
</div>
{is2FAenabled && (
<div className="mb-3">
<label htmlFor="exampleFormControlInput1" className="form-label">
Enter your password again
</label>
<input
className="form-control"
type="password"
aria-label=".form-control-lg example"
name="twoFAPassword"
onChange={onChangeCredentials}
value={credentials.twoFAPassword}
onKeyDown={onKeyDown}
onKeyUp={onKeyUp}
id="password-2"
/>
</div>
)}
<button
type="button"
className="btn btn-primary"
disabled={disableSubmit}
onClick={onSumit}
>
Sign up
</button>
</>
); );
}; };
......
import React from "react"; import React from "react";
import { Provider } from "react-redux";
import { PersistGate } from "redux-persist/integration/react";
import ReactDOM from "react-dom/client"; import ReactDOM from "react-dom/client";
import App from "./App"; import App from "./App";
import { store, persistor } from "./store";
const root = ReactDOM.createRoot( const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement document.getElementById("root") as HTMLElement
); );
root.render( root.render(
<React.StrictMode> <React.StrictMode>
<App /> <Provider store={store}>
<PersistGate persistor={persistor}>
<App />
</PersistGate>
</Provider>
</React.StrictMode> </React.StrictMode>
); );
/// <reference types="react-scripts" /> /// <reference types="react-scripts" />
/// <reference types="redux-persist" />
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 500 500">
<defs>
<clipPath id="freepik--clip-path--inject-2">
<path d="M159.63,109.66l38-21.92c.68-.39,1.23-.07,1.23.71v48.33a2.72,2.72,0,0,1-1.23,2.13l-38,21.88c-.68.39-1.24.07-1.24-.71V111.79A2.73,2.73,0,0,1,159.63,109.66Z" style="fill:none"></path>
</clipPath>
<clipPath id="freepik--clip-path-2--inject-2">
<path d="M159.63,201.75l38-21.92c.68-.4,1.23-.08,1.23.71v48.33a2.72,2.72,0,0,1-1.23,2.13l-38,21.88c-.68.39-1.24.07-1.24-.71V203.88A2.71,2.71,0,0,1,159.63,201.75Z" style="fill:none"></path>
</clipPath>
<clipPath id="freepik--clip-path-3--inject-2">
<path d="M159.63,293.89l38-21.92c.68-.39,1.23-.07,1.23.71V321a2.72,2.72,0,0,1-1.23,2.13l-38,21.88c-.68.39-1.24.07-1.24-.71V296A2.73,2.73,0,0,1,159.63,293.89Z" style="fill:none"></path>
</clipPath>
</defs>
<g id="freepik--Shadow--inject-2">
<path id="freepik--shadow--inject-2" d="M428.47,402.78c-16.27,8.77-42.64,8.77-58.9,0s-16.27-23,0-31.78,42.63-8.78,58.9,0S444.73,394,428.47,402.78Z" style="fill:white"></path>
</g>
<g id="freepik--Clouds--inject-2">
<g id="freepik--clouds--inject-2">
<path d="M377.4,69.15l8.93,5.16c0-.4-.07-.8-.07-1.18V70.54c0-4.61,3.23-6.47,7.22-4.17a13.84,13.84,0,0,1,4.3,4.14c.66-5.79,5.2-8,10.72-4.76,6,3.44,10.8,11.82,10.8,18.71v3.87a10.26,10.26,0,0,1-.91,4.48l7.41,4.29a8.82,8.82,0,0,1,4,6.93c0,2.56-1.79,3.59-4,2.32L377.4,78.4a8.85,8.85,0,0,1-4-6.94C373.4,68.91,375.19,67.87,377.4,69.15Z" style="fill:#ebebeb"></path>
<path d="M339.18,95.18l6.74,3.89c0-.3-.06-.6-.06-.9v-2c0-3.47,2.44-4.88,5.45-3.14a10.45,10.45,0,0,1,3.25,3.12c.49-4.37,3.92-6,8.09-3.59,4.5,2.6,8.15,8.92,8.15,14.12v2.92a7.7,7.7,0,0,1-.69,3.38l5.6,3.24a6.66,6.66,0,0,1,3,5.23c0,1.93-1.35,2.71-3,1.75l-36.53-21.09a6.69,6.69,0,0,1-3-5.24C336.16,95,337.51,94.21,339.18,95.18Z" style="fill:#ebebeb"></path>
</g>
</g>
<g id="freepik--Plants--inject-2">
<g id="freepik--plants--inject-2">
<path d="M86.19,381.09s1.49-14.67-5.26-24.32-16.08-8.83-19.51-7.47-6.05,5.92-.75,9.85,16.62,11.86,18,18.13Z" style="fill:green"></path>
<path d="M86.19,381.09s1.49-14.67-5.26-24.32-16.08-8.83-19.51-7.47-6.05,5.92-.75,9.85,16.62,11.86,18,18.13Z" style="opacity:0.15"></path>
<path d="M83,377.64a.44.44,0,0,1-.44-.43c-.23-15.35-14.26-24-18-25.54a.44.44,0,0,1-.25-.57.44.44,0,0,1,.57-.24c3.86,1.53,18.32,10.5,18.56,26.34a.44.44,0,0,1-.43.44Z" style="fill:#fff"></path>
<path d="M80.37,373.07c-.14-3.75-3.46-6.65-9.74-6.19s-5.35.39-12.76-2.25-13,0-13.78,2.85c-.9,3.12,5.17,5.09,9.59,7.58s7.36,5.41,5.87,9.47c-1.27,3.48-1,6.55,4.42,8.36,4.77,1.6,10.24-.74,11.82,4.12.9,2.77,5.19,6.1,9.62,4C97.47,390.78,80.37,373.07,80.37,373.07Z" style="fill:teal"></path>
<path d="M84.73,393.29a.44.44,0,0,1-.41-.3c-4.63-13.28-26.55-24.84-34.57-26.16a.44.44,0,0,1-.36-.5.44.44,0,0,1,.5-.37c8.17,1.35,30.52,13.16,35.26,26.74a.44.44,0,0,1-.27.56Z" style="fill:#fff"></path>
<path d="M65,386a.41.41,0,0,1-.34-.18.42.42,0,0,1,.08-.61,22.14,22.14,0,0,1,12.17-3.91h0a.44.44,0,0,1,.44.43.43.43,0,0,1-.43.44,21.71,21.71,0,0,0-11.66,3.73A.39.39,0,0,1,65,386Z" style="fill:#fff"></path>
</g>
</g>
<g id="freepik--Resumes--inject-2">
<path d="M89.84,219.31l-3.71-2.14h0a2.19,2.19,0,0,1-1-2V142.3a6.93,6.93,0,0,1,3.13-5.43L253,42.06a2.22,2.22,0,0,1,2.17-.24h0l0,0h0l3.7,2.13-2.78,72.73a6.94,6.94,0,0,1-3.14,5.42Z" style="fill:#fafafa"></path>
<path d="M88.9,144.44v72.83c0,2,1.4,2.81,3.13,1.81l164.68-94.81a6.93,6.93,0,0,0,3.13-5.43V46c0-2-1.41-2.81-3.14-1.81L92,139A6.94,6.94,0,0,0,88.9,144.44Z" style="fill:#ebebeb"></path>
<path d="M86.12,217.16l3.59,2.07a2.29,2.29,0,0,1-.81-2V144.43a6.32,6.32,0,0,1,.82-2.91L86,139.38a6.3,6.3,0,0,0-.82,2.92v72.83a2.17,2.17,0,0,0,.94,2Z" style="fill:#e0e0e0"></path>
<path d="M102.23,200.37l-4.61-2.66a2.82,2.82,0,0,1-1.27-2.2V157.15a2.8,2.8,0,0,1,1.27-2.2l45.15-26.07a2.84,2.84,0,0,1,2.54,0l4.61,2.66a2.84,2.84,0,0,1,1.27,2.21v38.36a2.82,2.82,0,0,1-1.27,2.2l-45.14,26.06A2.8,2.8,0,0,1,102.23,200.37Z" style="fill:#37474f"></path>
<path d="M104.56,200.47a2.8,2.8,0,0,1-2.32-.1l-4.62-2.66a2.82,2.82,0,0,1-1.27-2.2V157.14a2.61,2.61,0,0,1,.37-1.25l7.16,4.13a2.52,2.52,0,0,0-.38,1.26v38.36C103.5,200.37,104,200.7,104.56,200.47Z" style="fill:#263238"></path>
<path d="M103.51,161.28v38.36c0,.81.56,1.14,1.27.73l45.14-26.06a2.82,2.82,0,0,0,1.27-2.2V133.75c0-.81-.57-1.14-1.27-.74l-45.14,26.07A2.78,2.78,0,0,0,103.51,161.28Z" style="fill:#455a64"></path><polygon points="103.51 173.57 151.19 146.04 151.19 147.42 103.5 174.95 103.51 173.57" style="fill:#263238"></polygon><polygon points="123.77 160.5 130.92 156.37 130.92 161.87 123.77 166 123.77 160.5" style="fill:#FFFFFF"></polygon><polygon points="130.92 156.37 129.73 155.68 122.58 159.81 123.77 160.5 130.92 156.37" style="fill:#FFFFFF"></polygon><polygon points="130.92 156.37 129.73 155.68 122.58 159.81 123.77 160.5 130.92 156.37" style="fill:#fff;opacity:0.4"></polygon><polygon points="122.58 159.81 122.58 165.31 123.77 166 123.77 160.5 122.58 159.81" style="fill:#FFFFFF"></polygon><polygon points="122.58 159.81 122.58 165.31 123.77 166 123.77 160.5 122.58 159.81" style="opacity:0.1"></polygon>
<path d="M114.31,149.5c-.81,0-1.47-.07-1.47-.88V142a7.06,7.06,0,0,1,3.27-5.68L129,128.83a3,3,0,0,1,4.74,2.74v6.7c0,.81-.65.88-1.46.88s-1.47-.07-1.47-.88v-6.7a1.22,1.22,0,0,0,0-.33,1.57,1.57,0,0,0-.3.13l-12.93,7.46a4.22,4.22,0,0,0-1.81,3.14v6.65C115.77,149.43,115.12,149.5,114.31,149.5Z" style="fill:#FFFFFF"></path>
<path d="M157.59,108.74l38-21.92a.92.92,0,0,1,.87-.08l2,.9-1.65,48.22a2.7,2.7,0,0,1-1.23,2.13l-36.78,22.9s-1.82-.8-2.05-.92a.89.89,0,0,1-.37-.81V110.88A2.74,2.74,0,0,1,157.59,108.74Z" style="fill:#e0e0e0"></path>
<path d="M159.63,109.66l38-21.92c.68-.39,1.23-.07,1.23.71v48.33a2.72,2.72,0,0,1-1.23,2.13l-38,21.88c-.68.39-1.24.07-1.24-.71V111.79A2.73,2.73,0,0,1,159.63,109.66Z" style="fill:#fff"></path>
<g style="clip-path:url(#freepik--clip-path--inject-2)">
<g id="freepik--Character--inject-2">
<path d="M189,159.49c-4.26-18.68-9.13-22-4.58-25.87,4.68-1.79,7.1.76,7.91,6.24.4,2.67,1.27,13.88,2.36,18.06.95,3.68,2.24,8.24,3.67,10.87a1.55,1.55,0,0,0,1.17.82c1.33.19,1.73.94,2.81,1.49.85.43,1.48.32,1.44.62a1.66,1.66,0,0,1-1.34,1.33,4.69,4.69,0,0,1-1.59-.11,8.72,8.72,0,0,0,2.32,2.13c2.08,1.35,2.42,2.67-.88,4.43-2.08,1.1-4,.57-6.59-3.64a34,34,0,0,1-2.59-4.87A95,95,0,0,1,189,159.49Z" style="fill:#b16668"></path>
<path d="M176.89,135.87h0c-4.63,1.61-4.95,4.28-6.11,7.41a10.75,10.75,0,0,0-.22,6.95l3.23,9.92a65.39,65.39,0,0,0-3.27,9.07c8.1,3.05,18.21-2.4,20.65-6.86.1-.84-.53-7-.91-11,1.42-4.51,1.8-7.23,1.2-9.8-1.12-4.77-5.45-8.54-7.37-7.85Z" style="fill:#455a64"></path>
<path d="M182.4,129.49l-3.42.93c-4.75,1.3-8.63-2.1-8.65-7.59h0c0-6.57,4.58-13.17,10.28-14.72h0c5.7-1.56,10.34,2.51,10.37,9.09h0C191,122.69,187.16,128.19,182.4,129.49Z" style="fill:#263238"></path>
<path d="M177.94,106c1.47,2.12-.09,4.25-2.26,6.53s-4.13,3.85-5.6,1.74-.67-5.12,1.5-7.4S176.46,103.91,177.94,106Z" style="fill:#263238"></path>
<path d="M172.62,115.2l-2.18,2.45a1.81,1.81,0,0,1,.23-2.25A1.27,1.27,0,0,1,172.62,115.2Z" style="fill:#263238"></path>
<path d="M187,111.71c1.09.44,2.45,3.24,2.34,9.9-.09,5.66-1.66,7.47-2.45,8.09s-2.33.79-3.81.91l.08,3.4s2.51,1.69,2.38,3.27-3.47,3.2-5.4,2.21a16.08,16.08,0,0,1-3.47-2.52.29.29,0,0,1-.08-.21v-8.52a1.58,1.58,0,0,1-2.36.13,3.19,3.19,0,0,1-.7-4.25c.95-1.38,2.71-1.56,3.4-.15a13.9,13.9,0,0,0,5.52-3.41A14.3,14.3,0,0,0,187,111.71Z" style="fill:#b16668"></path>
<path d="M183.89,121.69a.94.94,0,0,1-.58.92c-.34.11-.63-.12-.64-.52a1,1,0,0,1,.57-.93C183.58,121.05,183.87,121.29,183.89,121.69Z" style="fill:#263238"></path>
<path d="M184.07,126.41l1.42.13a1,1,0,0,1-.92.84C184.18,127.35,184,126.91,184.07,126.41Z" style="fill:#9a4a4d"></path>
<path d="M188.9,118.15l-1.24-.66c.23-.47.69-.7,1-.52A.89.89,0,0,1,188.9,118.15Z" style="fill:#263238"></path>
<path d="M188.62,119.88a1,1,0,0,1-.57.93c-.34.11-.63-.13-.65-.53a.94.94,0,0,1,.58-.92C188.32,119.25,188.61,119.48,188.62,119.88Z" style="fill:#263238"></path><polygon points="185.87 119.88 185.85 124.5 187.78 123.27 185.87 119.88" style="fill:#9a4a4d"></polygon>
<path d="M183.07,130.61c-1.57.19-4.8,0-5.31-1.33a2.84,2.84,0,0,0,1.14,1.57c1,.69,4.19.89,4.19.89Z" style="fill:#9a4a4d"></path>
<path d="M179,168c-2.66,0-4.34-2.67-3.64-5.9,0-.13.05-.23.08-.32.52-1.59,1.64-1.7,1.64-1.7h0a4.07,4.07,0,0,1-1.79-3.12L174,150.62a9.39,9.39,0,0,1,.25-3.34L171,143.8l-.6.65a10.45,10.45,0,0,0,.13,5.78l3.23,9.92a60.53,60.53,0,0,0-3.27,9.07c6,2.25,13-.12,17.3-3.31A21.84,21.84,0,0,1,179,168Z" style="fill:#37474f"></path>
</g>
<path d="M162.23,166.63c3.6-18,5.87-25.7,9.82-28.43a13.13,13.13,0,0,1,2.67-1.33c.55.21.6,1.39.71,2.16a19,19,0,0,1-2.05,10.28s-5.26,14.2-6.1,19a80.91,80.91,0,0,0-1.51,12.83,2.08,2.08,0,0,0,.58,1.51c1,.94,1,1.91,1.58,3.07.49.91,1,1.16.87,1.43a1.22,1.22,0,0,1-1.57.56,4.34,4.34,0,0,1-1.2-1,12.71,12.71,0,0,0,.95,3.43c1.08,2.51.81,4-2.47,3.9-2.06-.08-3.35-1.71-3.66-7.34a52,52,0,0,1,0-6.3C161.24,174.85,161.56,170,162.23,166.63Z" style="fill:#b16668"></path>
</g>
<path d="M160.56,165.52l36.19-20.9c1.2-.69,2.17-.2,2.17,1.1a4.65,4.65,0,0,1-2.17,3.6l-36.19,20.89c-1.2.69-2.17.2-2.17-1.09A4.64,4.64,0,0,1,160.56,165.52Z" style="fill:#455a64"></path>
<path d="M205.19,83.47l36.2-20.9c1.19-.69,2.16-.2,2.16,1.09a4.65,4.65,0,0,1-2.16,3.6l-36.2,20.9c-1.19.69-2.16.2-2.16-1.1A4.65,4.65,0,0,1,205.19,83.47Z" style="fill:#455a64"></path>
<path d="M204.06,93.5l46.58-26.89c.6-.35,1.09-.1,1.09.54a2.32,2.32,0,0,1-1.09,1.8L204.11,95.84c-.6.35-1.09.11-1.11-.54A2.3,2.3,0,0,1,204.06,93.5Z" style="fill:#fff"></path>
<path d="M204.06,98.18l46.58-26.89c.6-.35,1.09-.1,1.09.55a2.33,2.33,0,0,1-1.09,1.8l-46.53,26.89c-.6.34-1.09.1-1.11-.55A2.3,2.3,0,0,1,204.06,98.18Z" style="fill:#fff"></path>
<path d="M204.06,102.87,250.64,76c.6-.34,1.09-.1,1.09.55a2.33,2.33,0,0,1-1.09,1.8l-46.53,26.89c-.6.35-1.09.1-1.11-.55A2.28,2.28,0,0,1,204.06,102.87Z" style="fill:#fff"></path>
<path d="M204.06,107.55l46.58-26.89c.6-.35,1.09-.1,1.09.54a2.32,2.32,0,0,1-1.09,1.8l-46.53,26.89c-.6.35-1.09.1-1.11-.54A2.28,2.28,0,0,1,204.06,107.55Z" style="fill:#fff"></path>
<path d="M204.06,112.23l46.58-26.89c.6-.35,1.09-.1,1.09.55a2.31,2.31,0,0,1-1.09,1.79l-46.53,26.9c-.6.34-1.09.1-1.11-.55A2.3,2.3,0,0,1,204.06,112.23Z" style="fill:#fff"></path>
<path d="M205.19,120.83l3.75-2.16c1.2-.7,2.17-.14,2.17,1.25v4.38a4.78,4.78,0,0,1-2.17,3.75l-3.79,2.19c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.81,4.81,0,0,1,205.19,120.83Z" style="fill:#FFFFFF"></path>
<path d="M212.52,117.77c0,.65.48.89,1.08.55l10-5.79a2.36,2.36,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.32,2.32,0,0,0,212.52,117.77Z" style="fill:#455a64"></path>
<path d="M212.52,121.29c0,.65.48.89,1.08.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.32,2.32,0,0,0,212.52,121.29Z" style="fill:#455a64"></path>
<path d="M212.52,124.81c0,.65.48.9,1.08.55l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.3,2.3,0,0,0,212.52,124.81Z" style="fill:#455a64"></path>
<path d="M205.19,134.9l3.75-2.16c1.2-.69,2.17-.13,2.17,1.25v4.38a4.78,4.78,0,0,1-2.17,3.75l-3.79,2.19c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.81,4.81,0,0,1,205.19,134.9Z" style="fill:#FFFFFF"></path>
<path d="M212.52,131.84c0,.65.48.89,1.08.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.32,2.32,0,0,0,212.52,131.84Z" style="fill:#455a64"></path>
<path d="M212.52,135.36c0,.65.48.9,1.08.55l10-5.79a2.33,2.33,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.54l-10,5.78A2.3,2.3,0,0,0,212.52,135.36Z" style="fill:#455a64"></path>
<path d="M212.52,138.89c0,.64.48.89,1.08.54l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.31,2.31,0,0,0,212.52,138.89Z" style="fill:#455a64"></path>
<path d="M232.21,105.53l3.75-2.17c1.2-.69,2.16-.13,2.16,1.25V109a4.75,4.75,0,0,1-2.16,3.75l-3.79,2.2c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.84,4.84,0,0,1,232.21,105.53Z" style="fill:#FFFFFF"></path>
<path d="M239.53,102.47c0,.64.49.89,1.09.54l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.32,2.32,0,0,0,239.53,102.47Z" style="fill:#455a64"></path>
<path d="M239.53,106c0,.65.49.89,1.09.55l10-5.79A2.34,2.34,0,0,0,251.73,99c0-.65-.48-.89-1.08-.55l-10,5.78A2.33,2.33,0,0,0,239.53,106Z" style="fill:#455a64"></path>
<path d="M239.53,109.51c0,.65.49.9,1.09.55l10-5.79a2.33,2.33,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.79A2.3,2.3,0,0,0,239.53,109.51Z" style="fill:#455a64"></path>
<path d="M232.21,119.6l3.75-2.16c1.2-.7,2.16-.14,2.16,1.25v4.38a4.77,4.77,0,0,1-2.16,3.75L232.17,129c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.84,4.84,0,0,1,232.21,119.6Z" style="fill:#FFFFFF"></path>
<path d="M239.53,116.54c0,.65.49.89,1.09.55l10-5.79a2.36,2.36,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.33,2.33,0,0,0,239.53,116.54Z" style="fill:#455a64"></path>
<path d="M239.53,120.06c0,.65.49.89,1.09.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.33,2.33,0,0,0,239.53,120.06Z" style="fill:#455a64"></path>
<path d="M239.53,123.58c0,.65.49.9,1.09.55l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.31,2.31,0,0,0,239.53,123.58Z" style="fill:#455a64"></path>
<path d="M89.84,311.4l-3.71-2.14h0a2.19,2.19,0,0,1-1-2V234.38A6.92,6.92,0,0,1,88.32,229L253,134.14a2.24,2.24,0,0,1,2.17-.24h0l0,0h0l3.7,2.13-2.78,72.72a6.94,6.94,0,0,1-3.14,5.43Z" style="fill:#fafafa"></path>
<path d="M88.9,236.53v72.83c0,2,1.4,2.81,3.13,1.81l164.68-94.82a6.93,6.93,0,0,0,3.13-5.43V138.09c0-2-1.41-2.81-3.14-1.81L92,231.1A6.94,6.94,0,0,0,88.9,236.53Z" style="fill:#ebebeb"></path>
<path d="M86.12,309.25l3.59,2.06a2.28,2.28,0,0,1-.81-2V236.52a6.29,6.29,0,0,1,.82-2.91L86,231.47a6.26,6.26,0,0,0-.82,2.91v72.84a2.17,2.17,0,0,0,.94,2Z" style="fill:#e0e0e0"></path>
<path d="M157.59,200.83l38-21.92a.9.9,0,0,1,.87-.09c.36.18,2,.91,2,.91L196.79,228a2.72,2.72,0,0,1-1.23,2.13L158.78,253s-1.82-.8-2.05-.92a.86.86,0,0,1-.37-.8V203A2.72,2.72,0,0,1,157.59,200.83Z" style="fill:#e0e0e0"></path>
<path d="M159.63,201.75l38-21.92c.68-.39,1.23-.08,1.23.71v48.33a2.72,2.72,0,0,1-1.23,2.13l-38,21.88c-.68.39-1.24.07-1.24-.71V203.88A2.71,2.71,0,0,1,159.63,201.75Z" style="fill:#fff"></path>
<g style="clip-path:url(#freepik--clip-path-2--inject-2)">
<g id="freepik--character-boy--inject-2">
<path d="M186.15,222.17s3-.93,5.47,3c1.69,2.66,7.6,12.78,7.6,12.78s11.48-6.09,12.13-6.88.61-2.42.7-3.29a9.72,9.72,0,0,0-.44-3.23c-.14-.91,1.18-1,1.83.31.47.92.51,2,.92,2a11.66,11.66,0,0,0,1.61-1.37c.71-.78,2-2.08,3-1.9a.83.83,0,0,1,.65.7,4.58,4.58,0,0,0,.37,1.55,2.79,2.79,0,0,1,.38.62,5.69,5.69,0,0,1,0,1c0,.48.51.68.57,1.15a8.25,8.25,0,0,1-.12,1.09c0,.23.08.44.08.67a2.28,2.28,0,0,1-.59,1.28,13.91,13.91,0,0,1-3.41,2.85c-1.05.68-2.43,1.29-3.62,1.94s-14.72,11-16.52,9.8-10.84-14.39-10.84-14.39C183.81,226,186.15,222.17,186.15,222.17Z" style="fill:#ffa8a7"></path>
<path d="M180.91,222.26a16,16,0,0,1,5.43-1.2,5.88,5.88,0,0,1,5.27,3.26c2.09,3.36,5.55,9.16,5.55,9.16a16.65,16.65,0,0,1-6.72,7.18l-6.37-9.61Z" style="fill:#455a64"></path>
<g id="freepik--character-boy--inject-2">
<path d="M170.48,228.07a7.07,7.07,0,0,0-2.33,3.42,16.69,16.69,0,0,0-.71,5v10.93l-.13,20.67c6.93,2.36,15.74.28,23.13-7.94,0,0-.41-26.44-.41-30.78,0-.2,0-.4,0-.6-.27-6.13-5.56-9-10.77-6l-4.38,2.48-4.39,2.85Z" style="fill:#FFFFFF"></path>
<path d="M175.22,205.59c0,4.66,3.27,7.56,7.31,6.48s7.31-5.74,7.31-10.4-3.49-4.66-7.52-3.58S175.22,200.93,175.22,205.59Z" style="fill:#263238"></path>
<path d="M171.41,213a63.86,63.86,0,0,0,1.51,6.4,1.66,1.66,0,0,0,1.32.88l-.07-4.09Z" style="fill:#263238"></path>
<path d="M172.76,204.23a3,3,0,0,0-2.06,1.39c-.89,1.29-.39,4.43.71,7.34l2-.27Z" style="fill:#263238"></path>
<path d="M174,212.53c-.4.39-1-.36-1.48-.83s-2.14-.86-3,1.34.72,4.51,2,4.63a2.14,2.14,0,0,0,2.56-1.52l.07,9.48c3.73,4,10.26-.71,7.32-2.46v-2.81a12.81,12.81,0,0,0,3-.63c1.63-.73,2.66-2.49,3.16-4.66.79-3.5,1.09-6.23.42-12.49-.74-6.87-7.86-5-11.71-1.21S174,212.53,174,212.53Z" style="fill:#ffa8a7"></path>
<path d="M174,213.32c-.2.06-1-1.23-1.48-1.62-.71-.55.2-7.47.2-7.47-.81-1.78.68-4.47,2.25-5.57a9.07,9.07,0,0,1,3.7-1.36c1.13-.21,2.24-.36,3.36-.46a31.65,31.65,0,0,0,4.06-.49,9.12,9.12,0,0,0,3.21-1.38c.33-.23.66,0,.55.43a5.29,5.29,0,0,1-.38,1.07,9.9,9.9,0,0,1-1.08,1.9,14.51,14.51,0,0,1-1.57,1.74c-3,2.84-6.81,3.62-10.15,4-.76.08-.92,1-1.32,3.38C175,209.61,174.73,213.12,174,213.32Z" style="fill:#263238"></path>
<path d="M172.76,204.75l-2.45-.86a1.63,1.63,0,0,1,1.86-1.21C172.85,202.91,173.11,203.84,172.76,204.75Z" style="fill:#263238"></path>
<path d="M181.55,220.36a21.77,21.77,0,0,1-4.92-.31,3.16,3.16,0,0,1-1.76-1.55,5.42,5.42,0,0,0,1,2.11c.94,1.13,5.68.87,5.68.87Z" style="fill:#f28f8f"></path>
<path d="M180.68,209.7a1.14,1.14,0,0,1-.73,1.07c-.41.1-.73-.2-.73-.69A1.12,1.12,0,0,1,180,209C180.35,208.91,180.68,209.21,180.68,209.7Z" style="fill:#263238"></path>
<path d="M179.51,206.52l-1.57,1.41a1.36,1.36,0,0,1,.37-1.53A.72.72,0,0,1,179.51,206.52Z" style="fill:#263238"></path>
<path d="M181.22,215.38l1.67.27a1.15,1.15,0,0,1-1.13.95C181.3,216.52,181.06,216,181.22,215.38Z" style="fill:#f28f8f"></path>
<path d="M187.38,205.15l-1.42-.89c.29-.55.84-.79,1.23-.55A1.1,1.1,0,0,1,187.38,205.15Z" style="fill:#263238"></path>
<path d="M186.76,207.83a1.13,1.13,0,0,1-.74,1.07c-.4.1-.73-.2-.73-.69a1.14,1.14,0,0,1,.73-1.07C186.43,207,186.76,207.34,186.76,207.83Z" style="fill:#263238"></path><polygon points="183.14 208.12 183.23 213.21 185.85 211.84 183.14 208.12" style="fill:#f28f8f"></polygon>
</g>
</g>
<path d="M160.17,259.32c1.53-21.06,4.65-28.61,9.78-30.82,1.77,1.32,2.2,7.51.35,12.21,0,0-4,14-4.21,18.81a77.13,77.13,0,0,0,.81,13.27,1.88,1.88,0,0,0,.81,1.32c1.12.73,1,1.79,1.85,2.79.63.79,1.22.93,1.1,1.22a1.41,1.41,0,0,1-1.57.84,4.23,4.23,0,0,1-1.37-.75,11.55,11.55,0,0,0,1.44,3.14c1.46,2.22,1.39,3.73-2,4.23-2.15.32-3.71-1-4.79-6.39-.31-1.55-1-4.33-1.34-6.34A61.41,61.41,0,0,1,160.17,259.32Z" style="fill:#ffa8a7"></path>
<path d="M171.41,227.46a12.07,12.07,0,0,0-5.63,4.37c-1.88,3.06-3.68,8-4.94,16.72,0,0,2.36,3.24,8.53.55,0,0,2.68-11.15,2.92-15.56C172.55,228.73,171.41,227.46,171.41,227.46Z" style="fill:#455a64"></path>
</g>
<path d="M160.56,257.61l36.19-20.9c1.2-.69,2.17-.2,2.17,1.1a4.64,4.64,0,0,1-2.17,3.59l-36.19,20.9c-1.2.69-2.17.2-2.17-1.1A4.64,4.64,0,0,1,160.56,257.61Z" style="fill:#455a64"></path>
<path d="M205.19,175.55l36.2-20.89c1.19-.69,2.16-.2,2.16,1.09a4.65,4.65,0,0,1-2.16,3.6l-36.2,20.89c-1.19.69-2.16.2-2.16-1.09A4.65,4.65,0,0,1,205.19,175.55Z" style="fill:#455a64"></path>
<path d="M204.06,185.59l46.58-26.9c.6-.34,1.09-.1,1.09.55a2.33,2.33,0,0,1-1.09,1.8l-46.53,26.89c-.6.35-1.09.1-1.11-.55A2.28,2.28,0,0,1,204.06,185.59Z" style="fill:#fff"></path>
<path d="M204.06,190.27l46.58-26.89c.6-.35,1.09-.1,1.09.54a2.32,2.32,0,0,1-1.09,1.8l-46.53,26.89c-.6.35-1.09.11-1.11-.54A2.28,2.28,0,0,1,204.06,190.27Z" style="fill:#fff"></path>
<path d="M204.06,195l46.58-26.89c.6-.35,1.09-.1,1.09.55a2.33,2.33,0,0,1-1.09,1.8L204.11,197.3c-.6.34-1.09.1-1.11-.55A2.3,2.3,0,0,1,204.06,195Z" style="fill:#fff"></path>
<path d="M204.06,199.64l46.58-26.9c.6-.34,1.09-.1,1.09.55a2.33,2.33,0,0,1-1.09,1.8L204.11,202c-.6.35-1.09.1-1.11-.55A2.28,2.28,0,0,1,204.06,199.64Z" style="fill:#fff"></path>
<path d="M204.06,204.32l46.58-26.89c.6-.35,1.09-.1,1.09.54a2.32,2.32,0,0,1-1.09,1.8l-46.53,26.89c-.6.35-1.09.1-1.11-.54A2.28,2.28,0,0,1,204.06,204.32Z" style="fill:#fff"></path>
<path d="M205.19,212.92l3.75-2.17c1.2-.69,2.17-.13,2.17,1.25v4.38a4.78,4.78,0,0,1-2.17,3.75l-3.79,2.19c-1.2.69-2.16.13-2.16-1.25l0-4.4A4.79,4.79,0,0,1,205.19,212.92Z" style="fill:#FFFFFF"></path>
<path d="M212.52,209.85c0,.65.48.9,1.08.55l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.3,2.3,0,0,0,212.52,209.85Z" style="fill:#455a64"></path>
<path d="M212.52,213.38c0,.65.48.89,1.08.55l10-5.79a2.36,2.36,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.32,2.32,0,0,0,212.52,213.38Z" style="fill:#455a64"></path>
<path d="M212.52,216.9c0,.65.48.89,1.08.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.32,2.32,0,0,0,212.52,216.9Z" style="fill:#455a64"></path>
<path d="M205.19,227l3.75-2.17c1.2-.69,2.17-.13,2.17,1.25v4.38a4.76,4.76,0,0,1-2.17,3.75l-3.79,2.2c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.81,4.81,0,0,1,205.19,227Z" style="fill:#FFFFFF"></path>
<path d="M212.52,223.93c0,.64.48.89,1.08.54l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.31,2.31,0,0,0,212.52,223.93Z" style="fill:#455a64"></path>
<path d="M212.52,227.45c0,.65.48.89,1.08.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.32,2.32,0,0,0,212.52,227.45Z" style="fill:#455a64"></path>
<path d="M212.52,231c0,.65.48.9,1.08.55l10-5.79a2.33,2.33,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.54l-10,5.78A2.3,2.3,0,0,0,212.52,231Z" style="fill:#455a64"></path>
<path d="M232.21,197.61l3.75-2.16c1.2-.69,2.16-.13,2.16,1.25v4.38a4.77,4.77,0,0,1-2.16,3.75L232.17,207c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.84,4.84,0,0,1,232.21,197.61Z" style="fill:#FFFFFF"></path>
<path d="M239.53,194.55c0,.65.49.9,1.09.55l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.65-.48-.89-1.08-.54l-10,5.78A2.31,2.31,0,0,0,239.53,194.55Z" style="fill:#455a64"></path>
<path d="M239.53,198.08c0,.64.49.89,1.09.54l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.32,2.32,0,0,0,239.53,198.08Z" style="fill:#455a64"></path>
<path d="M239.53,201.6c0,.65.49.89,1.09.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.33,2.33,0,0,0,239.53,201.6Z" style="fill:#455a64"></path>
<path d="M232.21,211.69l3.75-2.17c1.2-.69,2.16-.13,2.16,1.25v4.38A4.77,4.77,0,0,1,236,218.9l-3.79,2.19c-1.2.69-2.16.13-2.16-1.25l0-4.4A4.84,4.84,0,0,1,232.21,211.69Z" style="fill:#FFFFFF"></path>
<path d="M239.53,208.63c0,.64.49.89,1.09.54l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.32,2.32,0,0,0,239.53,208.63Z" style="fill:#455a64"></path>
<path d="M239.53,212.15c0,.65.49.89,1.09.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.33,2.33,0,0,0,239.53,212.15Z" style="fill:#455a64"></path>
<path d="M239.53,215.67c0,.65.49.89,1.09.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.33,2.33,0,0,0,239.53,215.67Z" style="fill:#455a64"></path>
<path d="M125.55,234.25l.08.05-.1-.06-.19-.1Z" style="opacity:0.30000000000000004"></path>
<path d="M124.14,233.18a.19.19,0,0,0,0,.15.19.19,0,0,1,0-.15l.28-1Z" style="fill:#FFFFFF"></path>
<path d="M124.14,233.18a.19.19,0,0,0,0,.15.19.19,0,0,1,0-.15l.28-1Z" style="fill:#fff;opacity:0.4"></path>
<path d="M152.54,219.41l-5.33-3.09-.06,0h-.1l-.41-.24c-.19-.1-.38-.22-.57-.33l-2.3-1.33-.36-.21-.72-.42a.45.45,0,0,0-.27-.05l-2.68.27a.78.78,0,0,0-.45.21.77.77,0,0,0-.14.19l-1.45,3.91,0,0,0,.07a.35.35,0,0,1,0,.08l-.1.11a1.93,1.93,0,0,1-.28.22l-.1.06c-.28.13-.57.28-.86.44l-2.81-1.63a.24.24,0,0,0-.12,0,.49.49,0,0,0-.32.16h0l-1.76,1.87-1.19,1.24a1,1,0,0,0-.2.37.47.47,0,0,0,0,.28l.83,2.78a.31.31,0,0,1,0,.1.4.4,0,0,1,0,.18.52.52,0,0,1,0,.11s0,0,0,0a.07.07,0,0,1,0,.05.36.36,0,0,1,0,.09l-.06.12a20.58,20.58,0,0,0-1.36,2.36.24.24,0,0,1-.06.09l-.08.09a1.06,1.06,0,0,1-.5.29l-2.52.61a.86.86,0,0,0-.48.3,1,1,0,0,0-.09.17l-.16.53-.83,2.79-.28,1a.19.19,0,0,0,0,.15.32.32,0,0,0,0,.09l.07.07,0,0,.43.24.11.07h0l.34.2.18.11.21.11.08.05.22.13,1.23.7h0a10.82,10.82,0,0,0,0,1.15.74.74,0,0,1,0,.31,1.46,1.46,0,0,1-.2.37l-2.57,3.11a.69.69,0,0,0-.16.32s0,.06,0,.09a.42.42,0,0,0,0,.23l1.23,2.7s0,0,0,.05l0,0h0c.1,0,.89.5,1.83,1.06.16.08.32.18.48.27l1.78,1,.21.12,1.1.64a.12.12,0,0,1-.06-.08l-1.22-2.7a.52.52,0,0,1,0-.33.84.84,0,0,1,.16-.31l2.57-3.11a1.07,1.07,0,0,0,.2-.38.7.7,0,0,0,.05-.3,12.68,12.68,0,0,1,0-2.22.38.38,0,0,0-.39-.38l-2.31-.13a.35.35,0,0,1-.18,0h0a.27.27,0,0,1-.12-.32l1.12-3.75.15-.53a.58.58,0,0,1,.11-.18.85.85,0,0,1,.46-.29l2.52-.61a1.12,1.12,0,0,0,.51-.3,1,1,0,0,0,.13-.18,25.11,25.11,0,0,1,1.36-2.35,1,1,0,0,0,.16-.58h0a.25.25,0,0,0,0-.09l-.82-2.78a.63.63,0,0,1,0-.3.92.92,0,0,1,.21-.34l0,0,2.9-3.08a.39.39,0,0,1,.41-.14h0a.12.12,0,0,1,.07.07l1.37,2.09c.1.15.36.14.58,0a12.41,12.41,0,0,1,1.66-1,1.35,1.35,0,0,0,.58-.55s0,0,0,0l1.46-3.9a.41.41,0,0,1,.14-.21.74.74,0,0,1,.44-.2l2.69-.27a.42.42,0,0,1,.23,0h0a.27.27,0,0,1,.12.28l-.85,3.84a.45.45,0,0,0,.28.48,4.31,4.31,0,0,1,1.17.68.48.48,0,0,0,.6-.1l2.74-2.51A.4.4,0,0,1,152.54,219.41Z" style="fill:#FFFFFF"></path>
<path d="M150.94,227.79c0,.35,0,.71-.05,1.07a.38.38,0,0,0,.39.38l2.3.13a.47.47,0,0,1,.17,0Z" style="fill:#FFFFFF"></path>
<path d="M143.16,243.12c-.1-.15-.35-.14-.58,0s-.54.36-.8.52l2.82,1.64h0a.19.19,0,0,1-.07-.06Z" style="fill:#FFFFFF"></path>
<path d="M135.81,244.61a4.25,4.25,0,0,1-1.18-.69.49.49,0,0,0-.6.1l-2.74,2.51a.48.48,0,0,1-.3.14l4.36,2.52a.22.22,0,0,1-.11-.26l.84-3.85A.42.42,0,0,0,135.81,244.61Z" style="fill:#FFFFFF"></path>
<path d="M143.79,237.6a7.75,7.75,0,0,1-3.49,2.26l-.15,0-.1,0-.24,0-.28,0h-.26a2.69,2.69,0,0,1-2.53-1.69,4.57,4.57,0,0,1-.36-1.41c.2-.1.42-.21.63-.33a11.94,11.94,0,0,0,5.4-9.34c0-.26,0-.51,0-.74a4.25,4.25,0,0,1,1.9-.4h.12l.09,0h.11a2.71,2.71,0,0,1,2.11,1.67C147.85,230.3,146.54,234.7,143.79,237.6Z" style="fill:#FFFFFF"></path>
<path d="M143.79,237.6a7.75,7.75,0,0,1-3.49,2.26l-.15,0-.1,0-.24,0-.28,0h-.26a2.69,2.69,0,0,1-2.53-1.69,4.57,4.57,0,0,1-.36-1.41c.2-.1.42-.21.63-.33a11.94,11.94,0,0,0,5.4-9.34c0-.26,0-.51,0-.74a4.25,4.25,0,0,1,1.9-.4h.12l.09,0h.11a2.71,2.71,0,0,1,2.11,1.67C147.85,230.3,146.54,234.7,143.79,237.6Z" style="opacity:0.30000000000000004"></path>
<path d="M153.76,229.42h0a.47.47,0,0,0-.17,0l-2.3-.13a.37.37,0,0,1-.39-.37c0-.37.05-.73.05-1.08a10.63,10.63,0,0,0-.05-1.14,1.12,1.12,0,0,1,.25-.68l2.57-3.12a.71.71,0,0,0,.16-.64l-1.22-2.7a.27.27,0,0,0-.07-.08h0a.37.37,0,0,0-.39.12l-2.75,2.51a.48.48,0,0,1-.6.1,4.31,4.31,0,0,0-1.17-.68.45.45,0,0,1-.28-.48l.85-3.84a.26.26,0,0,0-.12-.28.49.49,0,0,0-.25,0l-2.69.27a.73.73,0,0,0-.59.41l-1.45,3.9a1.26,1.26,0,0,1-.59.57,12.41,12.41,0,0,0-1.66,1c-.23.15-.48.16-.58,0l-1.37-2.1c-.1-.14-.32-.11-.5.07L135.48,224a.76.76,0,0,0-.23.64l.82,2.78a1,1,0,0,1-.15.67,23.07,23.07,0,0,0-1.36,2.35,1.06,1.06,0,0,1-.64.48l-2.52.61a.84.84,0,0,0-.57.47l-1.27,4.28a.3.3,0,0,0,.31.38l2.31.13a.39.39,0,0,1,.39.38,12.68,12.68,0,0,0,0,2.22,1.1,1.1,0,0,1-.25.68l-2.57,3.11a.67.67,0,0,0-.15.64l1.22,2.7a.14.14,0,0,0,.07.08h0l.1,0h0a.48.48,0,0,0,.3-.14L134,244a.49.49,0,0,1,.6-.1,4.22,4.22,0,0,0,1.18.68.43.43,0,0,1,.27.48l-.84,3.85a.22.22,0,0,0,.11.26h0a.47.47,0,0,0,.25,0l2.68-.26a.77.77,0,0,0,.59-.41l1.46-3.9a1.23,1.23,0,0,1,.58-.57l.86-.45.81-.51c.22-.16.47-.17.57,0l1.37,2.1a.13.13,0,0,0,.07.06.36.36,0,0,0,.43-.13L148,242a.78.78,0,0,0,.22-.65l-.82-2.78a1,1,0,0,1,.16-.67,23,23,0,0,0,1.35-2.35,1.06,1.06,0,0,1,.64-.48l2.52-.6a.85.85,0,0,0,.57-.48l1.27-4.27A.29.29,0,0,0,153.76,229.42ZM140.3,239.86l-.15,0-.11,0-.23,0-.28,0h-.25a2.71,2.71,0,0,1-2.53-1.71,4.44,4.44,0,0,1-.37-1.4,5,5,0,0,1,0-.78,12,12,0,0,1,3.32-7.63,9,9,0,0,1,2-1.65,4.86,4.86,0,0,1,.68-.35,4.28,4.28,0,0,1,1.9-.4h.32a2.69,2.69,0,0,1,2.11,1.67c1.14,2.52-.17,6.91-2.92,9.82A7.75,7.75,0,0,1,140.3,239.86Z" style="fill:#FFFFFF"></path><line x1="147.15" y1="216.29" x2="152.57" y2="219.43" style="fill:none"></line>
<path d="M134.43,230.66a1.12,1.12,0,0,1-.51.3l-2.52.61a.85.85,0,0,0-.46.29l-5.44-3.13a.86.86,0,0,1,.48-.3l2.52-.61a1.06,1.06,0,0,0,.5-.29h0Z" style="opacity:0.2"></path>
<path d="M136.08,227.55l-5.42-3.13a.31.31,0,0,0,0-.1l-.83-2.78a.47.47,0,0,1,0-.28l4.14,2.38,1.28.74a.63.63,0,0,0,0,.3l.82,2.78A.25.25,0,0,1,136.08,227.55Z" style="opacity:0.30000000000000004"></path>
<path d="M144.72,217.3a.41.41,0,0,0-.14.21l-1.46,3.9s0,0,0,0l-5.43-3.13,0,0,1.45-3.91a.77.77,0,0,1,.14-.19Z" style="opacity:0.30000000000000004"></path>
<path d="M152.54,219.41a.4.4,0,0,0-.38.13l-2.74,2.51a.48.48,0,0,1-.6.1,4.31,4.31,0,0,0-1.17-.68.45.45,0,0,1-.28-.48l.85-3.84a.27.27,0,0,0-.12-.28h0l-1-.59h.1l.06,0Z" style="opacity:0.30000000000000004"></path>
<path d="M153.75,229.41a.47.47,0,0,0-.17,0l-2.3-.13a.38.38,0,0,1-.39-.38c0-.36.05-.72.05-1.07Z" style="opacity:0.30000000000000004"></path>
<path d="M144.6,245.28h0l-2.82-1.64c.26-.16.54-.33.8-.52s.48-.16.58,0l1.37,2.1A.19.19,0,0,0,144.6,245.28Z" style="opacity:0.4"></path>
<path d="M136.08,245.08l-.84,3.85a.22.22,0,0,0,.11.26L131,246.67a.48.48,0,0,0,.3-.14L134,244a.49.49,0,0,1,.6-.1,4.25,4.25,0,0,0,1.18.69A.42.42,0,0,1,136.08,245.08Z" style="opacity:0.4"></path>
<path d="M132.51,239.73a1.07,1.07,0,0,1-.2.38l-2.57,3.11a.84.84,0,0,0-.16.31l-5.42-3.13a.69.69,0,0,1,.16-.32l2.57-3.11a1.46,1.46,0,0,0,.2-.37Z" style="opacity:0.2"></path>
<path d="M143.11,221.43a1.35,1.35,0,0,1-.58.55,12.41,12.41,0,0,0-1.66,1c-.22.15-.48.16-.58,0l-1.37-2.09a.12.12,0,0,0-.07-.07h0l-2.58-1.5c.29-.16.58-.31.86-.44l.1-.06a1.93,1.93,0,0,0,.28-.22l.1-.11a.35.35,0,0,0,0-.08l0-.07Z" style="opacity:0.1"></path>
<path d="M132.56,239.43a.7.7,0,0,1-.05.3l-5.42-3.13a.74.74,0,0,0,0-.31,10.82,10.82,0,0,1,0-1.15l2.59,1.5h0a.35.35,0,0,0,.18,0l2.31.13a.38.38,0,0,1,.39.38A12.68,12.68,0,0,0,132.56,239.43Z" style="opacity:0.4"></path>
<path d="M136.08,227.55h0a1,1,0,0,1-.16.58,25.11,25.11,0,0,0-1.36,2.35,1,1,0,0,1-.13.18L129,227.53l.08-.09a.24.24,0,0,0,.06-.09A20.58,20.58,0,0,1,130.5,225l.06-.12a.36.36,0,0,0,0-.09.07.07,0,0,0,0-.05s0,0,0,0a.52.52,0,0,0,0-.11.4.4,0,0,0,0-.18Z" style="opacity:0.1"></path>
<path d="M129.08,227.44l-.08.09h0Z" style="opacity:0.30000000000000004"></path>
<path d="M130.87,246.64l-1.1-.64-.21-.12-1.78-1c-.16-.09-.32-.19-.48-.27-.94-.56-1.73-1-1.83-1.06h0l0,0s0,0,0-.05l-1.23-2.7a.42.42,0,0,1,0-.23s0-.06,0-.09l5.42,3.13a.52.52,0,0,0,0,.33l1.22,2.7A.12.12,0,0,0,130.87,246.64Z" style="opacity:0.4"></path>
<path d="M125.5,228.73a1,1,0,0,0-.09.17l-.16.53-.83,2.79-.28,1a.19.19,0,0,0,0,.15.32.32,0,0,0,0,.09l.07.07,0,0,.43.24.11.07h0l.34.2.18.11.21.11.08.05.22.13,1.23.7h0l2.59,1.5a.27.27,0,0,1-.12-.32l1.12-3.75.15-.53a.58.58,0,0,1,.11-.18Z" style="opacity:0.30000000000000004"></path>
<path d="M136.25,219.28l-2.81-1.63a.24.24,0,0,0-.12,0,.49.49,0,0,0-.32.16h0l-1.76,1.87-1.19,1.24a1,1,0,0,0-.2.37l4.14,2.38,1.28.74a.92.92,0,0,1,.21-.34l0,0,2.9-3.08a.39.39,0,0,1,.41-.14Z" style="fill:#fff;opacity:0.5"></path>
<path d="M148.08,216.86a.42.42,0,0,0-.23,0l-2.69.27a.74.74,0,0,0-.44.2l-5.43-3.13a.78.78,0,0,1,.45-.21l2.68-.27a.45.45,0,0,1,.27.05l.72.42.36.21,2.3,1.33c.19.11.38.23.57.33l.41.24Z" style="fill:#fff;opacity:0.5"></path><line x1="147.21" y1="216.32" x2="147.14" y2="216.29" style="fill:none"></line>
<path d="M97.3,273.4l.11.07-.14-.08-.25-.15Z" style="opacity:0.30000000000000004"></path>
<path d="M95.36,271.92a.41.41,0,0,0,0,.22.28.28,0,0,1,0-.22l.39-1.31Z" style="fill:#FFFFFF"></path>
<path d="M95.36,271.92a.41.41,0,0,0,0,.22.28.28,0,0,1,0-.22l.39-1.31Z" style="fill:#fff;opacity:0.4"></path>
<path d="M132.72,252l-7.33-4.24-.08-.05a.32.32,0,0,0-.14,0l-.57-.32-.78-.45-1.49-.87-.49-.29-1-.57a.54.54,0,0,0-.37-.07l-3.69.36a1.1,1.1,0,0,0-.61.3.58.58,0,0,0-.19.26l-2,5.37,0,0-.06.1a.3.3,0,0,1-.07.1,1.07,1.07,0,0,1-.14.16,1.86,1.86,0,0,1-.38.3l-.14.08c-.39.18-.78.39-1.17.61l-3.87-2.24a.31.31,0,0,0-.17,0,.6.6,0,0,0-.43.22h0l-2.42,2.56-1.63,1.72a1.26,1.26,0,0,0-.29.5.64.64,0,0,0,0,.38l1.14,3.82a.61.61,0,0,1,0,.14.69.69,0,0,1,0,.24,1.24,1.24,0,0,1,0,.16v0s0,.05,0,.07a.56.56,0,0,1,0,.12l-.09.16a30,30,0,0,0-1.86,3.24l-.09.13-.12.12a1.43,1.43,0,0,1-.68.4l-3.46.83a1.24,1.24,0,0,0-.66.43.76.76,0,0,0-.13.23l-.21.73-1.14,3.83-.39,1.31a.41.41,0,0,0,0,.22.27.27,0,0,0,0,.11.24.24,0,0,0,.08.09l.06.05.59.34.16.09h0l.46.27.26.15.28.16.11.07.3.17,1.69,1h0c0,.54,0,1.06.06,1.58a1,1,0,0,1-.07.42,1.56,1.56,0,0,1-.27.51l-3.53,4.28a.92.92,0,0,0-.22.44l0,.12a.61.61,0,0,0,0,.31L97.07,286l.05.07.06,0v0c.14.07-.45-.27.85.49l.66.38,2.44,1.41.29.17,1.52.88a.31.31,0,0,1-.1-.12l-1.67-3.71a.6.6,0,0,1,0-.44,1.17,1.17,0,0,1,.22-.43l3.53-4.28a1.7,1.7,0,0,0,.28-.51,1,1,0,0,0,.07-.43,17.14,17.14,0,0,1,0-3,.51.51,0,0,0-.53-.52l-3.17-.18a.66.66,0,0,1-.25-.07h0a.39.39,0,0,1-.16-.45l1.53-5.15.22-.72a.69.69,0,0,1,.14-.25,1.3,1.3,0,0,1,.64-.4l3.47-.84a1.53,1.53,0,0,0,.69-.41,1.33,1.33,0,0,0,.19-.24,29.67,29.67,0,0,1,1.86-3.23,1.35,1.35,0,0,0,.22-.8h0a.23.23,0,0,0,0-.12L109,259.29a.77.77,0,0,1,0-.42,1.4,1.4,0,0,1,.28-.47l.06-.06,4-4.22a.56.56,0,0,1,.56-.2l0,0a.28.28,0,0,1,.1.09l1.88,2.88c.14.21.48.19.79,0a16.38,16.38,0,0,1,2.29-1.32,1.86,1.86,0,0,0,.79-.75s0,0,0,0l2-5.36a.76.76,0,0,1,.2-.28,1,1,0,0,1,.61-.28l3.69-.37a.64.64,0,0,1,.32,0l0,0a.32.32,0,0,1,.16.37l-1.16,5.28a.6.6,0,0,0,.38.66,5.91,5.91,0,0,1,1.61.94.68.68,0,0,0,.83-.14l3.77-3.45A.55.55,0,0,1,132.72,252Z" style="fill:#FFFFFF"></path>
<path d="M130.52,263.55c0,.49,0,1-.07,1.48a.51.51,0,0,0,.53.52l3.16.18a.52.52,0,0,1,.23,0Z" style="fill:#FFFFFF"></path>
<path d="M119.82,284.62c-.13-.21-.47-.19-.78,0s-.75.49-1.11.7l3.88,2.26h0a.39.39,0,0,1-.1-.08Z" style="fill:#FFFFFF"></path>
<path d="M109.73,286.66a6.12,6.12,0,0,1-1.62-.94.67.67,0,0,0-.82.14l-3.77,3.45a.69.69,0,0,1-.41.19l6,3.46a.33.33,0,0,1-.15-.36l1.16-5.28A.58.58,0,0,0,109.73,286.66Z" style="fill:#FFFFFF"></path>
<path d="M120.69,277a10.58,10.58,0,0,1-4.79,3.11l-.21.05-.14,0-.33,0-.38,0h-.35A3.7,3.7,0,0,1,111,278a6.22,6.22,0,0,1-.5-1.94c.28-.13.58-.28.87-.45a16.35,16.35,0,0,0,7.41-12.83c0-.36,0-.69,0-1a5.78,5.78,0,0,1,2.62-.55h.16l.13,0,.14,0a3.72,3.72,0,0,1,2.91,2.29C126.27,267,124.47,273,120.69,277Z" style="fill:#FFFFFF"></path>
<path d="M120.69,277a10.58,10.58,0,0,1-4.79,3.11l-.21.05-.14,0-.33,0-.38,0h-.35A3.7,3.7,0,0,1,111,278a6.22,6.22,0,0,1-.5-1.94c.28-.13.58-.28.87-.45a16.35,16.35,0,0,0,7.41-12.83c0-.36,0-.69,0-1a5.78,5.78,0,0,1,2.62-.55h.16l.13,0,.14,0a3.72,3.72,0,0,1,2.91,2.29C126.27,267,124.47,273,120.69,277Z" style="opacity:0.30000000000000004"></path>
<path d="M134.39,265.8h0a.41.41,0,0,0-.23-.06l-3.16-.18a.51.51,0,0,1-.53-.52c0-.5.07-1,.07-1.47s0-1.06-.07-1.58a1.54,1.54,0,0,1,.35-.93l3.53-4.28a.94.94,0,0,0,.21-.87l-1.67-3.71a.22.22,0,0,0-.11-.12h0a.51.51,0,0,0-.54.17l-3.77,3.44a.68.68,0,0,1-.83.14,5.77,5.77,0,0,0-1.61-.94.6.6,0,0,1-.38-.66l1.17-5.28a.34.34,0,0,0-.16-.37.67.67,0,0,0-.35-.06l-3.69.37a1,1,0,0,0-.81.56l-2,5.36a1.73,1.73,0,0,1-.8.78,16.38,16.38,0,0,0-2.29,1.32c-.31.21-.66.22-.79,0L114,254c-.13-.21-.43-.16-.68.09l-4,4.28a1.06,1.06,0,0,0-.31.88l1.13,3.82a1.34,1.34,0,0,1-.21.92,30.78,30.78,0,0,0-1.86,3.24,1.49,1.49,0,0,1-.88.65l-3.47.84a1.11,1.11,0,0,0-.78.65l-1.75,5.87a.42.42,0,0,0,.43.53l3.17.18a.51.51,0,0,1,.53.51,17.25,17.25,0,0,0,0,3.05,1.55,1.55,0,0,1-.35.94l-3.53,4.28a1,1,0,0,0-.21.88l1.67,3.7a.26.26,0,0,0,.11.12h0a.31.31,0,0,0,.13,0h0a.69.69,0,0,0,.41-.19l3.77-3.45a.67.67,0,0,1,.82-.14,6.06,6.06,0,0,0,1.61.94.58.58,0,0,1,.38.66l-1.16,5.28a.32.32,0,0,0,.15.36h0a.55.55,0,0,0,.35.06l3.69-.36a1.06,1.06,0,0,0,.81-.57l2-5.36a1.73,1.73,0,0,1,.8-.78c.39-.18.79-.39,1.18-.62s.74-.45,1.11-.7.65-.23.79,0l1.89,2.88a.2.2,0,0,0,.09.09.49.49,0,0,0,.58-.18l4.06-4.28a1.07,1.07,0,0,0,.31-.89l-1.13-3.81a1.29,1.29,0,0,1,.21-.92,31.83,31.83,0,0,0,1.86-3.24,1.45,1.45,0,0,1,.88-.65l3.46-.84a1.11,1.11,0,0,0,.79-.65l1.75-5.87A.4.4,0,0,0,134.39,265.8ZM115.9,280.14l-.21.05-.14,0-.33,0-.38,0h-.35A3.71,3.71,0,0,1,111,278a6.23,6.23,0,0,1-.51-1.93,9.51,9.51,0,0,1-.06-1.08A16.47,16.47,0,0,1,115,264.5a12.77,12.77,0,0,1,2.79-2.27,8.12,8.12,0,0,1,.93-.47,5.93,5.93,0,0,1,2.62-.56h.16l.13,0,.14,0a3.69,3.69,0,0,1,2.9,2.29c1.57,3.46-.23,9.5-4,13.49A10.49,10.49,0,0,1,115.9,280.14Z" style="fill:#FFFFFF"></path><line x1="125.3" y1="247.75" x2="132.76" y2="252.07" style="fill:none"></line>
<path d="M107.83,267.5a1.53,1.53,0,0,1-.69.41l-3.47.84a1.3,1.3,0,0,0-.64.4l-5.8-3.33a1.24,1.24,0,0,1,.66-.43l3.46-.83a1.43,1.43,0,0,0,.68-.4h0Z" style="opacity:0.2"></path>
<path d="M110.1,263.22l-5.78-3.33a.61.61,0,0,0,0-.14l-1.14-3.82a.64.64,0,0,1,0-.38l4,2.31,1.76,1a.77.77,0,0,0,0,.42l1.12,3.81A.23.23,0,0,1,110.1,263.22Z" style="opacity:0.30000000000000004"></path>
<path d="M122,249.15a.76.76,0,0,0-.2.28l-2,5.36s0,0,0,0L114,251.48l0,0,2-5.37a.58.58,0,0,1,.19-.26Z" style="opacity:0.30000000000000004"></path>
<path d="M132.72,252a.55.55,0,0,0-.52.18l-3.77,3.45a.68.68,0,0,1-.83.14,5.91,5.91,0,0,0-1.61-.94.6.6,0,0,1-.38-.66l1.16-5.28a.32.32,0,0,0-.16-.37l0,0-1.42-.82a.32.32,0,0,1,.14,0l.08.05Z" style="opacity:0.30000000000000004"></path>
<path d="M134.37,265.78a.52.52,0,0,0-.23,0l-3.16-.18a.51.51,0,0,1-.53-.52c0-.5.07-1,.07-1.48Z" style="opacity:0.30000000000000004"></path>
<path d="M121.81,287.59h0l-3.88-2.26c.36-.21.74-.45,1.11-.7s.65-.23.78,0l1.89,2.89A.39.39,0,0,0,121.81,287.59Z" style="opacity:0.4"></path>
<path d="M110.1,287.32l-1.16,5.28a.33.33,0,0,0,.15.36l-6-3.46a.69.69,0,0,0,.41-.19l3.77-3.45a.67.67,0,0,1,.82-.14,6.12,6.12,0,0,0,1.62.94A.58.58,0,0,1,110.1,287.32Z" style="opacity:0.4"></path>
<path d="M105.2,280a1.7,1.7,0,0,1-.28.51l-3.53,4.28a1.17,1.17,0,0,0-.22.43l-5.78-3.34a.92.92,0,0,1,.22-.44l3.53-4.28a1.56,1.56,0,0,0,.27-.51Z" style="opacity:0.2"></path>
<path d="M119.76,254.82a1.86,1.86,0,0,1-.79.75,16.38,16.38,0,0,0-2.29,1.32c-.31.21-.65.23-.79,0L114,254a.28.28,0,0,0-.1-.09l0,0L112,252.83c.39-.22.78-.43,1.17-.61l.14-.08a1.86,1.86,0,0,0,.38-.3,1.07,1.07,0,0,0,.14-.16.3.3,0,0,0,.07-.1l.06-.1Z" style="opacity:0.1"></path>
<path d="M105.27,279.54a1,1,0,0,1-.07.43l-5.79-3.35a1,1,0,0,0,.07-.42c0-.52-.07-1-.06-1.58l1.88,1.1h0a.66.66,0,0,0,.25.07l3.17.18a.51.51,0,0,1,.53.52A17.14,17.14,0,0,0,105.27,279.54Z" style="opacity:0.4"></path>
<path d="M110.1,263.22h0a1.35,1.35,0,0,1-.22.8,29.67,29.67,0,0,0-1.86,3.23,1.33,1.33,0,0,1-.19.24L102,264.16l.11-.12.09-.13a30,30,0,0,1,1.86-3.24l.09-.16a.56.56,0,0,0,0-.12s0,0,0-.07v0a1.24,1.24,0,0,0,0-.16.69.69,0,0,0,0-.24Z" style="opacity:0.1"></path>
<path d="M102.15,264l-.11.12h0Z" style="opacity:0.30000000000000004"></path>
<path d="M103,289.46l-1.52-.88-.29-.17L98.7,287l-.66-.38c-1.3-.76-.71-.42-.85-.49v0l-.06,0-.05-.07-1.68-3.72a.61.61,0,0,1,0-.31l0-.12,5.78,3.34a.6.6,0,0,0,0,.44l1.67,3.71A.31.31,0,0,0,103,289.46Z" style="opacity:0.4"></path>
<path d="M97.23,265.82a.76.76,0,0,0-.13.23l-.21.73-1.14,3.83-.39,1.31a.41.41,0,0,0,0,.22.27.27,0,0,0,0,.11.24.24,0,0,0,.08.09l.06.05.59.34.16.09h0l.46.27.26.15.28.16.11.07.3.17,1.69,1h0l1.88,1.1a.39.39,0,0,1-.16-.45l1.53-5.15.22-.72a.69.69,0,0,1,.14-.25Z" style="opacity:0.30000000000000004"></path>
<path d="M112,252.83l-3.87-2.24a.31.31,0,0,0-.17,0,.6.6,0,0,0-.43.22h0l-2.42,2.56-1.63,1.72a1.26,1.26,0,0,0-.29.5l4,2.31,1.76,1a1.4,1.4,0,0,1,.28-.47l.06-.06,4-4.22a.56.56,0,0,1,.56-.2Z" style="fill:#fff;opacity:0.5"></path>
<path d="M126.59,248.54a.64.64,0,0,0-.32,0l-3.69.37a1,1,0,0,0-.61.28l-5.79-3.34a1.1,1.1,0,0,1,.61-.3l3.69-.36a.54.54,0,0,1,.37.07l1,.57.49.29,1.49.87.78.45.57.32Z" style="fill:#fff;opacity:0.5"></path><line x1="125.39" y1="247.8" x2="125.3" y2="247.75" style="fill:none"></line>
<path d="M89.84,403.54l-3.71-2.14h0a2.19,2.19,0,0,1-1-2V326.53a6.93,6.93,0,0,1,3.13-5.43L253,226.29a2.22,2.22,0,0,1,2.17-.24h0l0,0h0l3.7,2.13-2.78,72.73a6.9,6.9,0,0,1-3.14,5.42Z" style="fill:#fafafa"></path>
<path d="M88.9,328.67v72.84c0,2,1.4,2.8,3.13,1.81L256.72,308.5a6.93,6.93,0,0,0,3.13-5.43V230.24c0-2-1.41-2.81-3.14-1.81L92,323.25A6.9,6.9,0,0,0,88.9,328.67Z" style="fill:#ebebeb"></path>
<path d="M86.12,401.39l3.59,2.07a2.29,2.29,0,0,1-.81-2V328.66a6.32,6.32,0,0,1,.82-2.91L86,323.61a6.3,6.3,0,0,0-.82,2.92v72.83a2.17,2.17,0,0,0,.94,2Z" style="fill:#e0e0e0"></path>
<path d="M102.23,384.6l-4.61-2.66a2.82,2.82,0,0,1-1.27-2.2V341.38a2.8,2.8,0,0,1,1.27-2.2l45.15-26.07a2.84,2.84,0,0,1,2.54,0l4.61,2.67a2.8,2.8,0,0,1,1.27,2.2v38.36a2.82,2.82,0,0,1-1.27,2.2L104.78,384.6A2.8,2.8,0,0,1,102.23,384.6Z" style="fill:#37474f"></path>
<path d="M104.56,384.7a2.8,2.8,0,0,1-2.32-.1l-4.62-2.66a2.82,2.82,0,0,1-1.27-2.2V341.38a2.54,2.54,0,0,1,.37-1.25l7.16,4.12a2.52,2.52,0,0,0-.38,1.26v38.36C103.5,384.6,104,384.93,104.56,384.7Z" style="fill:#263238"></path>
<path d="M103.51,345.51v38.36c0,.81.56,1.14,1.27.73l45.14-26.06a2.82,2.82,0,0,0,1.27-2.2V318c0-.81-.57-1.14-1.27-.74l-45.14,26.07A2.78,2.78,0,0,0,103.51,345.51Z" style="fill:#455a64"></path><polygon points="103.51 357.81 151.19 330.27 151.19 331.65 103.5 359.18 103.51 357.81" style="fill:#263238"></polygon><polygon points="123.77 344.73 130.92 340.6 130.92 346.11 123.77 350.23 123.77 344.73" style="fill:#FFFFFF"></polygon><polygon points="130.92 340.6 129.73 339.91 122.58 344.04 123.77 344.73 130.92 340.6" style="fill:#FFFFFF"></polygon><polygon points="130.92 340.6 129.73 339.91 122.58 344.04 123.77 344.73 130.92 340.6" style="fill:#fff;opacity:0.4"></polygon><polygon points="122.58 344.04 122.58 349.55 123.77 350.23 123.77 344.73 122.58 344.04" style="fill:#FFFFFF"></polygon><polygon points="122.58 344.04 122.58 349.55 123.77 350.23 123.77 344.73 122.58 344.04" style="opacity:0.1"></polygon>
<path d="M114.31,333.73c-.81,0-1.47-.07-1.47-.88V326.2a7.06,7.06,0,0,1,3.27-5.68L129,313.06a3,3,0,0,1,4.74,2.74v6.7c0,.81-.65.88-1.46.88s-1.47-.07-1.47-.88v-6.7a1.22,1.22,0,0,0,0-.33,1.57,1.57,0,0,0-.3.13l-12.93,7.47a4.19,4.19,0,0,0-1.81,3.13v6.65C115.77,333.66,115.12,333.73,114.31,333.73Z" style="fill:#FFFFFF"></path>
<path d="M157.59,293l38-21.91a.9.9,0,0,1,.87-.09l2,.9-1.65,48.22a2.7,2.7,0,0,1-1.23,2.13l-36.78,22.9s-1.82-.8-2.05-.92a.89.89,0,0,1-.37-.81V295.11A2.74,2.74,0,0,1,157.59,293Z" style="fill:#e0e0e0"></path>
<path d="M159.63,293.89l38-21.92c.68-.39,1.23-.07,1.23.71V321a2.7,2.7,0,0,1-1.23,2.13l-38,21.88c-.68.39-1.24.07-1.24-.71V296A2.73,2.73,0,0,1,159.63,293.89Z" style="fill:#fff"></path>
<g style="clip-path:url(#freepik--clip-path-3--inject-2)">
<g id="freepik--character--inject-2">
<path d="M189.84,342.34c-4.58-20.07-10.09-23.71-5.2-27.89,5.7-.87,7.9.92,8.77,6.8.43,2.88,1.36,14.91,2.53,19.41,1,3.95,2.41,8.85,3.95,11.67a1.65,1.65,0,0,0,1.26.88c1.43.21,1.85,1,3,1.61.91.46,1.58.34,1.54.67a1.79,1.79,0,0,1-1.44,1.42,5.14,5.14,0,0,1-1.71-.11,9.61,9.61,0,0,0,2.49,2.28c2.24,1.45,2.61,2.87-.94,4.76-2.23,1.19-4.32.61-7.08-3.9a37,37,0,0,1-2.78-5.24C192.33,349.81,190.57,345.58,189.84,342.34Z" style="fill:#ffa8a7"></path>
</g>
<path d="M192.7,310.05l-15,4c-3.56.95-6.44-1.6-6.44-5.71v-5.78c0-6.58,4.62-13.15,10.32-14.68l.77-.2c5.69-1.53,10.31,2.56,10.31,9.14v13.22Z" style="fill:#FFFFFF"></path>
<g style="opacity:0.5">
<path d="M192.7,310.05l-15,4c-3.56.95-6.44-1.6-6.44-5.71v-5.78c0-6.58,4.62-13.15,10.32-14.68l.77-.2c5.69-1.53,10.31,2.56,10.31,9.14v13.22Z"></path>
</g>
<path d="M174.85,290.62c-.56-.56-1.51-.35-2.12.46l1.13,1.12a1.33,1.33,0,0,0-.78.15,2.31,2.31,0,0,0-1.15,2.37l2.93-1.51a1.52,1.52,0,0,0-.06-.2A1.93,1.93,0,0,0,174.85,290.62Z" style="fill:#FFFFFF"></path>
<path d="M174.85,290.62c-.56-.56-1.51-.35-2.12.46l1.13,1.12a1.33,1.33,0,0,0-.78.15,2.31,2.31,0,0,0-1.15,2.37l2.93-1.51a1.52,1.52,0,0,0-.06-.2A1.93,1.93,0,0,0,174.85,290.62Z" style="opacity:0.5"></path>
<path d="M177.79,316.51s-6.24,1.47-7,2.07c4.52,4.85.83,15.08.83,15.08l2.51,8.74A50.45,50.45,0,0,0,169,354.19c-1.51,5-2.46,8.7-3.61,23.66,5.93,4.72,25.7-.45,30.73-9.4,0,0-1.54-9.81-3.55-18.91-1.46-6.65-2.9-10.24-2.54-12.64,2.65-10.13,2.85-12.65,2.39-14.63-1.33-5.55-6.55-8.15-7.84-7.81Z" style="fill:#37474f"></path>
<path d="M188.67,291.35c1.13.47,2.53,3.37,2.39,10.29-.11,5.87-1.75,7.74-2.57,8.38s-2.41.81-4,.92v3.5s2.13,2.29,2,3.93-3.07,2.81-5.07,1.78a12.28,12.28,0,0,1-3.67-3.64l0-8.06a1.64,1.64,0,0,1-2.45.12,3.32,3.32,0,0,1-.71-4.42c1-1.42,2.82-1.59,3.52-.13a10.51,10.51,0,0,1,4.41-5.27C185.81,296.68,187.55,294.82,188.67,291.35Z" style="fill:#ffa8a7"></path>
<path d="M185.42,301.69a1,1,0,0,1-.6.95c-.35.12-.65-.13-.67-.54a1,1,0,0,1,.61-1C185.11,301,185.41,301.27,185.42,301.69Z" style="fill:#263238"></path>
<path d="M185.59,306.59l1.48.14a1,1,0,0,1-1,.87C185.7,307.56,185.47,307.11,185.59,306.59Z" style="fill:#f28f8f"></path>
<path d="M190.63,298l-1.28-.68c.23-.49.71-.73,1.06-.54A.91.91,0,0,1,190.63,298Z" style="fill:#263238"></path>
<path d="M183.58,300.47l1.28-1.37c-.23-.36-.71-.34-1.07,0A1.16,1.16,0,0,0,183.58,300.47Z" style="fill:#263238"></path>
<path d="M190.34,299.84a1,1,0,0,1-.61,1c-.35.11-.65-.13-.66-.55a1,1,0,0,1,.6-1C190,299.18,190.32,299.43,190.34,299.84Z" style="fill:#263238"></path><polygon points="187.34 300.22 187.44 304.61 189.45 303.35 187.34 300.22" style="fill:#f28f8f"></polygon>
<path d="M184.54,310.94c-1.63.19-5,0-5.49-1.41a2.88,2.88,0,0,0,1.17,1.64c1,.72,4.32.94,4.32.94Z" style="fill:#f28f8f"></path><polygon points="172.91 338.18 177.48 343.99 174.13 342.4 172.91 338.18" style="fill:#263238"></polygon>
<path d="M160,349.93c3.87-19.29,6.54-28.4,10.77-31.35,2.13.21,2.77,3,3,4.64a18.34,18.34,0,0,1-2.16,10.44s-5.27,12.92-6.17,18a88.19,88.19,0,0,0-1.64,13.78,2.31,2.31,0,0,0,.63,1.63c1,1,1,2.05,1.71,3.3.52,1,1.09,1.25.93,1.54a1.33,1.33,0,0,1-1.7.6,4.59,4.59,0,0,1-1.28-1.08,13.53,13.53,0,0,0,1,3.68c1.16,2.71.87,4.32-2.65,4.19-2.21-.08-3.6-1.83-3.93-7.87a53.68,53.68,0,0,1-.06-6.78A145.72,145.72,0,0,1,160,349.93Z" style="fill:#ffa8a7"></path>
</g>
<path d="M160.56,349.75l36.19-20.89c1.2-.69,2.17-.2,2.17,1.09a4.64,4.64,0,0,1-2.17,3.6l-36.19,20.89c-1.2.69-2.17.2-2.17-1.09A4.64,4.64,0,0,1,160.56,349.75Z" style="fill:#455a64"></path>
<path d="M205.19,267.7l36.2-20.9c1.19-.69,2.16-.2,2.16,1.1a4.65,4.65,0,0,1-2.16,3.59l-36.2,20.9c-1.19.69-2.16.2-2.16-1.1A4.65,4.65,0,0,1,205.19,267.7Z" style="fill:#455a64"></path>
<path d="M204.06,277.73l46.58-26.89c.6-.35,1.09-.1,1.09.55a2.31,2.31,0,0,1-1.09,1.79l-46.53,26.9c-.6.34-1.09.1-1.11-.55A2.3,2.3,0,0,1,204.06,277.73Z" style="fill:#fff"></path>
<path d="M204.06,282.41l46.58-26.89c.6-.34,1.09-.1,1.09.55a2.33,2.33,0,0,1-1.09,1.8l-46.53,26.89c-.6.34-1.09.1-1.11-.55A2.3,2.3,0,0,1,204.06,282.41Z" style="fill:#fff"></path>
<path d="M204.06,287.1l46.58-26.9c.6-.34,1.09-.1,1.09.55a2.33,2.33,0,0,1-1.09,1.8l-46.53,26.89c-.6.35-1.09.1-1.11-.55A2.28,2.28,0,0,1,204.06,287.1Z" style="fill:#fff"></path>
<path d="M204.06,291.78l46.58-26.89c.6-.35,1.09-.1,1.09.54a2.32,2.32,0,0,1-1.09,1.8l-46.53,26.89c-.6.35-1.09.1-1.11-.54A2.28,2.28,0,0,1,204.06,291.78Z" style="fill:#fff"></path>
<path d="M204.06,296.46l46.58-26.89c.6-.35,1.09-.1,1.09.55a2.33,2.33,0,0,1-1.09,1.8l-46.53,26.89c-.6.34-1.09.1-1.11-.55A2.3,2.3,0,0,1,204.06,296.46Z" style="fill:#fff"></path>
<path d="M205.19,305.06l3.75-2.16c1.2-.69,2.17-.13,2.17,1.25v4.38a4.78,4.78,0,0,1-2.17,3.75l-3.79,2.19c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.81,4.81,0,0,1,205.19,305.06Z" style="fill:#FFFFFF"></path>
<path d="M212.52,302c0,.65.48.89,1.08.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.32,2.32,0,0,0,212.52,302Z" style="fill:#455a64"></path>
<path d="M212.52,305.52c0,.65.48.89,1.08.55l10-5.79a2.33,2.33,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.79A2.29,2.29,0,0,0,212.52,305.52Z" style="fill:#455a64"></path>
<path d="M212.52,309.05c0,.64.48.89,1.08.54l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.31,2.31,0,0,0,212.52,309.05Z" style="fill:#455a64"></path>
<path d="M205.19,319.13l3.75-2.16c1.2-.69,2.17-.13,2.17,1.25v4.38a4.78,4.78,0,0,1-2.17,3.75l-3.79,2.19c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.81,4.81,0,0,1,205.19,319.13Z" style="fill:#FFFFFF"></path>
<path d="M212.52,316.07c0,.65.48.89,1.08.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.32,2.32,0,0,0,212.52,316.07Z" style="fill:#455a64"></path>
<path d="M212.52,319.59c0,.65.48.9,1.08.55l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.3,2.3,0,0,0,212.52,319.59Z" style="fill:#455a64"></path>
<path d="M212.52,323.12c0,.64.48.89,1.08.54l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.31,2.31,0,0,0,212.52,323.12Z" style="fill:#455a64"></path>
<path d="M232.21,289.76l3.75-2.17c1.2-.69,2.16-.13,2.16,1.25v4.39A4.77,4.77,0,0,1,236,297l-3.79,2.19c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.84,4.84,0,0,1,232.21,289.76Z" style="fill:#FFFFFF"></path>
<path d="M239.53,286.7c0,.64.49.89,1.09.54l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.33,2.33,0,0,0,239.53,286.7Z" style="fill:#455a64"></path>
<path d="M239.53,290.22c0,.65.49.89,1.09.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.33,2.33,0,0,0,239.53,290.22Z" style="fill:#455a64"></path>
<path d="M239.53,293.74c0,.65.49.9,1.09.55l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.31,2.31,0,0,0,239.53,293.74Z" style="fill:#455a64"></path>
<path d="M232.21,303.83l3.75-2.16c1.2-.69,2.16-.13,2.16,1.25v4.38a4.77,4.77,0,0,1-2.16,3.75l-3.79,2.19c-1.2.69-2.16.13-2.16-1.25l0-4.41A4.84,4.84,0,0,1,232.21,303.83Z" style="fill:#FFFFFF"></path>
<path d="M239.53,300.77c0,.65.49.89,1.09.55l10-5.79a2.34,2.34,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.78A2.33,2.33,0,0,0,239.53,300.77Z" style="fill:#455a64"></path>
<path d="M239.53,304.29c0,.65.49.9,1.09.55l10-5.79a2.33,2.33,0,0,0,1.09-1.79c0-.65-.48-.89-1.08-.55l-10,5.79A2.3,2.3,0,0,0,239.53,304.29Z" style="fill:#455a64"></path>
<path d="M239.53,307.82c0,.64.49.89,1.09.54l10-5.78a2.36,2.36,0,0,0,1.09-1.8c0-.64-.48-.89-1.08-.54l-10,5.78A2.32,2.32,0,0,0,239.53,307.82Z" style="fill:#455a64"></path>
</g>
<g id="freepik--Icons--inject-2">
<path d="M304.61,165.48a6,6,0,0,0-2.69-4.66l-2.19-1.26a5.93,5.93,0,0,0-5.38,0l-17.32,10a5.5,5.5,0,0,0-1.9,2,5.45,5.45,0,0,0-.79,2.65v20a5.94,5.94,0,0,0,2.69,4.65l2.19,1.27a5,5,0,0,0,.57.27l.23.07c.13,0,.25.09.39.12a3,3,0,0,0,.32.06c.11,0,.22.05.33.06l.39,0h.93c.16,0,.33,0,.49-.06l.14,0a4.37,4.37,0,0,0,.52-.12l.07,0a4.44,4.44,0,0,0,1-.4l17.32-10a6,6,0,0,0,2.69-4.66Z" style="fill:#FFFFFF"></path>
<path d="M304.61,165.46v20a5.93,5.93,0,0,1-2.69,4.66l-17.32,10a3.44,3.44,0,0,1-.65.28h0l-.18,0-.17,0c-1,.11-1.68-.6-1.68-1.9v-20a5.45,5.45,0,0,1,.79-2.65,5.5,5.5,0,0,1,1.9-2l17.32-10c1.35-.78,2.46-.28,2.65,1.1,0-.14,0-.28-.07-.42A4.41,4.41,0,0,1,304.61,165.46Z" style="fill:#FFFFFF"></path>
<path d="M285,194.34c0,.27.19.37.42.24L300,186.12a.93.93,0,0,0,.41-.72v-8.64L285,185.7Z" style="fill:#5053eb"></path>
<path d="M300,171.7,296.11,174v-1.49a1,1,0,0,0-.48-.95,1,1,0,0,0-1.06.06l-4.2,2.42a2.27,2.27,0,0,0-1.06,1.84v2.05l-3.93,2.27a.91.91,0,0,0-.42.71v3L300.45,175v-3C300.45,171.68,300.27,171.57,300,171.7Zm-9.78,4.15a1.34,1.34,0,0,1,.59-1l4.2-2.43.09,0a.27.27,0,0,1,0,.11v2l-4.9,2.83Z" style="fill:#5053eb"></path>
<path d="M304.57,165c-.19-1.37-1.31-1.87-2.65-1.09l-17.33,10a5.4,5.4,0,0,0-1.89,2l-7.57-4.37a5.58,5.58,0,0,1,1.9-2l17.32-10a5.93,5.93,0,0,1,5.38,0l2.19,1.26A6,6,0,0,1,304.57,165Z" style="fill:#fff;opacity:0.4"></path>
<path d="M284.11,200.36a.76.76,0,0,1-.16.06l-.4.13a5.92,5.92,0,0,1-1.05.21h-.05l-.54,0a5.49,5.49,0,0,1-2.69-.64L277,198.88a6,6,0,0,1-2.69-4.66v-20a5,5,0,0,1,.32-1.67c.09-.23.19-.45.29-.66l.18-.32,7.57,4.37a5.45,5.45,0,0,0-.79,2.65v20c0,1.3.69,2,1.68,1.9l.16,0Z" style="opacity:0.1"></path>
<path d="M304.61,207.71a6,6,0,0,0-2.69-4.66l-2.19-1.26a5.93,5.93,0,0,0-5.38,0l-17.32,10a6,6,0,0,0-2.69,4.65v20A5.94,5.94,0,0,0,277,241.1l2.19,1.27a3.68,3.68,0,0,0,.57.26l.23.08.39.12.32.06.33.06c.13,0,.26,0,.39,0l.27,0h.66l.49,0,.14,0c.18,0,.35-.07.52-.12l.07,0a4.44,4.44,0,0,0,1-.4l17.32-10a6,6,0,0,0,2.69-4.66Z" style="fill:#37474f"></path>
<path d="M295.77,223.55a2.59,2.59,0,0,0-.5,1,1.32,1.32,0,0,0,.58-.59c0-.07.13-.3,0-.41A.08.08,0,0,0,295.77,223.55Z" style="fill:#f0f0f0"></path>
<path d="M293.58,223.05a.24.24,0,0,0-.14.21,1.07,1.07,0,0,0,.14.71,1.89,1.89,0,0,0,.13-.87C293.7,223,293.67,223,293.58,223.05Z" style="fill:#f0f0f0"></path>
<path d="M291.39,226.08h0a.27.27,0,0,0-.1.15.27.27,0,0,0,.05.35c.11.1.32.1.57-.07C291.69,226.16,291.51,226,291.39,226.08Z" style="fill:#f0f0f0"></path>
<path d="M293.58,218c-2.43,1.39-4.39,5.15-4.39,8.38,0,4.64,2.87,3.75,2.87,5.62a.53.53,0,0,0,.45.57,2.71,2.71,0,0,0,2.14-1.24,2,2,0,0,0,.44-1.08h0c0-1.87,2.87-4.3,2.87-8.94C298,218,296,216.56,293.58,218Zm2.53,6.19a2,2,0,0,1-1,1c-.09.36-.19.78-.27,1.28a25.19,25.19,0,0,0-.36,4.15.45.45,0,0,1-.18.35h0c-.1.05-.18,0-.18-.13a24.53,24.53,0,0,1,.37-4.28q.12-.7.27-1.29a1.26,1.26,0,0,1-.47,0,1.5,1.5,0,0,1-.7-.39,8.38,8.38,0,0,1-.71,1.2,5.13,5.13,0,0,1-.46.57c.09.28.18.61.26,1a18.76,18.76,0,0,1,.37,3.85.45.45,0,0,1-.18.34c-.1.06-.18,0-.18-.14a19.15,19.15,0,0,0-.36-3.73,6.71,6.71,0,0,0-.27-1c-.44.34-.8.37-1,.19a.86.86,0,0,1-.08-1,.94.94,0,0,1,.5-.56c.28-.08.56.15.8.64a4.09,4.09,0,0,0,.42-.51,7.12,7.12,0,0,0,.67-1.16,1.64,1.64,0,0,1-.26-1.2,1.08,1.08,0,0,1,.49-.77c.24-.13.42-.06.48.2a2.87,2.87,0,0,1-.26,1.51,1.39,1.39,0,0,0,.67.39,1.21,1.21,0,0,0,.42,0,3.5,3.5,0,0,1,.81-1.56c.19-.16.37-.17.49,0A1.07,1.07,0,0,1,296.11,224.15Z" style="fill:#f0f0f0"></path>
<path d="M293.58,216.86c-.17.1-.3,0-.3-.22v-2.29a.68.68,0,0,1,.3-.56c.16-.1.29,0,.29.22v2.29A.69.69,0,0,1,293.58,216.86Z" style="fill:#f0f0f0"></path>
<path d="M290.87,219.39c-.14.2-.32.24-.41.09l-.85-1.48a.6.6,0,0,1,.11-.61c.14-.19.32-.23.4-.09l.86,1.49A.63.63,0,0,1,290.87,219.39Z" style="fill:#f0f0f0"></path>
<path d="M288.89,223.18c-.08.23-.26.41-.41.38l-1.48-.29c-.14,0-.19-.24-.11-.48s.26-.4.41-.38l1.48.29C288.92,222.73,289,222.94,288.89,223.18Z" style="fill:#f0f0f0"></path>
<path d="M288.16,227.2a.71.71,0,0,1-.29.57l-1.72,1c-.16.1-.3,0-.3-.22a.72.72,0,0,1,.3-.57l1.72-1C288,226.88,288.16,227,288.16,227.2Z" style="fill:#f0f0f0"></path>
<path d="M288.89,230.39a.65.65,0,0,1-.11.61l-1.48,2c-.15.19-.33.23-.41.09a.65.65,0,0,1,.11-.61l1.48-2C288.63,230.29,288.81,230.25,288.89,230.39Z" style="fill:#f0f0f0"></path>
<path d="M298.26,225c.08-.24.27-.41.41-.38l1.48.29c.15,0,.19.24.11.48s-.26.4-.4.38l-1.49-.29C298.23,225.43,298.18,225.22,298.26,225Z" style="fill:#f0f0f0"></path>
<path d="M299,221a.71.71,0,0,1,.29-.57l1.72-1c.16-.1.3,0,.3.22a.72.72,0,0,1-.3.57l-1.72,1C299.12,221.28,299,221.17,299,221Z" style="fill:#f0f0f0"></path>
<path d="M298.26,217.77a.65.65,0,0,1,.11-.61l1.49-2c.14-.19.32-.23.4-.09a.62.62,0,0,1-.11.61l-1.48,2C298.53,217.87,298.34,217.91,298.26,217.77Z" style="fill:#f0f0f0"></path>
<path d="M296.28,216.27c-.14,0-.19-.24-.11-.48l.86-2.47c.08-.24.26-.41.41-.38s.19.24.1.47l-.85,2.48C296.61,216.13,296.42,216.3,296.28,216.27Z" style="fill:#f0f0f0"></path>
<path d="M295.14,230.8v1.49a2.06,2.06,0,0,1-.46,1.11,2.81,2.81,0,0,1-2.21,1.28.55.55,0,0,1-.45-.63v-1.34a.55.55,0,0,0,.45.48,2.78,2.78,0,0,0,2.21-1.28A2,2,0,0,0,295.14,230.8Z" style="fill:#f0f0f0"></path>
<path d="M304.57,207.25c-.19-1.38-1.31-1.88-2.65-1.1l-17.33,10a5.45,5.45,0,0,0-1.89,2l-7.57-4.36a5.5,5.5,0,0,1,1.9-2l17.32-10a5.93,5.93,0,0,1,5.38,0l2.19,1.26A6,6,0,0,1,304.57,207.25Z" style="fill:#455a64"></path>
<path d="M284.11,242.59l-.16.06-.4.12a4.55,4.55,0,0,1-1.05.21h-.05a4.89,4.89,0,0,1-.54,0,5.49,5.49,0,0,1-2.69-.64L277,241.11a6,6,0,0,1-2.69-4.66v-20a5,5,0,0,1,.32-1.67c.09-.23.19-.45.29-.66l.18-.32,7.57,4.36a5.48,5.48,0,0,0-.79,2.65v20c0,1.29.69,2,1.68,1.9l.16,0A2.12,2.12,0,0,0,284.11,242.59Z" style="fill:#263238"></path>
<path d="M304.61,249.93a6,6,0,0,0-2.69-4.65L299.73,244a6,6,0,0,0-5.38,0L277,254a6,6,0,0,0-2.69,4.66v20a6,6,0,0,0,2.69,4.66l2.19,1.26a3,3,0,0,0,.57.27l.23.08.39.12.32.06.33.06.39,0,.27,0h.66l.49,0,.14,0a4.36,4.36,0,0,0,.52-.11l.07,0a4.46,4.46,0,0,0,1-.41l17.32-10a5.94,5.94,0,0,0,2.69-4.65Z" style="fill:#FFFFFF"></path>
<path d="M304.57,249.48c-.19-1.38-1.31-1.88-2.65-1.1l-17.33,10a5.45,5.45,0,0,0-1.89,2L275.13,256a5.5,5.5,0,0,1,1.9-2l17.32-10a5.93,5.93,0,0,1,5.38,0l2.19,1.26A6,6,0,0,1,304.57,249.48Z" style="fill:#fff;opacity:0.4"></path>
<path d="M304.61,249.92v20a5.93,5.93,0,0,1-2.69,4.66l-17.32,10a3.44,3.44,0,0,1-.65.28h0l-.18.05-.17,0c-1,.11-1.68-.6-1.68-1.9V263a5.45,5.45,0,0,1,.79-2.65,5.5,5.5,0,0,1,1.9-2l17.32-10c1.35-.78,2.46-.28,2.65,1.1,0-.14,0-.28-.07-.42A4.5,4.5,0,0,1,304.61,249.92Z" style="fill:#FFFFFF"></path>
<path d="M301.2,264.56h0a.18.18,0,0,0-.11,0l-1.48-.08a.25.25,0,0,1-.25-.24c0-.24,0-.47,0-.7a5.85,5.85,0,0,0,0-.73.68.68,0,0,1,.17-.44l1.65-2a.44.44,0,0,0,.1-.41l-.78-1.74-.05-.05h0c-.07,0-.16,0-.26.08l-1.76,1.62a.32.32,0,0,1-.39.06,2.74,2.74,0,0,0-.76-.44.28.28,0,0,1-.17-.31l.54-2.47a.16.16,0,0,0-.07-.18.43.43,0,0,0-.17,0l-1.73.18a.47.47,0,0,0-.38.26l-.93,2.51a.85.85,0,0,1-.38.37,7.94,7.94,0,0,0-1.07.62c-.15.1-.31.1-.37,0l-.89-1.35c-.06-.1-.2-.08-.32,0l-1.89,2a.48.48,0,0,0-.15.41l.53,1.79a.65.65,0,0,1-.1.43,15.28,15.28,0,0,0-.87,1.52.71.71,0,0,1-.42.31l-1.62.39a.55.55,0,0,0-.37.3l-.82,2.76a.2.2,0,0,0,.21.24l1.48.09a.24.24,0,0,1,.25.24,7.59,7.59,0,0,0,0,1.43.75.75,0,0,1-.16.44l-1.66,2a.45.45,0,0,0-.1.41l.79,1.74a.09.09,0,0,0,0,.06h0l.06,0h0a.32.32,0,0,0,.2-.09l1.76-1.62a.34.34,0,0,1,.39-.07,2.64,2.64,0,0,0,.76.44.3.3,0,0,1,.18.31l-.55,2.48a.15.15,0,0,0,.07.17h0a.2.2,0,0,0,.16,0l1.73-.17a.49.49,0,0,0,.38-.26l.94-2.52a.72.72,0,0,1,.37-.36l.55-.29c.17-.1.35-.21.52-.33s.31-.11.37,0l.89,1.35,0,0a.26.26,0,0,0,.28-.08l1.9-2a.49.49,0,0,0,.14-.42l-.53-1.78a.66.66,0,0,1,.1-.44,12.78,12.78,0,0,0,.87-1.51.71.71,0,0,1,.42-.31l1.62-.39a.54.54,0,0,0,.37-.31l.82-2.75A.2.2,0,0,0,301.2,264.56Zm-8.67,6.73-.09,0-.07,0-.16,0-.18,0h-.16a1.74,1.74,0,0,1-1.63-1.1,2.9,2.9,0,0,1-.23-.91,2.74,2.74,0,0,1,0-.5,7.7,7.7,0,0,1,2.14-4.91,5.93,5.93,0,0,1,1.31-1.07l.44-.22a2.72,2.72,0,0,1,1.22-.26h.21a1.74,1.74,0,0,1,1.36,1.08c.73,1.62-.11,4.45-1.88,6.32A5,5,0,0,1,292.53,271.29Z" style="fill:#5053eb"></path>
<path d="M284.11,284.82l-.16.06-.4.12a4.55,4.55,0,0,1-1.05.21h-.05a4.89,4.89,0,0,1-.54,0,5.49,5.49,0,0,1-2.69-.64L277,283.33a6,6,0,0,1-2.69-4.65v-20a5,5,0,0,1,.32-1.66c.09-.23.19-.45.29-.66l.18-.33,7.57,4.37a5.48,5.48,0,0,0-.79,2.65v20c0,1.3.69,2,1.68,1.91l.16,0A2.12,2.12,0,0,0,284.11,284.82Z" style="opacity:0.1"></path>
<path d="M304.61,38.79a5.94,5.94,0,0,0-2.69-4.65l-2.19-1.27a5.93,5.93,0,0,0-5.38,0L277,42.87a6,6,0,0,0-2.69,4.66v20A6,6,0,0,0,277,72.19l2.19,1.26a3.72,3.72,0,0,0,.57.27l.23.08.39.11.32.07.33,0,.39,0,.27,0h.66l.49,0,.14,0,.52-.11.07,0a4.46,4.46,0,0,0,1-.41l17.32-10a6,6,0,0,0,2.69-4.66Z" style="fill:#455a64"></path>
<path d="M304.61,38.78v20a5.93,5.93,0,0,1-2.69,4.66l-17.32,10a3.44,3.44,0,0,1-.65.28h0l-.18,0-.17,0c-1,.11-1.68-.6-1.68-1.9v-20a5.45,5.45,0,0,1,.79-2.65,5.5,5.5,0,0,1,1.9-2l17.32-10c1.35-.78,2.46-.28,2.65,1.1,0-.14,0-.29-.07-.43A4.51,4.51,0,0,1,304.61,38.78Z" style="fill:#37474f"></path>
<path d="M292.82,46.58c2.16-1.25,3.91-.24,3.91,2.25a8.65,8.65,0,0,1-3.91,6.77c-2.16,1.24-3.91.23-3.91-2.26A8.61,8.61,0,0,1,292.82,46.58Z" style="fill:#f0f0f0"></path>
<path d="M300.52,59.9c0-4.09-2.87-5.91-6.42-3.86l-2.22,1.28a14.17,14.17,0,0,0-6.41,11.11v1.11l15-8.69Z" style="fill:#f0f0f0"></path>
<path d="M284.11,73.68l-.16.06-.4.12a5.92,5.92,0,0,1-1.05.21h-.05a4.89,4.89,0,0,1-.54,0,5.49,5.49,0,0,1-2.69-.64L277,72.19a6,6,0,0,1-2.69-4.66v-20a5.13,5.13,0,0,1,.32-1.67c.09-.22.19-.44.29-.65l.18-.33,7.57,4.37a5.45,5.45,0,0,0-.79,2.65v20c0,1.3.69,2,1.68,1.91l.16,0Z" style="fill:#263238"></path>
<path d="M304.61,81a6,6,0,0,0-2.69-4.66l-2.19-1.26a5.93,5.93,0,0,0-5.38,0L277,85.1a5.5,5.5,0,0,0-1.9,2,5.45,5.45,0,0,0-.79,2.65v20a6,6,0,0,0,2.69,4.66l2.19,1.26a5,5,0,0,0,.57.27l.23.07a2.52,2.52,0,0,0,.39.12l.32.07.33.05.39,0h.93a4.1,4.1,0,0,0,.49-.06l.14,0a4.37,4.37,0,0,0,.52-.12l.07,0a4.44,4.44,0,0,0,1-.4l17.32-10a6,6,0,0,0,2.69-4.66Z" style="fill:#FFFFFF"></path><polygon points="302.05 86.11 285.07 95.91 293.56 97.36 302.05 86.11" style="fill:#5053eb"></polygon><polygon points="293.56 99.84 285.07 95.91 285.07 109.16 302.05 99.36 302.05 86.11 293.56 99.84" style="fill:#5053eb"></polygon>
<path d="M304.57,80.57c-.19-1.38-1.31-1.88-2.65-1.1l-17.33,10a5.48,5.48,0,0,0-1.89,2l-7.57-4.37a5.58,5.58,0,0,1,1.9-2l17.32-10a5.93,5.93,0,0,1,5.38,0l2.19,1.26A6,6,0,0,1,304.57,80.57Z" style="fill:#fff;opacity:0.4"></path>
<path d="M284.11,115.9a.44.44,0,0,1-.16.06l-.4.13a5.92,5.92,0,0,1-1.05.21h-.05a4.87,4.87,0,0,1-.54,0,5.49,5.49,0,0,1-2.69-.64L277,114.42a6,6,0,0,1-2.69-4.66v-20a5,5,0,0,1,.32-1.67c.09-.23.19-.44.29-.65s.12-.22.18-.33l7.57,4.37a5.45,5.45,0,0,0-.79,2.65v20c0,1.3.69,2,1.68,1.9l.16,0A2.15,2.15,0,0,0,284.11,115.9Z" style="opacity:0.1"></path>
<path d="M304.61,123.25a6,6,0,0,0-2.69-4.66l-2.19-1.26a5.93,5.93,0,0,0-5.38,0l-17.32,10a5.5,5.5,0,0,0-1.9,2,5.45,5.45,0,0,0-.79,2.65v20a5.94,5.94,0,0,0,2.69,4.65l2.19,1.27a5,5,0,0,0,.57.27l.23.07c.13,0,.25.09.39.12a3,3,0,0,0,.32.06l.33.06.39,0h.27c.15,0,.3,0,.45,0h.21c.16,0,.33,0,.49-.06l.14,0a4.37,4.37,0,0,0,.52-.12l.07,0a4.44,4.44,0,0,0,1-.4l17.32-10a6,6,0,0,0,2.69-4.66Z" style="fill:#FFFFFF"></path>
<path d="M304.57,122.8c-.19-1.38-1.31-1.88-2.65-1.1l-17.33,10a5.48,5.48,0,0,0-1.89,2l-7.57-4.37a5.58,5.58,0,0,1,1.9-2l17.32-10a5.93,5.93,0,0,1,5.38,0l2.19,1.26A6,6,0,0,1,304.57,122.8Z" style="fill:#455a64"></path>
<path d="M304.61,123.24v20a5.93,5.93,0,0,1-2.69,4.66l-17.32,10a3.44,3.44,0,0,1-.65.28h0l-.18,0-.17,0c-1,.11-1.68-.6-1.68-1.9v-20a5.45,5.45,0,0,1,.79-2.65,5.5,5.5,0,0,1,1.9-2l17.32-10c1.35-.78,2.46-.28,2.65,1.1,0-.14,0-.28-.07-.43A4.6,4.6,0,0,1,304.61,123.24Z" style="fill:#37474f"></path><polygon points="292.83 130.79 284.48 141.46 292.58 142.44 300.94 131.78 292.83 130.79" style="fill:#f0f0f0"></polygon>
<path d="M287.55,147.61c0,1.77,2.36,1.85,5.28.16s5.28-4.49,5.28-6.26v-3.83l-5.28,6.75-5.28-.65Z" style="fill:#f0f0f0"></path>
<path d="M284.11,158.13a.44.44,0,0,1-.16.06l-.4.13a5.92,5.92,0,0,1-1.05.21h-.05l-.54,0a5.49,5.49,0,0,1-2.69-.64L277,156.65a6,6,0,0,1-2.69-4.66V132a5,5,0,0,1,.32-1.67c.09-.23.19-.45.29-.66l.18-.32,7.57,4.37a5.45,5.45,0,0,0-.79,2.65v20c0,1.3.69,2,1.68,1.9l.16,0A2.15,2.15,0,0,0,284.11,158.13Z" style="fill:#263238"></path>
</g>
<g id="freepik--character--inject-2">
<path d="M394.38,211.25l-47.67-12.94c-4.31-.74-6.12,9.79-1.8,10.53l49,4.95Z" style="fill:#37474f"></path>
<path d="M346.71,198.31c-4.31-.74-6.12,9.79-1.8,10.53l6.83.69c-2.8-.29-.85-10.08,1.28-9.5h0Z" style="fill:#FFFFFF"></path>
<path d="M414.49,231.37c5.74,0,8.8,1.73,11.2,7.06,2.3,5.1,9.42,19.91,9.07,23.5s-15,18.82-15,18.82l-4.18-5.08,9.07-15.23-8.9-12.84Z" style="fill:#ffa8a7"></path>
<g id="freepik--character--inject-2">
<path d="M400.47,388.45a38,38,0,0,1,1,3.7c.28,1.37.68,3.66.2,4.69s-2.35,1.7-5.26,1.68c-1.88,0-4.81,1.26-6.82,2.38s-6.39,1.62-8.58,1.36c-2.58-.3-5.26-1.8-5.68-2.87s-.77-2.54,6.23-4.78c.06,0,8.47-2.76,11.41-6Z" style="fill:#263238"></path>
<path d="M400.47,388.64l-1.33-.16-6.17.12c-2.94,3.25-11.35,6-11.41,6l-1.12.38c-1.22,1-.19,2.65,2.7,2.9S395,395.12,397,394.16A5.94,5.94,0,0,0,400.47,388.64Z" style="fill:#ffa8a7"></path>
<path d="M400.47,386s0,1.69,0,2.65-1.13,2.4-4.07,2.29c-2.06-.07-3.51-.63-3.43-2.33v-2.45Z" style="fill:#ffa8a7"></path>
<path d="M420.23,377.38c.53.22.64,1.24.66,3.27,0,1.53.28,4.22-1.53,4.71s-4.43.14-5.55-1.34c-1.38-1.84-2.31-3.45-4.3-5.71-1.73-2-3.6-3.79-4.25-6.49-.58-2.43,0-3.47,1.66-4.13s3.17-.12,5.48,1.81a10.5,10.5,0,0,0,2.06,1.09C416,371.06,419.7,377.17,420.23,377.38Z" style="fill:#263238"></path>
<path d="M420.28,375.51l-.07,2.48s-1.66,3.26-6.29,0c-.1-.24-.51-5.05-.51-5.05Z" style="fill:#ffa8a7"></path>
<path d="M414.46,370.59a10.5,10.5,0,0,1-2.06-1.09h0c-1.86-.6-5.79.1-4,2.81a21,21,0,0,0,5.54,5.68c2.1,1,2.83-.24,2.83-.24l-.74-5.84A4.64,4.64,0,0,0,414.46,370.59Z" style="fill:#ffa8a7"></path>
<path d="M423.66,341.09A59.07,59.07,0,0,0,421,328.21s1.56-11,2.8-21.52c2.89-24.73-.67-25.18-4.16-33.78,0,0-30.08-4-31.41,9.16-1.65,16.42-.91,48.27-.63,54.09s.75,8.46,2.48,20.66c1.32,9.29,2.92,30.07,2.92,30.07a7.11,7.11,0,0,0,7.5,0s4.28-25.87,4.19-32.58a57.18,57.18,0,0,0-2.15-14.71s2.69-26.76,3.38-31c0,0,.77,8.53,1.05,14.35s1.85,11.43,3.24,22.27c1.21,9.41,4.2,29.56,4.2,29.56,4.16,2.39,5.9.74,5.9.74S424.58,349.25,423.66,341.09Z" style="fill:#ffa8a7"></path>
<path d="M416.4,264.89s5.5,8.23,7.86,16.77,1.25,17.72.37,26.84-2.73,18.27-2.73,18.27-5.08,5.23-15.75,8c-13.09,3.42-19-.66-19-.66s-1.2-34.79,0-48.11,2.6-19.36,2.6-19.36Z" style="fill:#37474f"></path><polygon points="401.07 226.03 402.23 238.35 413.06 237.67 412.19 224 401.07 226.03" style="fill:#ffa8a7"></polygon>
<path d="M422.79,236.6c-1.1-3.27-3.35-5.18-8.3-5.23l-1.83.06c-.35,1.81-5.68,3.29-11,1.43-.74.19-3.73.56-4.88.71l-1.57.38c-3.84,1.25-7.17,3.86-7.29,14.43-.05,5,1.79,18.28,1.79,18.28s17.31,3.5,26.64-1.77C422.54,249.82,424.42,241.44,422.79,236.6Z" style="fill:#FFFFFF"></path>
<g style="opacity:0.4">
<path d="M422.79,236.6c-1.1-3.27-3.35-5.18-8.3-5.23l-1.83.06c-.35,1.81-5.68,3.29-11,1.43-.74.19-3.73.56-4.88.71l-1.57.38c-3.84,1.25-7.17,3.86-7.29,14.43-.05,5,1.79,18.28,1.79,18.28s17.31,3.5,26.64-1.77C422.54,249.82,424.42,241.44,422.79,236.6Z" style="fill:#fff"></path>
</g>
<path d="M396.83,233.57l-25.9-.18S372.4,218.9,373.3,217s3.09-2.29,5.23-2.91,2.16-1.64,2.16-1.64l-1.94-.19c-1.7-.18-2.38-2.3-1.64-3.73.35-.67.92-1.72,1.95-1.44l2.58.7s0-2.29-.82-3.23-1.44-.66-3.15-1.25c-1.28-.45-3.88-1.24-6-.38s-3.7,4.81-4.23,7.59a46.63,46.63,0,0,1-2.64,9.42c-1.88,5.17-4.63,15.77-4.88,20-.12,2,.06,3.12,2.24,3.65s27.56,3,27.56,3C395.16,245.89,398.28,240.6,396.83,233.57Z" style="fill:#ffa8a7"></path>
<path d="M395.41,210.72s-4.09-4.88-.89-9.63c3.78-5.59,10.44-7.49,18.67-5,4.07,1.21,10.05,6.84,10.35,14.73.24,6.08-16.82,10.11-16.55,14.28Z" style="fill:#263238"></path>
<path d="M393,212.5s-2.4,3.62-2.09,4a5.78,5.78,0,0,0,1.84.79Z" style="fill:#f28f8f"></path>
<path d="M400.36,201c-2.33,1.21-6.36,3.43-7.39,12-1.07,8.81.9,11.88,2.1,13,.81.78,5,1.06,7.18.39,2.73-.85,8.65-3.78,11.42-8.33,3.26-5.35,3.94-12.48.17-15.28C408.54,198.91,402.34,200,400.36,201Z" style="fill:#ffa8a7"></path>
<path d="M399.67,201.38s-2,8,.41,13.12c0,0,1.42-3.13,4.12-2.23s2.47,4.52.33,6.37a4.05,4.05,0,0,1-4.21.9s.07,4.45,3.88,6.21c0,0,7.95,3.8,15.13-3.88,6.52-7,5.68-19.45-3.93-22.65S399.67,201.38,399.67,201.38Z" style="fill:#263238"></path>
<path d="M432,235.29h0a11.5,11.5,0,0,1-11.5-11.5V209h0a11.5,11.5,0,0,1,11.5,11.5Z" style="fill:#263238"></path>
<path d="M393.49,197.77c-3.58,3.64-3.78,14.15,6.59,16.73l6.78-18.61C402.91,193.32,396.68,194.52,393.49,197.77Z" style="fill:#263238"></path>
<path d="M399,217.39a2.06,2.06,0,0,1-1.23-2.63,2,2,0,0,1,2.62-1.23Z" style="fill:#263238"></path>
</g>
</g>
</svg>
\ No newline at end of file
import { createStore, applyMiddleware, Store } from "redux";
import { persistStore } from "redux-persist";
import createSagaMiddleware from "redux-saga";
import rootReducer from "./common/reducers/root";
import rootSaga from "./common/saga/root";
const sagaMiddleware = createSagaMiddleware();
const store: Store = createStore(
rootReducer,
{},
applyMiddleware(sagaMiddleware)
);
sagaMiddleware.run(rootSaga);
const persistor = persistStore(store);
export { store, persistor };
/* eslint-disable array-callback-return */
export function initialiseControls(controls: any) {
Object.keys(controls).map((detector) => {
if (!(detector in controls)) return null;
Object.keys(controls[detector]).map((controlType) => {
if (!(controlType in controls[detector])) return;
if (controlType === "checkbox") {
const controlId = `${detector}_${controlType}`;
const labelId = `${detector}_${controlType}_label`;
controls[detector][controlType] = document.getElementById(controlId);
controls[detector].label[controlType] =
document.getElementById(labelId);
return;
}
if (controlType === "slider") {
Object.keys(controls[detector][controlType]).map((sliderType) => {
if (!(sliderType in controls[detector][controlType])) return;
const controlId = `${detector}_${controlType}_${sliderType}`;
const labelId = `${controlId}_label`;
const slider: any = document.getElementById(controlId);
const label = document.getElementById(labelId);
if (label && slider) {
label.innerHTML = slider.value;
slider.oninput = () => {
label.innerHTML = slider.value;
};
}
controls[detector][controlType][sliderType] = slider;
controls[detector].label[sliderType] = label;
});
return;
}
});
});
}
import React from "react";
import NavBar from "../components/NavBar";
const Home = () => {
return (
<div>
<NavBar />
</div>
);
};
export default Home;
import React, { useState } from "react";
import Login from "../components/Login";
import SignUp from "../components/SignUp";
import COVER from "../res/cover.svg";
import { USER_TYPE } from "../common/types";
import Alert from "../components/Alert";
const Landing = () => {
const [alert, setAlert] = useState<string | null>(null);
const [userType, setUserType] = useState<USER_TYPE>(USER_TYPE.CANDIDATE);
const [form, setForm] = useState<"sign-in" | "sign-up">("sign-up");
const setCandidate = () => setUserType(USER_TYPE.CANDIDATE);
const setOrganization = () => setUserType(USER_TYPE.ORGANIZATION);
const candidateClassName =
userType === USER_TYPE.CANDIDATE ? "btn" : "btn deactive";
const organizationClassName =
userType === USER_TYPE.ORGANIZATION ? "btn active" : "btn deactive";
const renderForm =
form === "sign-up" ? (
<>
<SignUp userType={userType} setAlert={setAlert} setForm={setForm} />
<section>
<p>
Already have an account?
<button
type="button"
className="btn btn-link"
onClick={() => setForm("sign-in")}
>
Sing in
</button>
</p>
</section>
</>
) : (
<>
<Login userType={userType} setAlert={setAlert} />
<section>
<p>
New to Smart Recruiter?
<button
type="button"
className="btn btn-link"
onClick={() => setForm("sign-up")}
>
Sing up
</button>
</p>
</section>
</>
);
return (
<div className="landing">
<div className="container">
<div className="row">
<div className="col-6 mt-5">
<img src={COVER} alt="cover" />
</div>
<div className="col-6">
<div className="card card-body onboard p-4">
<div className="usertype-selector btn-group" role="group">
<button
type="button"
className={candidateClassName}
onClick={setCandidate}
>
Candidate
</button>
<button
type="button"
className={organizationClassName}
onClick={setOrganization}
>
Organization
</button>
</div>
{renderForm}
<Alert alert={alert} setAlert={setAlert} />
</div>
</div>
</div>
<div className="row" style={{ paddingBottom: "100px" }}>
<h1 className="display-6">Smart Recruiter </h1>
<p className="lead">
Lorem ipsum dolor sit amet consectetur, adipisicing elit. At quae
saepe temporibus recusandae illo ex in voluptatibus assumenda
delectus sunt autem culpa ratione, ipsa totam magni ducimus eaque
quisquam. Harum!
</p>
</div>
</div>
</div>
);
};
export default Landing;
import React, { ChangeEvent, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { updateKeystrokeSettings } from "../common/actions/auth";
import { DEFAULT_CONTROLS } from "../common/config";
import { ControlsType, Reducers } from "../common/types";
import Avatar from "../components/Avatar";
import ChangePassword from "../components/ChangePassword";
import Charts from "../components/Charts";
import Layout from "../components/Layout";
import ResultTable from "../components/ResultTable";
const Settings = () => {
const dispatch = useDispatch();
const keystrokeResult = useSelector(
(state: Reducers) => state.auth.keystrokeResult
);
const [controls, setControls] = useState(
keystrokeResult?.controls || DEFAULT_CONTROLS
);
const onToggleStandard = () =>
setControls({
...controls,
standard: { ...controls.standard, use: !controls.standard.use },
});
const onToggleAdvance = () =>
setControls({
...controls,
fullStandard: {
...controls.fullStandard,
use: !controls.fullStandard.use,
},
});
const onChangeKeystroke = (e: ChangeEvent<HTMLInputElement>) => {
const [level, key] = e.target.name.split(".");
const attr = controls[level as keyof ControlsType];
setControls({
...controls,
[level]: {
...attr,
[key]: Number(e.target.value),
},
});
};
const onClickUpdateControls = () => {
dispatch(updateKeystrokeSettings(controls));
};
return (
<Layout title="Profile and Settings">
<div className="row">
<div className="col-8">
<div className="card p-4 mb-3">
<div className="mb-3 row">
<div className="col-sm-3">
<Avatar name="Hashan" size="lg" />
</div>
<div className="col-sm-9 ">
<input
className="form-control"
type="text"
placeholder="Default input"
aria-label="default input example"
/>
</div>
</div>
</div>
<ChangePassword />
</div>
<div className="col-4">
<div className="card p-4 keystrokes">
<h5>Keystroke-dynamics Settings</h5>
<div className="keystrokes-settings">
<div className="form-check form-switch">
<label className="form-check-label">Standard Settings</label>
<input
className="form-check-input"
type="checkbox"
role="switch"
checked={controls.standard.use}
onChange={onToggleStandard}
/>
</div>
<label htmlFor="customRange2" className="form-label">
SD Multiplier : {controls.standard.sd}
</label>
<input
type="range"
className="form-range"
min="0"
max="2.5"
step="0.1"
value={controls.standard.sd}
name="standard.sd"
onChange={onChangeKeystroke}
/>
<label htmlFor="customRange2" className="form-label">
Threshold : {controls.standard.threshold}
</label>
<input
type="range"
className="form-range"
min="1"
max="100"
value={controls.standard.threshold}
name="standard.threshold"
onChange={onChangeKeystroke}
/>
</div>
<div className="keystrokes-settings">
<div className="form-check form-switch">
<label className="form-check-label">Advance Settings</label>
<input
className="form-check-input"
type="checkbox"
role="switch"
checked={controls.fullStandard.use}
onChange={onToggleAdvance}
/>
</div>
<label htmlFor="customRange2" className="form-label">
Threshold : {controls.fullStandard.threshold}
</label>
<input
type="range"
className="form-range"
min="0"
max="2"
step="0.1"
value={controls.fullStandard.threshold}
name="fullStandard.threshold"
onChange={onChangeKeystroke}
/>
</div>
<button
type="button"
className="btn btn-primary"
onClick={onClickUpdateControls}
>
Update
</button>
<hr />
<h5>Last Login</h5>
<ResultTable data={keystrokeResult?.result} />
<Charts
title="Overall keystroke"
real={keystrokeResult?.db.full}
attempts={keystrokeResult?.attempt.full}
/>
</div>
</div>
</div>
</Layout>
);
};
export default Settings;
{ {
"compilerOptions": { "compilerOptions": {
"target": "es5", "target": "es5",
"lib": [ "lib": ["dom", "dom.iterable", "esnext"],
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true, "allowJs": true,
"skipLibCheck": true, "skipLibCheck": true,
"esModuleInterop": true, "esModuleInterop": true,
...@@ -20,7 +16,5 @@ ...@@ -20,7 +16,5 @@
"noEmit": true, "noEmit": true,
"jsx": "react-jsx" "jsx": "react-jsx"
}, },
"include": [ "include": ["src"]
"src"
]
} }
...@@ -1040,6 +1040,13 @@ ...@@ -1040,6 +1040,13 @@
dependencies: dependencies:
regenerator-runtime "^0.13.11" regenerator-runtime "^0.13.11"
"@babel/runtime@^7.12.1", "@babel/runtime@^7.6.3":
version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
dependencies:
regenerator-runtime "^0.13.11"
"@babel/template@^7.18.10", "@babel/template@^7.3.3": "@babel/template@^7.18.10", "@babel/template@^7.3.3":
version "7.18.10" version "7.18.10"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71"
...@@ -1572,6 +1579,50 @@ ...@@ -1572,6 +1579,50 @@
schema-utils "^3.0.0" schema-utils "^3.0.0"
source-map "^0.7.3" source-map "^0.7.3"
"@redux-saga/core@^1.2.2":
version "1.2.2"
resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.2.2.tgz#99b1daac93a42feecd9bab449f452f56f3155fea"
integrity sha512-0qr5oleOAmI5WoZLRA6FEa30M4qKZcvx+ZQOQw+RqFeH8t20bvhE329XSPsNfTVP8C6qyDsXOSjuoV+g3+8zkg==
dependencies:
"@babel/runtime" "^7.6.3"
"@redux-saga/deferred" "^1.2.1"
"@redux-saga/delay-p" "^1.2.1"
"@redux-saga/is" "^1.1.3"
"@redux-saga/symbols" "^1.1.3"
"@redux-saga/types" "^1.2.1"
redux "^4.0.4"
typescript-tuple "^2.2.1"
"@redux-saga/deferred@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.2.1.tgz#aca373a08ccafd6f3481037f2f7ee97f2c87c3ec"
integrity sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==
"@redux-saga/delay-p@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.2.1.tgz#e72ac4731c5080a21f75b61bedc31cb639d9e446"
integrity sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==
dependencies:
"@redux-saga/symbols" "^1.1.3"
"@redux-saga/is@^1.1.3":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.3.tgz#b333f31967e87e32b4e6b02c75b78d609dd4ad73"
integrity sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==
dependencies:
"@redux-saga/symbols" "^1.1.3"
"@redux-saga/types" "^1.2.1"
"@redux-saga/symbols@^1.1.3":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.3.tgz#b731d56201719e96dc887dc3ae9016e761654367"
integrity sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==
"@redux-saga/types@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.2.1.tgz#9403f51c17cae37edf870c6bc0c81c1ece5ccef8"
integrity sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==
"@remix-run/router@1.0.5": "@remix-run/router@1.0.5":
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.5.tgz#d5c65626add4c3c185a89aa5bd38b1e42daec075" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.5.tgz#d5c65626add4c3c185a89aa5bd38b1e42daec075"
...@@ -1967,6 +2018,14 @@ ...@@ -1967,6 +2018,14 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/hoist-non-react-statics@^3.3.1":
version "3.3.1"
resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
dependencies:
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
"@types/html-minifier-terser@^6.0.0": "@types/html-minifier-terser@^6.0.0":
version "6.1.0" version "6.1.0"
resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35"
...@@ -2146,6 +2205,11 @@ ...@@ -2146,6 +2205,11 @@
resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756"
integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==
"@types/use-sync-external-store@^0.0.3":
version "0.0.3"
resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43"
integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==
"@types/ws@^8.5.1": "@types/ws@^8.5.1":
version "8.5.3" version "8.5.3"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d"
...@@ -2703,6 +2767,15 @@ axe-core@^4.4.3: ...@@ -2703,6 +2767,15 @@ axe-core@^4.4.3:
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.0.tgz#1d07514866fa51262734b3357932fcf86961383a" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.0.tgz#1d07514866fa51262734b3357932fcf86961383a"
integrity sha512-L3ZNbXPTxMrl0+qTXAzn9FBRvk5XdO56K8CvcCKtlxv44Aw2w2NCclGuvCWxHPw1Riiq3ncP/sxFYj2nUqdoTw== integrity sha512-L3ZNbXPTxMrl0+qTXAzn9FBRvk5XdO56K8CvcCKtlxv44Aw2w2NCclGuvCWxHPw1Riiq3ncP/sxFYj2nUqdoTw==
axios@^1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024"
integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
axobject-query@^2.2.0: axobject-query@^2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
...@@ -4577,7 +4650,7 @@ flatted@^3.1.0: ...@@ -4577,7 +4650,7 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
follow-redirects@^1.0.0: follow-redirects@^1.0.0, follow-redirects@^1.15.0:
version "1.15.2" version "1.15.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
...@@ -4617,6 +4690,15 @@ form-data@^3.0.0: ...@@ -4617,6 +4690,15 @@ form-data@^3.0.0:
combined-stream "^1.0.8" combined-stream "^1.0.8"
mime-types "^2.1.12" mime-types "^2.1.12"
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
forwarded@0.2.0: forwarded@0.2.0:
version "0.2.0" version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
...@@ -4879,6 +4961,13 @@ he@^1.2.0: ...@@ -4879,6 +4961,13 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
dependencies:
react-is "^16.7.0"
hoopy@^0.1.4: hoopy@^0.1.4:
version "0.1.4" version "0.1.4"
resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
...@@ -7450,6 +7539,11 @@ proxy-addr@~2.0.7: ...@@ -7450,6 +7539,11 @@ proxy-addr@~2.0.7:
forwarded "0.2.0" forwarded "0.2.0"
ipaddr.js "1.9.1" ipaddr.js "1.9.1"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
psl@^1.1.33: psl@^1.1.33:
version "1.9.0" version "1.9.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
...@@ -7571,7 +7665,7 @@ react-error-overlay@^6.0.11: ...@@ -7571,7 +7665,7 @@ react-error-overlay@^6.0.11:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb"
integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==
react-is@^16.10.2, react-is@^16.13.1: react-is@^16.10.2, react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1" version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
...@@ -7591,6 +7685,18 @@ react-lifecycles-compat@^3.0.4: ...@@ -7591,6 +7685,18 @@ react-lifecycles-compat@^3.0.4:
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
react-redux@^8.0.5:
version "8.0.5"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.5.tgz#e5fb8331993a019b8aaf2e167a93d10af469c7bd"
integrity sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==
dependencies:
"@babel/runtime" "^7.12.1"
"@types/hoist-non-react-statics" "^3.3.1"
"@types/use-sync-external-store" "^0.0.3"
hoist-non-react-statics "^3.3.2"
react-is "^18.0.0"
use-sync-external-store "^1.0.0"
react-refresh@^0.11.0: react-refresh@^0.11.0:
version "0.11.0" version "0.11.0"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046"
...@@ -7784,6 +7890,25 @@ reduce-css-calc@^2.1.8: ...@@ -7784,6 +7890,25 @@ reduce-css-calc@^2.1.8:
css-unit-converter "^1.1.1" css-unit-converter "^1.1.1"
postcss-value-parser "^3.3.0" postcss-value-parser "^3.3.0"
redux-persist@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8"
integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==
redux-saga@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.2.2.tgz#4b9b30e022cf94ed1450605e9afd45998c3e8ac1"
integrity sha512-6xAHWgOqRP75MFuLq88waKK9/+6dCdMQjii2TohDMARVHeQ6HZrZoJ9HZ3dLqMWCZ9kj4iuS6CDsujgnovn11A==
dependencies:
"@redux-saga/core" "^1.2.2"
redux@^4.0.4, redux@^4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197"
integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==
dependencies:
"@babel/runtime" "^7.9.2"
regenerate-unicode-properties@^10.1.0: regenerate-unicode-properties@^10.1.0:
version "10.1.0" version "10.1.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c"
...@@ -8779,6 +8904,25 @@ typedarray-to-buffer@^3.1.5: ...@@ -8779,6 +8904,25 @@ typedarray-to-buffer@^3.1.5:
dependencies: dependencies:
is-typedarray "^1.0.0" is-typedarray "^1.0.0"
typescript-compare@^0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425"
integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==
dependencies:
typescript-logic "^0.0.0"
typescript-logic@^0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196"
integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==
typescript-tuple@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2"
integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==
dependencies:
typescript-compare "^0.0.2"
typescript@^4.9.4: typescript@^4.9.4:
version "4.9.4" version "4.9.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78"
...@@ -8872,6 +9016,11 @@ url-parse@^1.5.3: ...@@ -8872,6 +9016,11 @@ url-parse@^1.5.3:
querystringify "^2.1.1" querystringify "^2.1.1"
requires-port "^1.0.0" requires-port "^1.0.0"
use-sync-external-store@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment