diff --git a/databases/units/groundunitdatabase.json b/databases/units/groundunitdatabase.json index 048de0c5..6ea7482f 100644 --- a/databases/units/groundunitdatabase.json +++ b/databases/units/groundunitdatabase.json @@ -77,7 +77,7 @@ "label": "SA-19 Tunguska", "shortLabel": "19", "range": "Short", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "liveries": { @@ -164,7 +164,7 @@ "label": "SA-3 Launcher", "shortLabel": "5p73 s-125 ln", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -959,7 +959,7 @@ "era": "Mid Cold War", "label": "SA-13 Dog Ear", "shortLabel": "Dog Ear", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -1231,7 +1231,7 @@ "label": "Hawk SAM Battery", "shortLabel": "Hk", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "acquisitionRange": 90000, @@ -1251,7 +1251,7 @@ "label": "Hawk Continous Wave Acquisition Radar", "shortLabel": "Hawk cwar", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -1282,7 +1282,7 @@ "era": "Late Cold War", "label": "Hawk Launcher", "shortLabel": "Hawk ln", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -1620,7 +1620,7 @@ "label": "Hawk Platoon Command Post", "shortLabel": "Hawk pcp", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -1651,7 +1651,7 @@ "label": "Hawk Search Radar", "shortLabel": "Hawk sr", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -1989,7 +1989,7 @@ "label": "Hawk Track Radar", "shortLabel": "Hawk tr", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -2399,7 +2399,7 @@ "label": "SA-18 Igla", "shortLabel": "18", "range": "Short", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "liveries": { @@ -2586,7 +2586,7 @@ "label": "SA-6 Straight flush", "shortLabel": "Kub 1S91 str", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -2626,7 +2626,7 @@ "label": "SA-6 Launcher", "shortLabel": "Kub 2P25 ln", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -3487,7 +3487,7 @@ "era": "Modern", "label": "M1097 Avenger", "shortLabel": "97", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "acquisitionRange": 5200, @@ -3588,7 +3588,7 @@ "era": "Mid Cold War", "label": "M48 Chaparral", "shortLabel": "48", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "liveries": { @@ -3660,7 +3660,7 @@ "era": "Late Cold War", "label": "M6 Linebacker", "shortLabel": "M6", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "liveries": { @@ -4007,7 +4007,7 @@ "label": "SA-8 Launcher", "shortLabel": "Osa 9A33 ln", "range": "Short", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4104,7 +4104,7 @@ "label": "Patriot Antenna Mast Group", "shortLabel": "Patriot AMG", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4143,7 +4143,7 @@ "label": "Patriot Engagement Control Station", "shortLabel": "Patriot ECS", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4182,7 +4182,7 @@ "label": "Patriot Electric Power Plant", "shortLabel": "Patriot EPP", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4221,7 +4221,7 @@ "label": "Patriot Command Post", "shortLabel": "Patriot cp", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4260,7 +4260,7 @@ "label": "Patriot Launcher", "shortLabel": "Patriot ln", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4301,7 +4301,7 @@ "label": "Patriot SAM Battery", "shortLabel": "Pt", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "liveries": { @@ -4343,7 +4343,7 @@ "label": "Patriot Search/Track Radar", "shortLabel": "Patriot str", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4425,7 +4425,7 @@ "label": "SA-5 Thin Shield", "shortLabel": "RLS 19J6", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4461,7 +4461,7 @@ "label": "SA-5 Square Pair", "shortLabel": "RPC 5N62V", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4543,7 +4543,7 @@ "era": "Late Cold War", "label": "Roland ADS", "shortLabel": "RO", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "liveries": { @@ -4567,7 +4567,7 @@ "era": "Mid Cold War", "label": "Roland Search Radar", "shortLabel": "Roland Radar", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4591,7 +4591,7 @@ "label": "SA-5 Launcher", "shortLabel": "S-200 Launcher", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4676,7 +4676,7 @@ "label": "SA-10 Tin Shield", "shortLabel": "S-300PS 40B6M tr", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4716,7 +4716,7 @@ "label": "SA-10 Clam Shell", "shortLabel": "S-300PS 40B6MD sr", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4756,7 +4756,7 @@ "label": "SA-10 Command Post", "shortLabel": "S-300PS 54K6 cp", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4795,7 +4795,7 @@ "label": "SA-10 Launcher", "shortLabel": "S-300PS 5P85C ln", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4837,7 +4837,7 @@ "label": "SA-10 Launcher", "shortLabel": "S-300PS 5P85D ln", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4879,7 +4879,7 @@ "label": "SA-10 Big Bird", "shortLabel": "S-300PS 64H6E sr", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -4919,7 +4919,7 @@ "label": "SA-10 SAM Battery", "shortLabel": "10", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "acquisitionRange": 300000, @@ -4939,7 +4939,7 @@ "label": "SA-11 Command Post", "shortLabel": "SA-11 Buk CC 9S470M1", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -5010,7 +5010,7 @@ "label": "SA-11 Launcher", "shortLabel": "SA-11 Buk LN 9A310M1", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -5035,7 +5035,7 @@ "label": "SA-11 Snown Drift", "shortLabel": "SA-11 Buk SR 9S18M1", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -5106,7 +5106,7 @@ "label": "SA-11 SAM Battery", "shortLabel": "11", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "acquisitionRange": 98000, @@ -5126,7 +5126,7 @@ "label": "SA-18 Igla \"Grouse\" C2", "shortLabel": "18", "range": "Short", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": false, "acquisitionRange": 5000, @@ -5145,7 +5145,7 @@ "label": "SA-18 Igla \"Grouse\" C2", "shortLabel": "18", "range": "Short", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": false, "acquisitionRange": 5000, @@ -5164,7 +5164,7 @@ "label": "SA-2 SAM Battery", "shortLabel": "2", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "acquisitionRange": 160000, @@ -5184,7 +5184,7 @@ "label": "SA-3 SAM Battery", "shortLabel": "3", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "acquisitionRange": 160000, @@ -5204,7 +5204,7 @@ "label": "SA-5 SAM Battery", "shortLabel": "5", "range": "Long", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "acquisitionRange": 400000, @@ -5224,7 +5224,7 @@ "label": "SA-6 SAM Battery", "shortLabel": "6", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "description": "SA-6 Gainful radar SAM site 2K12. Range/alt max: 55 km, 50,000 ft. Tracked vehicle.", @@ -5515,7 +5515,7 @@ "era": "Early Cold War", "label": "SA-2 Fan Song", "shortLabel": "SNR 75V", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -5554,7 +5554,7 @@ "era": "Early Cold War", "label": "SA-2 Launcher", "shortLabel": "S75M Volhov", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -6015,7 +6015,7 @@ "label": "Stinger", "shortLabel": "Stinger", "range": "Short", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": false, "liveries": { @@ -6056,7 +6056,7 @@ "label": "Stinger", "shortLabel": "Stinger", "range": "Short", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": false, "liveries": { @@ -6097,7 +6097,7 @@ "label": "SA-9 Gaskin", "shortLabel": "9", "range": "Short", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "liveries": { @@ -6154,7 +6154,7 @@ "label": "SA-13 Gopher", "shortLabel": "13", "range": "Short", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "liveries": { @@ -6521,7 +6521,7 @@ "label": "SA-15 Gauntlet", "shortLabel": "15", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site", "enabled": true, "liveries": { @@ -7608,7 +7608,7 @@ "era": "Mid Cold War", "label": "SA-3 Flat Face B", "shortLabel": "Flat Face B", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { @@ -7664,7 +7664,7 @@ "label": "SA-3 Low Blow", "shortLabel": "snr s-125 tr", "range": "Medium", - "filename": "", + "filename": "sam.png", "type": "SAM Site Parts", "enabled": true, "liveries": { diff --git a/frontend/react/.gitignore b/frontend/react/.gitignore new file mode 100644 index 00000000..cb0da3d6 --- /dev/null +++ b/frontend/react/.gitignore @@ -0,0 +1,23 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/react/.vscode/extensions.json b/frontend/react/.vscode/extensions.json new file mode 100644 index 00000000..9d9323cc --- /dev/null +++ b/frontend/react/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint" + ] +} \ No newline at end of file diff --git a/frontend/react/.vscode/launch.json b/frontend/react/.vscode/launch.json new file mode 100644 index 00000000..1f07e0f0 --- /dev/null +++ b/frontend/react/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:3000/vite/", + "webRoot": "${workspaceFolder}", + "preLaunchTask": "npm: dev" + } + ] +} \ No newline at end of file diff --git a/frontend/react/.vscode/settings.json b/frontend/react/.vscode/settings.json new file mode 100644 index 00000000..c43800f3 --- /dev/null +++ b/frontend/react/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "eslint.validate": [ "javascript", "javascriptreact", "html", "typescriptreact" ], +} \ No newline at end of file diff --git a/frontend/react/.vscode/tasks.json b/frontend/react/.vscode/tasks.json new file mode 100644 index 00000000..586890ef --- /dev/null +++ b/frontend/react/.vscode/tasks.json @@ -0,0 +1,36 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "check-setup", + "type": "shell", + "command": "cd .. ; ./check_setup.bat", + "isBackground": false + }, + { + "type": "npm", + "script": "dev", + "problemMatcher": [ + { + "pattern": [ + { + "regexp": ".*", + "file": 1, + "location": 2, + "message": 3 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": ".*", + "endsPattern": ".*", + } + } + ], + "label": "npm: dev", + "detail": "vite --port=8080", + "isBackground": true, + "dependsOn": ["check-setup"] + } + ] +} \ No newline at end of file diff --git a/frontend/react/README.md b/frontend/react/README.md new file mode 100644 index 00000000..f768e33f --- /dev/null +++ b/frontend/react/README.md @@ -0,0 +1,8 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git a/frontend/react/eslint.config.js b/frontend/react/eslint.config.js new file mode 100644 index 00000000..0fe1928a --- /dev/null +++ b/frontend/react/eslint.config.js @@ -0,0 +1,36 @@ +import eslintPluginReadableTailwind from "eslint-plugin-readable-tailwind"; +import eslintParserTypeScript from "@typescript-eslint/parser"; +import eslintConfigPrettier from "eslint-config-prettier"; + +export default [ + { + files: ["**/*.{ts,tsx,cts,mts}"], + languageOptions: { + parser: eslintParserTypeScript, + }, + }, + { + files: ["**/*.tsx"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + plugins: { + "readable-tailwind": eslintPluginReadableTailwind, + }, + rules: { + "readable-tailwind/multiline": [ + "warn", + { group: "newLine", lineBreakStyle: "windows" }, + ], + "readable-tailwind/sort-classes": ["warn", { order: "improved" }], + "readable-tailwind/no-unnecessary-whitespace": [ + "warn", + { allowMultiline: true }, + ], + }, + }, +]; diff --git a/frontend/react/index.html b/frontend/react/index.html new file mode 100644 index 00000000..437fe1a2 --- /dev/null +++ b/frontend/react/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + Olympus v2 + + + +
+ + + diff --git a/frontend/react/package.json b/frontend/react/package.json new file mode 100644 index 00000000..300337ec --- /dev/null +++ b/frontend/react/package.json @@ -0,0 +1,53 @@ +{ + "name": "react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --port=8080", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-brands-svg-icons": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", + "@tanem/svg-injector": "^10.1.68", + "@turf/turf": "^6.5.0", + "@types/leaflet": "^1.9.8", + "@types/react-leaflet": "^3.0.0", + "@types/turf": "^3.5.32", + "js-sha256": "^0.11.0", + "leaflet": "^1.9.4", + "leaflet-control-mini-map": "^0.4.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.0.1", + "react-leaflet": "^4.2.1", + "turf": "^3.0.14", + "usng": "^0.3.0" + }, + "devDependencies": { + "@eslint/js": "^9.6.0", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/parser": "^7.14.1", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.19", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-react": "^7.34.3", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.6", + "eslint-plugin-readable-tailwind": "^1.5.2", + "globals": "^15.7.0", + "postcss": "^8.4.38", + "prettier": "^3.3.2", + "tailwindcss": "^3.4.3", + "typescript-eslint": "^7.14.1", + "vite": "^5.2.0" + } +} diff --git a/frontend/react/postcss.config.js b/frontend/react/postcss.config.js new file mode 100644 index 00000000..2aa7205d --- /dev/null +++ b/frontend/react/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/frontend/server/public/themes/olympus/images/buttons/camera/linked.svg b/frontend/react/public/images/buttons/camera/linked.svg similarity index 78% rename from frontend/server/public/themes/olympus/images/buttons/camera/linked.svg rename to frontend/react/public/images/buttons/camera/linked.svg index 86e90e32..bc567896 100644 --- a/frontend/server/public/themes/olympus/images/buttons/camera/linked.svg +++ b/frontend/react/public/images/buttons/camera/linked.svg @@ -1,17 +1,17 @@ + fill="black" /> \ No newline at end of file diff --git a/frontend/react/public/images/buttons/context/miss-on-purpose.svg b/frontend/react/public/images/buttons/context/miss-on-purpose.svg new file mode 100644 index 00000000..d3efde8c --- /dev/null +++ b/frontend/react/public/images/buttons/context/miss-on-purpose.svg @@ -0,0 +1,41 @@ + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/context/scenic-aaa.svg b/frontend/react/public/images/buttons/context/scenic-aaa.svg new file mode 100644 index 00000000..05d6337e --- /dev/null +++ b/frontend/react/public/images/buttons/context/scenic-aaa.svg @@ -0,0 +1,50 @@ + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/context/simulate-fire-fight.svg b/frontend/react/public/images/buttons/context/simulate-fire-fight.svg new file mode 100644 index 00000000..4799e4f5 --- /dev/null +++ b/frontend/react/public/images/buttons/context/simulate-fire-fight.svg @@ -0,0 +1,42 @@ + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/emissions/attack.svg b/frontend/react/public/images/buttons/emissions/attack.svg new file mode 100644 index 00000000..563f0848 --- /dev/null +++ b/frontend/react/public/images/buttons/emissions/attack.svg @@ -0,0 +1,45 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/emissions/defend.svg b/frontend/react/public/images/buttons/emissions/defend.svg new file mode 100644 index 00000000..545e2ee0 --- /dev/null +++ b/frontend/react/public/images/buttons/emissions/defend.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/emissions/free.svg b/frontend/react/public/images/buttons/emissions/free.svg new file mode 100644 index 00000000..91bd13bd --- /dev/null +++ b/frontend/react/public/images/buttons/emissions/free.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/emissions/silent.svg b/frontend/react/public/images/buttons/emissions/silent.svg new file mode 100644 index 00000000..9630d390 --- /dev/null +++ b/frontend/react/public/images/buttons/emissions/silent.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/intensity/1.svg b/frontend/react/public/images/buttons/intensity/1.svg new file mode 100644 index 00000000..121ab252 --- /dev/null +++ b/frontend/react/public/images/buttons/intensity/1.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/intensity/2.svg b/frontend/react/public/images/buttons/intensity/2.svg new file mode 100644 index 00000000..edfc90ef --- /dev/null +++ b/frontend/react/public/images/buttons/intensity/2.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/intensity/3.svg b/frontend/react/public/images/buttons/intensity/3.svg new file mode 100644 index 00000000..3a45140e --- /dev/null +++ b/frontend/react/public/images/buttons/intensity/3.svg @@ -0,0 +1,62 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/other/arrow-down-solid.svg b/frontend/react/public/images/buttons/other/arrow-down-solid.svg new file mode 100644 index 00000000..b4a6b513 --- /dev/null +++ b/frontend/react/public/images/buttons/other/arrow-down-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/other/back.svg b/frontend/react/public/images/buttons/other/back.svg new file mode 100644 index 00000000..1e89bfa1 --- /dev/null +++ b/frontend/react/public/images/buttons/other/back.svg @@ -0,0 +1,43 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/other/clock-rotate-left-solid.svg b/frontend/react/public/images/buttons/other/clock-rotate-left-solid.svg new file mode 100644 index 00000000..bc8877d9 --- /dev/null +++ b/frontend/react/public/images/buttons/other/clock-rotate-left-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/other/delete.svg b/frontend/react/public/images/buttons/other/delete.svg new file mode 100644 index 00000000..68f9ace4 --- /dev/null +++ b/frontend/react/public/images/buttons/other/delete.svg @@ -0,0 +1,42 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/other/edit.svg b/frontend/react/public/images/buttons/other/edit.svg new file mode 100644 index 00000000..d99fefbf --- /dev/null +++ b/frontend/react/public/images/buttons/other/edit.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/other/lock-open-solid.svg b/frontend/react/public/images/buttons/other/lock-open-solid.svg new file mode 100644 index 00000000..fbc2ec57 --- /dev/null +++ b/frontend/react/public/images/buttons/other/lock-open-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/other/lock-solid.svg b/frontend/react/public/images/buttons/other/lock-solid.svg new file mode 100644 index 00000000..fb7d1af5 --- /dev/null +++ b/frontend/react/public/images/buttons/other/lock-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/roe/designated.svg b/frontend/react/public/images/buttons/roe/designated.svg new file mode 100644 index 00000000..fd937ce7 --- /dev/null +++ b/frontend/react/public/images/buttons/roe/designated.svg @@ -0,0 +1,45 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/roe/free.svg b/frontend/react/public/images/buttons/roe/free.svg new file mode 100644 index 00000000..91bd13bd --- /dev/null +++ b/frontend/react/public/images/buttons/roe/free.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/roe/hold.svg b/frontend/react/public/images/buttons/roe/hold.svg new file mode 100644 index 00000000..9630d390 --- /dev/null +++ b/frontend/react/public/images/buttons/roe/hold.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/roe/return.svg b/frontend/react/public/images/buttons/roe/return.svg new file mode 100644 index 00000000..545e2ee0 --- /dev/null +++ b/frontend/react/public/images/buttons/roe/return.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/scatter/1.svg b/frontend/react/public/images/buttons/scatter/1.svg new file mode 100644 index 00000000..5b991069 --- /dev/null +++ b/frontend/react/public/images/buttons/scatter/1.svg @@ -0,0 +1,56 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/scatter/2.svg b/frontend/react/public/images/buttons/scatter/2.svg new file mode 100644 index 00000000..fd9dcb4e --- /dev/null +++ b/frontend/react/public/images/buttons/scatter/2.svg @@ -0,0 +1,56 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/scatter/3.svg b/frontend/react/public/images/buttons/scatter/3.svg new file mode 100644 index 00000000..72cc5c38 --- /dev/null +++ b/frontend/react/public/images/buttons/scatter/3.svg @@ -0,0 +1,56 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/spawn/aircraft.svg b/frontend/react/public/images/buttons/spawn/aircraft.svg new file mode 100644 index 00000000..fa679480 --- /dev/null +++ b/frontend/react/public/images/buttons/spawn/aircraft.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/spawn/explosion.svg b/frontend/react/public/images/buttons/spawn/explosion.svg new file mode 100644 index 00000000..4aa5003c --- /dev/null +++ b/frontend/react/public/images/buttons/spawn/explosion.svg @@ -0,0 +1,44 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/spawn/groundunit.svg b/frontend/react/public/images/buttons/spawn/groundunit.svg new file mode 100644 index 00000000..99c5a8a2 --- /dev/null +++ b/frontend/react/public/images/buttons/spawn/groundunit.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/spawn/helicopter.svg b/frontend/react/public/images/buttons/spawn/helicopter.svg new file mode 100644 index 00000000..051fdd91 --- /dev/null +++ b/frontend/react/public/images/buttons/spawn/helicopter.svg @@ -0,0 +1,59 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/spawn/more.svg b/frontend/react/public/images/buttons/spawn/more.svg new file mode 100644 index 00000000..813ddc68 --- /dev/null +++ b/frontend/react/public/images/buttons/spawn/more.svg @@ -0,0 +1,70 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/spawn/navyunit.svg b/frontend/react/public/images/buttons/spawn/navyunit.svg new file mode 100644 index 00000000..7d42bb28 --- /dev/null +++ b/frontend/react/public/images/buttons/spawn/navyunit.svg @@ -0,0 +1,59 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/spawn/sam.svg b/frontend/react/public/images/buttons/spawn/sam.svg new file mode 100644 index 00000000..34d64b48 --- /dev/null +++ b/frontend/react/public/images/buttons/spawn/sam.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/spawn/smoke.svg b/frontend/react/public/images/buttons/spawn/smoke.svg new file mode 100644 index 00000000..4e0c3034 --- /dev/null +++ b/frontend/react/public/images/buttons/spawn/smoke.svg @@ -0,0 +1,69 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/threat/evade.svg b/frontend/react/public/images/buttons/threat/evade.svg new file mode 100644 index 00000000..e617ef46 --- /dev/null +++ b/frontend/react/public/images/buttons/threat/evade.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/threat/manoeuvre.svg b/frontend/react/public/images/buttons/threat/manoeuvre.svg new file mode 100644 index 00000000..ae1ca646 --- /dev/null +++ b/frontend/react/public/images/buttons/threat/manoeuvre.svg @@ -0,0 +1,50 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/threat/none.svg b/frontend/react/public/images/buttons/threat/none.svg new file mode 100644 index 00000000..a8ac63d3 --- /dev/null +++ b/frontend/react/public/images/buttons/threat/none.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/threat/passive.svg b/frontend/react/public/images/buttons/threat/passive.svg new file mode 100644 index 00000000..5d64ab64 --- /dev/null +++ b/frontend/react/public/images/buttons/threat/passive.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/tools/draw-polygon-solid.svg b/frontend/react/public/images/buttons/tools/draw-polygon-solid.svg new file mode 100644 index 00000000..3511f016 --- /dev/null +++ b/frontend/react/public/images/buttons/tools/draw-polygon-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/tools/ground.svg b/frontend/react/public/images/buttons/tools/ground.svg new file mode 100644 index 00000000..a98bb431 --- /dev/null +++ b/frontend/react/public/images/buttons/tools/ground.svg @@ -0,0 +1,46 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/tools/pen-solid.svg b/frontend/react/public/images/buttons/tools/pen-solid.svg new file mode 100644 index 00000000..d99fefbf --- /dev/null +++ b/frontend/react/public/images/buttons/tools/pen-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/tools/tower.svg b/frontend/react/public/images/buttons/tools/tower.svg new file mode 100644 index 00000000..c1daee36 --- /dev/null +++ b/frontend/react/public/images/buttons/tools/tower.svg @@ -0,0 +1,46 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/airbase.svg b/frontend/react/public/images/buttons/visibility/airbase.svg new file mode 100644 index 00000000..831cbde0 --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/airbase.svg @@ -0,0 +1,62 @@ + + + + + + + + image/svg+xml + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/aircraft.svg b/frontend/react/public/images/buttons/visibility/aircraft.svg new file mode 100644 index 00000000..bf319bbd --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/aircraft.svg @@ -0,0 +1,41 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/circle-dot.svg b/frontend/react/public/images/buttons/visibility/circle-dot.svg new file mode 100644 index 00000000..61fc3b00 --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/circle-dot.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/dcs.svg b/frontend/react/public/images/buttons/visibility/dcs.svg new file mode 100644 index 00000000..223ae38f --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/dcs.svg @@ -0,0 +1,32 @@ + + + + + + image/svg+xml + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/flag.svg b/frontend/react/public/images/buttons/visibility/flag.svg new file mode 100644 index 00000000..ca5dc3a7 --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/flag.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/groundunit-sam.svg b/frontend/react/public/images/buttons/visibility/groundunit-sam.svg new file mode 100644 index 00000000..c90869fe --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/groundunit-sam.svg @@ -0,0 +1,50 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/groundunit.svg b/frontend/react/public/images/buttons/visibility/groundunit.svg new file mode 100644 index 00000000..efc87415 --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/groundunit.svg @@ -0,0 +1,47 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/helicopter.svg b/frontend/react/public/images/buttons/visibility/helicopter.svg new file mode 100644 index 00000000..68ee36e7 --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/helicopter.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/human.svg b/frontend/react/public/images/buttons/visibility/human.svg new file mode 100644 index 00000000..fbb611aa --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/human.svg @@ -0,0 +1,62 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/navyunit.svg b/frontend/react/public/images/buttons/visibility/navyunit.svg new file mode 100644 index 00000000..af0538e5 --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/navyunit.svg @@ -0,0 +1,41 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/olympus.svg b/frontend/react/public/images/buttons/visibility/olympus.svg new file mode 100644 index 00000000..34bccdbc --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/olympus.svg @@ -0,0 +1,42 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/buttons/visibility/shield.svg b/frontend/react/public/images/buttons/visibility/shield.svg new file mode 100644 index 00000000..3702a745 --- /dev/null +++ b/frontend/react/public/images/buttons/visibility/shield.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/convertToFontAwesomIcons.py b/frontend/react/public/images/convertToFontAwesomIcons.py new file mode 100644 index 00000000..29b3bea5 --- /dev/null +++ b/frontend/react/public/images/convertToFontAwesomIcons.py @@ -0,0 +1,36 @@ +from svgpathtools import svg2paths2 +import os +from glob import glob +import svgelements + +result = [y for x in os.walk(".") for y in glob(os.path.join(x[0], '*.svg'))] + +with open(os.path.join( "..", "..", "..", "..", "src", "ui", "components", "olicons.tsx"), "w") as fp: + fp.write('import { IconDefinition, IconName, IconPrefix } from "@fortawesome/fontawesome-svg-core";\n') + for filename in result: + try: + iconName = filename.replace(".", "").replace("\\", "_").removesuffix("svg") + iconName = iconName.replace("-", "_") + temp = iconName.split('_') + iconName = temp[0] + ''.join(ele.capitalize() for ele in temp[1:]) + + svg = svgelements.SVG.parse(filename) + paths, attributes, svg_attributes = svg2paths2(filename) + + fp.write(f"export const ol{iconName}: IconDefinition = {{") + fp.write(" icon: [") + fp.write(f" {svg.implicit_width}, {svg.implicit_height}, [], \"\",") + fp.write("\"") + + for path in paths: + fp.write(path.d() + " ") + + fp.write("\"") + fp.write("]") + + name = temp[0] + ''.join(ele.lower() + '-' for ele in temp[1:]).removesuffix('-') + fp.write(f', iconName: "olympus-{name}" as IconName') + fp.write(f', prefix: "fas" as IconPrefix') + fp.write("}\n") + except Exception as e: + print(f"Failed to generate path for {iconName}: {e}") \ No newline at end of file diff --git a/frontend/react/public/images/countries/ac.svg b/frontend/react/public/images/countries/ac.svg new file mode 100644 index 00000000..a567f201 --- /dev/null +++ b/frontend/react/public/images/countries/ac.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ad.svg b/frontend/react/public/images/countries/ad.svg new file mode 100644 index 00000000..29ff8e1b --- /dev/null +++ b/frontend/react/public/images/countries/ad.svg @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ae.svg b/frontend/react/public/images/countries/ae.svg new file mode 100644 index 00000000..233128bd --- /dev/null +++ b/frontend/react/public/images/countries/ae.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/af.svg b/frontend/react/public/images/countries/af.svg new file mode 100644 index 00000000..3ab02321 --- /dev/null +++ b/frontend/react/public/images/countries/af.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ag.svg b/frontend/react/public/images/countries/ag.svg new file mode 100644 index 00000000..e682964d --- /dev/null +++ b/frontend/react/public/images/countries/ag.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ai.svg b/frontend/react/public/images/countries/ai.svg new file mode 100644 index 00000000..9782e3f1 --- /dev/null +++ b/frontend/react/public/images/countries/ai.svg @@ -0,0 +1,766 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/al.svg b/frontend/react/public/images/countries/al.svg new file mode 100644 index 00000000..a3289181 --- /dev/null +++ b/frontend/react/public/images/countries/al.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/am.svg b/frontend/react/public/images/countries/am.svg new file mode 100644 index 00000000..617bde9e --- /dev/null +++ b/frontend/react/public/images/countries/am.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ao.svg b/frontend/react/public/images/countries/ao.svg new file mode 100644 index 00000000..c88be71b --- /dev/null +++ b/frontend/react/public/images/countries/ao.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/aq.svg b/frontend/react/public/images/countries/aq.svg new file mode 100644 index 00000000..ca909933 --- /dev/null +++ b/frontend/react/public/images/countries/aq.svg @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ar.svg b/frontend/react/public/images/countries/ar.svg new file mode 100644 index 00000000..b0cd2370 --- /dev/null +++ b/frontend/react/public/images/countries/ar.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/arab.svg b/frontend/react/public/images/countries/arab.svg new file mode 100644 index 00000000..5b726ebc --- /dev/null +++ b/frontend/react/public/images/countries/arab.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/as.svg b/frontend/react/public/images/countries/as.svg new file mode 100644 index 00000000..8a9e37c3 --- /dev/null +++ b/frontend/react/public/images/countries/as.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/at.svg b/frontend/react/public/images/countries/at.svg new file mode 100644 index 00000000..282e73ce --- /dev/null +++ b/frontend/react/public/images/countries/at.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/au.svg b/frontend/react/public/images/countries/au.svg new file mode 100644 index 00000000..b207fce3 --- /dev/null +++ b/frontend/react/public/images/countries/au.svg @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/aw.svg b/frontend/react/public/images/countries/aw.svg new file mode 100644 index 00000000..a2a27e9d --- /dev/null +++ b/frontend/react/public/images/countries/aw.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ax.svg b/frontend/react/public/images/countries/ax.svg new file mode 100644 index 00000000..c6e19c9a --- /dev/null +++ b/frontend/react/public/images/countries/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/az.svg b/frontend/react/public/images/countries/az.svg new file mode 100644 index 00000000..d7792417 --- /dev/null +++ b/frontend/react/public/images/countries/az.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ba.svg b/frontend/react/public/images/countries/ba.svg new file mode 100644 index 00000000..00b5c039 --- /dev/null +++ b/frontend/react/public/images/countries/ba.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bb.svg b/frontend/react/public/images/countries/bb.svg new file mode 100644 index 00000000..47b4374b --- /dev/null +++ b/frontend/react/public/images/countries/bb.svg @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bd.svg b/frontend/react/public/images/countries/bd.svg new file mode 100644 index 00000000..f0e04707 --- /dev/null +++ b/frontend/react/public/images/countries/bd.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/be.svg b/frontend/react/public/images/countries/be.svg new file mode 100644 index 00000000..c27a363d --- /dev/null +++ b/frontend/react/public/images/countries/be.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bf.svg b/frontend/react/public/images/countries/bf.svg new file mode 100644 index 00000000..1b77fd76 --- /dev/null +++ b/frontend/react/public/images/countries/bf.svg @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bg.svg b/frontend/react/public/images/countries/bg.svg new file mode 100644 index 00000000..2a2d1743 --- /dev/null +++ b/frontend/react/public/images/countries/bg.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bh.svg b/frontend/react/public/images/countries/bh.svg new file mode 100644 index 00000000..0a8aa682 --- /dev/null +++ b/frontend/react/public/images/countries/bh.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bi.svg b/frontend/react/public/images/countries/bi.svg new file mode 100644 index 00000000..41acc0d3 --- /dev/null +++ b/frontend/react/public/images/countries/bi.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bj.svg b/frontend/react/public/images/countries/bj.svg new file mode 100644 index 00000000..be81b66a --- /dev/null +++ b/frontend/react/public/images/countries/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bl.svg b/frontend/react/public/images/countries/bl.svg new file mode 100644 index 00000000..2fc04fe6 --- /dev/null +++ b/frontend/react/public/images/countries/bl.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/blue.svg b/frontend/react/public/images/countries/blue.svg new file mode 100644 index 00000000..6b5fec0e --- /dev/null +++ b/frontend/react/public/images/countries/blue.svg @@ -0,0 +1,57 @@ + + + + + + + image/svg+xml + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bm.svg b/frontend/react/public/images/countries/bm.svg new file mode 100644 index 00000000..6009c2cb --- /dev/null +++ b/frontend/react/public/images/countries/bm.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bn.svg b/frontend/react/public/images/countries/bn.svg new file mode 100644 index 00000000..b5105d71 --- /dev/null +++ b/frontend/react/public/images/countries/bn.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bo.svg b/frontend/react/public/images/countries/bo.svg new file mode 100644 index 00000000..237d6c74 --- /dev/null +++ b/frontend/react/public/images/countries/bo.svg @@ -0,0 +1,1149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bq.svg b/frontend/react/public/images/countries/bq.svg new file mode 100644 index 00000000..7f602a14 --- /dev/null +++ b/frontend/react/public/images/countries/bq.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/br.svg b/frontend/react/public/images/countries/br.svg new file mode 100644 index 00000000..090e7631 --- /dev/null +++ b/frontend/react/public/images/countries/br.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bs.svg b/frontend/react/public/images/countries/bs.svg new file mode 100644 index 00000000..03f9b4bf --- /dev/null +++ b/frontend/react/public/images/countries/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bt.svg b/frontend/react/public/images/countries/bt.svg new file mode 100644 index 00000000..3fdf6a99 --- /dev/null +++ b/frontend/react/public/images/countries/bt.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bv.svg b/frontend/react/public/images/countries/bv.svg new file mode 100644 index 00000000..fd4a1541 --- /dev/null +++ b/frontend/react/public/images/countries/bv.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bw.svg b/frontend/react/public/images/countries/bw.svg new file mode 100644 index 00000000..b30807cd --- /dev/null +++ b/frontend/react/public/images/countries/bw.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/by.svg b/frontend/react/public/images/countries/by.svg new file mode 100644 index 00000000..fec86eea --- /dev/null +++ b/frontend/react/public/images/countries/by.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/bz.svg b/frontend/react/public/images/countries/bz.svg new file mode 100644 index 00000000..49b7fa1f --- /dev/null +++ b/frontend/react/public/images/countries/bz.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ca.svg b/frontend/react/public/images/countries/ca.svg new file mode 100644 index 00000000..d08d00ab --- /dev/null +++ b/frontend/react/public/images/countries/ca.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cc.svg b/frontend/react/public/images/countries/cc.svg new file mode 100644 index 00000000..0c18628e --- /dev/null +++ b/frontend/react/public/images/countries/cc.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cd.svg b/frontend/react/public/images/countries/cd.svg new file mode 100644 index 00000000..d908fc98 --- /dev/null +++ b/frontend/react/public/images/countries/cd.svg @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cefta.svg b/frontend/react/public/images/countries/cefta.svg new file mode 100644 index 00000000..80ce913c --- /dev/null +++ b/frontend/react/public/images/countries/cefta.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cf.svg b/frontend/react/public/images/countries/cf.svg new file mode 100644 index 00000000..6379d4fc --- /dev/null +++ b/frontend/react/public/images/countries/cf.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cg.svg b/frontend/react/public/images/countries/cg.svg new file mode 100644 index 00000000..3013b8ea --- /dev/null +++ b/frontend/react/public/images/countries/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ch.svg b/frontend/react/public/images/countries/ch.svg new file mode 100644 index 00000000..1e986d88 --- /dev/null +++ b/frontend/react/public/images/countries/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ci.svg b/frontend/react/public/images/countries/ci.svg new file mode 100644 index 00000000..069cc19d --- /dev/null +++ b/frontend/react/public/images/countries/ci.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ck.svg b/frontend/react/public/images/countries/ck.svg new file mode 100644 index 00000000..5b266b55 --- /dev/null +++ b/frontend/react/public/images/countries/ck.svg @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cl.svg b/frontend/react/public/images/countries/cl.svg new file mode 100644 index 00000000..f8f49442 --- /dev/null +++ b/frontend/react/public/images/countries/cl.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cm.svg b/frontend/react/public/images/countries/cm.svg new file mode 100644 index 00000000..d04b80a9 --- /dev/null +++ b/frontend/react/public/images/countries/cm.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cn.svg b/frontend/react/public/images/countries/cn.svg new file mode 100644 index 00000000..bc36eb8a --- /dev/null +++ b/frontend/react/public/images/countries/cn.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/co.svg b/frontend/react/public/images/countries/co.svg new file mode 100644 index 00000000..433b3706 --- /dev/null +++ b/frontend/react/public/images/countries/co.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/codes.json b/frontend/react/public/images/countries/codes.json new file mode 100644 index 00000000..250ad473 --- /dev/null +++ b/frontend/react/public/images/countries/codes.json @@ -0,0 +1,378 @@ +{ + "AGGRESSORS": { + "flagCode": "RED", + "liveryCodes": ["RSO"] + }, + "INSURGENTS": { + "flagCode": "UNK", + "liveryCodes": ["INS"] + }, + "ALGERIA": { + "flagCode": "DZ", + "liveryCodes": ["DZA"] + }, + "ARGENTINA": { + "flagCode": "AR", + "liveryCodes": ["ARG"] + }, + "AUSTRALIA": { + "flagCode": "AU", + "liveryCodes": ["AUS", "AUSAF"] + }, + "AUSTRIA": { + "flagCode": "AT", + "liveryCodes": ["AUT"] + }, + "BAHRAIN": { + "flagCode": "BH", + "liveryCodes": ["BHR"] + }, + "BELARUS": { + "flagCode": "BY", + "liveryCodes": ["BLR"] + }, + "BELGIUM": { + "flagCode": "BE", + "liveryCodes": ["BEL"] + }, + "BOLIVIA": { + "flagCode": "BO", + "liveryCodes": ["BOL"] + }, + "BRAZIL": { + "flagCode": "BR", + "liveryCodes": ["BRA"] + }, + "BULGARIA": { + "flagCode": "BG", + "liveryCodes": ["BGR"] + }, + "CANADA": { + "flagCode": "CA", + "liveryCodes": ["CAN"] + }, + "CHILE": { + "flagCode": "CL", + "liveryCodes": ["CHL"] + }, + "CHINA": { + "flagCode": "CN", + "liveryCodes": ["CHN"] + }, + "CROATIA": { + "flagCode": "HR", + "liveryCodes": ["HRV"] + }, + "CUBA": { + "flagCode": "CU", + "liveryCodes": ["CUB"] + }, + "CYPRUS": { + "flagCode": "CY", + "liveryCodes": ["CYP"] + }, + "CHEZH_REPUBLIC": { + "displayName": "Czech Republic", + "flagCode": "CZ", + "liveryCodes": ["CZE"] + }, + "DENMARK": { + "flagCode": "DK", + "liveryCodes": ["DEN"] + }, + "EGYPT": { + "flagCode": "EG", + "liveryCodes": ["EGY", "EGP"] + }, + "ETHIOPIA": { + "flagCode": "ET", + "liveryCodes": ["ETH"] + }, + "FINLAND": { + "flagCode": "FI", + "liveryCodes": ["FIN"] + }, + "FRANCE": { + "flagCode": "FR", + "liveryCodes": ["FRA"] + }, + "GEORGIA": { + "flagCode": "GE", + "liveryCodes": ["GRG"] + }, + "GERMANY": { + "flagCode": "DE", + "liveryCodes": ["GER"] + }, + "GHANA": { + "flagCode": "GH", + "liveryCodes": ["GHA"] + }, + "GREECE": { + "flagCode": "GR", + "liveryCodes": ["GRC"] + }, + "HONDURAS": { + "flagCode": "HN", + "liveryCodes": ["HND"] + }, + "HUNGARY": { + "flagCode": "HU", + "liveryCodes": ["HUN"] + }, + "INDIA": { + "flagCode": "IN", + "liveryCodes": ["IND"] + }, + "INDONESIA": { + "flagCode": "ID", + "liveryCodes": ["IDN"] + }, + "IRAN": { + "flagCode": "IR", + "liveryCodes": ["IRN"] + }, + "IRAQ": { + "flagCode": "IQ", + "liveryCodes": ["IRQ"] + }, + "ISRAEL": { + "flagCode": "IL", + "liveryCodes": ["ISR"] + }, + "ITALY": { + "flagCode": "IT", + "liveryCodes": ["ITA"] + }, + "JAPAN": { + "flagCode": "JP", + "liveryCodes": ["JPN"] + }, + "JORDAN": { + "flagCode": "JO", + "liveryCodes": ["JOR"] + }, + "KAZAKHSTAN": { + "flagCode": "KZ", + "liveryCodes": ["KAZ"] + }, + "SOUTH_KOREA": { + "displayName": "South Korea", + "flagCode": "KR", + "liveryCodes": ["KOR"] + }, + "KUWAIT": { + "flagCode": "KW", + "liveryCodes": ["KWT"] + }, + "LEBANON": { + "flagCode": "LB", + "liveryCodes": ["LBN"] + }, + "MALAYSIA": { + "flagCode": "MY", + "liveryCodes": ["MYS"] + }, + "MEXICO": { + "flagCode": "MX", + "liveryCodes": ["MEX"] + }, + "MOROCCO": { + "flagCode": "MA", + "liveryCodes": ["MAR"] + }, + "THE_NETHERLANDS": { + "displayName": "The Netherlands", + "flagCode": "NL", + "liveryCodes": ["NETH"] + }, + "NIGERIA": { + "flagCode": "NG", + "liveryCodes": ["NGA"] + }, + "NORWAY": { + "flagCode": "NO", + "liveryCodes": ["NOR"] + }, + "OMAN": { + "flagCode": "OM", + "liveryCodes": ["OMN"] + }, + "PAKISTAN": { + "flagCode": "PK", + "liveryCodes": ["PAK"] + }, + "PERU": { + "flagCode": "PE", + "liveryCodes": ["PER"] + }, + "PHILIPPINES": { + "flagCode": "PH", + "liveryCodes": ["PHL"] + }, + "POLAND": { + "flagCode": "PL", + "liveryCodes": ["POL"] + }, + "PORTUGAL": { + "flagCode": "PT", + "liveryCodes": ["PRT"] + }, + "QATAR": { + "flagCode": "QA", + "liveryCodes": ["QAT"] + }, + "ROMANIA": { + "flagCode": "RO", + "liveryCodes": ["ROU"] + }, + "RUSSIA": { + "flagCode": "RU", + "liveryCodes": ["RUS"] + }, + "SAUDI_ARABIA": { + "displayName": "Saudi Arabia", + "flagCode": "SA", + "liveryCodes": ["SAU"] + }, + "SERBIA": { + "flagCode": "RS", + "liveryCodes": ["SRB"] + }, + "SLOVAKIA": { + "flagCode": "SK", + "liveryCodes": ["SVK"] + }, + "SLOVENIA": { + "flagCode": "SI", + "liveryCodes": ["SVN"] + }, + "SOUTH_AFRICA": { + "displayName": "South Africa", + "flagCode": "ZA", + "liveryCodes": [] + }, + "SPAIN": { + "flagCode": "ES", + "liveryCodes": ["SPN", "SPA"] + }, + "SUDAN": { + "flagCode": "SD", + "liveryCodes": ["SDN", "SUN"] + }, + "SWEDEN": { + "flagCode": "SE", + "liveryCodes": ["SWE"] + }, + "SWITZERLAND": { + "flagCode": "CH", + "liveryCodes": ["SUI"] + }, + "SYRIA": { + "flagCode": "SY", + "liveryCodes": ["SYR"] + }, + "THAILAND": { + "flagCode": "TH", + "liveryCodes": ["THA"] + }, + "TUNISIA": { + "flagCode": "TN", + "liveryCodes": ["TUN"] + }, + "TURKEY": { + "flagCode": "TR", + "liveryCodes": ["TUR"] + }, + "UKRAINE": { + "flagCode": "UA", + "liveryCodes": ["UKR"] + }, + "UNITED_ARAB_EMIRATES": { + "displayName": "United Arab Emirates", + "flagCode": "AE", + "liveryCodes": ["ARE"] + }, + "UK": { + "displayName": "United Kingdom", + "flagCode": "GB", + "liveryCodes": ["UK"] + }, + "USA": { + "displayName": "United States of America", + "flagCode": "US", + "liveryCodes": ["USA", "USAF"] + }, + "VENEZUELA": { + "flagCode": "VE", + "liveryCodes": ["VEN"] + }, + "VIETNAM": { + "flagCode": "VN", + "liveryCodes": ["VNM"] + }, + "YEMEN": { + "flagCode": "YE", + "liveryCodes": ["YEM"] + }, + "CJTF_BLUE": { + "displayName": "Combined Joint Task Force Blue", + "flagCode": "BLUE", + "liveryCodes": ["BLUE"] + }, + "SOUTH_OSETIA": { + "displayName": "South Ossetia", + "flagCode": "UNK", + "liveryCodes": [] + }, + "NORTH_KOREA": { + "displayName": "Democratic People's Republic of Korea", + "flagCode": "KP", + "liveryCodes": ["PRK"] + }, + "CJTF_RED": { + "displayName": "Combined Joint Task Force Red", + "flagCode": "RED", + "liveryCodes": ["RED"] + }, + "ABKHAZIA": { + "flagCode": "UNK", + "liveryCodes": ["ABH"] + }, + "ITALIAN_SOCIAL_REPUBLIC": { + "displayName": "Italian Social Republic", + "flagCode": "SOCIAL", + "liveryCodes": ["RSI"] + }, + "USSR": { + "displayName": "USSR", + "flagCode": "USSR", + "liveryCodes": [] + }, + "ECUADOR": { + "flagCode": "EC", + "liveryCodes": ["ECU"] + }, + "LIBYA": { + "flagCode": "LY", + "liveryCodes": ["LBY", "LIB"] + }, + "UN_PEACEKEEPERS": { + "displayName": "United Nations", + "flagCode": "UNK", + "liveryCodes": ["UN"] + }, + "GDR": { + "flagCode": "UNK", + "liveryCodes": ["GDR"] + }, + "YUGOSLAVIA": { + "flagCode": "YUG", + "liveryCodes": ["YUG"] + }, + "THIRDREICH": { + "displayName": "Third Reich", + "flagCode": "THIRD", + "liveryCodes": [] + } +} diff --git a/frontend/react/public/images/countries/cp.svg b/frontend/react/public/images/countries/cp.svg new file mode 100644 index 00000000..bb5411c6 --- /dev/null +++ b/frontend/react/public/images/countries/cp.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cr.svg b/frontend/react/public/images/countries/cr.svg new file mode 100644 index 00000000..d201d1a6 --- /dev/null +++ b/frontend/react/public/images/countries/cr.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cu.svg b/frontend/react/public/images/countries/cu.svg new file mode 100644 index 00000000..bf7ec060 --- /dev/null +++ b/frontend/react/public/images/countries/cu.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cv.svg b/frontend/react/public/images/countries/cv.svg new file mode 100644 index 00000000..eb066c00 --- /dev/null +++ b/frontend/react/public/images/countries/cv.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cw.svg b/frontend/react/public/images/countries/cw.svg new file mode 100644 index 00000000..116f9b9c --- /dev/null +++ b/frontend/react/public/images/countries/cw.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cx.svg b/frontend/react/public/images/countries/cx.svg new file mode 100644 index 00000000..ef933a50 --- /dev/null +++ b/frontend/react/public/images/countries/cx.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cy.svg b/frontend/react/public/images/countries/cy.svg new file mode 100644 index 00000000..f45acf07 --- /dev/null +++ b/frontend/react/public/images/countries/cy.svg @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/cz.svg b/frontend/react/public/images/countries/cz.svg new file mode 100644 index 00000000..e61450dc --- /dev/null +++ b/frontend/react/public/images/countries/cz.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/de.svg b/frontend/react/public/images/countries/de.svg new file mode 100644 index 00000000..baf32437 --- /dev/null +++ b/frontend/react/public/images/countries/de.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/dg.svg b/frontend/react/public/images/countries/dg.svg new file mode 100644 index 00000000..bf4ab23b --- /dev/null +++ b/frontend/react/public/images/countries/dg.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/dj.svg b/frontend/react/public/images/countries/dj.svg new file mode 100644 index 00000000..4a5ff3f2 --- /dev/null +++ b/frontend/react/public/images/countries/dj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/dk.svg b/frontend/react/public/images/countries/dk.svg new file mode 100644 index 00000000..3d94f0e1 --- /dev/null +++ b/frontend/react/public/images/countries/dk.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/dm.svg b/frontend/react/public/images/countries/dm.svg new file mode 100644 index 00000000..cf3d350d --- /dev/null +++ b/frontend/react/public/images/countries/dm.svg @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/do.svg b/frontend/react/public/images/countries/do.svg new file mode 100644 index 00000000..9777f6cb --- /dev/null +++ b/frontend/react/public/images/countries/do.svg @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/dz.svg b/frontend/react/public/images/countries/dz.svg new file mode 100644 index 00000000..59e7a7ec --- /dev/null +++ b/frontend/react/public/images/countries/dz.svg @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/eac.svg b/frontend/react/public/images/countries/eac.svg new file mode 100644 index 00000000..fc6516fe --- /dev/null +++ b/frontend/react/public/images/countries/eac.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ec.svg b/frontend/react/public/images/countries/ec.svg new file mode 100644 index 00000000..da38630c --- /dev/null +++ b/frontend/react/public/images/countries/ec.svg @@ -0,0 +1,334 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ee.svg b/frontend/react/public/images/countries/ee.svg new file mode 100644 index 00000000..a1c3dc4e --- /dev/null +++ b/frontend/react/public/images/countries/ee.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/eg.svg b/frontend/react/public/images/countries/eg.svg new file mode 100644 index 00000000..e860cebe --- /dev/null +++ b/frontend/react/public/images/countries/eg.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/eh.svg b/frontend/react/public/images/countries/eh.svg new file mode 100644 index 00000000..0831fc1f --- /dev/null +++ b/frontend/react/public/images/countries/eh.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/er.svg b/frontend/react/public/images/countries/er.svg new file mode 100644 index 00000000..61929685 --- /dev/null +++ b/frontend/react/public/images/countries/er.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/es-ct.svg b/frontend/react/public/images/countries/es-ct.svg new file mode 100644 index 00000000..94e41da9 --- /dev/null +++ b/frontend/react/public/images/countries/es-ct.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/es-ga.svg b/frontend/react/public/images/countries/es-ga.svg new file mode 100644 index 00000000..37c6259f --- /dev/null +++ b/frontend/react/public/images/countries/es-ga.svg @@ -0,0 +1,334 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/es-pv.svg b/frontend/react/public/images/countries/es-pv.svg new file mode 100644 index 00000000..c1eb25c7 --- /dev/null +++ b/frontend/react/public/images/countries/es-pv.svg @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/es.svg b/frontend/react/public/images/countries/es.svg new file mode 100644 index 00000000..eae95066 --- /dev/null +++ b/frontend/react/public/images/countries/es.svg @@ -0,0 +1,879 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/et.svg b/frontend/react/public/images/countries/et.svg new file mode 100644 index 00000000..bec1ed46 --- /dev/null +++ b/frontend/react/public/images/countries/et.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/eu.svg b/frontend/react/public/images/countries/eu.svg new file mode 100644 index 00000000..6753f886 --- /dev/null +++ b/frontend/react/public/images/countries/eu.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/fi.svg b/frontend/react/public/images/countries/fi.svg new file mode 100644 index 00000000..e62c8353 --- /dev/null +++ b/frontend/react/public/images/countries/fi.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/fj.svg b/frontend/react/public/images/countries/fj.svg new file mode 100644 index 00000000..9ff51434 --- /dev/null +++ b/frontend/react/public/images/countries/fj.svg @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/fk.svg b/frontend/react/public/images/countries/fk.svg new file mode 100644 index 00000000..cfa6b60f --- /dev/null +++ b/frontend/react/public/images/countries/fk.svg @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/fm.svg b/frontend/react/public/images/countries/fm.svg new file mode 100644 index 00000000..d521b68d --- /dev/null +++ b/frontend/react/public/images/countries/fm.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/fo.svg b/frontend/react/public/images/countries/fo.svg new file mode 100644 index 00000000..b64e89c0 --- /dev/null +++ b/frontend/react/public/images/countries/fo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/fr.svg b/frontend/react/public/images/countries/fr.svg new file mode 100644 index 00000000..6042436e --- /dev/null +++ b/frontend/react/public/images/countries/fr.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ga.svg b/frontend/react/public/images/countries/ga.svg new file mode 100644 index 00000000..35979cbf --- /dev/null +++ b/frontend/react/public/images/countries/ga.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gb-eng.svg b/frontend/react/public/images/countries/gb-eng.svg new file mode 100644 index 00000000..8d57eadf --- /dev/null +++ b/frontend/react/public/images/countries/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gb-nir.svg b/frontend/react/public/images/countries/gb-nir.svg new file mode 100644 index 00000000..f74420ab --- /dev/null +++ b/frontend/react/public/images/countries/gb-nir.svg @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gb-sct.svg b/frontend/react/public/images/countries/gb-sct.svg new file mode 100644 index 00000000..900318a7 --- /dev/null +++ b/frontend/react/public/images/countries/gb-sct.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gb-wls.svg b/frontend/react/public/images/countries/gb-wls.svg new file mode 100644 index 00000000..b4769755 --- /dev/null +++ b/frontend/react/public/images/countries/gb-wls.svg @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gb.svg b/frontend/react/public/images/countries/gb.svg new file mode 100644 index 00000000..47f344f4 --- /dev/null +++ b/frontend/react/public/images/countries/gb.svg @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gd.svg b/frontend/react/public/images/countries/gd.svg new file mode 100644 index 00000000..33cb3b34 --- /dev/null +++ b/frontend/react/public/images/countries/gd.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ge.svg b/frontend/react/public/images/countries/ge.svg new file mode 100644 index 00000000..a2984c10 --- /dev/null +++ b/frontend/react/public/images/countries/ge.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gf.svg b/frontend/react/public/images/countries/gf.svg new file mode 100644 index 00000000..01b9d896 --- /dev/null +++ b/frontend/react/public/images/countries/gf.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gg.svg b/frontend/react/public/images/countries/gg.svg new file mode 100644 index 00000000..6281b69b --- /dev/null +++ b/frontend/react/public/images/countries/gg.svg @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gh.svg b/frontend/react/public/images/countries/gh.svg new file mode 100644 index 00000000..bf4b42a9 --- /dev/null +++ b/frontend/react/public/images/countries/gh.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gi.svg b/frontend/react/public/images/countries/gi.svg new file mode 100644 index 00000000..4bfe752b --- /dev/null +++ b/frontend/react/public/images/countries/gi.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gl.svg b/frontend/react/public/images/countries/gl.svg new file mode 100644 index 00000000..59472d84 --- /dev/null +++ b/frontend/react/public/images/countries/gl.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gm.svg b/frontend/react/public/images/countries/gm.svg new file mode 100644 index 00000000..0456b8d8 --- /dev/null +++ b/frontend/react/public/images/countries/gm.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gn.svg b/frontend/react/public/images/countries/gn.svg new file mode 100644 index 00000000..c44cf15d --- /dev/null +++ b/frontend/react/public/images/countries/gn.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gp.svg b/frontend/react/public/images/countries/gp.svg new file mode 100644 index 00000000..32c1816b --- /dev/null +++ b/frontend/react/public/images/countries/gp.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gq.svg b/frontend/react/public/images/countries/gq.svg new file mode 100644 index 00000000..5aa686a9 --- /dev/null +++ b/frontend/react/public/images/countries/gq.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gr.svg b/frontend/react/public/images/countries/gr.svg new file mode 100644 index 00000000..14ab0974 --- /dev/null +++ b/frontend/react/public/images/countries/gr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gs.svg b/frontend/react/public/images/countries/gs.svg new file mode 100644 index 00000000..0d8aff80 --- /dev/null +++ b/frontend/react/public/images/countries/gs.svg @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gt.svg b/frontend/react/public/images/countries/gt.svg new file mode 100644 index 00000000..fa102cb9 --- /dev/null +++ b/frontend/react/public/images/countries/gt.svg @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gu.svg b/frontend/react/public/images/countries/gu.svg new file mode 100644 index 00000000..ed27aa6c --- /dev/null +++ b/frontend/react/public/images/countries/gu.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + G + + + U + + + A + + + M + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gw.svg b/frontend/react/public/images/countries/gw.svg new file mode 100644 index 00000000..bdc161a1 --- /dev/null +++ b/frontend/react/public/images/countries/gw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/gy.svg b/frontend/react/public/images/countries/gy.svg new file mode 100644 index 00000000..c4175df0 --- /dev/null +++ b/frontend/react/public/images/countries/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/hk.svg b/frontend/react/public/images/countries/hk.svg new file mode 100644 index 00000000..25f1c846 --- /dev/null +++ b/frontend/react/public/images/countries/hk.svg @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/hm.svg b/frontend/react/public/images/countries/hm.svg new file mode 100644 index 00000000..46b0c2d5 --- /dev/null +++ b/frontend/react/public/images/countries/hm.svg @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/hn.svg b/frontend/react/public/images/countries/hn.svg new file mode 100644 index 00000000..bb07bebe --- /dev/null +++ b/frontend/react/public/images/countries/hn.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/hr.svg b/frontend/react/public/images/countries/hr.svg new file mode 100644 index 00000000..c7fc580e --- /dev/null +++ b/frontend/react/public/images/countries/hr.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ht.svg b/frontend/react/public/images/countries/ht.svg new file mode 100644 index 00000000..c624afff --- /dev/null +++ b/frontend/react/public/images/countries/ht.svg @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/hu.svg b/frontend/react/public/images/countries/hu.svg new file mode 100644 index 00000000..9e154667 --- /dev/null +++ b/frontend/react/public/images/countries/hu.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ic.svg b/frontend/react/public/images/countries/ic.svg new file mode 100644 index 00000000..85b65f88 --- /dev/null +++ b/frontend/react/public/images/countries/ic.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/id.svg b/frontend/react/public/images/countries/id.svg new file mode 100644 index 00000000..4f2bde2b --- /dev/null +++ b/frontend/react/public/images/countries/id.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ie.svg b/frontend/react/public/images/countries/ie.svg new file mode 100644 index 00000000..89fa0b55 --- /dev/null +++ b/frontend/react/public/images/countries/ie.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/il.svg b/frontend/react/public/images/countries/il.svg new file mode 100644 index 00000000..96bf69e0 --- /dev/null +++ b/frontend/react/public/images/countries/il.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/im.svg b/frontend/react/public/images/countries/im.svg new file mode 100644 index 00000000..4a72da98 --- /dev/null +++ b/frontend/react/public/images/countries/im.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/in.svg b/frontend/react/public/images/countries/in.svg new file mode 100644 index 00000000..5ae3cae0 --- /dev/null +++ b/frontend/react/public/images/countries/in.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/io.svg b/frontend/react/public/images/countries/io.svg new file mode 100644 index 00000000..83d72303 --- /dev/null +++ b/frontend/react/public/images/countries/io.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/iq.svg b/frontend/react/public/images/countries/iq.svg new file mode 100644 index 00000000..350b1e4c --- /dev/null +++ b/frontend/react/public/images/countries/iq.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ir.svg b/frontend/react/public/images/countries/ir.svg new file mode 100644 index 00000000..c2d71c72 --- /dev/null +++ b/frontend/react/public/images/countries/ir.svg @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/is.svg b/frontend/react/public/images/countries/is.svg new file mode 100644 index 00000000..2dab697b --- /dev/null +++ b/frontend/react/public/images/countries/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/it.svg b/frontend/react/public/images/countries/it.svg new file mode 100644 index 00000000..295787cb --- /dev/null +++ b/frontend/react/public/images/countries/it.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/je.svg b/frontend/react/public/images/countries/je.svg new file mode 100644 index 00000000..9d1206c7 --- /dev/null +++ b/frontend/react/public/images/countries/je.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/jm.svg b/frontend/react/public/images/countries/jm.svg new file mode 100644 index 00000000..6d8dc00c --- /dev/null +++ b/frontend/react/public/images/countries/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/jo.svg b/frontend/react/public/images/countries/jo.svg new file mode 100644 index 00000000..38d52dde --- /dev/null +++ b/frontend/react/public/images/countries/jo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/jp.svg b/frontend/react/public/images/countries/jp.svg new file mode 100644 index 00000000..ab04bb52 --- /dev/null +++ b/frontend/react/public/images/countries/jp.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ke.svg b/frontend/react/public/images/countries/ke.svg new file mode 100644 index 00000000..dae1fc36 --- /dev/null +++ b/frontend/react/public/images/countries/ke.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/kg.svg b/frontend/react/public/images/countries/kg.svg new file mode 100644 index 00000000..f57b3922 --- /dev/null +++ b/frontend/react/public/images/countries/kg.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/kh.svg b/frontend/react/public/images/countries/kh.svg new file mode 100644 index 00000000..e029e624 --- /dev/null +++ b/frontend/react/public/images/countries/kh.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ki.svg b/frontend/react/public/images/countries/ki.svg new file mode 100644 index 00000000..96967d80 --- /dev/null +++ b/frontend/react/public/images/countries/ki.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/km.svg b/frontend/react/public/images/countries/km.svg new file mode 100644 index 00000000..1a56913b --- /dev/null +++ b/frontend/react/public/images/countries/km.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/kn.svg b/frontend/react/public/images/countries/kn.svg new file mode 100644 index 00000000..273c26a8 --- /dev/null +++ b/frontend/react/public/images/countries/kn.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/kp.svg b/frontend/react/public/images/countries/kp.svg new file mode 100644 index 00000000..3ad70d3d --- /dev/null +++ b/frontend/react/public/images/countries/kp.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/kr.svg b/frontend/react/public/images/countries/kr.svg new file mode 100644 index 00000000..ec6fa468 --- /dev/null +++ b/frontend/react/public/images/countries/kr.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/kw.svg b/frontend/react/public/images/countries/kw.svg new file mode 100644 index 00000000..5852d36a --- /dev/null +++ b/frontend/react/public/images/countries/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ky.svg b/frontend/react/public/images/countries/ky.svg new file mode 100644 index 00000000..bf5665e6 --- /dev/null +++ b/frontend/react/public/images/countries/ky.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/kz.svg b/frontend/react/public/images/countries/kz.svg new file mode 100644 index 00000000..e6b5c2b8 --- /dev/null +++ b/frontend/react/public/images/countries/kz.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/la.svg b/frontend/react/public/images/countries/la.svg new file mode 100644 index 00000000..5983bef5 --- /dev/null +++ b/frontend/react/public/images/countries/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/lb.svg b/frontend/react/public/images/countries/lb.svg new file mode 100644 index 00000000..567005eb --- /dev/null +++ b/frontend/react/public/images/countries/lb.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/lc.svg b/frontend/react/public/images/countries/lc.svg new file mode 100644 index 00000000..efdf2dc4 --- /dev/null +++ b/frontend/react/public/images/countries/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/li.svg b/frontend/react/public/images/countries/li.svg new file mode 100644 index 00000000..adf317f2 --- /dev/null +++ b/frontend/react/public/images/countries/li.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/lk.svg b/frontend/react/public/images/countries/lk.svg new file mode 100644 index 00000000..d2dba3b4 --- /dev/null +++ b/frontend/react/public/images/countries/lk.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/lr.svg b/frontend/react/public/images/countries/lr.svg new file mode 100644 index 00000000..3d6e3679 --- /dev/null +++ b/frontend/react/public/images/countries/lr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ls.svg b/frontend/react/public/images/countries/ls.svg new file mode 100644 index 00000000..f88130f1 --- /dev/null +++ b/frontend/react/public/images/countries/ls.svg @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/lt.svg b/frontend/react/public/images/countries/lt.svg new file mode 100644 index 00000000..0348401c --- /dev/null +++ b/frontend/react/public/images/countries/lt.svg @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/lu.svg b/frontend/react/public/images/countries/lu.svg new file mode 100644 index 00000000..ed9b8d0e --- /dev/null +++ b/frontend/react/public/images/countries/lu.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/lv.svg b/frontend/react/public/images/countries/lv.svg new file mode 100644 index 00000000..38f5060b --- /dev/null +++ b/frontend/react/public/images/countries/lv.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ly.svg b/frontend/react/public/images/countries/ly.svg new file mode 100644 index 00000000..2a97cfa1 --- /dev/null +++ b/frontend/react/public/images/countries/ly.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ma.svg b/frontend/react/public/images/countries/ma.svg new file mode 100644 index 00000000..dd1de52d --- /dev/null +++ b/frontend/react/public/images/countries/ma.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mc.svg b/frontend/react/public/images/countries/mc.svg new file mode 100644 index 00000000..29148ef0 --- /dev/null +++ b/frontend/react/public/images/countries/mc.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/md.svg b/frontend/react/public/images/countries/md.svg new file mode 100644 index 00000000..4396e0cd --- /dev/null +++ b/frontend/react/public/images/countries/md.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/me.svg b/frontend/react/public/images/countries/me.svg new file mode 100644 index 00000000..bf951bef --- /dev/null +++ b/frontend/react/public/images/countries/me.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mf.svg b/frontend/react/public/images/countries/mf.svg new file mode 100644 index 00000000..066af7bd --- /dev/null +++ b/frontend/react/public/images/countries/mf.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mg.svg b/frontend/react/public/images/countries/mg.svg new file mode 100644 index 00000000..10b8a56a --- /dev/null +++ b/frontend/react/public/images/countries/mg.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mh.svg b/frontend/react/public/images/countries/mh.svg new file mode 100644 index 00000000..50d710f2 --- /dev/null +++ b/frontend/react/public/images/countries/mh.svg @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mk.svg b/frontend/react/public/images/countries/mk.svg new file mode 100644 index 00000000..a9f6a4a8 --- /dev/null +++ b/frontend/react/public/images/countries/mk.svg @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ml.svg b/frontend/react/public/images/countries/ml.svg new file mode 100644 index 00000000..0ba73c78 --- /dev/null +++ b/frontend/react/public/images/countries/ml.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mm.svg b/frontend/react/public/images/countries/mm.svg new file mode 100644 index 00000000..171868bf --- /dev/null +++ b/frontend/react/public/images/countries/mm.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mn.svg b/frontend/react/public/images/countries/mn.svg new file mode 100644 index 00000000..0715c25e --- /dev/null +++ b/frontend/react/public/images/countries/mn.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mo.svg b/frontend/react/public/images/countries/mo.svg new file mode 100644 index 00000000..d0caf275 --- /dev/null +++ b/frontend/react/public/images/countries/mo.svg @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mp.svg b/frontend/react/public/images/countries/mp.svg new file mode 100644 index 00000000..2275ee24 --- /dev/null +++ b/frontend/react/public/images/countries/mp.svg @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mq.svg b/frontend/react/public/images/countries/mq.svg new file mode 100644 index 00000000..d41f85cc --- /dev/null +++ b/frontend/react/public/images/countries/mq.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mr.svg b/frontend/react/public/images/countries/mr.svg new file mode 100644 index 00000000..e4b4f993 --- /dev/null +++ b/frontend/react/public/images/countries/mr.svg @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ms.svg b/frontend/react/public/images/countries/ms.svg new file mode 100644 index 00000000..3a2a6666 --- /dev/null +++ b/frontend/react/public/images/countries/ms.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mt.svg b/frontend/react/public/images/countries/mt.svg new file mode 100644 index 00000000..5a73758f --- /dev/null +++ b/frontend/react/public/images/countries/mt.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mu.svg b/frontend/react/public/images/countries/mu.svg new file mode 100644 index 00000000..fd52f939 --- /dev/null +++ b/frontend/react/public/images/countries/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mv.svg b/frontend/react/public/images/countries/mv.svg new file mode 100644 index 00000000..9cc64295 --- /dev/null +++ b/frontend/react/public/images/countries/mv.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mw.svg b/frontend/react/public/images/countries/mw.svg new file mode 100644 index 00000000..36efb56a --- /dev/null +++ b/frontend/react/public/images/countries/mw.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mx.svg b/frontend/react/public/images/countries/mx.svg new file mode 100644 index 00000000..dcb855a7 --- /dev/null +++ b/frontend/react/public/images/countries/mx.svg @@ -0,0 +1,687 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/my.svg b/frontend/react/public/images/countries/my.svg new file mode 100644 index 00000000..a87e41ed --- /dev/null +++ b/frontend/react/public/images/countries/my.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/mz.svg b/frontend/react/public/images/countries/mz.svg new file mode 100644 index 00000000..26883233 --- /dev/null +++ b/frontend/react/public/images/countries/mz.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/na.svg b/frontend/react/public/images/countries/na.svg new file mode 100644 index 00000000..24c2f074 --- /dev/null +++ b/frontend/react/public/images/countries/na.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/nc.svg b/frontend/react/public/images/countries/nc.svg new file mode 100644 index 00000000..29940567 --- /dev/null +++ b/frontend/react/public/images/countries/nc.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ne.svg b/frontend/react/public/images/countries/ne.svg new file mode 100644 index 00000000..b85c2ce5 --- /dev/null +++ b/frontend/react/public/images/countries/ne.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/nf.svg b/frontend/react/public/images/countries/nf.svg new file mode 100644 index 00000000..ebd09ca8 --- /dev/null +++ b/frontend/react/public/images/countries/nf.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ng.svg b/frontend/react/public/images/countries/ng.svg new file mode 100644 index 00000000..9be3939f --- /dev/null +++ b/frontend/react/public/images/countries/ng.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ni.svg b/frontend/react/public/images/countries/ni.svg new file mode 100644 index 00000000..ee0f3494 --- /dev/null +++ b/frontend/react/public/images/countries/ni.svg @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/nl.svg b/frontend/react/public/images/countries/nl.svg new file mode 100644 index 00000000..b3f1992d --- /dev/null +++ b/frontend/react/public/images/countries/nl.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/no.svg b/frontend/react/public/images/countries/no.svg new file mode 100644 index 00000000..7ab5f6fd --- /dev/null +++ b/frontend/react/public/images/countries/no.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/np.svg b/frontend/react/public/images/countries/np.svg new file mode 100644 index 00000000..2797935f --- /dev/null +++ b/frontend/react/public/images/countries/np.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/nr.svg b/frontend/react/public/images/countries/nr.svg new file mode 100644 index 00000000..f8b4faa0 --- /dev/null +++ b/frontend/react/public/images/countries/nr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/nu.svg b/frontend/react/public/images/countries/nu.svg new file mode 100644 index 00000000..9a569194 --- /dev/null +++ b/frontend/react/public/images/countries/nu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/nz.svg b/frontend/react/public/images/countries/nz.svg new file mode 100644 index 00000000..253aea2a --- /dev/null +++ b/frontend/react/public/images/countries/nz.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/om.svg b/frontend/react/public/images/countries/om.svg new file mode 100644 index 00000000..6530d11c --- /dev/null +++ b/frontend/react/public/images/countries/om.svg @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pa.svg b/frontend/react/public/images/countries/pa.svg new file mode 100644 index 00000000..71a1dfa3 --- /dev/null +++ b/frontend/react/public/images/countries/pa.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pe.svg b/frontend/react/public/images/countries/pe.svg new file mode 100644 index 00000000..ef2301a1 --- /dev/null +++ b/frontend/react/public/images/countries/pe.svg @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pf.svg b/frontend/react/public/images/countries/pf.svg new file mode 100644 index 00000000..8b26bb61 --- /dev/null +++ b/frontend/react/public/images/countries/pf.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pg.svg b/frontend/react/public/images/countries/pg.svg new file mode 100644 index 00000000..4b81deaf --- /dev/null +++ b/frontend/react/public/images/countries/pg.svg @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ph.svg b/frontend/react/public/images/countries/ph.svg new file mode 100644 index 00000000..3d4865fa --- /dev/null +++ b/frontend/react/public/images/countries/ph.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pk.svg b/frontend/react/public/images/countries/pk.svg new file mode 100644 index 00000000..76489a00 --- /dev/null +++ b/frontend/react/public/images/countries/pk.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pl.svg b/frontend/react/public/images/countries/pl.svg new file mode 100644 index 00000000..3d886abc --- /dev/null +++ b/frontend/react/public/images/countries/pl.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pm.svg b/frontend/react/public/images/countries/pm.svg new file mode 100644 index 00000000..723acdbf --- /dev/null +++ b/frontend/react/public/images/countries/pm.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pn.svg b/frontend/react/public/images/countries/pn.svg new file mode 100644 index 00000000..1ceaffd8 --- /dev/null +++ b/frontend/react/public/images/countries/pn.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pr.svg b/frontend/react/public/images/countries/pr.svg new file mode 100644 index 00000000..774b1e4c --- /dev/null +++ b/frontend/react/public/images/countries/pr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ps.svg b/frontend/react/public/images/countries/ps.svg new file mode 100644 index 00000000..d539df99 --- /dev/null +++ b/frontend/react/public/images/countries/ps.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pt.svg b/frontend/react/public/images/countries/pt.svg new file mode 100644 index 00000000..6e942ee5 --- /dev/null +++ b/frontend/react/public/images/countries/pt.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/pw.svg b/frontend/react/public/images/countries/pw.svg new file mode 100644 index 00000000..503854b3 --- /dev/null +++ b/frontend/react/public/images/countries/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/py.svg b/frontend/react/public/images/countries/py.svg new file mode 100644 index 00000000..78a9bc6b --- /dev/null +++ b/frontend/react/public/images/countries/py.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/qa.svg b/frontend/react/public/images/countries/qa.svg new file mode 100644 index 00000000..b10ee481 --- /dev/null +++ b/frontend/react/public/images/countries/qa.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/re.svg b/frontend/react/public/images/countries/re.svg new file mode 100644 index 00000000..9a1f36ad --- /dev/null +++ b/frontend/react/public/images/countries/re.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/red.svg b/frontend/react/public/images/countries/red.svg new file mode 100644 index 00000000..0422092d --- /dev/null +++ b/frontend/react/public/images/countries/red.svg @@ -0,0 +1,57 @@ + + + + + + + image/svg+xml + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ro.svg b/frontend/react/public/images/countries/ro.svg new file mode 100644 index 00000000..d4154f90 --- /dev/null +++ b/frontend/react/public/images/countries/ro.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/rs.svg b/frontend/react/public/images/countries/rs.svg new file mode 100644 index 00000000..45f1fe45 --- /dev/null +++ b/frontend/react/public/images/countries/rs.svg @@ -0,0 +1,537 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ru.svg b/frontend/react/public/images/countries/ru.svg new file mode 100644 index 00000000..33e3cf95 --- /dev/null +++ b/frontend/react/public/images/countries/ru.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/rw.svg b/frontend/react/public/images/countries/rw.svg new file mode 100644 index 00000000..618ecc7e --- /dev/null +++ b/frontend/react/public/images/countries/rw.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sa.svg b/frontend/react/public/images/countries/sa.svg new file mode 100644 index 00000000..7f09beff --- /dev/null +++ b/frontend/react/public/images/countries/sa.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sb.svg b/frontend/react/public/images/countries/sb.svg new file mode 100644 index 00000000..c5472aa2 --- /dev/null +++ b/frontend/react/public/images/countries/sb.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sc.svg b/frontend/react/public/images/countries/sc.svg new file mode 100644 index 00000000..648c1cb3 --- /dev/null +++ b/frontend/react/public/images/countries/sc.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sd.svg b/frontend/react/public/images/countries/sd.svg new file mode 100644 index 00000000..7d01aa77 --- /dev/null +++ b/frontend/react/public/images/countries/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/se.svg b/frontend/react/public/images/countries/se.svg new file mode 100644 index 00000000..5e79b0c4 --- /dev/null +++ b/frontend/react/public/images/countries/se.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sg.svg b/frontend/react/public/images/countries/sg.svg new file mode 100644 index 00000000..2be9ad20 --- /dev/null +++ b/frontend/react/public/images/countries/sg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sh.svg b/frontend/react/public/images/countries/sh.svg new file mode 100644 index 00000000..43f1f1df --- /dev/null +++ b/frontend/react/public/images/countries/sh.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/si.svg b/frontend/react/public/images/countries/si.svg new file mode 100644 index 00000000..2aae6980 --- /dev/null +++ b/frontend/react/public/images/countries/si.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sj.svg b/frontend/react/public/images/countries/sj.svg new file mode 100644 index 00000000..0230663c --- /dev/null +++ b/frontend/react/public/images/countries/sj.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sk.svg b/frontend/react/public/images/countries/sk.svg new file mode 100644 index 00000000..8dc0c524 --- /dev/null +++ b/frontend/react/public/images/countries/sk.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sl.svg b/frontend/react/public/images/countries/sl.svg new file mode 100644 index 00000000..37205b54 --- /dev/null +++ b/frontend/react/public/images/countries/sl.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sm.svg b/frontend/react/public/images/countries/sm.svg new file mode 100644 index 00000000..3f5c3b3c --- /dev/null +++ b/frontend/react/public/images/countries/sm.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sn.svg b/frontend/react/public/images/countries/sn.svg new file mode 100644 index 00000000..0998237f --- /dev/null +++ b/frontend/react/public/images/countries/sn.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/so.svg b/frontend/react/public/images/countries/so.svg new file mode 100644 index 00000000..e6aaf767 --- /dev/null +++ b/frontend/react/public/images/countries/so.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/social.svg b/frontend/react/public/images/countries/social.svg new file mode 100644 index 00000000..d346bb45 --- /dev/null +++ b/frontend/react/public/images/countries/social.svg @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sr.svg b/frontend/react/public/images/countries/sr.svg new file mode 100644 index 00000000..a9023115 --- /dev/null +++ b/frontend/react/public/images/countries/sr.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ss.svg b/frontend/react/public/images/countries/ss.svg new file mode 100644 index 00000000..48b41344 --- /dev/null +++ b/frontend/react/public/images/countries/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/st.svg b/frontend/react/public/images/countries/st.svg new file mode 100644 index 00000000..6a526ba4 --- /dev/null +++ b/frontend/react/public/images/countries/st.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sv.svg b/frontend/react/public/images/countries/sv.svg new file mode 100644 index 00000000..58a33f90 --- /dev/null +++ b/frontend/react/public/images/countries/sv.svg @@ -0,0 +1,902 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sx.svg b/frontend/react/public/images/countries/sx.svg new file mode 100644 index 00000000..e10328a3 --- /dev/null +++ b/frontend/react/public/images/countries/sx.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sy.svg b/frontend/react/public/images/countries/sy.svg new file mode 100644 index 00000000..d57d2c17 --- /dev/null +++ b/frontend/react/public/images/countries/sy.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/sz.svg b/frontend/react/public/images/countries/sz.svg new file mode 100644 index 00000000..999f611f --- /dev/null +++ b/frontend/react/public/images/countries/sz.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ta.svg b/frontend/react/public/images/countries/ta.svg new file mode 100644 index 00000000..fd0e43cf --- /dev/null +++ b/frontend/react/public/images/countries/ta.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tc.svg b/frontend/react/public/images/countries/tc.svg new file mode 100644 index 00000000..8d73c32c --- /dev/null +++ b/frontend/react/public/images/countries/tc.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/td.svg b/frontend/react/public/images/countries/td.svg new file mode 100644 index 00000000..21ae3002 --- /dev/null +++ b/frontend/react/public/images/countries/td.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tf.svg b/frontend/react/public/images/countries/tf.svg new file mode 100644 index 00000000..c0c2fb2c --- /dev/null +++ b/frontend/react/public/images/countries/tf.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tg.svg b/frontend/react/public/images/countries/tg.svg new file mode 100644 index 00000000..92d9eb24 --- /dev/null +++ b/frontend/react/public/images/countries/tg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/th.svg b/frontend/react/public/images/countries/th.svg new file mode 100644 index 00000000..00843d8f --- /dev/null +++ b/frontend/react/public/images/countries/th.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/third.svg b/frontend/react/public/images/countries/third.svg new file mode 100644 index 00000000..d38e5a36 --- /dev/null +++ b/frontend/react/public/images/countries/third.svg @@ -0,0 +1,56 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tj.svg b/frontend/react/public/images/countries/tj.svg new file mode 100644 index 00000000..cd26cc68 --- /dev/null +++ b/frontend/react/public/images/countries/tj.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tk.svg b/frontend/react/public/images/countries/tk.svg new file mode 100644 index 00000000..6003afcd --- /dev/null +++ b/frontend/react/public/images/countries/tk.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tl.svg b/frontend/react/public/images/countries/tl.svg new file mode 100644 index 00000000..d72a3e75 --- /dev/null +++ b/frontend/react/public/images/countries/tl.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tm.svg b/frontend/react/public/images/countries/tm.svg new file mode 100644 index 00000000..492d1bf9 --- /dev/null +++ b/frontend/react/public/images/countries/tm.svg @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tn.svg b/frontend/react/public/images/countries/tn.svg new file mode 100644 index 00000000..a7dfc8be --- /dev/null +++ b/frontend/react/public/images/countries/tn.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/to.svg b/frontend/react/public/images/countries/to.svg new file mode 100644 index 00000000..2a69e403 --- /dev/null +++ b/frontend/react/public/images/countries/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tr.svg b/frontend/react/public/images/countries/tr.svg new file mode 100644 index 00000000..8bbc3e6f --- /dev/null +++ b/frontend/react/public/images/countries/tr.svg @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tt.svg b/frontend/react/public/images/countries/tt.svg new file mode 100644 index 00000000..83cfd141 --- /dev/null +++ b/frontend/react/public/images/countries/tt.svg @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tv.svg b/frontend/react/public/images/countries/tv.svg new file mode 100644 index 00000000..03cce039 --- /dev/null +++ b/frontend/react/public/images/countries/tv.svg @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tw.svg b/frontend/react/public/images/countries/tw.svg new file mode 100644 index 00000000..3a1a52ad --- /dev/null +++ b/frontend/react/public/images/countries/tw.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/tz.svg b/frontend/react/public/images/countries/tz.svg new file mode 100644 index 00000000..d3c30b5c --- /dev/null +++ b/frontend/react/public/images/countries/tz.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ua.svg b/frontend/react/public/images/countries/ua.svg new file mode 100644 index 00000000..27a6b99c --- /dev/null +++ b/frontend/react/public/images/countries/ua.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ug.svg b/frontend/react/public/images/countries/ug.svg new file mode 100644 index 00000000..f3748de6 --- /dev/null +++ b/frontend/react/public/images/countries/ug.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/um.svg b/frontend/react/public/images/countries/um.svg new file mode 100644 index 00000000..002bb9f9 --- /dev/null +++ b/frontend/react/public/images/countries/um.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/un.svg b/frontend/react/public/images/countries/un.svg new file mode 100644 index 00000000..00c31402 --- /dev/null +++ b/frontend/react/public/images/countries/un.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/unk.svg b/frontend/react/public/images/countries/unk.svg new file mode 100644 index 00000000..c960591a --- /dev/null +++ b/frontend/react/public/images/countries/unk.svg @@ -0,0 +1,68 @@ + + + + + + + image/svg+xml + + + + + + + ? + \ No newline at end of file diff --git a/frontend/react/public/images/countries/us.svg b/frontend/react/public/images/countries/us.svg new file mode 100644 index 00000000..137f1ba7 --- /dev/null +++ b/frontend/react/public/images/countries/us.svg @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ussr.svg b/frontend/react/public/images/countries/ussr.svg new file mode 100644 index 00000000..6bdaec5e --- /dev/null +++ b/frontend/react/public/images/countries/ussr.svg @@ -0,0 +1,74 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/uy.svg b/frontend/react/public/images/countries/uy.svg new file mode 100644 index 00000000..ba7d1cc9 --- /dev/null +++ b/frontend/react/public/images/countries/uy.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/uz.svg b/frontend/react/public/images/countries/uz.svg new file mode 100644 index 00000000..bc4a402e --- /dev/null +++ b/frontend/react/public/images/countries/uz.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/va.svg b/frontend/react/public/images/countries/va.svg new file mode 100644 index 00000000..e2934697 --- /dev/null +++ b/frontend/react/public/images/countries/va.svg @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/vc.svg b/frontend/react/public/images/countries/vc.svg new file mode 100644 index 00000000..c532ad7a --- /dev/null +++ b/frontend/react/public/images/countries/vc.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ve.svg b/frontend/react/public/images/countries/ve.svg new file mode 100644 index 00000000..68c956ac --- /dev/null +++ b/frontend/react/public/images/countries/ve.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/vg.svg b/frontend/react/public/images/countries/vg.svg new file mode 100644 index 00000000..a31eae08 --- /dev/null +++ b/frontend/react/public/images/countries/vg.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/vi.svg b/frontend/react/public/images/countries/vi.svg new file mode 100644 index 00000000..d27fe04f --- /dev/null +++ b/frontend/react/public/images/countries/vi.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/vn.svg b/frontend/react/public/images/countries/vn.svg new file mode 100644 index 00000000..5291f28f --- /dev/null +++ b/frontend/react/public/images/countries/vn.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/vu.svg b/frontend/react/public/images/countries/vu.svg new file mode 100644 index 00000000..4a74d7ed --- /dev/null +++ b/frontend/react/public/images/countries/vu.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/wf.svg b/frontend/react/public/images/countries/wf.svg new file mode 100644 index 00000000..19f1d93a --- /dev/null +++ b/frontend/react/public/images/countries/wf.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ws.svg b/frontend/react/public/images/countries/ws.svg new file mode 100644 index 00000000..3bf655f7 --- /dev/null +++ b/frontend/react/public/images/countries/ws.svg @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/xk.svg b/frontend/react/public/images/countries/xk.svg new file mode 100644 index 00000000..7c7bdb86 --- /dev/null +++ b/frontend/react/public/images/countries/xk.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/xx.svg b/frontend/react/public/images/countries/xx.svg new file mode 100644 index 00000000..0bd5e9a6 --- /dev/null +++ b/frontend/react/public/images/countries/xx.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/ye.svg b/frontend/react/public/images/countries/ye.svg new file mode 100644 index 00000000..b57affd9 --- /dev/null +++ b/frontend/react/public/images/countries/ye.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/yt.svg b/frontend/react/public/images/countries/yt.svg new file mode 100644 index 00000000..f4308aa4 --- /dev/null +++ b/frontend/react/public/images/countries/yt.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/yug.svg b/frontend/react/public/images/countries/yug.svg new file mode 100644 index 00000000..5af7a0d3 --- /dev/null +++ b/frontend/react/public/images/countries/yug.svg @@ -0,0 +1,53 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/za.svg b/frontend/react/public/images/countries/za.svg new file mode 100644 index 00000000..35012f44 --- /dev/null +++ b/frontend/react/public/images/countries/za.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/zm.svg b/frontend/react/public/images/countries/zm.svg new file mode 100644 index 00000000..1ed8e993 --- /dev/null +++ b/frontend/react/public/images/countries/zm.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/countries/zw.svg b/frontend/react/public/images/countries/zw.svg new file mode 100644 index 00000000..a785d961 --- /dev/null +++ b/frontend/react/public/images/countries/zw.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/favicons/android-chrome-192x192.png b/frontend/react/public/images/favicons/android-chrome-192x192.png new file mode 100644 index 00000000..94156476 Binary files /dev/null and b/frontend/react/public/images/favicons/android-chrome-192x192.png differ diff --git a/frontend/react/public/images/favicons/android-chrome-512x512.png b/frontend/react/public/images/favicons/android-chrome-512x512.png new file mode 100644 index 00000000..1b1a4c17 Binary files /dev/null and b/frontend/react/public/images/favicons/android-chrome-512x512.png differ diff --git a/frontend/react/public/images/favicons/apple-touch-icon.png b/frontend/react/public/images/favicons/apple-touch-icon.png new file mode 100644 index 00000000..8aa1651e Binary files /dev/null and b/frontend/react/public/images/favicons/apple-touch-icon.png differ diff --git a/frontend/react/public/images/favicons/favicon-16x16.png b/frontend/react/public/images/favicons/favicon-16x16.png new file mode 100644 index 00000000..01d279f2 Binary files /dev/null and b/frontend/react/public/images/favicons/favicon-16x16.png differ diff --git a/frontend/react/public/images/favicons/favicon-32x32.png b/frontend/react/public/images/favicons/favicon-32x32.png new file mode 100644 index 00000000..63c55bd2 Binary files /dev/null and b/frontend/react/public/images/favicons/favicon-32x32.png differ diff --git a/frontend/react/public/images/favicons/favicon.ico b/frontend/react/public/images/favicons/favicon.ico new file mode 100644 index 00000000..5bb88640 Binary files /dev/null and b/frontend/react/public/images/favicons/favicon.ico differ diff --git a/frontend/react/public/images/favicons/site.webmanifest b/frontend/react/public/images/favicons/site.webmanifest new file mode 100644 index 00000000..85fe3e4b --- /dev/null +++ b/frontend/react/public/images/favicons/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "DCS Olympus", + "short_name": "DCS Olympus", + "icons": [ + { + "src": "/images/favicons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/images/favicons/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/frontend/react/public/images/icon-round.png b/frontend/react/public/images/icon-round.png new file mode 100644 index 00000000..0244ffa7 Binary files /dev/null and b/frontend/react/public/images/icon-round.png differ diff --git a/frontend/react/public/images/icon.png b/frontend/react/public/images/icon.png new file mode 100644 index 00000000..9e11ba9c Binary files /dev/null and b/frontend/react/public/images/icon.png differ diff --git a/frontend/react/public/images/icons/altitude.svg b/frontend/react/public/images/icons/altitude.svg new file mode 100644 index 00000000..e63b1609 --- /dev/null +++ b/frontend/react/public/images/icons/altitude.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/arrow-pointer-solid.svg b/frontend/react/public/images/icons/arrow-pointer-solid.svg new file mode 100644 index 00000000..5f9a32d6 --- /dev/null +++ b/frontend/react/public/images/icons/arrow-pointer-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/arrows-to-eye-solid.svg b/frontend/react/public/images/icons/arrows-to-eye-solid.svg new file mode 100644 index 00000000..d54355c9 --- /dev/null +++ b/frontend/react/public/images/icons/arrows-to-eye-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/bomb-solid.svg b/frontend/react/public/images/icons/bomb-solid.svg new file mode 100644 index 00000000..a456f0ec --- /dev/null +++ b/frontend/react/public/images/icons/bomb-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/burst-solid.svg b/frontend/react/public/images/icons/burst-solid.svg new file mode 100644 index 00000000..99c49c2a --- /dev/null +++ b/frontend/react/public/images/icons/burst-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/camera.svg b/frontend/react/public/images/icons/camera.svg similarity index 67% rename from frontend/server/public/themes/olympus/images/icons/camera.svg rename to frontend/react/public/images/icons/camera.svg index 71f65572..71e162d3 100644 --- a/frontend/server/public/themes/olympus/images/icons/camera.svg +++ b/frontend/react/public/images/icons/camera.svg @@ -1,15 +1,15 @@ + fill="black" /> \ No newline at end of file diff --git a/frontend/react/public/images/icons/check_square.svg b/frontend/react/public/images/icons/check_square.svg new file mode 100644 index 00000000..7c4452e1 --- /dev/null +++ b/frontend/react/public/images/icons/check_square.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/chevron-down-warning.svg b/frontend/react/public/images/icons/chevron-down-warning.svg new file mode 100644 index 00000000..388d5c1d --- /dev/null +++ b/frontend/react/public/images/icons/chevron-down-warning.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/chevron-down.svg b/frontend/react/public/images/icons/chevron-down.svg new file mode 100644 index 00000000..fe9fdcf7 --- /dev/null +++ b/frontend/react/public/images/icons/chevron-down.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/circle-info-solid.svg b/frontend/react/public/images/icons/circle-info-solid.svg new file mode 100644 index 00000000..514d6e04 --- /dev/null +++ b/frontend/react/public/images/icons/circle-info-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/circle-question-regular.svg b/frontend/react/public/images/icons/circle-question-regular.svg new file mode 100644 index 00000000..985d4582 --- /dev/null +++ b/frontend/react/public/images/icons/circle-question-regular.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/climb.svg b/frontend/react/public/images/icons/climb.svg new file mode 100644 index 00000000..4e13c498 --- /dev/null +++ b/frontend/react/public/images/icons/climb.svg @@ -0,0 +1,42 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/crosshairs-solid.svg b/frontend/react/public/images/icons/crosshairs-solid.svg new file mode 100644 index 00000000..1f86a76f --- /dev/null +++ b/frontend/react/public/images/icons/crosshairs-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/descent.svg b/frontend/react/public/images/icons/descent.svg new file mode 100644 index 00000000..d01767ac --- /dev/null +++ b/frontend/react/public/images/icons/descent.svg @@ -0,0 +1,42 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/diamond.svg b/frontend/react/public/images/icons/diamond.svg new file mode 100644 index 00000000..280cf5a9 --- /dev/null +++ b/frontend/react/public/images/icons/diamond.svg @@ -0,0 +1,73 @@ + + + + + + image/svg+xml + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/echelon-lh.svg b/frontend/react/public/images/icons/echelon-lh.svg new file mode 100644 index 00000000..1e858b89 --- /dev/null +++ b/frontend/react/public/images/icons/echelon-lh.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/echelon-rh.svg b/frontend/react/public/images/icons/echelon-rh.svg new file mode 100644 index 00000000..ed2d7c99 --- /dev/null +++ b/frontend/react/public/images/icons/echelon-rh.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/echelon.svg b/frontend/react/public/images/icons/echelon.svg new file mode 100644 index 00000000..0aebcc15 --- /dev/null +++ b/frontend/react/public/images/icons/echelon.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/explosion-solid.svg b/frontend/react/public/images/icons/explosion-solid.svg new file mode 100644 index 00000000..90fd17e9 --- /dev/null +++ b/frontend/react/public/images/icons/explosion-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/eye-solid.svg b/frontend/react/public/images/icons/eye-solid.svg new file mode 100644 index 00000000..56ded06d --- /dev/null +++ b/frontend/react/public/images/icons/eye-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/fire-solid.svg b/frontend/react/public/images/icons/fire-solid.svg new file mode 100644 index 00000000..909b2621 --- /dev/null +++ b/frontend/react/public/images/icons/fire-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/follow.svg b/frontend/react/public/images/icons/follow.svg new file mode 100644 index 00000000..ae78c6c6 --- /dev/null +++ b/frontend/react/public/images/icons/follow.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/formation-end.svg b/frontend/react/public/images/icons/formation-end.svg new file mode 100644 index 00000000..d56674d7 --- /dev/null +++ b/frontend/react/public/images/icons/formation-end.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/formation-middle.svg b/frontend/react/public/images/icons/formation-middle.svg new file mode 100644 index 00000000..dc8691fa --- /dev/null +++ b/frontend/react/public/images/icons/formation-middle.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/front.svg b/frontend/react/public/images/icons/front.svg new file mode 100644 index 00000000..c96b0dbf --- /dev/null +++ b/frontend/react/public/images/icons/front.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/fuel.svg b/frontend/react/public/images/icons/fuel.svg new file mode 100644 index 00000000..b7f13cc4 --- /dev/null +++ b/frontend/react/public/images/icons/fuel.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/gamepad-solid.svg b/frontend/react/public/images/icons/gamepad-solid.svg new file mode 100644 index 00000000..c250ecc4 --- /dev/null +++ b/frontend/react/public/images/icons/gamepad-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/gears-solid.svg b/frontend/react/public/images/icons/gears-solid.svg new file mode 100644 index 00000000..717e3c8c --- /dev/null +++ b/frontend/react/public/images/icons/gears-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/grip-lines-solid.svg b/frontend/react/public/images/icons/grip-lines-solid.svg new file mode 100644 index 00000000..33e7a98f --- /dev/null +++ b/frontend/react/public/images/icons/grip-lines-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/group-ground.svg b/frontend/react/public/images/icons/group-ground.svg similarity index 79% rename from frontend/server/public/themes/olympus/images/icons/group-ground.svg rename to frontend/react/public/images/icons/group-ground.svg index d47d8bc6..261ae6cb 100644 --- a/frontend/server/public/themes/olympus/images/icons/group-ground.svg +++ b/frontend/react/public/images/icons/group-ground.svg @@ -1,15 +1,15 @@ + r="52.56604" /> \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/group-navy.svg b/frontend/react/public/images/icons/group-navy.svg similarity index 75% rename from frontend/server/public/themes/olympus/images/icons/group-navy.svg rename to frontend/react/public/images/icons/group-navy.svg index c2457a0f..06f47811 100644 --- a/frontend/server/public/themes/olympus/images/icons/group-navy.svg +++ b/frontend/react/public/images/icons/group-navy.svg @@ -1,15 +1,15 @@ + d="m 14.337485,311.27878 a 226.81407,212.6382 0 0 1 226.814085,1e-5 L 127.74452,495.42886 Z" /> \ No newline at end of file diff --git a/frontend/react/public/images/icons/hand-solid.svg b/frontend/react/public/images/icons/hand-solid.svg new file mode 100644 index 00000000..835f7f77 --- /dev/null +++ b/frontend/react/public/images/icons/hand-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/heading.svg b/frontend/react/public/images/icons/heading.svg new file mode 100644 index 00000000..8cd46189 --- /dev/null +++ b/frontend/react/public/images/icons/heading.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/health.svg b/frontend/react/public/images/icons/health.svg new file mode 100644 index 00000000..35246c8f --- /dev/null +++ b/frontend/react/public/images/icons/health.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/jet-fighter-up-solid.svg b/frontend/react/public/images/icons/jet-fighter-up-solid.svg new file mode 100644 index 00000000..df7b6a38 --- /dev/null +++ b/frontend/react/public/images/icons/jet-fighter-up-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/keyboard-solid.svg b/frontend/react/public/images/icons/keyboard-solid.svg new file mode 100644 index 00000000..25ca0376 --- /dev/null +++ b/frontend/react/public/images/icons/keyboard-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/land-at-point.svg b/frontend/react/public/images/icons/land-at-point.svg new file mode 100644 index 00000000..1c3ccf49 --- /dev/null +++ b/frontend/react/public/images/icons/land-at-point.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/line-abreast.svg b/frontend/react/public/images/icons/line-abreast.svg new file mode 100644 index 00000000..cf26c2fd --- /dev/null +++ b/frontend/react/public/images/icons/line-abreast.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/map-source.svg b/frontend/react/public/images/icons/map-source.svg new file mode 100644 index 00000000..0fa76064 --- /dev/null +++ b/frontend/react/public/images/icons/map-source.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/miss-blue.svg b/frontend/react/public/images/icons/miss-blue.svg new file mode 100644 index 00000000..29a23701 --- /dev/null +++ b/frontend/react/public/images/icons/miss-blue.svg @@ -0,0 +1,44 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/miss-red.svg b/frontend/react/public/images/icons/miss-red.svg new file mode 100644 index 00000000..5dfea3b2 --- /dev/null +++ b/frontend/react/public/images/icons/miss-red.svg @@ -0,0 +1,44 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/miss.svg b/frontend/react/public/images/icons/miss.svg new file mode 100644 index 00000000..9dc33158 --- /dev/null +++ b/frontend/react/public/images/icons/miss.svg @@ -0,0 +1,44 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/napalm.svg b/frontend/react/public/images/icons/napalm.svg new file mode 100644 index 00000000..09ecf9b9 --- /dev/null +++ b/frontend/react/public/images/icons/napalm.svg @@ -0,0 +1,43 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/person-military-pointing-solid.svg b/frontend/react/public/images/icons/person-military-pointing-solid.svg new file mode 100644 index 00000000..08a03dc4 --- /dev/null +++ b/frontend/react/public/images/icons/person-military-pointing-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/pin.svg b/frontend/react/public/images/icons/pin.svg new file mode 100644 index 00000000..0815ae07 --- /dev/null +++ b/frontend/react/public/images/icons/pin.svg @@ -0,0 +1,46 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/plane.svg b/frontend/react/public/images/icons/plane.svg new file mode 100644 index 00000000..ed567d52 --- /dev/null +++ b/frontend/react/public/images/icons/plane.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/ruler.svg b/frontend/react/public/images/icons/ruler.svg new file mode 100644 index 00000000..72ba6280 --- /dev/null +++ b/frontend/react/public/images/icons/ruler.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/scenic-blue.svg b/frontend/react/public/images/icons/scenic-blue.svg similarity index 85% rename from frontend/server/public/themes/olympus/images/icons/scenic-blue.svg rename to frontend/react/public/images/icons/scenic-blue.svg index c19ddb60..d148ede8 100644 --- a/frontend/server/public/themes/olympus/images/icons/scenic-blue.svg +++ b/frontend/react/public/images/icons/scenic-blue.svg @@ -1,15 +1,15 @@ + style="stroke-width:0.280262" /> \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/scenic-red.svg b/frontend/react/public/images/icons/scenic-red.svg similarity index 85% rename from frontend/server/public/themes/olympus/images/icons/scenic-red.svg rename to frontend/react/public/images/icons/scenic-red.svg index 0fe03fd9..3c441582 100644 --- a/frontend/server/public/themes/olympus/images/icons/scenic-red.svg +++ b/frontend/react/public/images/icons/scenic-red.svg @@ -1,15 +1,15 @@ + style="stroke-width:0.280262" /> \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/scenic.svg b/frontend/react/public/images/icons/scenic.svg similarity index 85% rename from frontend/server/public/themes/olympus/images/icons/scenic.svg rename to frontend/react/public/images/icons/scenic.svg index 6321f72a..72e9fe9e 100644 --- a/frontend/server/public/themes/olympus/images/icons/scenic.svg +++ b/frontend/react/public/images/icons/scenic.svg @@ -1,15 +1,15 @@ + style="stroke-width:0.280262" /> \ No newline at end of file diff --git a/frontend/react/public/images/icons/secondaries.svg b/frontend/react/public/images/icons/secondaries.svg new file mode 100644 index 00000000..9fd3b61b --- /dev/null +++ b/frontend/react/public/images/icons/secondaries.svg @@ -0,0 +1,51 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/smog-solid.svg b/frontend/react/public/images/icons/smog-solid.svg new file mode 100644 index 00000000..1d80749b --- /dev/null +++ b/frontend/react/public/images/icons/smog-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/speed-decrease.svg b/frontend/react/public/images/icons/speed-decrease.svg new file mode 100644 index 00000000..9c8592a2 --- /dev/null +++ b/frontend/react/public/images/icons/speed-decrease.svg @@ -0,0 +1,59 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/speed-increase.svg b/frontend/react/public/images/icons/speed-increase.svg new file mode 100644 index 00000000..d0dab688 --- /dev/null +++ b/frontend/react/public/images/icons/speed-increase.svg @@ -0,0 +1,58 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/speed.svg b/frontend/react/public/images/icons/speed.svg new file mode 100644 index 00000000..e90d1b16 --- /dev/null +++ b/frontend/react/public/images/icons/speed.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/square-check-solid.svg b/frontend/react/public/images/icons/square-check-solid.svg new file mode 100644 index 00000000..fd49d800 --- /dev/null +++ b/frontend/react/public/images/icons/square-check-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/square-regular.svg b/frontend/react/public/images/icons/square-regular.svg new file mode 100644 index 00000000..e79a57f4 --- /dev/null +++ b/frontend/react/public/images/icons/square-regular.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/sword.svg b/frontend/react/public/images/icons/sword.svg new file mode 100644 index 00000000..24b970c4 --- /dev/null +++ b/frontend/react/public/images/icons/sword.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/trail.svg b/frontend/react/public/images/icons/trail.svg new file mode 100644 index 00000000..2d312dd6 --- /dev/null +++ b/frontend/react/public/images/icons/trail.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/trash-can-regular.svg b/frontend/react/public/images/icons/trash-can-regular.svg new file mode 100644 index 00000000..9c583fc0 --- /dev/null +++ b/frontend/react/public/images/icons/trash-can-regular.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/triangle-exclamation-solid.svg b/frontend/react/public/images/icons/triangle-exclamation-solid.svg new file mode 100644 index 00000000..8fee83a8 --- /dev/null +++ b/frontend/react/public/images/icons/triangle-exclamation-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/icons/white-phosphorous.svg b/frontend/react/public/images/icons/white-phosphorous.svg new file mode 100644 index 00000000..acacc33b --- /dev/null +++ b/frontend/react/public/images/icons/white-phosphorous.svg @@ -0,0 +1,43 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/markers/airbase.svg b/frontend/react/public/images/markers/airbase.svg new file mode 100644 index 00000000..aef7666e --- /dev/null +++ b/frontend/react/public/images/markers/airbase.svg @@ -0,0 +1,83 @@ + + + + + + image/svg+xml + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/markers/bullseye.svg b/frontend/react/public/images/markers/bullseye.svg new file mode 100644 index 00000000..7e86f68e --- /dev/null +++ b/frontend/react/public/images/markers/bullseye.svg @@ -0,0 +1,45 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/markers/draw.svg b/frontend/react/public/images/markers/draw.svg new file mode 100644 index 00000000..d00ac7dd --- /dev/null +++ b/frontend/react/public/images/markers/draw.svg @@ -0,0 +1,40 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/markers/marker-icon.png b/frontend/react/public/images/markers/marker-icon.png similarity index 100% rename from frontend/server/public/themes/olympus/images/markers/marker-icon.png rename to frontend/react/public/images/markers/marker-icon.png diff --git a/frontend/server/public/themes/olympus/images/markers/marker-shadow.png b/frontend/react/public/images/markers/marker-shadow.png similarity index 100% rename from frontend/server/public/themes/olympus/images/markers/marker-shadow.png rename to frontend/react/public/images/markers/marker-shadow.png diff --git a/frontend/react/public/images/markers/move.svg b/frontend/react/public/images/markers/move.svg new file mode 100644 index 00000000..254f5e0f --- /dev/null +++ b/frontend/react/public/images/markers/move.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/markers/smoke.svg b/frontend/react/public/images/markers/smoke.svg new file mode 100644 index 00000000..f49f1c44 --- /dev/null +++ b/frontend/react/public/images/markers/smoke.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/markers/target.svg b/frontend/react/public/images/markers/target.svg new file mode 100644 index 00000000..1f740173 --- /dev/null +++ b/frontend/react/public/images/markers/target.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/olympus-4112x4112.png b/frontend/react/public/images/olympus-4112x4112.png new file mode 100644 index 00000000..fedbfca1 Binary files /dev/null and b/frontend/react/public/images/olympus-4112x4112.png differ diff --git a/frontend/react/public/images/olympus-500x500.png b/frontend/react/public/images/olympus-500x500.png new file mode 100644 index 00000000..42c1b326 Binary files /dev/null and b/frontend/react/public/images/olympus-500x500.png differ diff --git a/frontend/server/public/themes/olympus/images/parrot/parrot.png b/frontend/react/public/images/parrot/parrot.png similarity index 100% rename from frontend/server/public/themes/olympus/images/parrot/parrot.png rename to frontend/react/public/images/parrot/parrot.png diff --git a/frontend/server/public/themes/olympus/images/splash/1.jpg b/frontend/react/public/images/splash/1.jpg similarity index 100% rename from frontend/server/public/themes/olympus/images/splash/1.jpg rename to frontend/react/public/images/splash/1.jpg diff --git a/frontend/server/public/themes/olympus/images/splash/2.jpg b/frontend/react/public/images/splash/2.jpg similarity index 100% rename from frontend/server/public/themes/olympus/images/splash/2.jpg rename to frontend/react/public/images/splash/2.jpg diff --git a/frontend/server/public/themes/olympus/images/splash/3.jpg b/frontend/react/public/images/splash/3.jpg similarity index 100% rename from frontend/server/public/themes/olympus/images/splash/3.jpg rename to frontend/react/public/images/splash/3.jpg diff --git a/frontend/server/public/themes/olympus/images/splash/4.jpg b/frontend/react/public/images/splash/4.jpg similarity index 100% rename from frontend/server/public/themes/olympus/images/splash/4.jpg rename to frontend/react/public/images/splash/4.jpg diff --git a/frontend/server/public/themes/olympus/images/splash/5.jpg b/frontend/react/public/images/splash/5.jpg similarity index 100% rename from frontend/server/public/themes/olympus/images/splash/5.jpg rename to frontend/react/public/images/splash/5.jpg diff --git a/frontend/server/public/themes/olympus/images/splash/6.jpg b/frontend/react/public/images/splash/6.jpg similarity index 100% rename from frontend/server/public/themes/olympus/images/splash/6.jpg rename to frontend/react/public/images/splash/6.jpg diff --git a/frontend/server/public/themes/olympus/images/splash/7.jpg b/frontend/react/public/images/splash/7.jpg similarity index 100% rename from frontend/server/public/themes/olympus/images/splash/7.jpg rename to frontend/react/public/images/splash/7.jpg diff --git a/frontend/server/public/themes/olympus/images/splash/8.jpg b/frontend/react/public/images/splash/8.jpg similarity index 100% rename from frontend/server/public/themes/olympus/images/splash/8.jpg rename to frontend/react/public/images/splash/8.jpg diff --git a/frontend/react/public/images/states/attack.svg b/frontend/react/public/images/states/attack.svg new file mode 100644 index 00000000..daabf0c2 --- /dev/null +++ b/frontend/react/public/images/states/attack.svg @@ -0,0 +1,53 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/states/awacs.svg b/frontend/react/public/images/states/awacs.svg new file mode 100644 index 00000000..669d364f --- /dev/null +++ b/frontend/react/public/images/states/awacs.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/states/dcs.svg b/frontend/react/public/images/states/dcs.svg new file mode 100644 index 00000000..649c3d82 --- /dev/null +++ b/frontend/react/public/images/states/dcs.svg @@ -0,0 +1,71 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/states/follow.svg b/frontend/react/public/images/states/follow.svg new file mode 100644 index 00000000..61c47e3c --- /dev/null +++ b/frontend/react/public/images/states/follow.svg @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/states/human.svg b/frontend/react/public/images/states/human.svg new file mode 100644 index 00000000..54fe73bb --- /dev/null +++ b/frontend/react/public/images/states/human.svg @@ -0,0 +1,51 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/states/idle.svg b/frontend/react/public/images/states/idle.svg new file mode 100644 index 00000000..302f60e3 --- /dev/null +++ b/frontend/react/public/images/states/idle.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/states/land-at-point.svg b/frontend/react/public/images/states/land-at-point.svg new file mode 100644 index 00000000..8d8c0c3c --- /dev/null +++ b/frontend/react/public/images/states/land-at-point.svg @@ -0,0 +1,51 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/states/miss-on-purpose.svg b/frontend/react/public/images/states/miss-on-purpose.svg similarity index 94% rename from frontend/server/public/themes/olympus/images/states/miss-on-purpose.svg rename to frontend/react/public/images/states/miss-on-purpose.svg index 1fe1c274..c1d9a11a 100644 --- a/frontend/server/public/themes/olympus/images/states/miss-on-purpose.svg +++ b/frontend/react/public/images/states/miss-on-purpose.svg @@ -1,18 +1,18 @@ + style="fill:#ffffff;fill-opacity:1;stroke-width:0.688083" /> \ No newline at end of file diff --git a/frontend/react/public/images/states/no-task.svg b/frontend/react/public/images/states/no-task.svg new file mode 100644 index 00000000..70e75414 --- /dev/null +++ b/frontend/react/public/images/states/no-task.svg @@ -0,0 +1,53 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/states/off.svg b/frontend/react/public/images/states/off.svg new file mode 100644 index 00000000..333b0d85 --- /dev/null +++ b/frontend/react/public/images/states/off.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/states/refuel.svg b/frontend/react/public/images/states/refuel.svg new file mode 100644 index 00000000..cb805fd2 --- /dev/null +++ b/frontend/react/public/images/states/refuel.svg @@ -0,0 +1,61 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/states/rtb.svg b/frontend/react/public/images/states/rtb.svg new file mode 100644 index 00000000..c394967e --- /dev/null +++ b/frontend/react/public/images/states/rtb.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/states/scenic-aaa.svg b/frontend/react/public/images/states/scenic-aaa.svg similarity index 94% rename from frontend/server/public/themes/olympus/images/states/scenic-aaa.svg rename to frontend/react/public/images/states/scenic-aaa.svg index 53fbbfa4..8344fa72 100644 --- a/frontend/server/public/themes/olympus/images/states/scenic-aaa.svg +++ b/frontend/react/public/images/states/scenic-aaa.svg @@ -1,18 +1,18 @@ + style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.280262;stroke-opacity:1" /> \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/states/simulate-fire-fight.svg b/frontend/react/public/images/states/simulate-fire-fight.svg similarity index 88% rename from frontend/server/public/themes/olympus/images/states/simulate-fire-fight.svg rename to frontend/react/public/images/states/simulate-fire-fight.svg index 113730be..30590b9b 100644 --- a/frontend/server/public/themes/olympus/images/states/simulate-fire-fight.svg +++ b/frontend/react/public/images/states/simulate-fire-fight.svg @@ -1,18 +1,18 @@ + id="path14144-2" /> \ No newline at end of file diff --git a/frontend/react/public/images/states/tanker.svg b/frontend/react/public/images/states/tanker.svg new file mode 100644 index 00000000..3bce8241 --- /dev/null +++ b/frontend/react/public/images/states/tanker.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/a-10.png b/frontend/react/public/images/units/a-10.png new file mode 100644 index 00000000..bf231f50 Binary files /dev/null and b/frontend/react/public/images/units/a-10.png differ diff --git a/frontend/react/public/images/units/a-20.png b/frontend/react/public/images/units/a-20.png new file mode 100644 index 00000000..b9d64924 Binary files /dev/null and b/frontend/react/public/images/units/a-20.png differ diff --git a/frontend/react/public/images/units/a-29.png b/frontend/react/public/images/units/a-29.png new file mode 100644 index 00000000..71b9b390 Binary files /dev/null and b/frontend/react/public/images/units/a-29.png differ diff --git a/frontend/react/public/images/units/a-4.png b/frontend/react/public/images/units/a-4.png new file mode 100644 index 00000000..d846c5b2 Binary files /dev/null and b/frontend/react/public/images/units/a-4.png differ diff --git a/frontend/react/public/images/units/a-400.png b/frontend/react/public/images/units/a-400.png new file mode 100644 index 00000000..424c0e58 Binary files /dev/null and b/frontend/react/public/images/units/a-400.png differ diff --git a/frontend/react/public/images/units/a-50.png b/frontend/react/public/images/units/a-50.png new file mode 100644 index 00000000..96292111 Binary files /dev/null and b/frontend/react/public/images/units/a-50.png differ diff --git a/frontend/react/public/images/units/a-6.png b/frontend/react/public/images/units/a-6.png new file mode 100644 index 00000000..ad4fe2cb Binary files /dev/null and b/frontend/react/public/images/units/a-6.png differ diff --git a/frontend/react/public/images/units/ah-1.png b/frontend/react/public/images/units/ah-1.png new file mode 100644 index 00000000..39c3c73e Binary files /dev/null and b/frontend/react/public/images/units/ah-1.png differ diff --git a/frontend/react/public/images/units/ah-64.png b/frontend/react/public/images/units/ah-64.png new file mode 100644 index 00000000..b56b62bb Binary files /dev/null and b/frontend/react/public/images/units/ah-64.png differ diff --git a/frontend/react/public/images/units/airUnit.png b/frontend/react/public/images/units/airUnit.png new file mode 100644 index 00000000..29d28433 Binary files /dev/null and b/frontend/react/public/images/units/airUnit.png differ diff --git a/frontend/react/public/images/units/aircraft.svg b/frontend/react/public/images/units/aircraft.svg new file mode 100644 index 00000000..eefd55d1 --- /dev/null +++ b/frontend/react/public/images/units/aircraft.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/airliner2engine.png b/frontend/react/public/images/units/airliner2engine.png new file mode 100644 index 00000000..c296d125 Binary files /dev/null and b/frontend/react/public/images/units/airliner2engine.png differ diff --git a/frontend/react/public/images/units/an-26.png b/frontend/react/public/images/units/an-26.png new file mode 100644 index 00000000..0d7be716 Binary files /dev/null and b/frontend/react/public/images/units/an-26.png differ diff --git a/frontend/react/public/images/units/av8bna.png b/frontend/react/public/images/units/av8bna.png new file mode 100644 index 00000000..194c13ec Binary files /dev/null and b/frontend/react/public/images/units/av8bna.png differ diff --git a/frontend/react/public/images/units/b-1.png b/frontend/react/public/images/units/b-1.png new file mode 100644 index 00000000..964bfb59 Binary files /dev/null and b/frontend/react/public/images/units/b-1.png differ diff --git a/frontend/react/public/images/units/b-17.png b/frontend/react/public/images/units/b-17.png new file mode 100644 index 00000000..1c0a4dbf Binary files /dev/null and b/frontend/react/public/images/units/b-17.png differ diff --git a/frontend/react/public/images/units/b-2.png b/frontend/react/public/images/units/b-2.png new file mode 100644 index 00000000..afcc4241 Binary files /dev/null and b/frontend/react/public/images/units/b-2.png differ diff --git a/frontend/react/public/images/units/b-52.png b/frontend/react/public/images/units/b-52.png new file mode 100644 index 00000000..63bfd5d3 Binary files /dev/null and b/frontend/react/public/images/units/b-52.png differ diff --git a/frontend/react/public/images/units/b707.png b/frontend/react/public/images/units/b707.png new file mode 100644 index 00000000..267423fe Binary files /dev/null and b/frontend/react/public/images/units/b707.png differ diff --git a/frontend/react/public/images/units/bf109.png b/frontend/react/public/images/units/bf109.png new file mode 100644 index 00000000..a4ea8316 Binary files /dev/null and b/frontend/react/public/images/units/bf109.png differ diff --git a/frontend/react/public/images/units/bomb.svg b/frontend/react/public/images/units/bomb.svg new file mode 100644 index 00000000..d13bad6a --- /dev/null +++ b/frontend/react/public/images/units/bomb.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/c-101.png b/frontend/react/public/images/units/c-101.png new file mode 100644 index 00000000..546f8d56 Binary files /dev/null and b/frontend/react/public/images/units/c-101.png differ diff --git a/frontend/react/public/images/units/c-130.png b/frontend/react/public/images/units/c-130.png new file mode 100644 index 00000000..fd15e590 Binary files /dev/null and b/frontend/react/public/images/units/c-130.png differ diff --git a/frontend/react/public/images/units/c-17.png b/frontend/react/public/images/units/c-17.png new file mode 100644 index 00000000..ec37926c Binary files /dev/null and b/frontend/react/public/images/units/c-17.png differ diff --git a/frontend/react/public/images/units/c-5.png b/frontend/react/public/images/units/c-5.png new file mode 100644 index 00000000..c864a11f Binary files /dev/null and b/frontend/react/public/images/units/c-5.png differ diff --git a/frontend/react/public/images/units/ch-47.png b/frontend/react/public/images/units/ch-47.png new file mode 100644 index 00000000..96c4ffb5 Binary files /dev/null and b/frontend/react/public/images/units/ch-47.png differ diff --git a/frontend/react/public/images/units/ch-53.png b/frontend/react/public/images/units/ch-53.png new file mode 100644 index 00000000..8327da78 Binary files /dev/null and b/frontend/react/public/images/units/ch-53.png differ diff --git a/frontend/react/public/images/units/death.svg b/frontend/react/public/images/units/death.svg new file mode 100644 index 00000000..fb680f06 --- /dev/null +++ b/frontend/react/public/images/units/death.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/e-2.png b/frontend/react/public/images/units/e-2.png new file mode 100644 index 00000000..b2c4a30b Binary files /dev/null and b/frontend/react/public/images/units/e-2.png differ diff --git a/frontend/react/public/images/units/e-3.png b/frontend/react/public/images/units/e-3.png new file mode 100644 index 00000000..c7385b45 Binary files /dev/null and b/frontend/react/public/images/units/e-3.png differ diff --git a/frontend/react/public/images/units/eurofighter.png b/frontend/react/public/images/units/eurofighter.png new file mode 100644 index 00000000..fc0ee314 Binary files /dev/null and b/frontend/react/public/images/units/eurofighter.png differ diff --git a/frontend/react/public/images/units/f-1.png b/frontend/react/public/images/units/f-1.png new file mode 100644 index 00000000..03ef0988 Binary files /dev/null and b/frontend/react/public/images/units/f-1.png differ diff --git a/frontend/react/public/images/units/f-111.png b/frontend/react/public/images/units/f-111.png new file mode 100644 index 00000000..b80dde96 Binary files /dev/null and b/frontend/react/public/images/units/f-111.png differ diff --git a/frontend/react/public/images/units/f-117.png b/frontend/react/public/images/units/f-117.png new file mode 100644 index 00000000..37cbc2c7 Binary files /dev/null and b/frontend/react/public/images/units/f-117.png differ diff --git a/frontend/react/public/images/units/f-14.png b/frontend/react/public/images/units/f-14.png new file mode 100644 index 00000000..78a14e12 Binary files /dev/null and b/frontend/react/public/images/units/f-14.png differ diff --git a/frontend/react/public/images/units/f-15.png b/frontend/react/public/images/units/f-15.png new file mode 100644 index 00000000..4293dc9f Binary files /dev/null and b/frontend/react/public/images/units/f-15.png differ diff --git a/frontend/react/public/images/units/f-16c.png b/frontend/react/public/images/units/f-16c.png new file mode 100644 index 00000000..1a60dc6b Binary files /dev/null and b/frontend/react/public/images/units/f-16c.png differ diff --git a/frontend/react/public/images/units/f-22.png b/frontend/react/public/images/units/f-22.png new file mode 100644 index 00000000..8f269b17 Binary files /dev/null and b/frontend/react/public/images/units/f-22.png differ diff --git a/frontend/react/public/images/units/f-35.png b/frontend/react/public/images/units/f-35.png new file mode 100644 index 00000000..0dc21a13 Binary files /dev/null and b/frontend/react/public/images/units/f-35.png differ diff --git a/frontend/react/public/images/units/f-4.png b/frontend/react/public/images/units/f-4.png new file mode 100644 index 00000000..12739dbd Binary files /dev/null and b/frontend/react/public/images/units/f-4.png differ diff --git a/frontend/react/public/images/units/f-5.png b/frontend/react/public/images/units/f-5.png new file mode 100644 index 00000000..96a0fd9a Binary files /dev/null and b/frontend/react/public/images/units/f-5.png differ diff --git a/frontend/react/public/images/units/f-86.png b/frontend/react/public/images/units/f-86.png new file mode 100644 index 00000000..6ec3c491 Binary files /dev/null and b/frontend/react/public/images/units/f-86.png differ diff --git a/frontend/react/public/images/units/fa-18c.png b/frontend/react/public/images/units/fa-18c.png new file mode 100644 index 00000000..2f11a356 Binary files /dev/null and b/frontend/react/public/images/units/fa-18c.png differ diff --git a/frontend/react/public/images/units/fw190.png b/frontend/react/public/images/units/fw190.png new file mode 100644 index 00000000..505a15c2 Binary files /dev/null and b/frontend/react/public/images/units/fw190.png differ diff --git a/frontend/react/public/images/units/general1.png b/frontend/react/public/images/units/general1.png new file mode 100644 index 00000000..2e5e95af Binary files /dev/null and b/frontend/react/public/images/units/general1.png differ diff --git a/frontend/react/public/images/units/gripen.png b/frontend/react/public/images/units/gripen.png new file mode 100644 index 00000000..34eb854e Binary files /dev/null and b/frontend/react/public/images/units/gripen.png differ diff --git a/frontend/react/public/images/units/groundunit-aaa.svg b/frontend/react/public/images/units/groundunit-aaa.svg new file mode 100644 index 00000000..beeb5fa6 --- /dev/null +++ b/frontend/react/public/images/units/groundunit-aaa.svg @@ -0,0 +1,17 @@ + + + + A + + A + A + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-apc.svg b/frontend/react/public/images/units/groundunit-apc.svg new file mode 100644 index 00000000..9f227819 --- /dev/null +++ b/frontend/react/public/images/units/groundunit-apc.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-artillery.svg b/frontend/react/public/images/units/groundunit-artillery.svg new file mode 100644 index 00000000..78a5be80 --- /dev/null +++ b/frontend/react/public/images/units/groundunit-artillery.svg @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-ewr.svg b/frontend/react/public/images/units/groundunit-ewr.svg new file mode 100644 index 00000000..fa2775fc --- /dev/null +++ b/frontend/react/public/images/units/groundunit-ewr.svg @@ -0,0 +1,60 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-infantry.svg b/frontend/react/public/images/units/groundunit-infantry.svg new file mode 100644 index 00000000..92268c40 --- /dev/null +++ b/frontend/react/public/images/units/groundunit-infantry.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-sam-launcher.svg b/frontend/react/public/images/units/groundunit-sam-launcher.svg new file mode 100644 index 00000000..ebe2ff8f --- /dev/null +++ b/frontend/react/public/images/units/groundunit-sam-launcher.svg @@ -0,0 +1,51 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-sam-radar.svg b/frontend/react/public/images/units/groundunit-sam-radar.svg new file mode 100644 index 00000000..18c3f6a5 --- /dev/null +++ b/frontend/react/public/images/units/groundunit-sam-radar.svg @@ -0,0 +1,50 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-sam.svg b/frontend/react/public/images/units/groundunit-sam.svg new file mode 100644 index 00000000..1f0e68f1 --- /dev/null +++ b/frontend/react/public/images/units/groundunit-sam.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-tactical.svg b/frontend/react/public/images/units/groundunit-tactical.svg new file mode 100644 index 00000000..40bdae5f --- /dev/null +++ b/frontend/react/public/images/units/groundunit-tactical.svg @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-tank.svg b/frontend/react/public/images/units/groundunit-tank.svg new file mode 100644 index 00000000..272113e3 --- /dev/null +++ b/frontend/react/public/images/units/groundunit-tank.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit-truck.svg b/frontend/react/public/images/units/groundunit-truck.svg new file mode 100644 index 00000000..aa581462 --- /dev/null +++ b/frontend/react/public/images/units/groundunit-truck.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/groundunit.svg b/frontend/react/public/images/units/groundunit.svg new file mode 100644 index 00000000..8d74c672 --- /dev/null +++ b/frontend/react/public/images/units/groundunit.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/h-6.png b/frontend/react/public/images/units/h-6.png new file mode 100644 index 00000000..573ffda2 Binary files /dev/null and b/frontend/react/public/images/units/h-6.png differ diff --git a/frontend/react/public/images/units/hawk.png b/frontend/react/public/images/units/hawk.png new file mode 100644 index 00000000..27f2ffe2 Binary files /dev/null and b/frontend/react/public/images/units/hawk.png differ diff --git a/frontend/react/public/images/units/helicopter.svg b/frontend/react/public/images/units/helicopter.svg new file mode 100644 index 00000000..cb79e8cc --- /dev/null +++ b/frontend/react/public/images/units/helicopter.svg @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/helicopter1.png b/frontend/react/public/images/units/helicopter1.png new file mode 100644 index 00000000..6e085372 Binary files /dev/null and b/frontend/react/public/images/units/helicopter1.png differ diff --git a/frontend/react/public/images/units/i-16.png b/frontend/react/public/images/units/i-16.png new file mode 100644 index 00000000..8e8a92f9 Binary files /dev/null and b/frontend/react/public/images/units/i-16.png differ diff --git a/frontend/react/public/images/units/il-76.png b/frontend/react/public/images/units/il-76.png new file mode 100644 index 00000000..fa697729 Binary files /dev/null and b/frontend/react/public/images/units/il-76.png differ diff --git a/frontend/react/public/images/units/j-10.png b/frontend/react/public/images/units/j-10.png new file mode 100644 index 00000000..5cf11e78 Binary files /dev/null and b/frontend/react/public/images/units/j-10.png differ diff --git a/frontend/react/public/images/units/j-20.png b/frontend/react/public/images/units/j-20.png new file mode 100644 index 00000000..4ee50e96 Binary files /dev/null and b/frontend/react/public/images/units/j-20.png differ diff --git a/frontend/react/public/images/units/j-7.png b/frontend/react/public/images/units/j-7.png new file mode 100644 index 00000000..b67a5b2f Binary files /dev/null and b/frontend/react/public/images/units/j-7.png differ diff --git a/frontend/react/public/images/units/jf-17.png b/frontend/react/public/images/units/jf-17.png new file mode 100644 index 00000000..da0fe721 Binary files /dev/null and b/frontend/react/public/images/units/jf-17.png differ diff --git a/frontend/react/public/images/units/ju-88.png b/frontend/react/public/images/units/ju-88.png new file mode 100644 index 00000000..73a540f6 Binary files /dev/null and b/frontend/react/public/images/units/ju-88.png differ diff --git a/frontend/react/public/images/units/ka-27.png b/frontend/react/public/images/units/ka-27.png new file mode 100644 index 00000000..7c2ffcff Binary files /dev/null and b/frontend/react/public/images/units/ka-27.png differ diff --git a/frontend/react/public/images/units/ka-50.png b/frontend/react/public/images/units/ka-50.png new file mode 100644 index 00000000..2acf87d8 Binary files /dev/null and b/frontend/react/public/images/units/ka-50.png differ diff --git a/frontend/react/public/images/units/kc-10.png b/frontend/react/public/images/units/kc-10.png new file mode 100644 index 00000000..205d7e3c Binary files /dev/null and b/frontend/react/public/images/units/kc-10.png differ diff --git a/frontend/react/public/images/units/kc-135.png b/frontend/react/public/images/units/kc-135.png new file mode 100644 index 00000000..a1f23b30 Binary files /dev/null and b/frontend/react/public/images/units/kc-135.png differ diff --git a/frontend/react/public/images/units/l-159.png b/frontend/react/public/images/units/l-159.png new file mode 100644 index 00000000..d81d3631 Binary files /dev/null and b/frontend/react/public/images/units/l-159.png differ diff --git a/frontend/react/public/images/units/l-39.png b/frontend/react/public/images/units/l-39.png new file mode 100644 index 00000000..868bf651 Binary files /dev/null and b/frontend/react/public/images/units/l-39.png differ diff --git a/frontend/react/public/images/units/m2000.png b/frontend/react/public/images/units/m2000.png new file mode 100644 index 00000000..7e3be642 Binary files /dev/null and b/frontend/react/public/images/units/m2000.png differ diff --git a/frontend/react/public/images/units/mb-339.png b/frontend/react/public/images/units/mb-339.png new file mode 100644 index 00000000..98d3b350 Binary files /dev/null and b/frontend/react/public/images/units/mb-339.png differ diff --git a/frontend/react/public/images/units/mi-24.png b/frontend/react/public/images/units/mi-24.png new file mode 100644 index 00000000..64c99f81 Binary files /dev/null and b/frontend/react/public/images/units/mi-24.png differ diff --git a/frontend/react/public/images/units/mi-26.png b/frontend/react/public/images/units/mi-26.png new file mode 100644 index 00000000..14c51d70 Binary files /dev/null and b/frontend/react/public/images/units/mi-26.png differ diff --git a/frontend/react/public/images/units/mi-28.png b/frontend/react/public/images/units/mi-28.png new file mode 100644 index 00000000..6e1acedc Binary files /dev/null and b/frontend/react/public/images/units/mi-28.png differ diff --git a/frontend/react/public/images/units/mi-8.png b/frontend/react/public/images/units/mi-8.png new file mode 100644 index 00000000..f5c004d6 Binary files /dev/null and b/frontend/react/public/images/units/mi-8.png differ diff --git a/frontend/react/public/images/units/mig-15.png b/frontend/react/public/images/units/mig-15.png new file mode 100644 index 00000000..8ff2fc25 Binary files /dev/null and b/frontend/react/public/images/units/mig-15.png differ diff --git a/frontend/react/public/images/units/mig-19.png b/frontend/react/public/images/units/mig-19.png new file mode 100644 index 00000000..00722e72 Binary files /dev/null and b/frontend/react/public/images/units/mig-19.png differ diff --git a/frontend/react/public/images/units/mig-21.png b/frontend/react/public/images/units/mig-21.png new file mode 100644 index 00000000..c5ea25db Binary files /dev/null and b/frontend/react/public/images/units/mig-21.png differ diff --git a/frontend/react/public/images/units/mig-23.png b/frontend/react/public/images/units/mig-23.png new file mode 100644 index 00000000..db4816a5 Binary files /dev/null and b/frontend/react/public/images/units/mig-23.png differ diff --git a/frontend/react/public/images/units/mig-25.png b/frontend/react/public/images/units/mig-25.png new file mode 100644 index 00000000..89e4b4b5 Binary files /dev/null and b/frontend/react/public/images/units/mig-25.png differ diff --git a/frontend/react/public/images/units/mig-29.png b/frontend/react/public/images/units/mig-29.png new file mode 100644 index 00000000..8d51acda Binary files /dev/null and b/frontend/react/public/images/units/mig-29.png differ diff --git a/frontend/react/public/images/units/missile.svg b/frontend/react/public/images/units/missile.svg new file mode 100644 index 00000000..0593f71d --- /dev/null +++ b/frontend/react/public/images/units/missile.svg @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/mosquito.png b/frontend/react/public/images/units/mosquito.png new file mode 100644 index 00000000..a7bf07e7 Binary files /dev/null and b/frontend/react/public/images/units/mosquito.png differ diff --git a/frontend/react/public/images/units/navyunit.svg b/frontend/react/public/images/units/navyunit.svg new file mode 100644 index 00000000..2584f42b --- /dev/null +++ b/frontend/react/public/images/units/navyunit.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/oh-58.png b/frontend/react/public/images/units/oh-58.png new file mode 100644 index 00000000..3429cf59 Binary files /dev/null and b/frontend/react/public/images/units/oh-58.png differ diff --git a/frontend/react/public/images/units/p-47.png b/frontend/react/public/images/units/p-47.png new file mode 100644 index 00000000..23d70951 Binary files /dev/null and b/frontend/react/public/images/units/p-47.png differ diff --git a/frontend/react/public/images/units/p-51.png b/frontend/react/public/images/units/p-51.png new file mode 100644 index 00000000..a38eea64 Binary files /dev/null and b/frontend/react/public/images/units/p-51.png differ diff --git a/frontend/react/public/images/units/rafale.png b/frontend/react/public/images/units/rafale.png new file mode 100644 index 00000000..e577e93d Binary files /dev/null and b/frontend/react/public/images/units/rafale.png differ diff --git a/frontend/react/public/images/units/rq-1.png b/frontend/react/public/images/units/rq-1.png new file mode 100644 index 00000000..7490b5ff Binary files /dev/null and b/frontend/react/public/images/units/rq-1.png differ diff --git a/frontend/react/public/images/units/rq-4.png b/frontend/react/public/images/units/rq-4.png new file mode 100644 index 00000000..95cbc0ee Binary files /dev/null and b/frontend/react/public/images/units/rq-4.png differ diff --git a/frontend/react/public/images/units/s-3.png b/frontend/react/public/images/units/s-3.png new file mode 100644 index 00000000..396fe2d9 Binary files /dev/null and b/frontend/react/public/images/units/s-3.png differ diff --git a/frontend/react/public/images/units/sa-342.png b/frontend/react/public/images/units/sa-342.png new file mode 100644 index 00000000..678776ac Binary files /dev/null and b/frontend/react/public/images/units/sa-342.png differ diff --git a/frontend/react/public/images/units/sam.png b/frontend/react/public/images/units/sam.png new file mode 100644 index 00000000..7f201afc Binary files /dev/null and b/frontend/react/public/images/units/sam.png differ diff --git a/frontend/react/public/images/units/spitfire.png b/frontend/react/public/images/units/spitfire.png new file mode 100644 index 00000000..65d3d1ca Binary files /dev/null and b/frontend/react/public/images/units/spitfire.png differ diff --git a/frontend/react/public/images/units/static.svg b/frontend/react/public/images/units/static.svg new file mode 100644 index 00000000..a5511a12 --- /dev/null +++ b/frontend/react/public/images/units/static.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/frontend/react/public/images/units/su-17.png b/frontend/react/public/images/units/su-17.png new file mode 100644 index 00000000..47dd52e9 Binary files /dev/null and b/frontend/react/public/images/units/su-17.png differ diff --git a/frontend/react/public/images/units/su-24.png b/frontend/react/public/images/units/su-24.png new file mode 100644 index 00000000..0928ca61 Binary files /dev/null and b/frontend/react/public/images/units/su-24.png differ diff --git a/frontend/react/public/images/units/su-25.png b/frontend/react/public/images/units/su-25.png new file mode 100644 index 00000000..9a9fca64 Binary files /dev/null and b/frontend/react/public/images/units/su-25.png differ diff --git a/frontend/react/public/images/units/su-27.png b/frontend/react/public/images/units/su-27.png new file mode 100644 index 00000000..b2c18cbe Binary files /dev/null and b/frontend/react/public/images/units/su-27.png differ diff --git a/frontend/react/public/images/units/su-34.png b/frontend/react/public/images/units/su-34.png new file mode 100644 index 00000000..de88958e Binary files /dev/null and b/frontend/react/public/images/units/su-34.png differ diff --git a/frontend/react/public/images/units/su-57.png b/frontend/react/public/images/units/su-57.png new file mode 100644 index 00000000..56d835b5 Binary files /dev/null and b/frontend/react/public/images/units/su-57.png differ diff --git a/frontend/react/public/images/units/tornado.png b/frontend/react/public/images/units/tornado.png new file mode 100644 index 00000000..d3eacb52 Binary files /dev/null and b/frontend/react/public/images/units/tornado.png differ diff --git a/frontend/react/public/images/units/tu-160.png b/frontend/react/public/images/units/tu-160.png new file mode 100644 index 00000000..7f2b28f5 Binary files /dev/null and b/frontend/react/public/images/units/tu-160.png differ diff --git a/frontend/react/public/images/units/tu-22.png b/frontend/react/public/images/units/tu-22.png new file mode 100644 index 00000000..c807bd73 Binary files /dev/null and b/frontend/react/public/images/units/tu-22.png differ diff --git a/frontend/react/public/images/units/tu-95.png b/frontend/react/public/images/units/tu-95.png new file mode 100644 index 00000000..73e5cdfa Binary files /dev/null and b/frontend/react/public/images/units/tu-95.png differ diff --git a/frontend/react/public/images/units/u-28.png b/frontend/react/public/images/units/u-28.png new file mode 100644 index 00000000..6577d344 Binary files /dev/null and b/frontend/react/public/images/units/u-28.png differ diff --git a/frontend/react/public/images/units/uh-1.png b/frontend/react/public/images/units/uh-1.png new file mode 100644 index 00000000..1bd45cb4 Binary files /dev/null and b/frontend/react/public/images/units/uh-1.png differ diff --git a/frontend/react/public/images/units/uh-60.png b/frontend/react/public/images/units/uh-60.png new file mode 100644 index 00000000..66513c80 Binary files /dev/null and b/frontend/react/public/images/units/uh-60.png differ diff --git a/frontend/react/public/images/units/viggen.png b/frontend/react/public/images/units/viggen.png new file mode 100644 index 00000000..2e775f55 Binary files /dev/null and b/frontend/react/public/images/units/viggen.png differ diff --git a/frontend/react/public/images/units/yak-40.png b/frontend/react/public/images/units/yak-40.png new file mode 100644 index 00000000..46fdf8f8 Binary files /dev/null and b/frontend/react/public/images/units/yak-40.png differ diff --git a/frontend/react/public/images/units/yak-52.png b/frontend/react/public/images/units/yak-52.png new file mode 100644 index 00000000..4b2c4845 Binary files /dev/null and b/frontend/react/public/images/units/yak-52.png differ diff --git a/frontend/react/public/vite.svg b/frontend/react/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/frontend/react/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/react/src/assets/react.svg b/frontend/react/src/assets/react.svg new file mode 100644 index 00000000..15895c27 --- /dev/null +++ b/frontend/react/src/assets/react.svg @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/frontend/react/src/constants/constants.ts b/frontend/react/src/constants/constants.ts new file mode 100644 index 00000000..486fdc30 --- /dev/null +++ b/frontend/react/src/constants/constants.ts @@ -0,0 +1,376 @@ +import { LatLng, LatLngBounds } from "leaflet"; +import { Context, MapOptions } from "../types/types"; + +export const DEFAULT_CONTEXT: Context = "default context"; + +export const UNITS_URI = "units"; +export const WEAPONS_URI = "weapons"; +export const LOGS_URI = "logs"; +export const AIRBASES_URI = "airbases"; +export const BULLSEYE_URI = "bullseyes"; +export const MISSION_URI = "mission"; +export const COMMANDS_URI = "commands"; + +export const NONE = "None"; +export const GAME_MASTER = "Game master"; +export const BLUE_COMMANDER = "Blue commander"; +export const RED_COMMANDER = "Red commander"; + +export const VISUAL = 1; +export const OPTIC = 2; +export const RADAR = 4; +export const IRST = 8; +export const RWR = 16; +export const DLINK = 32; + +export const states: string[] = [ + "none", + "idle", + "reach-destination", + "attack", + "follow", + "land", + "refuel", + "AWACS", + "tanker", + "bomb-point", + "carpet-bomb", + "bomb-building", + "fire-at-area", + "simulate-fire-fight", + "scenic-aaa", + "miss-on-purpose", + "land-at-point", +]; +export const ROEs: string[] = ["free", "designated", "", "return", "hold"]; +export const reactionsToThreat: string[] = [ + "none", + "manoeuvre", + "passive", + "evade", +]; +export const emissionsCountermeasures: string[] = [ + "silent", + "attack", + "defend", + "free", +]; + +export const ERAS = [ + { + name: "Early Cold War", + chronologicalOrder: 2, + }, + { + name: "Late Cold War", + chronologicalOrder: 4, + }, + { + name: "Mid Cold War", + chronologicalOrder: 3, + }, + { + name: "Modern", + chronologicalOrder: 5, + }, + { + name: "WW2", + chronologicalOrder: 1, + }, +]; + +export const ROEDescriptions: string[] = [ + "Free (Attack anyone)", + "Designated (Attack the designated target only) \nWARNING: Ground and Navy units don't respect this ROE, it will be equivalent to weapons FREE.", + "", + "Return (Only fire if fired upon) \nWARNING: Ground and Navy units don't respect this ROE, it will be equivalent to weapons FREE.", + "Hold (Never fire)", +]; + +export const reactionsToThreatDescriptions: string[] = [ + "None (No reaction)", + "Manoeuvre (no countermeasures)", + "Passive (Countermeasures only, no manoeuvre)", + "Evade (Countermeasures and manoeuvers)", +]; + +export const emissionsCountermeasuresDescriptions: string[] = [ + "Silent (Radar OFF, no ECM)", + "Attack (Radar only for targeting, ECM only if locked)", + "Defend (Radar for searching, ECM if locked)", + "Always on (Radar and ECM always on)", +]; + +export const shotsScatterDescriptions: string[] = [ + "When performing scenic shooting tasks like simulated firefights, will shoot with a large scatter", + "When performing scenic shooting tasks like simulated firefights, will shoot with a medium scatter", + "When performing scenic shooting tasks like simulated firefights, will shoot with a small scatter (Radar guided units will track shots when the enemy unit is close)", +]; + +export const shotsIntensityDescriptions: string[] = [ + "When performing scenic shooting tasks like simulated firefights, will shoot with a low rate of fire", + "When performing scenic shooting tasks like simulated firefights, will shoot with a medium rate of fire", + "When performing scenic shooting tasks like simulated firefights, will shoot with a high rate of fire", +]; + +export const minSpeedValues: { [key: string]: number } = { + Aircraft: 100, + Helicopter: 0, + NavyUnit: 0, + GroundUnit: 0, +}; +export const maxSpeedValues: { [key: string]: number } = { + Aircraft: 800, + Helicopter: 300, + NavyUnit: 60, + GroundUnit: 60, +}; +export const speedIncrements: { [key: string]: number } = { + Aircraft: 25, + Helicopter: 10, + NavyUnit: 5, + GroundUnit: 5, +}; +export const minAltitudeValues: { [key: string]: number } = { + Aircraft: 0, + Helicopter: 0, +}; +export const maxAltitudeValues: { [key: string]: number } = { + Aircraft: 50000, + Helicopter: 10000, +}; +export const altitudeIncrements: { [key: string]: number } = { + Aircraft: 500, + Helicopter: 100, +}; + +export const minimapBoundaries = { + Nevada: [ + // NTTR + new LatLng(39.7982463, -119.985425), + new LatLng(34.4037128, -119.7806729), + new LatLng(34.3483316, -112.4529351), + new LatLng(39.7372411, -112.1130805), + new LatLng(39.7982463, -119.985425), + ], + Syria: [ + // Syria + new LatLng(37.3630556, 29.2686111), + new LatLng(31.8472222, 29.8975), + new LatLng(32.1358333, 42.1502778), + new LatLng(37.7177778, 42.3716667), + new LatLng(37.3630556, 29.2686111), + ], + Caucasus: [ + // Caucasus + new LatLng(39.6170191, 27.634935), + new LatLng(38.8735863, 47.1423108), + new LatLng(47.3907982, 49.3101946), + new LatLng(48.3955879, 26.7753625), + new LatLng(39.6170191, 27.634935), + ], + PersianGulf: [ + // Persian Gulf + new LatLng(32.9355285, 46.5623682), + new LatLng(21.729393, 47.572675), + new LatLng(21.8501348, 63.9734737), + new LatLng(33.131584, 64.7313594), + new LatLng(32.9355285, 46.5623682), + ], + MarianaIslands: [ + // Marianas + new LatLng(22.09, 135.0572222), + new LatLng(10.5777778, 135.7477778), + new LatLng(10.7725, 149.3918333), + new LatLng(22.5127778, 149.5427778), + new LatLng(22.09, 135.0572222), + ], + Falklands: [ + // South Atlantic + new LatLng(-49.097217, -79.418267), + new LatLng(-56.874517, -79.418267), + new LatLng(-56.874517, -43.316433), + new LatLng(-49.097217, -43.316433), + new LatLng(-49.097217, -79.418267), + ], + Normandy: [ + // Normandy + new LatLng(50.44, -3.29), + new LatLng(48.12, -3.29), + new LatLng(48.12, 3.7), + new LatLng(50.44, 3.7), + new LatLng(50.44, -3.29), + ], + SinaiMap: [ + // Sinai + new LatLng(34.312222, 28.523333), + new LatLng(25.946944, 28.523333), + new LatLng(25.946944, 36.897778), + new LatLng(34.312222, 36.897778), + new LatLng(34.312222, 28.523333), + ], +}; + +export const mapBounds = { + Syria: { + bounds: new LatLngBounds([31.8472222, 29.8975], [37.7177778, 42.3716667]), + zoom: 5, + }, + MarianaIslands: { + bounds: new LatLngBounds( + [10.5777778, 135.7477778], + [22.5127778, 149.5427778] + ), + zoom: 5, + }, + Nevada: { + bounds: new LatLngBounds( + [34.4037128, -119.7806729], + [39.7372411, -112.1130805] + ), + zoom: 5, + }, + PersianGulf: { + bounds: new LatLngBounds([21.729393, 47.572675], [33.131584, 64.7313594]), + zoom: 4, + }, + Caucasus: { + bounds: new LatLngBounds([39.6170191, 27.634935], [47.3907982, 49.3101946]), + zoom: 4, + }, + Falklands: { + bounds: new LatLngBounds( + [-49.097217, -79.418267], + [-56.874517, -43.316433] + ), + zoom: 3, + }, + Normandy: { bounds: new LatLngBounds([50.44, -3.29], [48.12, 3.7]), zoom: 5 }, + SinaiMap: { + bounds: new LatLngBounds([34.312222, 28.523333], [25.946944, 36.897778]), + zoom: 4, + }, +}; + +export const defaultMapMirrors = {}; +export const defaultMapLayers = {}; + +/* Map constants */ +export const IDLE = "Idle"; +export const SPAWN_UNIT = "Spawn unit"; +export const CONTEXT_ACTION = "Context action"; +export const COALITIONAREA_DRAW_POLYGON = "Draw Coalition Area"; + +export const IADSTypes = ["AAA", "SAM Site", "Radar (EWR)"]; +export const IADSDensities: { [key: string]: number } = { + AAA: 0.8, + "SAM Site": 0.1, + "Radar (EWR)": 0.05, +}; +export const GROUND_UNIT_AIR_DEFENCE_REGEX: RegExp = + /(\b(AAA|SAM|MANPADS?|[mM]anpads?)|[sS]tinger\b)/; + +export const MAP_OPTIONS_TOOLTIPS = { + hideGroupMembers: "Hide group members when zoomed out", + hideUnitsShortRangeRings: "Hide short range units threat range rings (R)", + showUnitContacts: "Show selected units contact lines", + showUnitPaths: "Show selected unit paths", + showUnitTargets: "Show selected unit targets", + showUnitLabels: "Show unit labels (L)", + showUnitsEngagementRings: "Show units threat range rings (Q)", + showUnitsAcquisitionRings: "Show units detection range rings (E)", +}; + +export const MAP_OPTIONS_DEFAULTS = { + hideGroupMembers: true, + hideUnitsShortRangeRings: true, + showUnitContacts: true, + showUnitPaths: true, + showUnitTargets: false, + showUnitLabels: true, + showUnitsEngagementRings: true, + showUnitsAcquisitionRings: true, + fillSelectedRing: false, + showMinimap: false +} as MapOptions; + +export const MAP_HIDDEN_TYPES_DEFAULTS = { + human: false, + olympus: false, + dcs: false, + aircraft: false, + helicopter: false, + "groundunit-sam": false, + groundunit: false, + navyunit: false, + airbase: false, + dead: false, + blue: false, + red: false, + neutral: false, +}; + +export enum DataIndexes { + startOfData = 0, + category, + alive, + human, + controlled, + coalition, + country, + name, + unitName, + groupName, + state, + task, + hasTask, + position, + speed, + horizontalVelocity, + verticalVelocity, + heading, + track, + isActiveTanker, + isActiveAWACS, + onOff, + followRoads, + fuel, + desiredSpeed, + desiredSpeedType, + desiredAltitude, + desiredAltitudeType, + leaderID, + formationOffset, + targetID, + targetPosition, + ROE, + reactionToThreat, + emissionsCountermeasures, + TACAN, + radio, + generalSettings, + ammo, + contacts, + activePath, + isLeader, + operateAs, + shotsScatter, + shotsIntensity, + health, + endOfData = 255, +} + +export const MGRS_PRECISION_10KM = 2; +export const MGRS_PRECISION_1KM = 3; +export const MGRS_PRECISION_100M = 4; +export const MGRS_PRECISION_10M = 5; +export const MGRS_PRECISION_1M = 6; + +export const DELETE_CYCLE_TIME = 0.05; +export const DELETE_SLOW_THRESHOLD = 50; + +export const GROUPING_ZOOM_TRANSITION = 13; + +export const MAX_SHOTS_SCATTER = 3; +export const MAX_SHOTS_INTENSITY = 3; +export const SHOTS_SCATTER_DEGREES = 10; diff --git a/frontend/react/src/dom.d.ts b/frontend/react/src/dom.d.ts new file mode 100644 index 00000000..146d437f --- /dev/null +++ b/frontend/react/src/dom.d.ts @@ -0,0 +1,38 @@ +import { ServerStatus } from "./interfaces"; +import { Unit } from "./unit/unit"; + +interface CustomEventMap { + unitSelection: CustomEvent; + unitDeselection: CustomEvent; + unitsSelection: CustomEvent; + unitsDeselection: CustomEvent; + clearSelection: CustomEvent; + unitDeath: CustomEvent; + unitUpdated: CustomEvent; + mapStateChanged: CustomEvent; + mapContextMenu: CustomEvent; + mapOptionChanged: CustomEvent; + mapSourceChanged: CustomEvent; + mapOptionsChanged: CustomEvent; // TODO not very clear, why the two options? + mapSelectionEnd: CustomEvent; + configLoaded: CustomEvent; + commandModeOptionsChanged: CustomEvent; + contactsUpdated: CustomEvent; + activeCoalitionChanged: CustomEvent; + serverStatusUpdated: CustomEvent; + mapForceBoxSelect: CustomEvent +} + +declare global { + interface Document { + addEventListener( + type: K, + listener: (this: Document, ev: CustomEventMap[K]) => void + ): void; + dispatchEvent(ev: CustomEventMap[K]): void; + } + + //function getOlympusPlugin(): OlympusPlugin; +} + +export {}; diff --git a/frontend/react/src/eventscontext.tsx b/frontend/react/src/eventscontext.tsx new file mode 100644 index 00000000..52453b28 --- /dev/null +++ b/frontend/react/src/eventscontext.tsx @@ -0,0 +1,19 @@ +import { createContext } from "react"; + +export const EventsContext = createContext({ + setMainMenuVisible: (e: boolean) => {}, + setSpawnMenuVisible: (e: boolean) => {}, + setUnitControlMenuVisible: (e: boolean) => {}, + setMeasureMenuVisible: (e: boolean) => {}, + setDrawingMenuVisible: (e: boolean) => {}, + setOptionsMenuVisible: (e: boolean) => {}, + toggleMainMenuVisible: () => {}, + toggleSpawnMenuVisible: () => {}, + toggleUnitControlMenuVisible: () => {}, + toggleMeasureMenuVisible: () => {}, + toggleDrawingMenuVisible: () => {}, + toggleOptionsMenuVisible: () => {}, +}); + +export const EventsProvider = EventsContext.Provider; +export const EventsConsumer = EventsContext.Consumer; diff --git a/frontend/react/src/index.css b/frontend/react/src/index.css new file mode 100644 index 00000000..4f66ad7a --- /dev/null +++ b/frontend/react/src/index.css @@ -0,0 +1,43 @@ +@import "../node_modules/leaflet/dist/leaflet.css"; + +@tailwind base; +@tailwind components; +@tailwind utilities; + +* { + font-weight: 400; + font-family: "Inter", sans-serif; + font-optical-sizing: auto; + font-style: normal; + font-variation-settings: "slnt" 0; +} + +.z-ui-0 { + z-index: 2000; +} + +.z-ui-1 { + z-index: 2001; +} + +.z-ui-2 { + z-index: 2002; +} + +.z-ui-3 { + z-index: 2003; +} + +.z-ui-4 { + z-index: 2004; +} + +.z-ui-5 { + z-index: 2005; +} + +.z-ui-6 { + z-index: 2006; +} + + diff --git a/frontend/react/src/interfaces.ts b/frontend/react/src/interfaces.ts new file mode 100644 index 00000000..b1a3be44 --- /dev/null +++ b/frontend/react/src/interfaces.ts @@ -0,0 +1,294 @@ +import { LatLng } from "leaflet"; +import { Coalition, Context } from "./types/types"; + +class Airbase {} + +export interface ContextMenuOption { + tooltip: string; + src: string; + callback: CallableFunction; +} + +export interface AirbasesData { + airbases: { [key: string]: any }; + sessionHash: string; + time: number; +} + +export interface BullseyesData { + bullseyes: { + [key: string]: { latitude: number; longitude: number; coalition: string }; + }; + sessionHash: string; + time: number; +} + +export interface MissionData { + mission: { + theatre: string; + dateAndTime: DateAndTime; + commandModeOptions: CommandModeOptions; + coalitions: { red: string[]; blue: string[] }; + }; + time: number; + sessionHash: string; +} + +export interface CommandModeOptions { + commandMode: string; + restrictSpawns: boolean; + restrictToCoalition: boolean; + setupTime: number; + spawnPoints: { + red: number; + blue: number; + }; + eras: string[]; +} + +export interface DateAndTime { + date: { Year: number; Month: number; Day: number }; + time: { h: number; m: number; s: number }; + elapsedTime: number; + startTime: number; +} + +export interface LogData { + logs: { [key: string]: string }; + sessionHash: string; + time: number; +} + +export interface ServerRequestOptions { + time?: number; + commandHash?: string; +} + +export interface SpawnRequestTable { + category: string; + coalition: string; + unit: UnitSpawnTable; +} + +export interface UnitSpawnTable { + unitType: string; + location: LatLng; + skill: string; + liveryID: string; + altitude?: number; + loadout?: string; +} + +export interface ObjectIconOptions { + showState: boolean; + showVvi: boolean; + showHealth: boolean; + showHotgroup: boolean; + showUnitIcon: boolean; + showShortLabel: boolean; + showFuel: boolean; + showAmmo: boolean; + showSummary: boolean; + showCallsign: boolean; + rotateToHeading: boolean; +} + +export interface GeneralSettings { + prohibitJettison: boolean; + prohibitAA: boolean; + prohibitAG: boolean; + prohibitAfterburner: boolean; + prohibitAirWpn: boolean; +} + +export interface TACAN { + isOn: boolean; + channel: number; + XY: string; + callsign: string; +} + +export interface Radio { + frequency: number; + callsign: number; + callsignNumber: number; +} + +export interface Ammo { + quantity: number; + name: string; + guidance: number; + category: number; + missileCategory: number; +} + +export interface Contact { + ID: number; + detectionMethod: number; +} + +export interface Offset { + x: number; + y: number; + z: number; +} + +export interface UnitData { + category: string; + categoryDisplayName: string; + ID: number; + alive: boolean; + human: boolean; + controlled: boolean; + coalition: string; + country: number; + name: string; + unitName: string; + groupName: string; + state: string; + task: string; + hasTask: boolean; + position: LatLng; + speed: number; + horizontalVelocity: number; + verticalVelocity: number; + heading: number; + track: number; + isActiveTanker: boolean; + isActiveAWACS: boolean; + onOff: boolean; + followRoads: boolean; + fuel: number; + desiredSpeed: number; + desiredSpeedType: string; + desiredAltitude: number; + desiredAltitudeType: string; + leaderID: number; + formationOffset: Offset; + targetID: number; + targetPosition: LatLng; + ROE: string; + reactionToThreat: string; + emissionsCountermeasures: string; + TACAN: TACAN; + radio: Radio; + generalSettings: GeneralSettings; + ammo: Ammo[]; + contacts: Contact[]; + activePath: LatLng[]; + isLeader: boolean; + operateAs: string; + shotsScatter: number; + shotsIntensity: number; + health: number; +} + +export interface LoadoutItemBlueprint { + name: string; + quantity: number; + effectiveAgainst?: string; +} + +export interface LoadoutBlueprint { + fuel: number; + items: LoadoutItemBlueprint[]; + roles: string[]; + code: string; + name: string; + enabled: boolean; +} + +export interface UnitBlueprint { + name: string; + enabled: boolean; + coalition: string; + era: string; + label: string; + shortLabel: string; + type?: string; + loadouts?: LoadoutBlueprint[]; + filename?: string; + liveries?: { [key: string]: { name: string; countries: string[] } }; + cost?: number; + barrelHeight?: number; + muzzleVelocity?: number; + aimTime?: number; + shotsToFire?: number; + shotsBaseInterval?: number; + shotsBaseScatter?: number; + description?: string; + abilities?: string; + tags?: string; + acquisitionRange?: number; + engagementRange?: number; + targetingRange?: number; + aimMethodRange?: number; + alertnessTimeConstant?: number; + canTargetPoint?: boolean; + canRearm?: boolean; + canAAA?: boolean; + indirectFire?: boolean; + markerFile?: string; + unitWhenGrouped?: string; +} + +export interface AirbaseOptions { + name: string; + position: L.LatLng; +} + +export interface AirbaseChartData { + elevation: string; + ICAO: string; + TACAN: string; + runways: AirbaseChartRunwayData[]; +} + +export interface AirbaseChartRunwayHeadingData { + [index: string]: { + magHeading: string; + ILS: string; + }; +} + +export interface AirbaseChartRunwayData { + headings: AirbaseChartRunwayHeadingData[]; + length: string; +} + +export interface Listener { + callback: CallableFunction; + name?: string; +} + +export interface ShortcutOptions { + altKey?: boolean; + callback: CallableFunction; + context?: Context; + ctrlKey?: boolean; + name?: string; + shiftKey?: boolean; +} + +export interface ShortcutKeyboardOptions extends ShortcutOptions { + code: string; + event?: "keydown" | "keyup"; +} + +export interface ShortcutMouseOptions extends ShortcutOptions { + button: number; + event: "mousedown" | "mouseup"; +} + +export interface Manager { + add: CallableFunction; +} + +export interface ServerStatus { + frameRate: number; + load: number; + elapsedTime: number; + missionTime: DateAndTime["time"]; + connected: boolean; + paused: boolean; +} diff --git a/frontend/react/src/main.tsx b/frontend/react/src/main.tsx new file mode 100644 index 00000000..571c5a25 --- /dev/null +++ b/frontend/react/src/main.tsx @@ -0,0 +1,13 @@ +/***************** UI *******************/ +import React from "react"; +import ReactDOM from "react-dom/client"; +import { setupApp } from "./olympusapp.js"; +import { UI } from "./ui/ui.js"; + +import "./index.css"; + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + +); diff --git a/frontend/react/src/map/boxselect.ts b/frontend/react/src/map/boxselect.ts new file mode 100644 index 00000000..37a4b655 --- /dev/null +++ b/frontend/react/src/map/boxselect.ts @@ -0,0 +1,173 @@ +import { Handler } from "leaflet"; +import { Util } from "leaflet"; +import { DomUtil } from "leaflet"; +import { DomEvent } from "leaflet"; +import { LatLngBounds } from "leaflet"; +import { Bounds } from "leaflet"; + +export var BoxSelect = Handler.extend({ + initialize: function (map) { + this._map = map; + this._container = map.getContainer(); + this._pane = map.getPanes().overlayPane; + this._resetStateTimeout = 0; + this._forceBoxSelect = false; + map.on("unload", this._destroy, this); + + document.addEventListener("mapForceBoxSelect", (e) => { + this._forceBoxSelect = true; + const originalEvent = (e as CustomEvent).detail; + this._onMouseDown(originalEvent); + }); + }, + + addHooks: function () { + DomEvent.on(this._container, "mousedown", this._onMouseDown, this); + DomEvent.on(this._container, "mapForceBoxSelect", this._onMouseDown, this); + }, + + removeHooks: function () { + DomEvent.off(this._container, "mousedown", this._onMouseDown, this); + DomEvent.off(this._container, "mapForceBoxSelect", this._onMouseDown, this); + }, + + moved: function () { + return this._moved; + }, + + _destroy: function () { + DomUtil.remove(this._pane); + delete this._pane; + }, + + _resetState: function () { + this._resetStateTimeout = 0; + this._moved = false; + }, + + _clearDeferredResetState: function () { + if (this._resetStateTimeout !== 0) { + clearTimeout(this._resetStateTimeout); + this._resetStateTimeout = 0; + } + }, + + _onMouseDown: function (e: any) { + if ( + (e.which == 1 && e.button == 0 && (e.shiftKey || this._forceBoxSelect)) || + (e.type === "touchstart" && this._forceBoxSelect) + ) { + this._map.fire("selectionstart"); + // Clear the deferred resetState if it hasn't executed yet, otherwise it + // will interrupt the interaction and orphan a box element in the container. + this._clearDeferredResetState(); + this._resetState(); + + DomUtil.disableTextSelection(); + DomUtil.disableImageDrag(); + this._map.dragging.disable(); + + if (e.type === "touchstart") + this._startPoint = this._map.mouseEventToContainerPoint(e.touches[0]); + else + this._startPoint = this._map.mouseEventToContainerPoint(e); + + DomEvent.on( + //@ts-ignore + document, + { + contextmenu: DomEvent.stop, + touchmove: this._onMouseMove, + touchend: this._onMouseUp, + touchstart: this._onKeyDown, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp, + keydown: this._onKeyDown, + }, + this + ); + } else { + return false; + } + }, + + _onMouseMove: function (e: any) { + if (!this._moved) { + this._moved = true; + + this._box = DomUtil.create("div", "leaflet-zoom-box", this._container); + DomUtil.addClass(this._container, "leaflet-crosshair"); + + this._map.fire("boxzoomstart"); + } + + if (e.type === "touchmove") + this._point = this._map.mouseEventToContainerPoint(e.touches[0]); + else + this._point = this._map.mouseEventToContainerPoint(e); + + var bounds = new Bounds(this._point, this._startPoint), + size = bounds.getSize(); + + if (bounds.min != undefined) DomUtil.setPosition(this._box, bounds.min); + + this._box.style.width = size.x + "px"; + this._box.style.height = size.y + "px"; + }, + + _finish: function () { + if (this._moved) { + DomUtil.remove(this._box); + DomUtil.removeClass(this._container, "leaflet-crosshair"); + } + + DomUtil.enableTextSelection(); + DomUtil.enableImageDrag(); + this._map.dragging.enable(); + + DomEvent.off( + //@ts-ignore + document, + { + contextmenu: DomEvent.stop, + touchmove: this._onMouseMove, + touchend: this._onMouseUp, + touchstart: this._onKeyDown, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp, + keydown: this._onKeyDown, + }, + this + ); + }, + + _onMouseUp: function (e: any) { + if (e.which !== 1 && e.button !== 0 && e.type !== "touchend") { + return; + } + + this._finish(); + + if (!this._moved) { + return; + } + // Postpone to next JS tick so internal click event handling + // still see it as "moved". + window.setTimeout(Util.bind(this._resetState, this), 0); + var bounds = new LatLngBounds( + this._map.containerPointToLatLng(this._startPoint), + this._map.containerPointToLatLng(this._point) + ); + + this._forceBoxSelect = false; + this._map.fire("selectionend", { selectionBounds: bounds }); + }, + + _onKeyDown: function (e: any) { + if (e.keyCode === 27) { + this._finish(); + this._clearDeferredResetState(); + this._resetState(); + } + }, +}); diff --git a/frontend/react/src/map/clickableminimap.ts b/frontend/react/src/map/clickableminimap.ts new file mode 100644 index 00000000..ec2cd1f3 --- /dev/null +++ b/frontend/react/src/map/clickableminimap.ts @@ -0,0 +1,12 @@ +import { MiniMap, MiniMapOptions } from "leaflet-control-mini-map"; + +export class ClickableMiniMap extends MiniMap { + constructor(layer: L.TileLayer | L.LayerGroup, options?: MiniMapOptions) { + super(layer, options); + } + + getMap() { + //@ts-ignore needed to access not exported member. A bit of a hack, required to access click events //TODO: fix me + return this._miniMap; + } +} diff --git a/frontend/react/src/map/coalitionarea/coalitionarea.ts b/frontend/react/src/map/coalitionarea/coalitionarea.ts new file mode 100644 index 00000000..a9b7423c --- /dev/null +++ b/frontend/react/src/map/coalitionarea/coalitionarea.ts @@ -0,0 +1,194 @@ +import { + DomUtil, + LatLng, + LatLngExpression, + Map, + Point, + Polygon, + PolylineOptions, +} from "leaflet"; +import { getApp } from "../../olympusapp"; +import { CoalitionAreaHandle } from "./coalitionareahandle"; +import { CoalitionAreaMiddleHandle } from "./coalitionareamiddlehandle"; +import { BLUE_COMMANDER, RED_COMMANDER } from "../../constants/constants"; + +export class CoalitionArea extends Polygon { + #coalition: string = "blue"; + #selected: boolean = true; + #editing: boolean = true; + #handles: CoalitionAreaHandle[] = []; + #middleHandles: CoalitionAreaMiddleHandle[] = []; + #activeIndex: number = 0; + + constructor( + latlngs: LatLngExpression[] | LatLngExpression[][] | LatLngExpression[][][], + options?: PolylineOptions + ) { + if (options === undefined) options = {}; + + options.bubblingMouseEvents = false; + options.interactive = false; + + super(latlngs, options); + this.#setColors(); + this.#registerCallbacks(); + + if ( + [BLUE_COMMANDER, RED_COMMANDER].includes( + getApp().getMissionManager().getCommandModeOptions().commandMode + ) + ) + this.setCoalition(getApp().getMissionManager().getCommandedCoalition()); + } + + setCoalition(coalition: string) { + this.#coalition = coalition; + this.#setColors(); + } + + getCoalition() { + return this.#coalition; + } + + setSelected(selected: boolean) { + this.#selected = selected; + this.#setColors(); + this.#setHandles(); + this.setOpacity(selected ? 1 : 0.5); + if (!this.getSelected() && this.getEditing()) { + /* Remove the vertex we were working on */ + var latlngs = this.getLatLngs()[0] as LatLng[]; + latlngs.splice(this.#activeIndex, 1); + this.setLatLngs(latlngs); + this.setEditing(false); + } + } + + getSelected() { + return this.#selected; + } + + setEditing(editing: boolean) { + this.#editing = editing; + this.#setHandles(); + var latlngs = this.getLatLngs()[0] as LatLng[]; + + /* Remove areas with less than 2 vertexes */ + if (latlngs.length <= 2) getApp().getMap().deleteCoalitionArea(this); + } + + getEditing() { + return this.#editing; + } + + addTemporaryLatLng(latlng: LatLng) { + this.#activeIndex++; + var latlngs = this.getLatLngs()[0] as LatLng[]; + latlngs.splice(this.#activeIndex, 0, latlng); + this.setLatLngs(latlngs); + this.#setHandles(); + } + + moveActiveVertex(latlng: LatLng) { + var latlngs = this.getLatLngs()[0] as LatLng[]; + latlngs[this.#activeIndex] = latlng; + this.setLatLngs(latlngs); + this.#setHandles(); + } + + setOpacity(opacity: number) { + this.setStyle({ opacity: opacity, fillOpacity: opacity * 0.25 }); + } + + onRemove(map: Map): this { + super.onRemove(map); + this.#handles + .concat(this.#middleHandles) + .forEach((handle: CoalitionAreaHandle | CoalitionAreaMiddleHandle) => + handle.removeFrom(getApp().getMap()) + ); + return this; + } + + #setColors() { + const coalitionColor = + this.getCoalition() === "blue" ? "#247be2" : "#ff5858"; + this.setStyle({ + color: this.getSelected() ? "white" : coalitionColor, + fillColor: coalitionColor, + }); + } + + #setHandles() { + this.#handles.forEach((handle: CoalitionAreaHandle) => + handle.removeFrom(getApp().getMap()) + ); + this.#handles = []; + if (this.getSelected()) { + var latlngs = this.getLatLngs()[0] as LatLng[]; + latlngs.forEach((latlng: LatLng, idx: number) => { + /* Add the polygon vertex handle (for moving the vertex) */ + const handle = new CoalitionAreaHandle(latlng); + handle.addTo(getApp().getMap()); + handle.on("drag", (e: any) => { + var latlngs = this.getLatLngs()[0] as LatLng[]; + latlngs[idx] = e.target.getLatLng(); + this.setLatLngs(latlngs); + this.#setMiddleHandles(); + }); + this.#handles.push(handle); + }); + } + this.#setMiddleHandles(); + } + + #setMiddleHandles() { + this.#middleHandles.forEach((handle: CoalitionAreaMiddleHandle) => + handle.removeFrom(getApp().getMap()) + ); + this.#middleHandles = []; + var latlngs = this.getLatLngs()[0] as LatLng[]; + if (this.getSelected() && latlngs.length >= 2) { + var lastLatLng: LatLng | null = null; + latlngs.concat([latlngs[0]]).forEach((latlng: LatLng, idx: number) => { + /* Add the polygon middle point handle (for adding new vertexes) */ + if (lastLatLng != null) { + const handle1Point = getApp().getMap().latLngToLayerPoint(latlng); + const handle2Point = getApp().getMap().latLngToLayerPoint(lastLatLng); + const middlePoint = new Point( + (handle1Point.x + handle2Point.x) / 2, + (handle1Point.y + handle2Point.y) / 2 + ); + const middleLatLng = getApp() + .getMap() + .layerPointToLatLng(middlePoint); + + const middleHandle = new CoalitionAreaMiddleHandle(middleLatLng); + middleHandle.addTo(getApp().getMap()); + middleHandle.on("click", (e: any) => { + this.#activeIndex = idx - 1; + this.addTemporaryLatLng(middleLatLng); + }); + this.#middleHandles.push(middleHandle); + } + lastLatLng = latlng; + }); + } + } + + #registerCallbacks() { + this.on("click", (e: any) => { + getApp().getMap().deselectAllCoalitionAreas(); + if (!this.getSelected()) { + this.setSelected(true); + } + }); + + this.on("contextmenu", (e: any) => { + if (!this.getEditing()) { + getApp().getMap().deselectAllCoalitionAreas(); + this.setSelected(true); + } else this.setEditing(false); + }); + } +} diff --git a/frontend/react/src/map/coalitionarea/coalitionareahandle.ts b/frontend/react/src/map/coalitionarea/coalitionareahandle.ts new file mode 100644 index 00000000..ea86b808 --- /dev/null +++ b/frontend/react/src/map/coalitionarea/coalitionareahandle.ts @@ -0,0 +1,21 @@ +import { DivIcon, LatLng } from "leaflet"; +import { CustomMarker } from "../markers/custommarker"; + +export class CoalitionAreaHandle extends CustomMarker { + constructor(latlng: LatLng) { + super(latlng, { interactive: true, draggable: true }); + } + + createIcon() { + this.setIcon( + new DivIcon({ + iconSize: [24, 24], + iconAnchor: [12, 12], + className: "leaflet-coalitionarea-handle-marker", + }) + ); + var el = document.createElement("div"); + el.classList.add("ol-coalitionarea-handle-icon"); + this.getElement()?.appendChild(el); + } +} diff --git a/frontend/react/src/map/coalitionarea/coalitionareamiddlehandle.ts b/frontend/react/src/map/coalitionarea/coalitionareamiddlehandle.ts new file mode 100644 index 00000000..76d861fb --- /dev/null +++ b/frontend/react/src/map/coalitionarea/coalitionareamiddlehandle.ts @@ -0,0 +1,21 @@ +import { DivIcon, LatLng } from "leaflet"; +import { CustomMarker } from "../markers/custommarker"; + +export class CoalitionAreaMiddleHandle extends CustomMarker { + constructor(latlng: LatLng) { + super(latlng, { interactive: true, draggable: false }); + } + + createIcon() { + this.setIcon( + new DivIcon({ + iconSize: [16, 16], + iconAnchor: [8, 8], + className: "leaflet-coalitionarea-middle-handle-marker", + }) + ); + var el = document.createElement("div"); + el.classList.add("ol-coalitionarea-middle-handle-icon"); + this.getElement()?.appendChild(el); + } +} diff --git a/frontend/react/src/map/coalitionarea/drawingcursor.ts b/frontend/react/src/map/coalitionarea/drawingcursor.ts new file mode 100644 index 00000000..a783e622 --- /dev/null +++ b/frontend/react/src/map/coalitionarea/drawingcursor.ts @@ -0,0 +1,22 @@ +import { DivIcon, LatLng } from "leaflet"; +import { CustomMarker } from "../markers/custommarker"; + +export class DrawingCursor extends CustomMarker { + constructor() { + super(new LatLng(0, 0), { interactive: false }); + this.setZIndexOffset(9999); + } + + createIcon() { + this.setIcon( + new DivIcon({ + iconSize: [24, 24], + iconAnchor: [0, 24], + className: "leaflet-draw-marker", + }) + ); + var el = document.createElement("div"); + el.classList.add("ol-draw-icon"); + this.getElement()?.appendChild(el); + } +} diff --git a/frontend/react/src/map/dcslayer.ts b/frontend/react/src/map/dcslayer.ts new file mode 100644 index 00000000..5b3d6d92 --- /dev/null +++ b/frontend/react/src/map/dcslayer.ts @@ -0,0 +1,71 @@ +import * as L from "leaflet"; + +export class DCSLayer extends L.TileLayer { + createTile(coords: L.Coords, done: L.DoneCallback) { + let newDone = (error?: Error, tile?: HTMLElement) => { + if ( + error === null && + tile !== undefined && + !tile.classList.contains("filtered") + ) { + // Create a canvas and set its width and height. + var canvas = document.createElement("canvas"); + canvas.setAttribute("width", "256px"); + canvas.setAttribute("height", "256px"); + + // Get the canvas drawing context, and draw the image to it. + var context = canvas.getContext("2d"); + if (context) { + context.drawImage( + tile as CanvasImageSource, + 0, + 0, + canvas.width, + canvas.height + ); + + // Get the canvas image data. + var imageData = context.getImageData( + 0, + 0, + canvas.width, + canvas.height + ); + + // Create a function for preserving a specified colour. + var makeTransparent = function ( + imageData: ImageData, + color: { r: number; g: number; b: number } + ) { + // Get the pixel data from the source. + var data = imageData.data; + // Iterate through all the pixels. + for (var i = 0; i < data.length; i += 4) { + // Check if the current pixel should have preserved transparency. This simply compares whether the color we passed in is equivalent to our pixel data. + var convert = + data[i] > color.r - 5 && + data[i] < color.r + 5 && + data[i + 1] > color.g - 5 && + data[i + 1] < color.g + 5 && + data[i + 2] > color.b - 5 && + data[i + 2] < color.b + 5; + + // Either preserve the initial transparency or set the transparency to 0. + data[i + 3] = convert ? 100 : data[i + 3]; + } + return imageData; + }; + + // Get the new pixel data and set it to the canvas context. + var newData = makeTransparent(imageData, { r: 26, g: 109, b: 127 }); + context.putImageData(newData, 0, 0); + (tile as HTMLImageElement).src = canvas.toDataURL(); + tile.classList.add("filtered"); + } + } else { + return done(error, tile); + } + }; + return super.createTile(coords, newDone); + } +} diff --git a/frontend/react/src/map/map.ts b/frontend/react/src/map/map.ts new file mode 100644 index 00000000..3d115636 --- /dev/null +++ b/frontend/react/src/map/map.ts @@ -0,0 +1,990 @@ +import * as L from "leaflet"; +import { getApp } from "../olympusapp"; +import { BoxSelect } from "./boxselect"; +import { Airbase } from "../mission/airbase"; +import { Unit } from "../unit/unit"; +import { + bearing, + deg2rad, + getGroundElevation, + polyContains, +} from "../other/utils"; +import { DestinationPreviewMarker } from "./markers/destinationpreviewmarker"; +import { TemporaryUnitMarker } from "./markers/temporaryunitmarker"; +import { ClickableMiniMap } from "./clickableminimap"; +import { + defaultMapLayers, + mapBounds, + minimapBoundaries, + IDLE, + COALITIONAREA_DRAW_POLYGON, + defaultMapMirrors, + SPAWN_UNIT, + CONTEXT_ACTION, + MAP_OPTIONS_DEFAULTS, + MAP_HIDDEN_TYPES_DEFAULTS, +} from "../constants/constants"; +import { CoalitionArea } from "./coalitionarea/coalitionarea"; +import { TouchBoxSelect } from "./touchboxselect"; +import { DestinationPreviewHandle } from "./markers/destinationpreviewHandle"; + +import "./markers/stylesheets/airbase.css"; +import "./markers/stylesheets/bullseye.css"; +import "./markers/stylesheets/units.css"; + +// Temporary +import "./theme.css"; +import { MapHiddenTypes, MapOptions } from "../types/types"; +import { SpawnRequestTable } from "../interfaces"; +import { ContextAction } from "../unit/contextaction"; + +L.Map.addInitHook("addHandler", "boxSelect", BoxSelect); + +export class Map extends L.Map { + /* Options */ + #options: MapOptions = MAP_OPTIONS_DEFAULTS; + #hiddenTypes: MapHiddenTypes = MAP_HIDDEN_TYPES_DEFAULTS; + + #ID: string; + #state: string; + #layer: L.TileLayer | L.LayerGroup | null = null; + + #spawnRequestTable: SpawnRequestTable | null = null; + + #preventLeftClick: boolean = false; + #leftClickTimer: number = 0; + #deafultPanDelta: number = 100; + #panInterval: number | null = null; + #panLeft: boolean = false; + #panRight: boolean = false; + #panUp: boolean = false; + #panDown: boolean = false; + + #lastMousePosition: L.Point = new L.Point(0, 0); + #lastMouseCoordinates: L.LatLng = new L.LatLng(0, 0); + + #shiftKey: boolean = false; + #centerUnit: Unit | null = null; + + #miniMap: ClickableMiniMap | null = null; + #miniMapLayerGroup: L.LayerGroup; + #miniMapPolyline: L.Polyline; + + #temporaryMarkers: TemporaryUnitMarker[] = []; + + #isSelecting: boolean = false; + #isZooming: boolean = false; + #previousZoom: number = 0; + + #slaveDCSCamera: boolean = false; + #slaveDCSCameraAvailable: boolean = false; + #cameraControlTimer: number = 0; + #cameraControlPort: number = 3003; + #cameraControlMode: string = "map"; + + #coalitionAreas: CoalitionArea[] = []; + + #mapLayers: any = defaultMapLayers; + #mapMirrors: any = defaultMapMirrors; + #layerName: string = ""; + #cameraOptionsXmlHttp: XMLHttpRequest | null = null; + #bradcastPositionXmlHttp: XMLHttpRequest | null = null; + #cameraZoomRatio: number = 1.0; + + #contextAction: null | ContextAction = null; + #theatre: string = ""; + #waitingForDoubleClick: boolean = false; + #doubleClickTimer: number = 0; + #longPressTimer: number = 0; + #isDragging: boolean = false; + + /** + * + * @param ID - the ID of the HTML element which will contain the context menu + */ + constructor(ID: string) { + /* Init the leaflet map */ + super(ID, { + preferCanvas: true, + doubleClickZoom: false, + zoomControl: false, + boxZoom: false, + //@ts-ignore Needed because the boxSelect option is non-standard + boxSelect: true, + zoomAnimation: true, + maxBoundsViscosity: 1.0, + minZoom: 7, + keyboard: true, + keyboardPanDelta: 0, + }); + this.setView([37.23, -115.8], 10); + + this.#ID = ID; + + /* Minimap */ + var minimapLayer = new L.TileLayer( + "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}", + { minZoom: 0, maxZoom: 13 } + ); + this.#miniMapLayerGroup = new L.LayerGroup([minimapLayer]); + this.#miniMapPolyline = new L.Polyline([], { color: "#202831" }); + this.#miniMapPolyline.addTo(this.#miniMapLayerGroup); + + /* Init the state machine */ + this.#state = IDLE; + + /* Register event handles */ + this.on("click", (e: any) => this.#onClick(e)); + this.on("dblclick", (e: any) => this.#onDoubleClick(e)); + this.on("zoomstart", (e: any) => this.#onZoomStart(e)); + this.on("zoom", (e: any) => this.#onZoom(e)); + this.on("zoomend", (e: any) => this.#onZoomEnd(e)); + this.on("drag", (e: any) => this.centerOnUnit(null)); + this.on("dragstart", (e: any) => this.#onDragStart(e)); + this.on("dragend", (e: any) => this.#onDragEnd(e)); + this.on("contextmenu", (e: any) => this.#onContextMenu(e)); + this.on("selectionstart", (e: any) => this.#onSelectionStart(e)); + this.on("selectionend", (e: any) => this.#onSelectionEnd(e)); + this.on("mouseup", (e: any) => this.#onMouseUp(e)); + this.on("mousedown", (e: any) => this.#onMouseDown(e)); + this.on("mousemove", (e: any) => this.#onMouseMove(e)); + this.on("keydown", (e: any) => this.#onKeyDown(e)); + this.on("keyup", (e: any) => this.#onKeyUp(e)); + this.on("move", (e: any) => { + if (this.#slaveDCSCamera) this.#broadcastPosition(); + }); + + L.DomEvent.on(this.getContainer(), "touchstart", this.#onMouseDown, this); + L.DomEvent.on(this.getContainer(), "touchend", this.#onMouseUp, this); + + /* Event listeners */ + document.addEventListener("hiddenTypesChanged", (ev: CustomEventInit) => { + Object.values(getApp().getUnitsManager().getUnits()).forEach( + (unit: Unit) => unit.updateVisibility() + ); + Object.values(getApp().getMissionManager().getAirbases()).forEach( + (airbase: Airbase) => { + if (this.getHiddenTypes().airbase) airbase.removeFrom(this); + else airbase.addTo(this); + } + ); + }); + + document.addEventListener( + "toggleCoalitionAreaDraw", + (ev: CustomEventInit) => { + //this.getMapContextMenu().hide(); + this.deselectAllCoalitionAreas(); + if (ev.detail?.type == "polygon") { + if (this.getState() !== COALITIONAREA_DRAW_POLYGON) + this.setState(COALITIONAREA_DRAW_POLYGON); + else this.setState(IDLE); + } + } + ); + + //document.addEventListener("unitUpdated", (ev: CustomEvent) => { + // if (this.#centerUnit != null && ev.detail == this.#centerUnit) + // this.#panToUnit(this.#centerUnit); + //}); + + document.addEventListener("mapOptionsChanged", () => { + this.getContainer().toggleAttribute( + "data-hide-labels", + !this.getOptions().showUnitLabels + ); + //this.#cameraControlPort = this.getOptions()[DCS_LINK_PORT] as number; + //this.#cameraZoomRatio = 50 / (20 + (this.getOptions()[DCS_LINK_RATIO] as number)); + + if (this.#slaveDCSCamera) { + this.#broadcastPosition(); + window.setTimeout(() => { + this.#broadcastPosition(); + }, 500); // DCS does not always apply the altitude correctly at the first set when changing map type + } + + this.updateMinimap(); + }); + + document.addEventListener("configLoaded", () => { + let config = getApp().getConfig(); + let layerSet = false; + + /* First load the map mirrors */ + if (config.mapMirrors) { + let mapMirrors = config.mapMirrors; + this.#mapMirrors = { + ...this.#mapMirrors, + ...mapMirrors, + }; + this.setLayerName(Object.keys(mapMirrors)[0]); + } + + /* Set the options, and if at least one mirror is available, select the first */ + if (Object.keys(this.#mapMirrors).length > 0) { + this.setLayerName(Object.keys(this.#mapMirrors)[0]); + layerSet = true; // Needed because this is async + } + + /* Then load the map layers */ + if (config.mapLayers) { + let mapLayers = config.mapLayers; + this.#mapLayers = { + ...this.#mapLayers, + ...mapLayers, + }; + } + + /* Append this options, and if no mirror was selected, select the first on (if available). Mirrors have the precedence */ + if (!layerSet && Object.keys(this.#mapLayers).length > 0) { + this.setLayerName(Object.keys(this.#mapLayers)[0]); + } + }); + + document.addEventListener("toggleCameraLinkStatus", () => { + // if (this.#slaveDCSCameraAvailable) { // Commented to experiment with usability + this.setSlaveDCSCamera(!this.#slaveDCSCamera); + // } + }); + + document.addEventListener("slewCameraToPosition", () => { + // if (this.#slaveDCSCameraAvailable) { // Commented to experiment with usability + this.#broadcastPosition(); + // } + }); + + /* Pan interval */ + this.#panInterval = window.setInterval(() => { + if (this.#panUp || this.#panDown || this.#panRight || this.#panLeft) + this.panBy( + new L.Point( + ((this.#panLeft ? -1 : 0) + (this.#panRight ? 1 : 0)) * + this.#deafultPanDelta * + (this.#shiftKey ? 3 : 1), + ((this.#panUp ? -1 : 0) + (this.#panDown ? 1 : 0)) * + this.#deafultPanDelta * + (this.#shiftKey ? 3 : 1) + ) + ); + }, 20); + + /* Periodically check if the camera control endpoint is available */ + this.#cameraControlTimer = window.setInterval(() => { + this.#checkCameraPort(); + }, 1000); + } + + setLayerName(layerName: string) { + if (this.#layer) this.removeLayer(this.#layer); + + let theatre = getApp().getMissionManager()?.getTheatre(); + + /* Normal or custom layers are handled here */ + if (layerName in this.#mapLayers) { + const layerData = this.#mapLayers[layerName]; + if (layerData instanceof Array) { + let layers = layerData.map((layer: any) => { + return new L.TileLayer( + layer.urlTemplate.replace("{theatre}", theatre.toLowerCase()), + layer + ); + }); + this.#layer = new L.LayerGroup(layers); + this.#layer?.addTo(this); + } else { + this.#layer = new L.TileLayer(layerData.urlTemplate, layerData); + this.#layer?.addTo(this); + } + + /* Mirrored layers are handled here */ + } else if (Object.keys(this.#mapMirrors).includes(layerName)) { + let layers: L.TileLayer[] = []; + + layers.push( + new L.TileLayer( + "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}", + { + minZoom: 1, + maxZoom: 19, + } + ) + ); + + /* Load the configuration file */ + const mirror = this.#mapMirrors[layerName as any]; + const request = new Request(mirror + "/config.json"); + fetch(request) + .then((response) => { + if (response.status === 200) { + return response.json(); + } else { + return {}; + } + }) + .then((res: any) => { + if ("alt-" + theatre.toLowerCase() in res) { + let template = `${mirror}/alt-${theatre.toLowerCase()}/{z}/{x}/{y}.png`; + layers.push( + ...res["alt-" + theatre.toLowerCase()].map((layerConfig: any) => { + return new L.TileLayer(template, { + ...layerConfig, + crossOrigin: "", + }); + }) + ); + } + this.#layer = new L.LayerGroup(layers); + this.#layer?.addTo(this); + }) + .catch(() => { + this.#layer = new L.LayerGroup(layers); + this.#layer?.addTo(this); + }); + } + this.#layerName = layerName; + + document.dispatchEvent( + new CustomEvent("mapSourceChanged", { detail: layerName }) + ); + } + + getLayerName() { + return this.#layerName; + } + + getLayers() { + return Object.keys(this.#mapLayers); + } + + /* State machine */ + setState( + state: string, + options?: { + spawnRequestTable?: SpawnRequestTable; + contextAction?: ContextAction | null; + } + ) { + this.#state = state; + + /* Operations to perform if you are NOT in a state */ + if (this.#state !== COALITIONAREA_DRAW_POLYGON) { + this.#deselectSelectedCoalitionArea(); + } + + /* Operations to perform if you ARE in a state */ + if (this.#state === IDLE) { + getApp().getUnitsManager().deselectAllUnits(); + } else if (this.#state === SPAWN_UNIT) { + this.#spawnRequestTable = options?.spawnRequestTable ?? null; + } else if (this.#state === CONTEXT_ACTION) { + this.#contextAction = options?.contextAction ?? null; + } else if (this.#state === COALITIONAREA_DRAW_POLYGON) { + this.#coalitionAreas.push(new CoalitionArea([])); + this.#coalitionAreas[this.#coalitionAreas.length - 1].addTo(this); + } + + document.dispatchEvent( + new CustomEvent("mapStateChanged", { detail: this.#state }) + ); + } + + getState() { + return this.#state; + } + + deselectAllCoalitionAreas() { + this.#coalitionAreas.forEach((coalitionArea: CoalitionArea) => + coalitionArea.setSelected(false) + ); + } + + deleteCoalitionArea(coalitionArea: CoalitionArea) { + if (this.#coalitionAreas.includes(coalitionArea)) + this.#coalitionAreas.splice( + this.#coalitionAreas.indexOf(coalitionArea), + 1 + ); + if (this.hasLayer(coalitionArea)) this.removeLayer(coalitionArea); + } + + setHiddenType(key: string, value: boolean) { + this.#hiddenTypes[key] = value; + document.dispatchEvent(new CustomEvent("hiddenTypesChanged")); + } + + getHiddenTypes() { + return this.#hiddenTypes; + } + + /* Context Menus */ + hideAllContextMenus() { + this.hideMapContextMenu(); + this.hideUnitContextMenu(); + this.hideAirbaseContextMenu(); + this.hideAirbaseSpawnMenu(); + this.hideCoalitionAreaContextMenu(); + } + + showMapContextMenu(x: number, y: number, latlng: L.LatLng) { + //this.hideAllContextMenus(); + //this.#mapContextMenu.show(x, y, latlng); + //document.dispatchEvent(new CustomEvent("mapContextMenu")); + } + + hideMapContextMenu() { + //this.#mapContextMenu.hide(); + //document.dispatchEvent(new CustomEvent("mapContextMenu")); + } + + getMapContextMenu() { + return null; //this.#mapContextMenu; + } + + showUnitContextMenu( + x: number | undefined = undefined, + y: number | undefined = undefined, + latlng: L.LatLng | undefined = undefined + ) { + //this.hideAllContextMenus(); + //this.#unitContextMenu.show(x, y, latlng); + } + + getUnitContextMenu() { + return null; //this.#unitContextMenu; + } + + hideUnitContextMenu() { + //this.#unitContextMenu.hide(); + } + + showAirbaseContextMenu( + airbase: Airbase, + x: number | undefined = undefined, + y: number | undefined = undefined, + latlng: L.LatLng | undefined = undefined + ) { + //this.hideAllContextMenus(); + //this.#airbaseContextMenu.show(x, y, latlng); + //this.#airbaseContextMenu.setAirbase(airbase); + } + + getAirbaseContextMenu() { + return null; //this.#airbaseContextMenu; + } + + hideAirbaseContextMenu() { + //this.#airbaseContextMenu.hide(); + } + + showAirbaseSpawnMenu( + airbase: Airbase, + x: number | undefined = undefined, + y: number | undefined = undefined, + latlng: L.LatLng | undefined = undefined + ) { + //this.hideAllContextMenus(); + //this.#airbaseSpawnMenu.show(x, y); + //this.#airbaseSpawnMenu.setAirbase(airbase); + } + + getAirbaseSpawnMenu() { + return null; //this.#airbaseSpawnMenu; + } + + hideAirbaseSpawnMenu() { + //this.#airbaseSpawnMenu.hide(); + } + + showCoalitionAreaContextMenu( + x: number, + y: number, + latlng: L.LatLng, + coalitionArea: CoalitionArea + ) { + //this.hideAllContextMenus(); + //this.#coalitionAreaContextMenu.show(x, y, latlng); + //this.#coalitionAreaContextMenu.setCoalitionArea(coalitionArea); + } + + getCoalitionAreaContextMenu() { + return null; //this.#coalitionAreaContextMenu; + } + + hideCoalitionAreaContextMenu() { + //this.#coalitionAreaContextMenu.hide(); + } + + getMousePosition() { + return this.#lastMousePosition; + } + + getMouseCoordinates() { + return this.#lastMouseCoordinates; + } + + centerOnUnit(unit: Unit | null) { + if (unit !== null) { + this.options.scrollWheelZoom = "center"; + this.#centerUnit = unit; + } else { + this.options.scrollWheelZoom = undefined; + this.#centerUnit = null; + } + } + + getCenteredOnUnit() { + return this.#centerUnit; + } + + setTheatre(theatre: string) { + this.#theatre = theatre; + + var bounds = new L.LatLngBounds([-90, -180], [90, 180]); + if (theatre in mapBounds) { + bounds = mapBounds[theatre as keyof typeof mapBounds].bounds; + } + + this.setView(bounds.getCenter(), 8); + + this.updateMinimap(); + + const boundaries = this.#getMinimapBoundaries(); + this.#miniMapPolyline.setLatLngs( + boundaries[theatre as keyof typeof boundaries] + ); + + this.setLayerName(this.#layerName); + } + + updateMinimap() { + if (this.#miniMap) this.#miniMap.remove(); + + if (this.#options.showMinimap) { + var bounds = new L.LatLngBounds([-90, -180], [90, 180]); + var miniMapZoom = 5; + if (this.#theatre in mapBounds) { + bounds = mapBounds[this.#theatre as keyof typeof mapBounds].bounds; + miniMapZoom = mapBounds[this.#theatre as keyof typeof mapBounds].zoom; + } + + this.#miniMap = new ClickableMiniMap(this.#miniMapLayerGroup, { + position: "topright", + width: 192 * 1.5, + height: 108 * 1.5, + //@ts-ignore Needed because some of the inputs are wrong in the original module interface + zoomLevelFixed: miniMapZoom, + //@ts-ignore Needed because some of the inputs are wrong in the original module interface + centerFixed: bounds.getCenter(), + }).addTo(this); + this.#miniMap.disableInteractivity(); + this.#miniMap.getMap().on("click", (e: any) => { + if (this.#miniMap) this.setView(e.latlng); + }); + } + } + + getMiniMapLayerGroup() { + return this.#miniMapLayerGroup; + } + + handleMapPanning(e: any) { + if (e.type === "keyup") { + switch (e.code) { + case "KeyA": + case "ArrowLeft": + this.#panLeft = false; + break; + case "KeyD": + case "ArrowRight": + this.#panRight = false; + break; + case "KeyW": + case "ArrowUp": + this.#panUp = false; + break; + case "KeyS": + case "ArrowDown": + this.#panDown = false; + break; + } + } else { + switch (e.code) { + case "KeyA": + case "ArrowLeft": + this.#panLeft = true; + break; + case "KeyD": + case "ArrowRight": + this.#panRight = true; + break; + case "KeyW": + case "ArrowUp": + this.#panUp = true; + break; + case "KeyS": + case "ArrowDown": + this.#panDown = true; + break; + } + } + } + + addTemporaryMarker( + latlng: L.LatLng, + name: string, + coalition: string, + commandHash?: string + ) { + var marker = new TemporaryUnitMarker(latlng, name, coalition, commandHash); + marker.addTo(this); + this.#temporaryMarkers.push(marker); + return marker; + } + + getSelectedCoalitionArea() { + return this.#coalitionAreas.find((area: CoalitionArea) => { + return area.getSelected(); + }); + } + + bringCoalitionAreaToBack(coalitionArea: CoalitionArea) { + coalitionArea.bringToBack(); + this.#coalitionAreas.splice(this.#coalitionAreas.indexOf(coalitionArea), 1); + this.#coalitionAreas.unshift(coalitionArea); + } + + setOption(key, value) { + this.#options[key] = value; + document.dispatchEvent(new CustomEvent("mapOptionsChanged")); + } + + getOptions() { + return this.#options; + } + + isZooming() { + return this.#isZooming; + } + + getPreviousZoom() { + return this.#previousZoom; + } + + getIsUnitProtected(unit: Unit) { + //const toggles = this.#mapMarkerVisibilityControls.reduce((list, control: MapMarkerVisibilityControl) => { + // if (control.isProtected) { + // list = list.concat(control.toggles); + // } + // return list; + //}, [] as string[]); + // + //if (toggles.length === 0) + // return false; + // + //return toggles.some((toggle: string) => { + // // Specific coding for robots - extend later if needed + // return (toggle === "dcs" && !unit.getControlled() && !unit.getHuman()); + //}); + return false; + } + + getMapMarkerVisibilityControls() { + return null; //this.#mapMarkerVisibilityControls; + } + + setSlaveDCSCamera(newSlaveDCSCamera: boolean) { + this.#slaveDCSCamera = newSlaveDCSCamera; + let button = document.getElementById("camera-link-control"); + button?.classList.toggle("off", !newSlaveDCSCamera); + if (this.#slaveDCSCamera) { + this.#broadcastPosition(); + window.setTimeout(() => { + this.#broadcastPosition(); + }, 500); // DCS does not always apply the altitude correctly at the first set when changing map type + } + } + + setCameraControlMode(newCameraControlMode: string) { + this.#cameraControlMode = newCameraControlMode; + if (this.#slaveDCSCamera) { + this.#broadcastPosition(); + window.setTimeout(() => { + this.#broadcastPosition(); + }, 500); // DCS does not always apply the altitude correctly at the first set when changing map type + } + } + + increaseCameraZoom() { + //const slider = document.querySelector(`label[title="${DCS_LINK_RATIO}"] input`); + //if (slider instanceof HTMLInputElement) { + // slider.value = String(Math.min(Number(slider.max), Number(slider.value) + 10)); + // slider.dispatchEvent(new Event('input')); + // slider.dispatchEvent(new Event('mouseup')); + //} + } + + decreaseCameraZoom() { + //const slider = document.querySelector(`label[title="${DCS_LINK_RATIO}"] input`); + //if (slider instanceof HTMLInputElement) { + // slider.value = String(Math.max(Number(slider.min), Number(slider.value) - 10)); + // slider.dispatchEvent(new Event('input')); + // slider.dispatchEvent(new Event('mouseup')); + //} + } + + executeContextAction( + targetUnit: Unit | null, + targetPosition: L.LatLng | null + ) { + this.#contextAction?.executeCallback(targetUnit, targetPosition); + } + + /* Event handlers */ + #onClick(e: any) { + /* Exit if we were waiting for a doubleclick */ + if (this.#waitingForDoubleClick) { + return; + } + + /* We'll wait for a doubleclick */ + this.#waitingForDoubleClick = true; + + this.#doubleClickTimer = window.setTimeout(() => { + /* Still waiting so no doubleclick; do the click action */ + if (this.#waitingForDoubleClick) { + if (!this.#preventLeftClick) { + /* Execute the short click action */ + if (this.#state === IDLE) { + this.deselectAllCoalitionAreas(); + } else if (this.#state === SPAWN_UNIT) { + if (this.#spawnRequestTable !== null) { + const location = e.latlng; + this.#spawnRequestTable.unit.location = e.latlng; + getApp() + .getUnitsManager() + .spawnUnits( + this.#spawnRequestTable.category, + [this.#spawnRequestTable.unit], + this.#spawnRequestTable.coalition, + false, + undefined, + undefined, + (hash) => { + this.addTemporaryMarker( + location, + this.#spawnRequestTable?.unit.unitType ?? "unknown", + this.#spawnRequestTable?.coalition ?? "blue", + hash + ); + } + ); + } + } else if (this.#state === COALITIONAREA_DRAW_POLYGON) { + if (this.getSelectedCoalitionArea()?.getEditing()) { + this.getSelectedCoalitionArea()?.addTemporaryLatLng(e.latlng); + } else { + this.deselectAllCoalitionAreas(); + } + } else if (this.#state === CONTEXT_ACTION) { + this.executeContextAction(null, e.latlng); + } else { + this.setState(IDLE); + getApp().getUnitsManager().deselectAllUnits(); + } + } + } + + /* No longer waiting for a doubleclick */ + this.#waitingForDoubleClick = false; + }, 200); + } + + #onDoubleClick(e: any) { + /* Let single clicks work again */ + this.#waitingForDoubleClick = false; + clearTimeout(this.#doubleClickTimer); + + this.setState(IDLE); + } + + #onContextMenu(e: any) {} + + #onDragStart(e: any) { + this.#isDragging = true; + } + + #onDragEnd(e: any) { + this.#isDragging = false; + } + + #onSelectionStart(e: any) { + this.#isSelecting = true; + } + + #onSelectionEnd(e: any) { + this.#isSelecting = false; + clearTimeout(this.#leftClickTimer); + this.#preventLeftClick = true; + this.#leftClickTimer = window.setTimeout(() => { + this.#preventLeftClick = false; + }, 200); + getApp().getUnitsManager().selectFromBounds(e.selectionBounds); + document.dispatchEvent(new CustomEvent("mapSelectionEnd")); + } + + #onMouseUp(e: any) { + window.clearTimeout(this.#longPressTimer); + } + + #onMouseDown(e: any) { + this.#longPressTimer = window.setTimeout(() => { + if (!this.#isDragging && !this.#isZooming) + if (e.type === "touchstart") + document.dispatchEvent( + new CustomEvent("mapForceBoxSelect", { detail: e }) + ); + else + document.dispatchEvent( + new CustomEvent("mapForceBoxSelect", { detail: e.originalEvent }) + ); + }, 500); + } + + #onMouseMove(e: any) { + this.#lastMousePosition.x = e.originalEvent.x; + this.#lastMousePosition.y = e.originalEvent.y; + this.#lastMouseCoordinates = this.mouseEventToLatLng(e.originalEvent); + + if (this.#state === COALITIONAREA_DRAW_POLYGON && e.latlng !== undefined) { + /* Update the polygon being drawn with the current position of the mouse cursor */ + this.getSelectedCoalitionArea()?.moveActiveVertex(e.latlng); + } + } + + #onKeyDown(e: any) { + this.#shiftKey = e.originalEvent.shiftKey; + } + + #onKeyUp(e: any) { + this.#shiftKey = e.originalEvent.shiftKey; + } + + #onZoomStart(e: any) { + this.#previousZoom = this.getZoom(); + if (this.#centerUnit != null) this.#panToUnit(this.#centerUnit); + this.#isZooming = true; + } + + #onZoom(e: any) { + if (this.#centerUnit != null) this.#panToUnit(this.#centerUnit); + } + + #onZoomEnd(e: any) { + this.#isZooming = false; + } + + #broadcastPosition() { + if ( + this.#bradcastPositionXmlHttp?.readyState !== 4 && + this.#bradcastPositionXmlHttp !== null + ) + return; + + getGroundElevation(this.getCenter(), (response: string) => { + var groundElevation: number | null = null; + try { + groundElevation = parseFloat(response); + this.#bradcastPositionXmlHttp = new XMLHttpRequest(); + /* Using 127.0.0.1 instead of localhost because the LuaSocket version used in DCS only listens to IPv4. This avoids the lag caused by the + browser if it first tries to send the request on the IPv6 address for localhost */ + this.#bradcastPositionXmlHttp.open( + "POST", + `http://127.0.0.1:${this.#cameraControlPort}` + ); + + const C = 40075016.686; + let mpp = + (C * Math.cos(deg2rad(this.getCenter().lat))) / + Math.pow(2, this.getZoom() + 8); + let d = mpp * 1920; + let alt = + (((d / 2) * 1) / Math.tan(deg2rad(40))) * this.#cameraZoomRatio; + alt = Math.min(alt, 50000); + this.#bradcastPositionXmlHttp.send( + JSON.stringify({ + lat: this.getCenter().lat, + lng: this.getCenter().lng, + alt: alt + groundElevation, + mode: this.#cameraControlMode, + }) + ); + } catch { + console.warn("broadcastPosition: could not retrieve ground elevation"); + } + }); + } + + /* */ + #panToUnit(unit: Unit) { + var unitPosition = new L.LatLng( + unit.getPosition().lat, + unit.getPosition().lng + ); + this.setView(unitPosition, this.getZoom(), { animate: false }); + } + + #getMinimapBoundaries() { + /* Draw the limits of the maps in the minimap*/ + return minimapBoundaries; + } + + #deselectSelectedCoalitionArea() { + this.getSelectedCoalitionArea()?.setSelected(false); + } + + #setSlaveDCSCameraAvailable(newSlaveDCSCameraAvailable: boolean) { + this.#slaveDCSCameraAvailable = newSlaveDCSCameraAvailable; + let linkButton = document.getElementById("camera-link-control"); + if (linkButton) { + if (!newSlaveDCSCameraAvailable) { + //this.setSlaveDCSCamera(false); // Commented to experiment with usability + linkButton.classList.add("red"); + linkButton.title = "Camera link to DCS is not available"; + } else { + linkButton.classList.remove("red"); + linkButton.title = "Link/Unlink DCS camera with Olympus position"; + } + } + } + + /* Check if the camera control plugin is available. Right now this will only change the color of the button, no changes in functionality */ + #checkCameraPort() { + if (this.#cameraOptionsXmlHttp?.readyState !== 4) + this.#cameraOptionsXmlHttp?.abort(); + + this.#cameraOptionsXmlHttp = new XMLHttpRequest(); + + /* Using 127.0.0.1 instead of localhost because the LuaSocket version used in DCS only listens to IPv4. This avoids the lag caused by the + browser if it first tries to send the request on the IPv6 address for localhost */ + this.#cameraOptionsXmlHttp.open( + "OPTIONS", + `http://127.0.0.1:${this.#cameraControlPort}` + ); + this.#cameraOptionsXmlHttp.onload = (res: any) => { + if ( + this.#cameraOptionsXmlHttp !== null && + this.#cameraOptionsXmlHttp.status == 204 + ) + this.#setSlaveDCSCameraAvailable(true); + else this.#setSlaveDCSCameraAvailable(false); + }; + this.#cameraOptionsXmlHttp.onerror = (res: any) => { + this.#setSlaveDCSCameraAvailable(false); + }; + this.#cameraOptionsXmlHttp.ontimeout = (res: any) => { + this.#setSlaveDCSCameraAvailable(false); + }; + this.#cameraOptionsXmlHttp.timeout = 500; + this.#cameraOptionsXmlHttp.send(""); + } +} diff --git a/frontend/react/src/map/markers/custommarker.ts b/frontend/react/src/map/markers/custommarker.ts new file mode 100644 index 00000000..09333f86 --- /dev/null +++ b/frontend/react/src/map/markers/custommarker.ts @@ -0,0 +1,25 @@ +import { DivIcon, Map, Marker } from "leaflet"; +import { MarkerOptions } from "leaflet"; +import { LatLngExpression } from "leaflet"; + +export class CustomMarker extends Marker { + constructor(latlng: LatLngExpression, options?: MarkerOptions) { + super(latlng, options); + } + + onAdd(map: Map): this { + this.setIcon(new DivIcon()); // Default empty icon + super.onAdd(map); + this.createIcon(); + return this; + } + + onRemove(map: Map): this { + super.onRemove(map); + return this; + } + + createIcon() { + /* Overloaded by child classes */ + } +} diff --git a/frontend/react/src/map/markers/destinationpreviewHandle.ts b/frontend/react/src/map/markers/destinationpreviewHandle.ts new file mode 100644 index 00000000..79a52846 --- /dev/null +++ b/frontend/react/src/map/markers/destinationpreviewHandle.ts @@ -0,0 +1,21 @@ +import { DivIcon, LatLng } from "leaflet"; +import { CustomMarker } from "../markers/custommarker"; + +export class DestinationPreviewHandle extends CustomMarker { + constructor(latlng: LatLng) { + super(latlng, { interactive: true, draggable: true }); + } + + createIcon() { + this.setIcon( + new DivIcon({ + iconSize: [18, 18], + iconAnchor: [9, 9], + className: "leaflet-destination-preview-handle-marker", + }) + ); + var el = document.createElement("div"); + el.classList.add("ol-destination-preview-handle-icon"); + this.getElement()?.appendChild(el); + } +} diff --git a/frontend/react/src/map/markers/destinationpreviewmarker.ts b/frontend/react/src/map/markers/destinationpreviewmarker.ts new file mode 100644 index 00000000..c3961444 --- /dev/null +++ b/frontend/react/src/map/markers/destinationpreviewmarker.ts @@ -0,0 +1,22 @@ +import { DivIcon, LatLngExpression, MarkerOptions } from "leaflet"; +import { CustomMarker } from "./custommarker"; + +export class DestinationPreviewMarker extends CustomMarker { + constructor(latlng: LatLngExpression, options?: MarkerOptions) { + super(latlng, options); + this.setZIndexOffset(9999); + } + + createIcon() { + this.setIcon( + new DivIcon({ + iconSize: [52, 52], + iconAnchor: [26, 26], + className: "leaflet-destination-preview", + }) + ); + var el = document.createElement("div"); + el.classList.add("ol-destination-preview-icon"); + this.getElement()?.appendChild(el); + } +} diff --git a/frontend/react/src/map/markers/smokemarker.ts b/frontend/react/src/map/markers/smokemarker.ts new file mode 100644 index 00000000..b8a99c6e --- /dev/null +++ b/frontend/react/src/map/markers/smokemarker.ts @@ -0,0 +1,39 @@ +import { DivIcon, LatLngExpression, MarkerOptions } from "leaflet"; +import { CustomMarker } from "./custommarker"; +import { SVGInjector } from "@tanem/svg-injector"; +import { getApp } from "../../olympusapp"; + +export class SmokeMarker extends CustomMarker { + #color: string; + + constructor( + latlng: LatLngExpression, + color: string, + options?: MarkerOptions + ) { + super(latlng, options); + this.setZIndexOffset(9999); + this.#color = color; + window.setTimeout(() => { + this.removeFrom(getApp().getMap()); + }, 300000); /* Remove the smoke after 5 minutes */ + } + + createIcon() { + this.setIcon( + new DivIcon({ + iconSize: [52, 52], + iconAnchor: [26, 52], + className: "leaflet-smoke-marker", + }) + ); + var el = document.createElement("div"); + el.classList.add("ol-smoke-icon"); + el.setAttribute("data-color", this.#color); + var img = document.createElement("img"); + img.src = "/images/markers/smoke.svg"; + img.onload = () => SVGInjector(img); + el.appendChild(img); + this.getElement()?.appendChild(el); + } +} diff --git a/frontend/react/src/map/markers/stylesheets/airbase.css b/frontend/react/src/map/markers/stylesheets/airbase.css new file mode 100644 index 00000000..87eb740c --- /dev/null +++ b/frontend/react/src/map/markers/stylesheets/airbase.css @@ -0,0 +1,26 @@ +.airbase-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + position: relative; + width: 40px; + height: 40px; +} + +.airbase-icon svg { + width: 40px; + height: 40px; +} + +.airbase-icon[data-coalition="red"] svg * { + stroke: var(--unit-background-red); +} + +.airbase-icon[data-coalition="blue"] svg * { + stroke: var(--unit-background-blue); +} + +.airbase-icon[data-coalition="neutral"] svg * { + stroke: var(--unit-background-neutral); +} diff --git a/frontend/react/src/map/markers/stylesheets/bullseye.css b/frontend/react/src/map/markers/stylesheets/bullseye.css new file mode 100644 index 00000000..37b458e3 --- /dev/null +++ b/frontend/react/src/map/markers/stylesheets/bullseye.css @@ -0,0 +1,24 @@ +.bullseye-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + position: relative; + width: 100%; + height: 100%; +} + +.bullseye-icon[data-coalition="red"] svg * { + stroke: var(--unit-background-red); + fill: var(--unit-background-red); +} + +.bullseye-icon[data-coalition="blue"] svg * { + stroke: var(--unit-background-blue); + fill: var(--unit-background-blue); +} + +.bullseye-icon[data-coalition="neutral"] svg * { + stroke: var(--unit-background-neutral); + fill: var(--unit-background-neutral); +} diff --git a/frontend/react/src/map/markers/stylesheets/units.css b/frontend/react/src/map/markers/stylesheets/units.css new file mode 100644 index 00000000..7b46717f --- /dev/null +++ b/frontend/react/src/map/markers/stylesheets/units.css @@ -0,0 +1,400 @@ +/*** Unit marker elements ***/ +[data-object|="unit"] { + align-items: center; + cursor: pointer; + display: flex; + height: 100%; + justify-content: center; + position: relative; + width: 100%; +} + +.unit-vvi { + align-self: center; + background: var(--secondary-gunmetal-grey); + display: flex; + justify-self: center; + padding-bottom: calc((var(--unit-width) / 2) + var(--unit-stroke-width)); + position: absolute; + transform-origin: bottom; + translate: 0 -50%; + width: var(--unit-vvi-width); +} + +.unit-hotgroup { + align-content: center; + background-color: var(--background-steel); + border-radius: var(--border-radius-xs); + display: none; + height: 15px; + justify-content: center; + position: absolute; + transform: rotate(-45deg); + translate: 0 -200%; + width: 15px; +} + +.unit-hotgroup-id { + background-color: transparent; + color: white; + font-size: 9px; + font-weight: bolder; + transform: rotate(45deg); + translate: -1px 1px; +} + +.unit-icon { + height: var(--unit-height); + position: absolute; + transform-origin: center; + width: var(--unit-width); +} + +.unit-icon svg { + height: 100%; + width: 100%; +} + +[data-is-selected] .unit-icon::before { + background-color: var(--unit-spotlight-fill); + border-radius: 50%; + content: ""; + height: 100%; + position: absolute; + width: 100%; + z-index: -1; +} + +/*** Basic colours ***/ +[data-coalition="blue"] .unit-icon svg > *:first-child { + fill: var(--unit-background-blue); +} + +[data-coalition="red"] .unit-icon svg > *:first-child { + fill: var(--unit-background-red); +} + +[data-coalition="neutral"] .unit-icon svg > *:first-child { + fill: var(--unit-background-neutral); +} + +[data-is-selected] .unit-icon svg > *:first-child { + fill: white; +} + +[data-is-highlighted] .unit-icon svg > *:first-child { + stroke: white; +} + +/*** Cursors ***/ +[data-is-dead], +[data-object|="unit-missile"], +[data-object|="unit-bomb"] { + cursor: default; +} + +/*** Labels ***/ +[data-object|="unit"] .unit-short-label { + color: var(--secondary-gunmetal-grey); + font-size: var(--unit-font-size); + font-weight: var(--unit-font-weight); + line-height: normal; + position: absolute; +} + +[data-object|="unit-groundunit"] .unit-short-label { + transform: translateY(7px); +} + +/*** Health indicator ***/ +[data-object|="unit"] .unit-health { + background: white; + border: var(--unit-health-border-width) solid var(--secondary-dark-steel); + border-radius: var(--border-radius-sm); + display: none; + height: var(--unit-health-height); + position: absolute; + translate: var(--unit-health-x) var(--unit-health-y); + width: var(--unit-health-width); +} + +/*** Fuel indicator ***/ +[data-object|="unit"] .unit-fuel { + background: white; + border: var(--unit-fuel-border-width) solid var(--secondary-dark-steel); + border-radius: var(--border-radius-sm); + display: none; + height: var(--unit-fuel-height); + position: absolute; + translate: var(--unit-fuel-x) var(--unit-fuel-y); + width: var(--unit-fuel-width); +} + +[data-object|="unit"] .unit-fuel-level, +[data-object|="unit"] .unit-health-level { + background-color: var(--secondary-light-grey); + height: 100%; + width: 100%; +} + +/*** Ammo indicator ***/ +[data-object|="unit"] .unit-ammo { + column-gap: var(--unit-ammo-spacing); + display: none; + height: fit-content; + position: absolute; + translate: var(--unit-ammo-x) var(--unit-ammo-y); + width: fit-content; +} + +[data-object|="unit"] .unit-ammo > * { + background-color: white; + border: var(--unit-ammo-border-width) solid var(--secondary-dark-steel); + border-radius: 50%; + padding: var(--unit-ammo-radius); +} + +/*** Unit summary ***/ +[data-object|="unit"] .unit-summary { + color: white; + column-gap: 6px; + display: flex; + flex-wrap: wrap; + font-size: 11px; + font-weight: bold; + justify-content: right; + line-height: 12px; + pointer-events: none; + position: absolute; + row-gap: 1px; + text-shadow: + -1px -1px 0 #000, + 1px -1px 0 #000, + -1px 1px 0 #000, + 1px 1px 0 #000; + right: 100%; + width: fit-content; +} + +[data-hide-labels] [data-object|="unit"] .unit-summary { + display: none; +} + +[data-object|="unit"] .unit-summary > * { + padding: 1px; +} + +[data-object|="unit"] .unit-summary .unit-callsign { + color: white; + overflow: hidden; + text-align: right; + transform-origin: right; + white-space: nowrap; + width: 80px; +} + +[data-object|="unit"]:hover .unit-summary .unit-callsign { + direction: rtl; + overflow: visible; +} + +/*** Common ***/ +[data-object|="unit"]:hover .unit-ammo, +[data-object|="unit"]:hover .unit-health, +[data-object|="unit"]:hover .unit-fuel { + display: flex; +} + +[data-object|="unit"][data-has-low-fuel] .unit-fuel, +[data-object|="unit"][data-has-low-health] .unit-health { + animation: pulse 1.5s linear infinite; +} + +[data-object|="unit"][data-is-in-hotgroup] .unit-hotgroup, +[data-object|="unit"][data-is-selected] .unit-ammo, +[data-object|="unit"][data-is-selected] .unit-fuel, +[data-object|="unit"][data-is-selected] .unit-health, +[data-object|="unit"][data-is-selected] .unit-selected-spotlight { + display: flex; +} + +[data-object|="unit"][data-has-fox-1] .unit-ammo > div:nth-child(1), +[data-object|="unit"][data-has-fox-2] .unit-ammo > div:nth-child(2), +[data-object|="unit"][data-has-fox-3] .unit-ammo > div:nth-child(3), +[data-object|="unit"][data-has-other-ammo] .unit-ammo > div:nth-child(4) { + background-color: var(--secondary-gunmetal-grey); +} + +[data-object|="unit"][data-coalition="blue"][data-is-selected] + .unit-short-label { + color: var(--secondary-blue-text); +} + +[data-object|="unit"][data-coalition="blue"] .unit-fuel-level, +[data-object|="unit"][data-coalition="blue"] .unit-health-level, +[data-object|="unit"][data-coalition="blue"][data-has-fox-1] + .unit-ammo + > div:nth-child(1), +[data-object|="unit"][data-coalition="blue"][data-has-fox-2] + .unit-ammo + > div:nth-child(2), +[data-object|="unit"][data-coalition="blue"][data-has-fox-3] + .unit-ammo + > div:nth-child(3), +[data-object|="unit"][data-coalition="blue"][data-has-other-ammo] + .unit-ammo + > div:nth-child(4) { + background-color: var(--primary-blue); +} + +[data-object|="unit"][data-coalition="blue"] .unit-vvi { + background-color: var(--secondary-blue-outline); +} + +[data-object|="unit"][data-coalition="red"][data-is-selected] + .unit-short-label { + color: var(--secondary-red-text); +} + +[data-object|="unit"][data-coalition="red"] .unit-fuel-level, +[data-object|="unit"][data-coalition="red"] .unit-health-level, +[data-object|="unit"][data-coalition="red"][data-has-fox-1] + .unit-ammo + > div:nth-child(1), +[data-object|="unit"][data-coalition="red"][data-has-fox-2] + .unit-ammo + > div:nth-child(2), +[data-object|="unit"][data-coalition="red"][data-has-fox-3] + .unit-ammo + > div:nth-child(3), +[data-object|="unit"][data-coalition="red"][data-has-other-ammo] + .unit-ammo + > div:nth-child(4) { + background-color: var(--primary-red); +} + +[data-object|="unit"][data-coalition="blue"] .unit-vvi { + background-color: var(--secondary-red-outline); +} + +/*** Unit state ***/ +[data-object|="unit"] .unit-state { + background-repeat: no-repeat; + height: 20px; + position: absolute; + width: 20px; + left: 0px; + top: 0px; +} + +[data-object|="unit"][data-state="rtb"] .unit-state { + background-image: url("/images/states/rtb.svg"); +} + +[data-object|="unit"][data-state="land"] .unit-state { + background-image: url("/images/states/rtb.svg"); +} + +[data-object|="unit"][data-state="idle"] .unit-state { + background-image: url("/images/states/idle.svg"); +} + +[data-object*="groundunit"][data-state="idle"] .unit-state, +[data-object*="navyunit"][data-state="idle"] .unit-state { + background-image: url(""); /* To avoid clutter, dont show the idle state for non flying units */ +} + +[data-object|="unit"][data-state="attack"] .unit-state, +[data-object|="unit"][data-state="bomb-point"] .unit-state, +[data-object|="unit"][data-state="carpet-bombing"] .unit-state, +[data-object|="unit"][data-state="fire-at-area"] .unit-state { + background-image: url("/images/states/attack.svg"); +} + +[data-object|="unit"][data-state="follow"] .unit-state { + background-image: url("/images/states/follow.svg"); +} + +[data-object|="unit"][data-state="refuel"] .unit-state { + background-image: url("/images/states/refuel.svg"); +} + +[data-object|="unit"][data-state="human"] .unit-state { + background-image: url("/images/states/human.svg"); +} + +[data-object|="unit"][data-state="dcs"] .unit-state { + background-image: url("/images/states/dcs.svg"); +} + +[data-object|="unit"][data-state="land-at-point"] .unit-state { + background-image: url("/images/states/land-at-point.svg"); +} + +[data-object|="unit"][data-state="no-task"] .unit-state { + background-image: url("/images/states/no-task.svg"); +} + +[data-object|="unit"][data-state="off"] .unit-state { + background-image: url("/images/states/off.svg"); +} + +[data-object|="unit"][data-state="tanker"] .unit-state { + background-image: url("/images/states/tanker.svg"); +} + +[data-object|="unit"][data-state="AWACS"] .unit-state { + background-image: url("/images/states/awacs.svg"); +} + +[data-object|="unit"][data-state="miss-on-purpose"] .unit-state { + background-image: url("/images/states/miss-on-purpose.svg"); +} + +[data-object|="unit"][data-state="scenic-aaa"] .unit-state { + background-image: url("/images/states/scenic-aaa.svg"); +} + +[data-object|="unit"][data-state="simulate-fire-fight"] .unit-state { + background-image: url("/images/states/simulate-fire-fight.svg"); +} + +[data-object|="unit"] .unit-health::before { + background-image: url("/images/icons/health.svg"); + background-repeat: no-repeat; + background-size: contain; + content: " "; + height: 6px; + left: 0; + position: absolute; + top: 0; + translate: -10px -2px; + width: 6px; +} + +/*** Dead unit ***/ +[data-object|="unit"][data-is-dead] .unit-selected-spotlight, +[data-object|="unit"][data-is-dead] .unit-short-label, +[data-object|="unit"][data-is-dead] .unit-vvi, +[data-object|="unit"][data-is-dead] .unit-hotgroup, +[data-object|="unit"][data-is-dead] .unit-hotgroup-id, +[data-object|="unit"][data-is-dead] .unit-state, +[data-object|="unit"][data-is-dead] .unit-fuel, +[data-object|="unit"][data-is-dead] .unit-health, +[data-object|="unit"][data-is-dead] .unit-ammo, +[data-object|="unit"][data-is-dead]:hover .unit-fuel, +[data-object|="unit"][data-is-dead]:hover .unit-ammo { + display: none; +} + +[data-object|="unit"][data-is-dead] .unit-summary > * { + display: none; +} + +[data-object|="unit"][data-is-dead] .unit-summary .unit-callsign { + display: block; +} + +.ol-temporary-marker { + opacity: 0.5; +} diff --git a/frontend/react/src/map/markers/targetmarker.ts b/frontend/react/src/map/markers/targetmarker.ts new file mode 100644 index 00000000..94a1de0c --- /dev/null +++ b/frontend/react/src/map/markers/targetmarker.ts @@ -0,0 +1,22 @@ +import { DivIcon, LatLngExpression, MarkerOptions } from "leaflet"; +import { CustomMarker } from "./custommarker"; + +export class TargetMarker extends CustomMarker { + constructor(latlng: LatLngExpression, options?: MarkerOptions) { + super(latlng, options); + this.setZIndexOffset(9999); + } + + createIcon() { + this.setIcon( + new DivIcon({ + iconSize: [52, 52], + iconAnchor: [26, 26], + className: "leaflet-target-marker", + }) + ); + var el = document.createElement("div"); + el.classList.add("ol-target-icon"); + this.getElement()?.appendChild(el); + } +} diff --git a/frontend/react/src/map/markers/temporaryunitmarker.ts b/frontend/react/src/map/markers/temporaryunitmarker.ts new file mode 100644 index 00000000..72a09228 --- /dev/null +++ b/frontend/react/src/map/markers/temporaryunitmarker.ts @@ -0,0 +1,87 @@ +import { CustomMarker } from "./custommarker"; +import { DivIcon, LatLng } from "leaflet"; +import { SVGInjector } from "@tanem/svg-injector"; +import { + getMarkerCategoryByName, + getUnitDatabaseByCategory, +} from "../../other/utils"; +import { getApp } from "../../olympusapp"; + +export class TemporaryUnitMarker extends CustomMarker { + #name: string; + #coalition: string; + #commandHash: string | undefined = undefined; + #timer: number = 0; + + constructor( + latlng: LatLng, + name: string, + coalition: string, + commandHash?: string + ) { + super(latlng, { interactive: false }); + this.#name = name; + this.#coalition = coalition; + this.#commandHash = commandHash; + + if (commandHash !== undefined) this.setCommandHash(commandHash); + } + + setCommandHash(commandHash: string) { + this.#commandHash = commandHash; + this.#timer = window.setInterval(() => { + if (this.#commandHash !== undefined) { + getApp() + .getServerManager() + .isCommandExecuted((res: any) => { + if (res.commandExecuted) { + this.removeFrom(getApp().getMap()); + window.clearInterval(this.#timer); + } + }, this.#commandHash); + } + }, 1000); + } + + createIcon() { + const category = getMarkerCategoryByName(this.#name); + const databaseEntry = getUnitDatabaseByCategory(category)?.getByName( + this.#name + ); + + /* Set the icon */ + var icon = new DivIcon({ + className: "leaflet-unit-icon", + iconAnchor: [25, 25], + iconSize: [50, 50], + }); + this.setIcon(icon); + + var el = document.createElement("div"); + el.classList.add("unit"); + el.setAttribute("data-object", `unit-${category}`); + el.setAttribute("data-coalition", this.#coalition); + + // Main icon + var unitIcon = document.createElement("div"); + unitIcon.classList.add("unit-icon"); + var img = document.createElement("img"); + + img.src = `/images/units/${databaseEntry?.markerFile ?? category}.svg`; + img.onload = () => SVGInjector(img); + unitIcon.appendChild(img); + unitIcon.toggleAttribute("data-rotate-to-heading", false); + el.append(unitIcon); + + // Short label + if (category == "aircraft" || category == "helicopter") { + var shortLabel = document.createElement("div"); + shortLabel.classList.add("unit-short-label"); + shortLabel.innerText = databaseEntry?.shortLabel || ""; + el.append(shortLabel); + } + + this.getElement()?.appendChild(el); + this.getElement()?.classList.add("ol-temporary-marker"); + } +} diff --git a/frontend/react/src/map/rangecircle.ts b/frontend/react/src/map/rangecircle.ts new file mode 100644 index 00000000..ed76937a --- /dev/null +++ b/frontend/react/src/map/rangecircle.ts @@ -0,0 +1,60 @@ +// @ts-nocheck +// This is a horrible hack. But it is needed at the moment to ovveride a default behaviour of Leaflet. TODO please fix me the proper way. + +import { Circle, Point, Polyline } from "leaflet"; + +/** + * This custom Circle object implements a faster render method for very big circles. When zoomed in, the default ctx.arc method + * is very slow since the circle is huge. Also, when zoomed in most of the circle points will be outside the screen and not needed. This + * simpler, faster renderer approximates the circle with line segements and only draws those currently visibile. + * A more refined version using arcs could be implemented but this works good enough. + */ +export class RangeCircle extends Circle { + _updatePath() { + if (!this._renderer._drawing || this._empty()) { + return; + } + var p = this._point, + ctx = this._renderer._ctx, + r = Math.max(Math.round(this._radius), 1), + s = (Math.max(Math.round(this._radiusY), 1) || r) / r; + + if (s !== 1) { + ctx.save(); + ctx.scale(1, s); + } + + let pathBegun = false; + let dtheta = (Math.PI * 2) / 120; + for (let theta = 0; theta <= Math.PI * 2; theta += dtheta) { + let p1 = new Point( + p.x + r * Math.cos(theta), + p.y / s + r * Math.sin(theta) + ); + let p2 = new Point( + p.x + r * Math.cos(theta + dtheta), + p.y / s + r * Math.sin(theta + dtheta) + ); + let l1 = this._map.layerPointToLatLng(p1); + let l2 = this._map.layerPointToLatLng(p2); + let line = new Polyline([l1, l2]); + if (this._map.getBounds().intersects(line.getBounds())) { + if (!pathBegun) { + ctx.beginPath(); + ctx.moveTo(p1.x, p1.y); + pathBegun = true; + } + ctx.lineTo(p2.x, p2.y); + } else { + if (pathBegun) { + this._renderer._fillStroke(ctx, this); + pathBegun = false; + } + } + } + + if (pathBegun) this._renderer._fillStroke(ctx, this); + + if (s !== 1) ctx.restore(); + } +} diff --git a/frontend/react/src/map/theme.css b/frontend/react/src/map/theme.css new file mode 100644 index 00000000..744e3347 --- /dev/null +++ b/frontend/react/src/map/theme.css @@ -0,0 +1,99 @@ +:root { + /** Colours **/ + + /*** Coalition: neutral ***/ + --primary-neutral: #949ba7; + --secondary-neutral-outline: #111111; + --secondary-neutral-text: #111111; + --unit-background-neutral: #cfd9e8; + + /*** Coalition: blue ***/ + --primary-blue: #247be2; + --secondary-blue-outline: #082e44; + --secondary-blue-text: #017dc1; + --unit-background-blue: #3bb9ff; + + /*** Coalition: red ***/ + --primary-red: #ff5858; + --secondary-red-outline: #262222; + --secondary-red-text: #d42121; + --unit-background-red: #ff5858; + + /*** UI Colours **/ + --accent-amber: #ffd828; + --accent-green: #8bff63; + --accent-light-blue: #5ca7ff; + --accent-dark-blue: #017dc1; + --transparent-accent-light-blue: rgba(92, 167, 255, 0.33); + --accent-light-red: #f5b6b6; + + --background-grey: #3d4651; + --background-dark-grey: #35393d; + --background-slate-blue: #363c43; + --background-offwhite: #f2f2f3; + --background-steel: #202831; + + --secondary-dark-steel: #181e25; + --secondary-gunmetal-grey: #2f2f2f; + --secondary-lighter-grey: #949ba7; + --secondary-light-grey: #797e83; + --secondary-semitransparent-white: #ffffffaa; + --secondary-transparent-white: #ffffff30; + --secondary-yellow: #ffd46893; + + --background-hover: #f2f2f333; + + --nav-text: #ececec; + + --ol-select-secondary: #545f6c; + --ol-switch-off: #686868; + --ol-switch-undefined: #383838; + + --ol-dialog-disabled-text-color: #ffffff20; + + /*** General border radii **/ + --border-radius-xs: 2px; + --border-radius-sm: 5px; + --border-radius-md: 10px; + --border-radius-lg: 15px; + + /*** Fonts **/ + --font-weight-bolder: 600; + + /*** Unit marker settings ***/ + /*** All markers **/ + --unit-border-radius: var(--border-radius-xs); + --unit-font-size: 14px; + --unit-font-weight: bolder; + --unit-label-border-width: 2px; + --unit-spotlight-fill: var(--secondary-yellow); + --unit-spotlight-radius: 26px; + --unit-stroke-width: 3px; + --unit-height: 50px; + --unit-width: 50px; + + --unit-health-border-width: 2px; + --unit-health-height: 6px; + --unit-health-width: 36px; + --unit-health-x: 0px; + --unit-health-y: 26px; + + /*** Air units ***/ + --unit-ammo-gap: calc(2px + var(--unit-stroke-width)); + --unit-ammo-border-radius: 50%; + --unit-ammo-border-width: 2px; + --unit-ammo-radius: 2px; + --unit-ammo-spacing: 2px; + --unit-ammo-x: 0px; + --unit-ammo-y: 30px; + --unit-fuel-border-width: 2px; + --unit-fuel-height: 6px; + --unit-fuel-width: 36px; + --unit-fuel-x: 0px; + --unit-fuel-y: 22px; + --unit-vvi-width: 4px; +} + +* { + font-weight: 600; +} diff --git a/frontend/react/src/map/touchboxselect.ts b/frontend/react/src/map/touchboxselect.ts new file mode 100644 index 00000000..fe531e4b --- /dev/null +++ b/frontend/react/src/map/touchboxselect.ts @@ -0,0 +1,149 @@ +import { Map, Point } from "leaflet"; +import { Handler } from "leaflet"; +import { Util } from "leaflet"; +import { DomUtil } from "leaflet"; +import { DomEvent } from "leaflet"; +import { LatLngBounds } from "leaflet"; +import { Bounds } from "leaflet"; + +export var TouchBoxSelect = Handler.extend({ + initialize: function (map: Map) { + this._map = map; + this._container = map.getContainer(); + this._pane = map.getPanes().overlayPane; + this._resetStateTimeout = 0; + this._doubleClicked = false; + map.on("unload", this._destroy, this); + }, + + addHooks: function () { + DomEvent.on(this._container, "touchstart", this._onMouseDown, this); + }, + + removeHooks: function () { + DomEvent.off(this._container, "touchstart", this._onMouseDown, this); + }, + + moved: function () { + return this._moved; + }, + + _destroy: function () { + DomUtil.remove(this._pane); + delete this._pane; + }, + + _resetState: function () { + this._resetStateTimeout = 0; + this._moved = false; + }, + + _clearDeferredResetState: function () { + if (this._resetStateTimeout !== 0) { + clearTimeout(this._resetStateTimeout); + this._resetStateTimeout = 0; + } + }, + + _onMouseDown: function (e: any) { + if (e.which == 0) { + this._map.fire("selectionstart"); + // Clear the deferred resetState if it hasn't executed yet, otherwise it + // will interrupt the interaction and orphan a box element in the container. + this._clearDeferredResetState(); + this._resetState(); + + DomUtil.disableTextSelection(); + DomUtil.disableImageDrag(); + + this._startPoint = this._getMousePosition(e); + + //@ts-ignore + DomEvent.on( + document, + { + contextmenu: DomEvent.stop, + touchmove: this._onMouseMove, + touchend: this._onMouseUp, + }, + this + ); + } else { + return false; + } + }, + + _onMouseMove: function (e: any) { + if (!this._moved) { + this._moved = true; + + this._box = DomUtil.create("div", "leaflet-zoom-box", this._container); + DomUtil.addClass(this._container, "leaflet-crosshair"); + } + + this._point = this._getMousePosition(e); + + var bounds = new Bounds(this._point, this._startPoint), + size = bounds.getSize(); + + if (bounds.min != undefined) DomUtil.setPosition(this._box, bounds.min); + + this._box.style.width = size.x + "px"; + this._box.style.height = size.y + "px"; + }, + + _finish: function () { + if (this._moved) { + DomUtil.remove(this._box); + DomUtil.removeClass(this._container, "leaflet-crosshair"); + } + + DomUtil.enableTextSelection(); + DomUtil.enableImageDrag(); + + //@ts-ignore + DomEvent.off( + document, + { + contextmenu: DomEvent.stop, + touchmove: this._onMouseMove, + touchend: this._onMouseUp, + }, + this + ); + }, + + _onMouseUp: function (e: any) { + if (e.which !== 0) { + return; + } + + this._finish(); + + if (!this._moved) { + return; + } + // Postpone to next JS tick so internal click event handling + // still see it as "moved". + window.setTimeout(Util.bind(this._resetState, this), 0); + var bounds = new LatLngBounds( + this._map.containerPointToLatLng(this._startPoint), + this._map.containerPointToLatLng(this._point) + ); + + this._map.fire("selectionend", { selectionBounds: bounds }); + }, + + _getMousePosition(e: any) { + var scale = DomUtil.getScale(this._container), + offset = scale.boundingClientRect; // left and top values are in page scale (like the event clientX/Y) + + return new Point( + // offset.left/top values are in page scale (like clientX/Y), + // whereas clientLeft/Top (border width) values are the original values (before CSS scale applies). + (e.touches[0].clientX - offset.left) / scale.x - + this._container.clientLeft, + (e.touches[0].clientY - offset.top) / scale.y - this._container.clientTop + ); + }, +}); diff --git a/frontend/react/src/mission/airbase.ts b/frontend/react/src/mission/airbase.ts new file mode 100644 index 00000000..50b82851 --- /dev/null +++ b/frontend/react/src/mission/airbase.ts @@ -0,0 +1,101 @@ +import { DivIcon } from "leaflet"; +import { CustomMarker } from "../map/markers/custommarker"; +import { SVGInjector } from "@tanem/svg-injector"; +import { AirbaseChartData, AirbaseOptions } from "../interfaces"; + +export class Airbase extends CustomMarker { + #name: string = ""; + #chartData: AirbaseChartData = { + elevation: "", + ICAO: "", + TACAN: "", + runways: [], + }; + #coalition: string = ""; + #hasChartDataBeenSet: boolean = false; + #properties: string[] = []; + #parkings: string[] = []; + + constructor(options: AirbaseOptions) { + super(options.position, { riseOnHover: true }); + + this.#name = options.name; + } + + chartDataHasBeenSet() { + return this.#hasChartDataBeenSet; + } + + createIcon() { + var icon = new DivIcon({ + className: "leaflet-airbase-marker", + iconSize: [40, 40], + iconAnchor: [20, 20], + }); // Set the marker, className must be set to avoid white square + this.setIcon(icon); + + var el = document.createElement("div"); + el.classList.add("airbase-icon"); + el.setAttribute("data-object", "airbase"); + var img = document.createElement("img"); + img.src = "/images/markers/airbase.svg"; + img.onload = () => SVGInjector(img); + el.appendChild(img); + this.getElement()?.appendChild(el); + el.addEventListener("mouseover", (ev) => { + document.dispatchEvent( + new CustomEvent("airbaseMouseover", { detail: this }) + ); + }); + el.addEventListener("mouseout", (ev) => { + document.dispatchEvent( + new CustomEvent("airbaseMouseout", { detail: this }) + ); + }); + el.dataset.coalition = this.#coalition; + } + + setCoalition(coalition: string) { + this.#coalition = coalition; + (( + this.getElement()?.querySelector(".airbase-icon") + )).dataset.coalition = this.#coalition; + } + + getChartData() { + return this.#chartData; + } + + getCoalition() { + return this.#coalition; + } + + setName(name: string) { + this.#name = name; + } + + getName() { + return this.#name; + } + + setChartData(chartData: AirbaseChartData) { + this.#hasChartDataBeenSet = true; + this.#chartData = chartData; + } + + setProperties(properties: string[]) { + this.#properties = properties; + } + + getProperties() { + return this.#properties; + } + + setParkings(parkings: string[]) { + this.#parkings = parkings; + } + + getParkings() { + return this.#parkings; + } +} diff --git a/frontend/react/src/mission/bullseye.ts b/frontend/react/src/mission/bullseye.ts new file mode 100644 index 00000000..b1149780 --- /dev/null +++ b/frontend/react/src/mission/bullseye.ts @@ -0,0 +1,36 @@ +import { DivIcon } from "leaflet"; +import { CustomMarker } from "../map/markers/custommarker"; +import { SVGInjector } from "@tanem/svg-injector"; + +export class Bullseye extends CustomMarker { + #coalition: string = ""; + + createIcon() { + var icon = new DivIcon({ + className: "leaflet-bullseye-marker", + iconSize: [40, 40], + iconAnchor: [20, 20], + }); // Set the marker, className must be set to avoid white square + this.setIcon(icon); + + var el = document.createElement("div"); + el.classList.add("bullseye-icon"); + el.setAttribute("data-object", "bullseye"); + var img = document.createElement("img"); + img.src = "/images/markers/bullseye.svg"; + img.onload = () => SVGInjector(img); + el.appendChild(img); + this.getElement()?.appendChild(el); + } + + setCoalition(coalition: string) { + this.#coalition = coalition; + (( + this.getElement()?.querySelector(".bullseye-icon") + )).dataset.coalition = this.#coalition; + } + + getCoalition() { + return this.#coalition; + } +} diff --git a/frontend/react/src/mission/missionmanager.ts b/frontend/react/src/mission/missionmanager.ts new file mode 100644 index 00000000..0fed3c8c --- /dev/null +++ b/frontend/react/src/mission/missionmanager.ts @@ -0,0 +1,437 @@ +import { LatLng } from "leaflet"; +import { getApp } from "../olympusapp"; +import { Airbase } from "./airbase"; +import { Bullseye } from "./bullseye"; +import { + BLUE_COMMANDER, + ERAS, + GAME_MASTER, + NONE, + RED_COMMANDER, +} from "../constants/constants"; +//import { Dropdown } from "../controls/dropdown"; +import { groundUnitDatabase } from "../unit/databases/groundunitdatabase"; +//import { createCheckboxOption, getCheckboxOptions } from "../other/utils"; +import { aircraftDatabase } from "../unit/databases/aircraftdatabase"; +import { helicopterDatabase } from "../unit/databases/helicopterdatabase"; +import { navyUnitDatabase } from "../unit/databases/navyunitdatabase"; +//import { Popup } from "../popups/popup"; +import { + AirbasesData, + BullseyesData, + CommandModeOptions, + DateAndTime, + MissionData, +} from "../interfaces"; + +/** The MissionManager */ +export class MissionManager { + #bullseyes: { [name: string]: Bullseye } = {}; + #airbases: { [name: string]: Airbase } = {}; + #theatre: string = ""; + #dateAndTime: DateAndTime = { + date: { Year: 0, Month: 0, Day: 0 }, + time: { h: 0, m: 0, s: 0 }, + startTime: 0, + elapsedTime: 0, + }; + #load: number = 0; + #frameRate: number = 0; + #commandModeOptions: CommandModeOptions = { + commandMode: NONE, + restrictSpawns: false, + restrictToCoalition: false, + setupTime: Infinity, + spawnPoints: { red: Infinity, blue: Infinity }, + eras: [], + }; + #remainingSetupTime: number = 0; + #spentSpawnPoint: number = 0; + //#commandModeDialog: HTMLElement; + //#commandModeErasDropdown: Dropdown; + #coalitions: { red: string[]; blue: string[] } = { red: [], blue: [] }; + + constructor() { + document.addEventListener("applycommandModeOptions", () => + this.#applycommandModeOptions() + ); + document.addEventListener("showCommandModeDialog", () => + this.showCommandModeDialog() + ); + document.addEventListener( + "toggleSpawnRestrictions", + (ev: CustomEventInit) => { + this.#toggleSpawnRestrictions(ev.detail._element.checked); + } + ); + + /* command-mode settings dialog */ + //this.#commandModeDialog = document.querySelector("#command-mode-settings-dialog") as HTMLElement; + //this.#commandModeErasDropdown = new Dropdown("command-mode-era-options", () => {}); + } + + /** Update location of bullseyes + * + * @param object + */ + updateBullseyes(data: BullseyesData) { + const commandMode = getApp() + .getMissionManager() + .getCommandModeOptions().commandMode; + for (let idx in data.bullseyes) { + const bullseye = data.bullseyes[idx]; + + // Prevent Red and Blue coalitions seeing each other's bulleye(s) + if ( + (bullseye.coalition === "red" && commandMode === BLUE_COMMANDER) || + (bullseye.coalition === "blue" && commandMode === RED_COMMANDER) + ) { + continue; + } + + if (!(idx in this.#bullseyes)) + this.#bullseyes[idx] = new Bullseye([0, 0]).addTo(getApp().getMap()); + + if (bullseye.latitude && bullseye.longitude && bullseye.coalition) { + this.#bullseyes[idx].setLatLng( + new LatLng(bullseye.latitude, bullseye.longitude) + ); + this.#bullseyes[idx].setCoalition(bullseye.coalition); + } + } + } + + /** Update airbase information + * + * @param object + */ + updateAirbases(data: AirbasesData) { + for (let idx in data.airbases) { + var airbase = data.airbases[idx]; + if ( + this.#airbases[airbase.callsign] === undefined && + airbase.callsign != "" + ) { + this.#airbases[airbase.callsign] = new Airbase({ + position: new LatLng(airbase.latitude, airbase.longitude), + name: airbase.callsign, + }).addTo(getApp().getMap()); + this.#airbases[airbase.callsign].on("contextmenu", (e) => + this.#onAirbaseClick(e) + ); + this.#loadAirbaseChartData(airbase.callsign); + } + + if ( + this.#airbases[airbase.callsign] != undefined && + airbase.latitude && + airbase.longitude && + airbase.coalition + ) { + this.#airbases[airbase.callsign].setLatLng( + new LatLng(airbase.latitude, airbase.longitude) + ); + this.#airbases[airbase.callsign].setCoalition(airbase.coalition); + } + } + } + + /** Update mission information + * + * @param object + */ + updateMission(data: MissionData) { + if (data.mission) { + /* Set the mission theatre */ + if (data.mission.theatre != this.#theatre) { + this.#theatre = data.mission.theatre; + getApp().getMap().setTheatre(this.#theatre); + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText("Map set to " + this.#theatre); + } + + /* Set the date and time data */ + this.#dateAndTime = data.mission.dateAndTime; + data.mission.dateAndTime.time.s -= 1; // ED has seconds 1-60 and not 0-59?! + + /* Set the coalition countries */ + this.#coalitions = data.mission.coalitions; + + /* Set the command mode options */ + this.#setcommandModeOptions(data.mission.commandModeOptions); + this.#remainingSetupTime = + this.getCommandModeOptions().setupTime - + this.getDateAndTime().elapsedTime; + var commandModePhaseEl = document.querySelector( + "#command-mode-phase" + ) as HTMLElement; + if (commandModePhaseEl) { + if (this.#remainingSetupTime > 0) { + var remainingTime = `-${new Date(this.#remainingSetupTime * 1000).toISOString().substring(14, 19)}`; + commandModePhaseEl.dataset.remainingTime = remainingTime; + } + + commandModePhaseEl.classList.toggle( + "setup-phase", + this.#remainingSetupTime > 0 && + this.getCommandModeOptions().restrictSpawns + ); + //commandModePhaseEl.classList.toggle("game-commenced", this.#remainingSetupTime <= 0 || !this.getCommandModeOptions().restrictSpawns); + //commandModePhaseEl.classList.toggle("no-restrictions", !this.getCommandModeOptions().restrictSpawns); + } + } + } + + /** Get the bullseyes set in this theatre + * + * @returns object + */ + getBullseyes() { + return this.#bullseyes; + } + + /** Get the airbases in this theatre + * + * @returns object + */ + getAirbases() { + return this.#airbases; + } + + /** Get the options/settings as set in the command mode + * + * @returns object + */ + getCommandModeOptions() { + return this.#commandModeOptions; + } + + /** Get the current date and time of the mission (based on local time) + * + * @returns object + */ + getDateAndTime() { + return this.#dateAndTime; + } + + /** + * Get the number of seconds left of setup time + * @returns number + */ + getRemainingSetupTime() { + return this.#remainingSetupTime; + } + + /** Get an object with the coalitions in it + * + * @returns object + */ + getCoalitions() { + return this.#coalitions; + } + + /** Get the current theatre (map) name + * + * @returns string + */ + getTheatre() { + return this.#theatre; + } + + getAvailableSpawnPoints() { + if (this.getCommandModeOptions().commandMode === GAME_MASTER) + return Infinity; + else if (this.getCommandModeOptions().commandMode === BLUE_COMMANDER) + return ( + this.getCommandModeOptions().spawnPoints.blue - this.#spentSpawnPoint + ); + else if (this.getCommandModeOptions().commandMode === RED_COMMANDER) + return ( + this.getCommandModeOptions().spawnPoints.red - this.#spentSpawnPoint + ); + else return 0; + } + + getCommandedCoalition() { + if (this.getCommandModeOptions().commandMode === BLUE_COMMANDER) + return "blue"; + else if (this.getCommandModeOptions().commandMode === RED_COMMANDER) + return "red"; + else return "all"; + } + + refreshSpawnPoints() { + var spawnPointsEl = document.querySelector("#spawn-points"); + if (spawnPointsEl) { + spawnPointsEl.textContent = `${this.getAvailableSpawnPoints()}`; + } + } + + setSpentSpawnPoints(spawnPoints: number) { + this.#spentSpawnPoint = spawnPoints; + this.refreshSpawnPoints(); + } + + setLoad(load: number) { + this.#load = load; + } + + getLoad() { + return this.#load; + } + + setFrameRate(frameRate: number) { + this.#frameRate = frameRate; + } + + getFrameRate() { + return this.#frameRate; + } + + showCommandModeDialog() { + //const options = this.getCommandModeOptions() + //const { restrictSpawns, restrictToCoalition, setupTime } = options; + //this.#toggleSpawnRestrictions(restrictSpawns); + // + ///* Create the checkboxes to select the unit eras */ + //this.#commandModeErasDropdown.setOptionsElements( + // ERAS.sort((eraA, eraB) => { + // return ( eraA.chronologicalOrder > eraB.chronologicalOrder ) ? 1 : -1; + // }).map((era) => { + // return createCheckboxOption(era.name, `Enable ${era} units spawns`, this.getCommandModeOptions().eras.includes(era.name)); + // }) + //); + // + //this.#commandModeDialog.classList.remove("hide"); + // + //const restrictSpawnsCheckbox = this.#commandModeDialog.querySelector("#restrict-spawns")?.querySelector("input") as HTMLInputElement; + //const restrictToCoalitionCheckbox = this.#commandModeDialog.querySelector("#restrict-to-coalition")?.querySelector("input") as HTMLInputElement; + //const blueSpawnPointsInput = this.#commandModeDialog.querySelector("#blue-spawn-points")?.querySelector("input") as HTMLInputElement; + //const redSpawnPointsInput = this.#commandModeDialog.querySelector("#red-spawn-points")?.querySelector("input") as HTMLInputElement; + //const setupTimeInput = this.#commandModeDialog.querySelector("#setup-time")?.querySelector("input") as HTMLInputElement; + // + //restrictSpawnsCheckbox.checked = restrictSpawns; + //restrictToCoalitionCheckbox.checked = restrictToCoalition; + //blueSpawnPointsInput.value = String(options.spawnPoints.blue); + //redSpawnPointsInput.value = String(options.spawnPoints.red); + //setupTimeInput.value = String(Math.floor(setupTime / 60.0)); + } + + #applycommandModeOptions() { + //this.#commandModeDialog.classList.add("hide"); + // + //const restrictSpawnsCheckbox = this.#commandModeDialog.querySelector("#restrict-spawns")?.querySelector("input") as HTMLInputElement; + //const restrictToCoalitionCheckbox = this.#commandModeDialog.querySelector("#restrict-to-coalition")?.querySelector("input") as HTMLInputElement; + //const blueSpawnPointsInput = this.#commandModeDialog.querySelector("#blue-spawn-points")?.querySelector("input") as HTMLInputElement; + //const redSpawnPointsInput = this.#commandModeDialog.querySelector("#red-spawn-points")?.querySelector("input") as HTMLInputElement; + //const setupTimeInput = this.#commandModeDialog.querySelector("#setup-time")?.querySelector("input") as HTMLInputElement; + // + //var eras: string[] = []; + //const enabledEras = getCheckboxOptions(this.#commandModeErasDropdown); + //Object.keys(enabledEras).forEach((key: string) => {if (enabledEras[key]) eras.push(key)}); + //getApp().getServerManager().setCommandModeOptions(restrictSpawnsCheckbox.checked, restrictToCoalitionCheckbox.checked, {blue: parseInt(blueSpawnPointsInput.value), red: parseInt(redSpawnPointsInput.value)}, eras, parseInt(setupTimeInput.value) * 60); + } + + #setcommandModeOptions(commandModeOptions: CommandModeOptions) { + /* Refresh all the data if we have exited the NONE state */ + var requestRefresh = false; + if ( + this.#commandModeOptions.commandMode === NONE && + commandModeOptions.commandMode !== NONE + ) + requestRefresh = true; + + /* Refresh the page if we have lost Game Master priviledges */ + if ( + this.#commandModeOptions.commandMode === GAME_MASTER && + commandModeOptions.commandMode !== GAME_MASTER + ) + location.reload(); + + /* Check if any option has changed */ + var commandModeOptionsChanged = + !commandModeOptions.eras.every((value: string, idx: number) => { + return value === this.getCommandModeOptions().eras[idx]; + }) || + commandModeOptions.spawnPoints.red !== + this.getCommandModeOptions().spawnPoints.red || + commandModeOptions.spawnPoints.blue !== + this.getCommandModeOptions().spawnPoints.blue || + commandModeOptions.restrictSpawns !== + this.getCommandModeOptions().restrictSpawns || + commandModeOptions.restrictToCoalition !== + this.getCommandModeOptions().restrictToCoalition; + + this.#commandModeOptions = commandModeOptions; + this.setSpentSpawnPoints(0); + this.refreshSpawnPoints(); + + if (commandModeOptionsChanged) { + document.dispatchEvent( + new CustomEvent("commandModeOptionsChanged", { detail: this }) + ); + document.getElementById("command-mode-toolbar")?.classList.remove("hide"); + const el = document.getElementById("command-mode"); + if (el) { + el.dataset.mode = commandModeOptions.commandMode; + el.textContent = commandModeOptions.commandMode.toUpperCase(); + } + } + + document + .querySelector("#spawn-points-container") + ?.classList.toggle( + "hide", + this.getCommandModeOptions().commandMode === GAME_MASTER || + !this.getCommandModeOptions().restrictSpawns + ); + document + .querySelector("#command-mode-settings-button") + ?.classList.toggle( + "hide", + this.getCommandModeOptions().commandMode !== GAME_MASTER + ); + + if (requestRefresh) getApp().getServerManager().refreshAll(); + } + + #onAirbaseClick(e: any) { + getApp() + .getMap() + .showAirbaseContextMenu( + e.sourceTarget, + e.originalEvent.x, + e.originalEvent.y, + e.latlng + ); + } + + #loadAirbaseChartData(callsign: string) { + if (!this.#theatre) { + return; + } + + var xhr = new XMLHttpRequest(); + xhr.open( + "GET", + `api/airbases/${this.#theatre.toLowerCase()}/${callsign}`, + true + ); + xhr.responseType = "json"; + xhr.onload = () => { + var status = xhr.status; + if (status === 200) { + const data = xhr.response; + this.getAirbases()[callsign].setChartData(data); + } else { + console.error(`Error retrieving data for ${callsign} airbase`); + } + }; + xhr.send(); + } + + #toggleSpawnRestrictions(restrictionsEnabled: boolean) { + //this.#commandModeDialog.querySelectorAll("input, label, .ol-select").forEach( el => { + // if (!el.closest("#restrict-spawns")) el.toggleAttribute("disabled", !restrictionsEnabled); + //}); + } +} diff --git a/frontend/react/src/olympusapp.ts b/frontend/react/src/olympusapp.ts new file mode 100644 index 00000000..2449aa0c --- /dev/null +++ b/frontend/react/src/olympusapp.ts @@ -0,0 +1,240 @@ +/***************** APP *******************/ +var app: OlympusApp; + +export function setupApp() { + if (app === undefined) { + app = new OlympusApp(); + app.start(); + } +} + +export function getApp() { + return app; +} + +import { Map } from "./map/map"; +import { MissionManager } from "./mission/missionmanager"; +import { ShortcutManager } from "./shortcut/shortcutmanager"; +import { UnitsManager } from "./unit/unitsmanager"; +import { WeaponsManager } from "./weapon/weaponsmanager"; +import { ServerManager } from "./server/servermanager"; + +import { + BLUE_COMMANDER, + DEFAULT_CONTEXT, + GAME_MASTER, + RED_COMMANDER, +} from "./constants/constants"; +import { aircraftDatabase } from "./unit/databases/aircraftdatabase"; +import { helicopterDatabase } from "./unit/databases/helicopterdatabase"; +import { groundUnitDatabase } from "./unit/databases/groundunitdatabase"; +import { navyUnitDatabase } from "./unit/databases/navyunitdatabase"; +import { Coalition, Context } from "./types/types"; + +export var VERSION = "{{OLYMPUS_VERSION_NUMBER}}"; +export var IP = window.location.toString(); +export var connectedToServer = true; // Temporary + +export class OlympusApp { + /* Global data */ + #activeCoalition: Coalition = "blue"; + #latestVersion: string | undefined = undefined; + #config: any = {}; + + /* Main leaflet map, extended by custom methods */ + #map: Map | null = null; + + /* Managers */ + #missionManager: MissionManager | null = null; + #serverManager: ServerManager | null = null; + #shortcutManager: ShortcutManager | null = null; + #unitsManager: UnitsManager | null = null; + #weaponsManager: WeaponsManager | null = null; + //#pluginsManager: // TODO + + /* Current context */ + #context: Context = DEFAULT_CONTEXT; + + constructor() {} + + getCurrentContext() { + return this.#context; + } + + getMap() { + return this.#map as Map; + } + + getServerManager() { + return this.#serverManager as ServerManager; + } + + getShortcutManager() { + return this.#shortcutManager as ShortcutManager; + } + + getUnitsManager() { + return this.#unitsManager as UnitsManager; + } + + getWeaponsManager() { + return this.#weaponsManager as WeaponsManager; + } + + getMissionManager() { + return this.#missionManager as MissionManager; + } + + /* TODO + getPluginsManager() { + return null // this.#pluginsManager as PluginsManager; + } + */ + + /** Set the active coalition, i.e. the currently controlled coalition. A game master can change the active coalition, while a commander is bound to his/her coalition + * + * @param newActiveCoalition + */ + setActiveCoalition(newActiveCoalition: Coalition) { + if ( + this.getMissionManager().getCommandModeOptions().commandMode == + GAME_MASTER + ) { + this.#activeCoalition = newActiveCoalition; + document.dispatchEvent(new CustomEvent("activeCoalitionChanged")); + } + } + + /** + * + * @returns The active coalition + */ + getActiveCoalition(): Coalition { + if ( + this.getMissionManager().getCommandModeOptions().commandMode == + GAME_MASTER + ) + return this.#activeCoalition; + else { + if ( + this.getMissionManager().getCommandModeOptions().commandMode == + BLUE_COMMANDER + ) + return "blue"; + else if ( + this.getMissionManager().getCommandModeOptions().commandMode == + RED_COMMANDER + ) + return "red"; + else return "neutral"; + } + } + + /** + * + * @returns The aircraft database + */ + getAircraftDatabase() { + return aircraftDatabase; + } + + /** + * + * @returns The helicopter database + */ + getHelicopterDatabase() { + return helicopterDatabase; + } + + /** + * + * @returns The ground unit database + */ + getGroundUnitDatabase() { + return groundUnitDatabase; + } + + /** + * + * @returns The navy unit database + */ + getNavyUnitDatabase() { + return navyUnitDatabase; + } + + start() { + /* Initialize base functionalitites */ + this.#map = new Map("map-container"); + + this.#missionManager = new MissionManager(); + this.#serverManager = new ServerManager(); + this.#shortcutManager = new ShortcutManager(); + this.#unitsManager = new UnitsManager(); + this.#weaponsManager = new WeaponsManager(); + + /* Set the address of the server */ + this.getServerManager().setAddress( + window.location.href.split("?")[0].replace("vite/", "") + ); + + /* Setup all global events */ + this.#setupEvents(); + + /* Check if we are running the latest version */ + const request = new Request( + "https://raw.githubusercontent.com/Pax1601/DCSOlympus/main/version.json" + ); + fetch(request) + .then((response) => { + if (response.status === 200) { + return response.json(); + } else { + throw new Error( + "Error connecting to Github to retrieve latest version" + ); + } + }) + .then((res) => { + this.#latestVersion = res["version"]; + const latestVersionSpan = document.getElementById( + "latest-version" + ) as HTMLElement; + if (latestVersionSpan) { + latestVersionSpan.innerHTML = this.#latestVersion ?? "Unknown"; + latestVersionSpan.classList.toggle( + "new-version", + this.#latestVersion !== VERSION + ); + } + }); + + /* Load the config file from the server */ + const configRequest = new Request( + window.location.href.split("?")[0].replace("vite/", "") + + "resources/config" + ); + fetch(configRequest) + .then((response) => { + if (response.status === 200) { + return response.json(); + } else { + throw new Error("Error retrieving config file"); + } + }) + .then((res) => { + this.#config = res; + document.dispatchEvent(new CustomEvent("configLoaded")); + }); + } + + getConfig() { + return this.#config; + } + + #setupEvents() { + /* Reload the page, used to mimic a restart of the app */ + document.addEventListener("reloadPage", () => { + location.reload(); + }); + } +} diff --git a/frontend/react/src/other/utils.ts b/frontend/react/src/other/utils.ts new file mode 100644 index 00000000..02e8868e --- /dev/null +++ b/frontend/react/src/other/utils.ts @@ -0,0 +1,554 @@ +import { LatLng, Point, Polygon } from "leaflet"; +import * as turf from "@turf/turf"; +import { UnitDatabase } from "../unit/databases/unitdatabase"; +import { + AircraftDatabase, + aircraftDatabase, +} from "../unit/databases/aircraftdatabase"; +import { helicopterDatabase } from "../unit/databases/helicopterdatabase"; +import { groundUnitDatabase } from "../unit/databases/groundunitdatabase"; +//import { Buffer } from "buffer"; +import { + GROUND_UNIT_AIR_DEFENCE_REGEX, + ROEs, + emissionsCountermeasures, + reactionsToThreat, + states, +} from "../constants/constants"; +import { navyUnitDatabase } from "../unit/databases/navyunitdatabase"; +import { DateAndTime, UnitBlueprint } from "../interfaces"; +import { Converter } from "usng"; +import { MGRS } from "../types/types"; +import { getApp } from "../olympusapp"; + +export function bearing( + lat1: number, + lon1: number, + lat2: number, + lon2: number +) { + const φ1 = deg2rad(lat1); // φ, λ in radians + const φ2 = deg2rad(lat2); + const λ1 = deg2rad(lon1); // φ, λ in radians + const λ2 = deg2rad(lon2); + const y = Math.sin(λ2 - λ1) * Math.cos(φ2); + const x = + Math.cos(φ1) * Math.sin(φ2) - + Math.sin(φ1) * Math.cos(φ2) * Math.cos(λ2 - λ1); + const θ = Math.atan2(y, x); + const brng = (rad2deg(θ) + 360) % 360; // in degrees + + return brng; +} + +export function distance( + lat1: number, + lon1: number, + lat2: number, + lon2: number +) { + const R = 6371e3; // metres + const φ1 = deg2rad(lat1); // φ, λ in radians + const φ2 = deg2rad(lat2); + const Δφ = deg2rad(lat2 - lat1); + const Δλ = deg2rad(lon2 - lon1); + + const a = + Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + + const d = R * c; // in metres + + return d; +} + +export function bearingAndDistanceToLatLng( + lat: number, + lon: number, + brng: number, + dist: number +) { + const R = 6371e3; // metres + const φ1 = deg2rad(lat); // φ, λ in radians + const λ1 = deg2rad(lon); + const φ2 = Math.asin( + Math.sin(φ1) * Math.cos(dist / R) + + Math.cos(φ1) * Math.sin(dist / R) * Math.cos(brng) + ); + const λ2 = + λ1 + + Math.atan2( + Math.sin(brng) * Math.sin(dist / R) * Math.cos(φ1), + Math.cos(dist / R) - Math.sin(φ1) * Math.sin(φ2) + ); + + return new LatLng(rad2deg(φ2), rad2deg(λ2)); +} + +export function ConvertDDToDMS(D: number, lng: boolean) { + var dir = D < 0 ? (lng ? "W" : "S") : lng ? "E" : "N"; + var deg = 0 | (D < 0 ? (D = -D) : D); + var min = 0 | (((D += 1e-9) % 1) * 60); + var sec = (0 | (((D * 60) % 1) * 6000)) / 100; + var dec = Math.round((sec - Math.floor(sec)) * 100); + var sec = Math.floor(sec); + if (lng) + return ( + dir + + zeroPad(deg, 3) + + "°" + + zeroPad(min, 2) + + "'" + + zeroPad(sec, 2) + + "." + + zeroPad(dec, 2) + + '"' + ); + else + return ( + dir + + zeroPad(deg, 2) + + "°" + + zeroPad(min, 2) + + "'" + + zeroPad(sec, 2) + + "." + + zeroPad(dec, 2) + + '"' + ); +} + +export function dataPointMap(container: HTMLElement, data: any) { + Object.keys(data).forEach((key) => { + const val = "" + data[key]; // Ensure a string + container.querySelectorAll(`[data-point="${key}"]`).forEach((el) => { + // We could probably have options here + if (el instanceof HTMLInputElement) { + el.value = val; + } else if (el instanceof HTMLElement) { + el.innerText = val; + } + }); + }); +} + +export function deg2rad(deg: number) { + var pi = Math.PI; + return deg * (pi / 180); +} + +export function rad2deg(rad: number) { + var pi = Math.PI; + return rad / (pi / 180); +} + +export function generateUUIDv4() { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { + var r = (Math.random() * 16) | 0, + v = c == "x" ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +} + +export function keyEventWasInInput(event: KeyboardEvent) { + const target = event.target; + return ( + target instanceof HTMLElement && + ["INPUT", "TEXTAREA"].includes(target.nodeName) + ); +} + +export function reciprocalHeading(heading: number): number { + return heading > 180 ? heading - 180 : heading + 180; +} + +/** + * Prepend numbers to the start of a string + * + * @param num subject number + * @param places places to pad + * @param decimal whether this is a decimal number or not + * + * */ +export const zeroAppend = function ( + num: number, + places: number, + decimal: boolean = false +) { + var string = decimal ? num.toFixed(2) : String(num); + while (string.length < places) { + string = "0" + string; + } + return string; +}; + +export const zeroPad = function (num: number, places: number) { + var string = String(num); + while (string.length < places) { + string += "0"; + } + return string; +}; + +export function similarity(s1: string, s2: string) { + var longer = s1; + var shorter = s2; + if (s1.length < s2.length) { + longer = s2; + shorter = s1; + } + var longerLength = longer.length; + if (longerLength == 0) { + return 1.0; + } + return (longerLength - editDistance(longer, shorter)) / longerLength; +} + +export function editDistance(s1: string, s2: string) { + s1 = s1.toLowerCase(); + s2 = s2.toLowerCase(); + + var costs = new Array(); + for (var i = 0; i <= s1.length; i++) { + var lastValue = i; + for (var j = 0; j <= s2.length; j++) { + if (i == 0) costs[j] = j; + else { + if (j > 0) { + var newValue = costs[j - 1]; + if (s1.charAt(i - 1) != s2.charAt(j - 1)) + newValue = Math.min(Math.min(newValue, lastValue), costs[j]) + 1; + costs[j - 1] = lastValue; + lastValue = newValue; + } + } + } + if (i > 0) costs[s2.length] = lastValue; + } + return costs[s2.length]; +} + +export function latLngToMGRS( + lat: number, + lng: number, + precision: number = 4 +): MGRS | false { + if (precision < 0 || precision > 6) { + console.error( + "latLngToMGRS: precision must be a number >= 0 and <= 6. Given precision: " + + precision + ); + return false; + } + const mgrs = new Converter({}).LLtoMGRS(lat, lng, precision); + const match = mgrs.match(new RegExp(`^(\\d{2})([A-Z])([A-Z])([A-Z])(\\d+)$`)); + const easting = match[5].substr(0, match[5].length / 2); + const northing = match[5].substr(match[5].length / 2); + + let output: MGRS = { + bandLetter: match[2], + columnLetter: match[3], + groups: [match[1] + match[2], match[3] + match[4], easting, northing], + easting: easting, + northing: northing, + precision: precision, + rowLetter: match[4], + string: match[0], + zoneNumber: match[1], + }; + + return output; +} + +export function latLngToUTM(lat: number, lng: number) { + return new Converter({}).LLtoUTM(lat, lng); +} + +export function latLngToMercator( + lat: number, + lng: number +): { x: number; y: number } { + var rMajor = 6378137; //Equatorial Radius, WGS84 + var shift = Math.PI * rMajor; + var x = (lng * shift) / 180; + var y = Math.log(Math.tan(((90 + lat) * Math.PI) / 360)) / (Math.PI / 180); + y = (y * shift) / 180; + + return { x: x, y: y }; +} + +export function mercatorToLatLng(x: number, y: number) { + var rMajor = 6378137; //Equatorial Radius, WGS84 + var shift = Math.PI * rMajor; + var lng = (x / shift) * 180.0; + var lat = (y / shift) * 180.0; + lat = + (180 / Math.PI) * + (2 * Math.atan(Math.exp((lat * Math.PI) / 180.0)) - Math.PI / 2.0); + + return { lng: lng, lat: lat }; +} + +export function createDivWithClass(className: string) { + var el = document.createElement("div"); + el.classList.add(className); + return el; +} + +export function knotsToMs(knots: number) { + return knots / 1.94384; +} + +export function msToKnots(ms: number) { + return ms * 1.94384; +} + +export function ftToM(ft: number) { + return ft * 0.3048; +} + +export function mToFt(m: number) { + return m / 0.3048; +} + +export function mToNm(m: number) { + return m * 0.000539957; +} + +export function nmToM(nm: number) { + return nm / 0.000539957; +} + +export function nmToFt(nm: number) { + return nm * 6076.12; +} + +export function polyContains(latlng: LatLng, polygon: Polygon) { + var poly = polygon.toGeoJSON(); + return turf.inside(turf.point([latlng.lng, latlng.lat]), poly); +} + +export function randomPointInPoly(polygon: Polygon): LatLng { + var bounds = polygon.getBounds(); + var x_min = bounds.getEast(); + var x_max = bounds.getWest(); + var y_min = bounds.getSouth(); + var y_max = bounds.getNorth(); + + var lat = y_min + Math.random() * (y_max - y_min); + var lng = x_min + Math.random() * (x_max - x_min); + + var poly = polygon.toGeoJSON(); + var inside = turf.inside(turf.point([lng, lat]), poly); + + if (inside) { + return new LatLng(lat, lng); + } else { + return randomPointInPoly(polygon); + } +} + +export function polygonArea(polygon: Polygon) { + var poly = polygon.toGeoJSON(); + return turf.area(poly); +} + +export function randomUnitBlueprint( + unitDatabase: UnitDatabase, + options: { + type?: string; + role?: string; + ranges?: string[]; + eras?: string[]; + coalition?: string; + } +) { + /* Start from all the unit blueprints in the database */ + var unitBlueprints = Object.values(unitDatabase.getBlueprints()); + + /* If a specific type or role is provided, use only the blueprints of that type or role */ + if (options.type && options.role) { + console.error( + "Can't create random unit if both type and role are provided. Either create by type or by role." + ); + return null; + } + + if (options.type) { + unitBlueprints = unitDatabase.getByType(options.type); + } else if (options.role) { + unitBlueprints = unitDatabase.getByType(options.role); + } + + /* Keep only the units that have a range included in the requested values */ + if (options.ranges) { + unitBlueprints = unitBlueprints.filter((unitBlueprint: UnitBlueprint) => { + var rangeType = ""; + var range = unitBlueprint.acquisitionRange; + if (range !== undefined) { + if (range >= 0 && range < 10000) rangeType = "Short range"; + else if (range >= 10000 && range < 100000) rangeType = "Medium range"; + else if (range >= 100000 && range < 999999) rangeType = "Long range"; + } + return options.ranges?.includes(rangeType); + }); + } + + /* Keep only the units that have an era included in the requested values */ + if (options.eras) { + unitBlueprints = unitBlueprints.filter((unitBlueprint: UnitBlueprint) => { + return unitBlueprint.era + ? options.eras?.includes(unitBlueprint.era) + : true; + }); + } + + /* Keep only the units that have the correct coalition, if selected */ + if (options.coalition) { + unitBlueprints = unitBlueprints.filter((unitBlueprint: UnitBlueprint) => { + return unitBlueprint.coalition && unitBlueprint.coalition !== "" + ? options.coalition === unitBlueprint.coalition + : true; + }); + } + + var index = Math.floor(Math.random() * unitBlueprints.length); + return unitBlueprints[index]; +} + +export function getMarkerCategoryByName(name: string) { + if (aircraftDatabase.getByName(name) != null) return "aircraft"; + else if (helicopterDatabase.getByName(name) != null) return "helicopter"; + else if (groundUnitDatabase.getByName(name) != null) { + var type = groundUnitDatabase.getByName(name)?.type ?? ""; + if (/\bAAA|SAM\b/.test(type) || /\bmanpad|stinger\b/i.test(type)) + return "groundunit-sam"; + else return "groundunit-other"; + } else if (navyUnitDatabase.getByName(name) != null) return "navyunit"; + else return "aircraft"; // TODO add other unit types +} + +export function getUnitDatabaseByCategory(category: string) { + if (category.toLowerCase() == "aircraft") return aircraftDatabase; + else if (category.toLowerCase() == "helicopter") return helicopterDatabase; + else if (category.toLowerCase().includes("groundunit")) + return groundUnitDatabase; + else if (category.toLowerCase().includes("navyunit")) return navyUnitDatabase; + else return null; +} + +export function getUnitCategoryByBlueprint(blueprint: UnitBlueprint) { + for (let database of [ + getApp()?.getAircraftDatabase(), + getApp()?.getHelicopterDatabase(), + getApp()?.getGroundUnitDatabase(), + getApp()?.getNavyUnitDatabase(), + ]) { + if (blueprint.name in database.blueprints) return database.getCategory(); + } + return "unknown"; +} + +export function base64ToBytes(base64: string) { + //return Buffer.from(base64, 'base64').buffer; +} + +export function enumToState(state: number) { + if (state < states.length) return states[state]; + else return states[0]; +} + +export function enumToROE(ROE: number) { + if (ROE < ROEs.length) return ROEs[ROE]; + else return ROEs[0]; +} + +export function enumToReactionToThreat(reactionToThreat: number) { + if (reactionToThreat < reactionsToThreat.length) + return reactionsToThreat[reactionToThreat]; + else return reactionsToThreat[0]; +} + +export function enumToEmissioNCountermeasure(emissionCountermeasure: number) { + if (emissionCountermeasure < emissionsCountermeasures.length) + return emissionsCountermeasures[emissionCountermeasure]; + else return emissionsCountermeasures[0]; +} + +export function enumToCoalition(coalitionID: number) { + switch (coalitionID) { + case 0: + return "neutral"; + case 1: + return "red"; + case 2: + return "blue"; + } + return ""; +} + +export function coalitionToEnum(coalition: string) { + switch (coalition) { + case "neutral": + return 0; + case "red": + return 1; + case "blue": + return 2; + } + return 0; +} + +export function convertDateAndTimeToDate(dateAndTime: DateAndTime) { + const date = dateAndTime.date; + const time = dateAndTime.time; + + if (!date) { + return new Date(); + } + + let year = date.Year; + let month = date.Month - 1; + + if (month < 0) { + month = 11; + year--; + } + + return new Date(year, month, date.Day, time.h, time.m, time.s); +} + +export function getGroundElevation(latlng: LatLng, callback: CallableFunction) { + /* Get the ground elevation from the server endpoint */ + const xhr = new XMLHttpRequest(); + xhr.open("GET", `api/elevation/${latlng.lat}/${latlng.lng}`, true); + xhr.timeout = 500; // ms + xhr.responseType = "json"; + xhr.onload = () => { + var status = xhr?.status; + if (status === 200) { + callback(xhr.response); + } + }; + xhr.send(); +} + +export function getWikipediaEntry(search: string, callback: CallableFunction) { + /* Get the ground elevation from the server endpoint */ + const xhr = new XMLHttpRequest(); + xhr.open( + "GET", + `https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts|pageimages&exintro&explaintext&generator=search&gsrsearch=intitle:${search}&gsrlimit=1&redirects=1&origin=*`, + true + ); + xhr.timeout = 500; // ms + xhr.responseType = "json"; + xhr.onload = () => { + var status = xhr?.status; + if (status === 200) { + callback(xhr.response); + } + }; + xhr.send(); +} diff --git a/frontend/react/src/server/dataextractor.ts b/frontend/react/src/server/dataextractor.ts new file mode 100644 index 00000000..ac546907 --- /dev/null +++ b/frontend/react/src/server/dataextractor.ts @@ -0,0 +1,176 @@ +import { LatLng } from "leaflet"; +import { + Ammo, + Contact, + GeneralSettings, + Offset, + Radio, + TACAN, +} from "../interfaces"; + +export class DataExtractor { + #seekPosition = 0; + #dataview: DataView; + #decoder: TextDecoder; + #buffer: ArrayBuffer; + + constructor(buffer: ArrayBuffer) { + this.#buffer = buffer; + this.#dataview = new DataView(this.#buffer); + this.#decoder = new TextDecoder("utf-8"); + } + + setSeekPosition(seekPosition: number) { + this.#seekPosition = seekPosition; + } + + getSeekPosition() { + return this.#seekPosition; + } + + extractBool() { + const value = this.#dataview.getUint8(this.#seekPosition); + this.#seekPosition += 1; + return value > 0; + } + + extractUInt8() { + const value = this.#dataview.getUint8(this.#seekPosition); + this.#seekPosition += 1; + return value; + } + + extractUInt16() { + const value = this.#dataview.getUint16(this.#seekPosition, true); + this.#seekPosition += 2; + return value; + } + + extractUInt32() { + const value = this.#dataview.getUint32(this.#seekPosition, true); + this.#seekPosition += 4; + return value; + } + + extractUInt64() { + const value = this.#dataview.getBigUint64(this.#seekPosition, true); + this.#seekPosition += 8; + return value; + } + + extractFloat64() { + const value = this.#dataview.getFloat64(this.#seekPosition, true); + this.#seekPosition += 8; + return value; + } + + extractLatLng() { + return new LatLng( + this.extractFloat64(), + this.extractFloat64(), + this.extractFloat64() + ); + } + + extractFromBitmask(bitmask: number, position: number) { + return ((bitmask >> position) & 1) > 0; + } + + extractString(length?: number) { + if (length === undefined) length = this.extractUInt16(); + var stringBuffer = this.#buffer.slice( + this.#seekPosition, + this.#seekPosition + length + ); + var view = new Int8Array(stringBuffer); + var stringLength = length; + view.every((value: number, idx: number) => { + if (value === 0) { + stringLength = idx; + return false; + } else return true; + }); + const value = this.#decoder.decode(stringBuffer); + this.#seekPosition += length; + return value.substring(0, stringLength).trim(); + } + + extractChar() { + return this.extractString(1); + } + + extractTACAN() { + const value: TACAN = { + isOn: this.extractBool(), + channel: this.extractUInt8(), + XY: this.extractChar(), + callsign: this.extractString(4), + }; + return value; + } + + extractRadio() { + const value: Radio = { + frequency: this.extractUInt32(), + callsign: this.extractUInt8(), + callsignNumber: this.extractUInt8(), + }; + return value; + } + + extractGeneralSettings() { + const value: GeneralSettings = { + prohibitJettison: this.extractBool(), + prohibitAA: this.extractBool(), + prohibitAG: this.extractBool(), + prohibitAfterburner: this.extractBool(), + prohibitAirWpn: this.extractBool(), + }; + return value; + } + + extractAmmo() { + const value: Ammo[] = []; + const size = this.extractUInt16(); + for (let idx = 0; idx < size; idx++) { + value.push({ + quantity: this.extractUInt16(), + name: this.extractString(33), + guidance: this.extractUInt8(), + category: this.extractUInt8(), + missileCategory: this.extractUInt8(), + }); + } + return value; + } + + extractContacts() { + const value: Contact[] = []; + const size = this.extractUInt16(); + for (let idx = 0; idx < size; idx++) { + value.push({ + ID: this.extractUInt32(), + detectionMethod: this.extractUInt8(), + }); + } + return value; + } + + extractActivePath() { + const value: LatLng[] = []; + const size = this.extractUInt16(); + for (let idx = 0; idx < size; idx++) { + value.push(this.extractLatLng()); + } + return value; + } + + extractOffset() { + const value: Offset = { + x: this.extractFloat64(), + y: this.extractFloat64(), + z: this.extractFloat64(), + }; + return value; + } +} diff --git a/frontend/react/src/server/servermanager.ts b/frontend/react/src/server/servermanager.ts new file mode 100644 index 00000000..a01ea1f5 --- /dev/null +++ b/frontend/react/src/server/servermanager.ts @@ -0,0 +1,942 @@ +import { LatLng } from "leaflet"; +import { getApp } from "../olympusapp"; +import { + AIRBASES_URI, + BULLSEYE_URI, + COMMANDS_URI, + LOGS_URI, + MISSION_URI, + NONE, + ROEs, + UNITS_URI, + WEAPONS_URI, + emissionsCountermeasures, + reactionsToThreat, +} from "../constants/constants"; +import { + AirbasesData, + BullseyesData, + GeneralSettings, + MissionData, + Radio, + ServerRequestOptions, + ServerStatus, + TACAN, +} from "../interfaces"; + +export class ServerManager { + #connected: boolean = false; + #paused: boolean = false; + #REST_ADDRESS = "http://localhost:3001/olympus"; + #username = "no-username"; + #password = ""; + #sessionHash: string | null = null; + #lastUpdateTimes: { [key: string]: number } = {}; + #previousMissionElapsedTime: number = 0; // Track if mission elapsed time is increasing (i.e. is the server paused) + #serverIsPaused: boolean = false; + #intervals: number[] = []; + #requests: { [key: string]: XMLHttpRequest } = {}; + + constructor() { + this.#lastUpdateTimes[UNITS_URI] = Date.now(); + this.#lastUpdateTimes[WEAPONS_URI] = Date.now(); + this.#lastUpdateTimes[LOGS_URI] = Date.now(); + this.#lastUpdateTimes[AIRBASES_URI] = Date.now(); + this.#lastUpdateTimes[BULLSEYE_URI] = Date.now(); + this.#lastUpdateTimes[MISSION_URI] = Date.now(); + } + + setUsername(newUsername: string) { + this.#username = newUsername; + } + + setPassword(newPassword: string) { + this.#password = newPassword; + } + + GET( + callback: CallableFunction, + errorCallback: CallableFunction, + uri: string, + options?: ServerRequestOptions, + responseType: string = "text", + force: boolean = false + ) { + var xmlHttp = new XMLHttpRequest(); + + /* If a request on this uri is still pending (meaning it's not done or did not yet fail), skip the request, to avoid clogging the TCP workers */ + /* If we are forcing the request we don't care if one already exists, just send it. CAREFUL: this makes sense only for low frequency requests, like refreshes, when we + are reasonably confident any previous request will be done before we make a new one on the same URI. */ + if ( + uri in this.#requests && + this.#requests[uri].readyState !== 4 && + !force + ) { + console.warn(`GET request on ${uri} URI still pending, skipping...`); + return; + } + + if (!force) this.#requests[uri] = xmlHttp; + + /* Assemble the request options string */ + var optionsString = ""; + if (options?.time != undefined) optionsString = `time=${options.time}`; + if (options?.commandHash != undefined) + optionsString = `commandHash=${options.commandHash}`; + + /* On the connection */ + xmlHttp.open( + "GET", + `${this.#REST_ADDRESS}/${uri}${optionsString ? `?${optionsString}` : ""}`, + true + ); + + /* If provided, set the credentials */ + if (this.#username && this.#password) + xmlHttp.setRequestHeader( + "Authorization", + "Basic " + btoa(`${this.#username}:${this.#password}`) + ); + + /* If specified, set the response type */ + if (responseType) + xmlHttp.responseType = responseType as XMLHttpRequestResponseType; + + xmlHttp.onload = (e) => { + if (xmlHttp.status == 200) { + /* Success */ + this.setConnected(true); + if (xmlHttp.responseType == "arraybuffer") + this.#lastUpdateTimes[uri] = callback(xmlHttp.response); + else { + const result = JSON.parse(xmlHttp.responseText); + this.#lastUpdateTimes[uri] = callback(result); + + if (result.frameRate !== undefined && result.load !== undefined) { + getApp().getMissionManager().setLoad(result.load); + getApp().getMissionManager().setFrameRate(result.frameRate); + } + } + } else if (xmlHttp.status == 401) { + /* Bad credentials */ + console.error("Incorrect username/password"); + errorCallback && errorCallback(xmlHttp.status); + } else { + /* Failure, probably disconnected */ + this.setConnected(false); + errorCallback && errorCallback(xmlHttp.status); + } + }; + xmlHttp.onreadystatechange = (res) => { + if (xmlHttp.readyState == 4 && xmlHttp.status === 0) { + console.error("An error occurred during the XMLHttpRequest"); + this.setConnected(false); + errorCallback && errorCallback(xmlHttp.status); + } + }; + xmlHttp.send(null); + } + + PUT(request: object, callback: CallableFunction) { + var xmlHttp = new XMLHttpRequest(); + xmlHttp.open("PUT", this.#REST_ADDRESS); + xmlHttp.setRequestHeader("Content-Type", "application/json"); + if (this.#username && this.#password) + xmlHttp.setRequestHeader( + "Authorization", + "Basic " + btoa(`${this.#username}:${this.#password}`) + ); + xmlHttp.onload = (res: any) => { + var res = JSON.parse(xmlHttp.responseText); + callback(res.commandHash); + }; + xmlHttp.send(JSON.stringify(request)); + console.log(`Sending PUT request:`); + console.log(request); + } + + getConfig(callback: CallableFunction) { + var xmlHttp = new XMLHttpRequest(); + xmlHttp.open( + "GET", + window.location.href.split("?")[0].replace("vite/", "") + "config", + true + ); + xmlHttp.onload = function (e) { + var data = JSON.parse(xmlHttp.responseText); + callback(data); + }; + xmlHttp.onerror = function () { + console.error( + "An error occurred during the XMLHttpRequest, could not retrieve configuration file" + ); + }; + xmlHttp.send(null); + } + + setAddress(address: string) { + this.#REST_ADDRESS = `${address}olympus`; + console.log(`Setting REST address to ${this.#REST_ADDRESS}`); + } + + getAirbases( + callback: CallableFunction, + errorCallback: CallableFunction = () => {} + ) { + this.GET(callback, errorCallback, AIRBASES_URI); + } + + getBullseye( + callback: CallableFunction, + errorCallback: CallableFunction = () => {} + ) { + this.GET(callback, errorCallback, BULLSEYE_URI); + } + + getLogs( + callback: CallableFunction, + refresh: boolean = false, + errorCallback: CallableFunction = () => {} + ) { + this.GET( + callback, + errorCallback, + LOGS_URI, + { time: refresh ? 0 : this.#lastUpdateTimes[LOGS_URI] }, + "text", + refresh + ); + } + + getMission( + callback: CallableFunction, + errorCallback: CallableFunction = () => {} + ) { + this.GET(callback, errorCallback, MISSION_URI); + } + + getUnits( + callback: CallableFunction, + refresh: boolean = false, + errorCallback: CallableFunction = () => {} + ) { + this.GET( + callback, + errorCallback, + UNITS_URI, + { time: refresh ? 0 : this.#lastUpdateTimes[UNITS_URI] }, + "arraybuffer", + refresh + ); + } + + getWeapons( + callback: CallableFunction, + refresh: boolean = false, + errorCallback: CallableFunction = () => {} + ) { + this.GET( + callback, + errorCallback, + WEAPONS_URI, + { time: refresh ? 0 : this.#lastUpdateTimes[WEAPONS_URI] }, + "arraybuffer", + refresh + ); + } + + isCommandExecuted( + callback: CallableFunction, + commandHash: string, + errorCallback: CallableFunction = () => {} + ) { + this.GET(callback, errorCallback, COMMANDS_URI, { + commandHash: commandHash, + }); + } + + addDestination(ID: number, path: any, callback: CallableFunction = () => {}) { + var command = { ID: ID, path: path }; + var data = { setPath: command }; + this.PUT(data, callback); + } + + spawnSmoke( + color: string, + latlng: LatLng, + callback: CallableFunction = () => {} + ) { + var command = { color: color, location: latlng }; + var data = { smoke: command }; + this.PUT(data, callback); + } + + spawnExplosion( + intensity: number, + explosionType: string, + latlng: LatLng, + callback: CallableFunction = () => {} + ) { + var command = { + explosionType: explosionType, + intensity: intensity, + location: latlng, + }; + var data = { explosion: command }; + this.PUT(data, callback); + } + + spawnAircrafts( + units: any, + coalition: string, + airbaseName: string, + country: string, + immediate: boolean, + spawnPoints: number, + callback: CallableFunction = () => {} + ) { + var command = { + units: units, + coalition: coalition, + airbaseName: airbaseName, + country: country, + immediate: immediate, + spawnPoints: spawnPoints, + }; + var data = { spawnAircrafts: command }; + this.PUT(data, callback); + } + + spawnHelicopters( + units: any, + coalition: string, + airbaseName: string, + country: string, + immediate: boolean, + spawnPoints: number, + callback: CallableFunction = () => {} + ) { + var command = { + units: units, + coalition: coalition, + airbaseName: airbaseName, + country: country, + immediate: immediate, + spawnPoints: spawnPoints, + }; + var data = { spawnHelicopters: command }; + this.PUT(data, callback); + } + + spawnGroundUnits( + units: any, + coalition: string, + country: string, + immediate: boolean, + spawnPoints: number, + callback: CallableFunction = () => {} + ) { + var command = { + units: units, + coalition: coalition, + country: country, + immediate: immediate, + spawnPoints: spawnPoints, + }; + var data = { spawnGroundUnits: command }; + this.PUT(data, callback); + } + + spawnNavyUnits( + units: any, + coalition: string, + country: string, + immediate: boolean, + spawnPoints: number, + callback: CallableFunction = () => {} + ) { + var command = { + units: units, + coalition: coalition, + country: country, + immediate: immediate, + spawnPoints: spawnPoints, + }; + var data = { spawnNavyUnits: command }; + this.PUT(data, callback); + } + + attackUnit( + ID: number, + targetID: number, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, targetID: targetID }; + var data = { attackUnit: command }; + this.PUT(data, callback); + } + + followUnit( + ID: number, + targetID: number, + offset: { x: number; y: number; z: number }, + callback: CallableFunction = () => {} + ) { + // X: front-rear, positive front + // Y: top-bottom, positive bottom + // Z: left-right, positive right + + var command = { + ID: ID, + targetID: targetID, + offsetX: offset["x"], + offsetY: offset["y"], + offsetZ: offset["z"], + }; + var data = { followUnit: command }; + this.PUT(data, callback); + } + + cloneUnits( + units: { ID: number; location: LatLng }[], + deleteOriginal: boolean, + spawnPoints: number, + callback: CallableFunction = () => {} + ) { + var command = { + units: units, + deleteOriginal: deleteOriginal, + spawnPoints: spawnPoints, + }; + var data = { cloneUnits: command }; + this.PUT(data, callback); + } + + deleteUnit( + ID: number, + explosion: boolean, + explosionType: string, + immediate: boolean, + callback: CallableFunction = () => {} + ) { + var command = { + ID: ID, + explosion: explosion, + explosionType: explosionType, + immediate: immediate, + }; + var data = { deleteUnit: command }; + this.PUT(data, callback); + } + + landAt(ID: number, latlng: LatLng, callback: CallableFunction = () => {}) { + var command = { ID: ID, location: latlng }; + var data = { landAt: command }; + this.PUT(data, callback); + } + + changeSpeed( + ID: number, + speedChange: string, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, change: speedChange }; + var data = { changeSpeed: command }; + this.PUT(data, callback); + } + + setSpeed(ID: number, speed: number, callback: CallableFunction = () => {}) { + var command = { ID: ID, speed: speed }; + var data = { setSpeed: command }; + this.PUT(data, callback); + } + + setSpeedType( + ID: number, + speedType: string, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, speedType: speedType }; + var data = { setSpeedType: command }; + this.PUT(data, callback); + } + + changeAltitude( + ID: number, + altitudeChange: string, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, change: altitudeChange }; + var data = { changeAltitude: command }; + this.PUT(data, callback); + } + + setAltitudeType( + ID: number, + altitudeType: string, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, altitudeType: altitudeType }; + var data = { setAltitudeType: command }; + this.PUT(data, callback); + } + + setAltitude( + ID: number, + altitude: number, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, altitude: altitude }; + var data = { setAltitude: command }; + this.PUT(data, callback); + } + + createFormation( + ID: number, + isLeader: boolean, + wingmenIDs: number[], + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, wingmenIDs: wingmenIDs, isLeader: isLeader }; + var data = { setLeader: command }; + this.PUT(data, callback); + } + + setROE(ID: number, ROE: string, callback: CallableFunction = () => {}) { + var command = { ID: ID, ROE: ROEs.indexOf(ROE) }; + var data = { setROE: command }; + this.PUT(data, callback); + } + + setReactionToThreat( + ID: number, + reactionToThreat: string, + callback: CallableFunction = () => {} + ) { + var command = { + ID: ID, + reactionToThreat: reactionsToThreat.indexOf(reactionToThreat), + }; + var data = { setReactionToThreat: command }; + this.PUT(data, callback); + } + + setEmissionsCountermeasures( + ID: number, + emissionCountermeasure: string, + callback: CallableFunction = () => {} + ) { + var command = { + ID: ID, + emissionsCountermeasures: emissionsCountermeasures.indexOf( + emissionCountermeasure + ), + }; + var data = { setEmissionsCountermeasures: command }; + this.PUT(data, callback); + } + + setOnOff(ID: number, onOff: boolean, callback: CallableFunction = () => {}) { + var command = { ID: ID, onOff: onOff }; + var data = { setOnOff: command }; + this.PUT(data, callback); + } + + setFollowRoads( + ID: number, + followRoads: boolean, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, followRoads: followRoads }; + var data = { setFollowRoads: command }; + this.PUT(data, callback); + } + + setOperateAs( + ID: number, + operateAs: number, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, operateAs: operateAs }; + var data = { setOperateAs: command }; + this.PUT(data, callback); + } + + refuel(ID: number, callback: CallableFunction = () => {}) { + var command = { ID: ID }; + var data = { refuel: command }; + this.PUT(data, callback); + } + + bombPoint(ID: number, latlng: LatLng, callback: CallableFunction = () => {}) { + var command = { ID: ID, location: latlng }; + var data = { bombPoint: command }; + this.PUT(data, callback); + } + + carpetBomb( + ID: number, + latlng: LatLng, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, location: latlng }; + var data = { carpetBomb: command }; + this.PUT(data, callback); + } + + bombBuilding( + ID: number, + latlng: LatLng, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, location: latlng }; + var data = { bombBuilding: command }; + this.PUT(data, callback); + } + + fireAtArea( + ID: number, + latlng: LatLng, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, location: latlng }; + var data = { fireAtArea: command }; + this.PUT(data, callback); + } + + simulateFireFight( + ID: number, + latlng: LatLng, + altitude: number, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, location: latlng, altitude: altitude }; + var data = { simulateFireFight: command }; + this.PUT(data, callback); + } + + // TODO: Remove coalition + scenicAAA( + ID: number, + coalition: string, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, coalition: coalition }; + var data = { scenicAAA: command }; + this.PUT(data, callback); + } + + // TODO: Remove coalition + missOnPurpose( + ID: number, + coalition: string, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, coalition: coalition }; + var data = { missOnPurpose: command }; + this.PUT(data, callback); + } + + landAtPoint( + ID: number, + latlng: LatLng, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, location: latlng }; + var data = { landAtPoint: command }; + this.PUT(data, callback); + } + + setShotsScatter( + ID: number, + shotsScatter: number, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, shotsScatter: shotsScatter }; + var data = { setShotsScatter: command }; + this.PUT(data, callback); + } + + setShotsIntensity( + ID: number, + shotsIntensity: number, + callback: CallableFunction = () => {} + ) { + var command = { ID: ID, shotsIntensity: shotsIntensity }; + var data = { setShotsIntensity: command }; + this.PUT(data, callback); + } + + setAdvacedOptions( + ID: number, + isActiveTanker: boolean, + isActiveAWACS: boolean, + TACAN: TACAN, + radio: Radio, + generalSettings: GeneralSettings, + callback: CallableFunction = () => {} + ) { + var command = { + ID: ID, + isActiveTanker: isActiveTanker, + isActiveAWACS: isActiveAWACS, + TACAN: TACAN, + radio: radio, + generalSettings: generalSettings, + }; + + var data = { setAdvancedOptions: command }; + this.PUT(data, callback); + } + + setCommandModeOptions( + restrictSpawns: boolean, + restrictToCoalition: boolean, + spawnPoints: { blue: number; red: number }, + eras: string[], + setupTime: number, + callback: CallableFunction = () => {} + ) { + var command = { + restrictSpawns: restrictSpawns, + restrictToCoalition: restrictToCoalition, + spawnPoints: spawnPoints, + eras: eras, + setupTime: setupTime, + }; + + var data = { setCommandModeOptions: command }; + this.PUT(data, callback); + } + + reloadDatabases(callback: CallableFunction = () => {}) { + var data = { reloadDatabases: {} }; + this.PUT(data, callback); + } + + startUpdate() { + /* Clear any existing interval */ + this.#intervals.forEach((interval: number) => { + window.clearInterval(interval); + }); + this.#intervals = []; + + this.#intervals.push( + window.setInterval(() => { + if (!this.getPaused()) { + this.getMission((data: MissionData) => { + this.checkSessionHash(data.sessionHash); + getApp().getMissionManager()?.updateMission(data); + return data.time; + }); + } + }, 1000) + ); + + this.#intervals.push( + window.setInterval(() => { + if ( + !this.getPaused() && + getApp().getMissionManager().getCommandModeOptions().commandMode != + NONE + ) { + this.getAirbases((data: AirbasesData) => { + this.checkSessionHash(data.sessionHash); + getApp().getMissionManager()?.updateAirbases(data); + return data.time; + }); + } + }, 10000) + ); + + this.#intervals.push( + window.setInterval(() => { + if ( + !this.getPaused() && + getApp().getMissionManager().getCommandModeOptions().commandMode != + NONE + ) { + this.getBullseye((data: BullseyesData) => { + this.checkSessionHash(data.sessionHash); + getApp().getMissionManager()?.updateBullseyes(data); + return data.time; + }); + } + }, 10000) + ); + + this.#intervals.push( + window.setInterval(() => { + if ( + !this.getPaused() && + getApp().getMissionManager().getCommandModeOptions().commandMode != + NONE + ) { + this.getLogs((data: any) => { + this.checkSessionHash(data.sessionHash); + //(getApp().getPanelsManager().get("log") as LogPanel).appendLogs(data.logs) + return data.time; + }); + } + }, 1000) + ); + + this.#intervals.push( + window.setInterval(() => { + if ( + !this.getPaused() && + getApp().getMissionManager().getCommandModeOptions().commandMode != + NONE + ) { + this.getUnits((buffer: ArrayBuffer) => { + var time = getApp().getUnitsManager()?.update(buffer); + return time; + }, false); + } + }, 250) + ); + + this.#intervals.push( + window.setInterval(() => { + if ( + !this.getPaused() && + getApp().getMissionManager().getCommandModeOptions().commandMode != + NONE + ) { + this.getWeapons((buffer: ArrayBuffer) => { + var time = getApp().getWeaponsManager()?.update(buffer); + return time; + }, false); + } + }, 250) + ); + + this.#intervals.push( + window.setInterval( + () => { + if ( + !this.getPaused() && + getApp().getMissionManager().getCommandModeOptions().commandMode != + NONE + ) { + this.getUnits((buffer: ArrayBuffer) => { + var time = getApp().getUnitsManager()?.update(buffer); + return time; + }, true); + } + }, + this.getServerIsPaused() ? 500 : 5000 + ) + ); + + // Mission clock and elapsed time + this.#intervals.push( + window.setInterval(() => { + const elapsedMissionTime = getApp() + .getMissionManager() + .getDateAndTime().elapsedTime; + this.#serverIsPaused = + elapsedMissionTime === this.#previousMissionElapsedTime; + this.#previousMissionElapsedTime = elapsedMissionTime; + + document.dispatchEvent( + new CustomEvent("serverStatusUpdated", { + detail: { + frameRate: getApp().getMissionManager().getFrameRate(), + load: getApp().getMissionManager().getLoad(), + elapsedTime: getApp().getMissionManager().getDateAndTime() + .elapsedTime, + missionTime: getApp().getMissionManager().getDateAndTime().time, + connected: this.getConnected(), + paused: this.getPaused(), + } as ServerStatus, + }) + ); + }, 1000) + ); + + this.#intervals.push( + window.setInterval(() => { + if ( + !this.getPaused() && + getApp().getMissionManager().getCommandModeOptions().commandMode != + NONE + ) { + this.getWeapons((buffer: ArrayBuffer) => { + var time = getApp().getWeaponsManager()?.update(buffer); + return time; + }, true); + } + }, 5000) + ); + } + + refreshAll() { + this.getAirbases((data: AirbasesData) => { + this.checkSessionHash(data.sessionHash); + getApp().getMissionManager()?.updateAirbases(data); + return data.time; + }); + + this.getBullseye((data: BullseyesData) => { + this.checkSessionHash(data.sessionHash); + getApp().getMissionManager()?.updateBullseyes(data); + return data.time; + }); + + this.getLogs((data: any) => { + this.checkSessionHash(data.sessionHash); + //(getApp().getPanelsManager().get("log") as LogPanel).appendLogs(data.logs) + return data.time; + }); + + this.getWeapons((buffer: ArrayBuffer) => { + var time = getApp().getWeaponsManager()?.update(buffer); + return time; + }, true); + + this.getUnits((buffer: ArrayBuffer) => { + var time = getApp().getUnitsManager()?.update(buffer); + return time; + }, true); + } + + checkSessionHash(newSessionHash: string) { + if (this.#sessionHash != null) { + if (newSessionHash !== this.#sessionHash) location.reload(); + } else this.#sessionHash = newSessionHash; + } + + setConnected(newConnected: boolean) { + if (this.#connected != newConnected) { + //newConnected ? (getApp().getPopupsManager().get("infoPopup") as Popup).setText("Connected to DCS Olympus server") : (getApp().getPopupsManager().get("infoPopup") as Popup).setText("Disconnected from DCS Olympus server"); + if (newConnected) { + document.getElementById("splash-screen")?.classList.add("hide"); + document.getElementById("gray-out")?.classList.add("hide"); + } + } + + this.#connected = newConnected; + } + + getConnected() { + return this.#connected; + } + + setPaused(newPaused: boolean) { + this.#paused = newPaused; + //this.#paused ? (getApp().getPopupsManager().get("infoPopup") as Popup).setText("View paused") : (getApp().getPopupsManager().get("infoPopup") as Popup).setText("View unpaused"); + } + + getPaused() { + return this.#paused; + } + + getServerIsPaused() { + return this.#serverIsPaused; + } + + getRequests() { + return this.#requests; + } +} diff --git a/frontend/react/src/shortcut/shortcut.ts b/frontend/react/src/shortcut/shortcut.ts new file mode 100644 index 00000000..32b4765d --- /dev/null +++ b/frontend/react/src/shortcut/shortcut.ts @@ -0,0 +1,63 @@ +import { getApp } from "../olympusapp"; +import { + ShortcutKeyboardOptions, + ShortcutMouseOptions, + ShortcutOptions, +} from "../interfaces"; +import { keyEventWasInInput } from "../other/utils"; + +export abstract class Shortcut { + #config: ShortcutOptions; + + constructor(config: ShortcutOptions) { + this.#config = config; + } + + getConfig() { + return this.#config; + } +} + +export class ShortcutKeyboard extends Shortcut { + constructor(config: ShortcutKeyboardOptions) { + config.event = config.event || "keyup"; + super(config); + + document.addEventListener(config.event, (ev: any) => { + if ( + typeof config.context === "string" && + getApp().getCurrentContext() !== config.context + ) { + return; + } + + if (ev instanceof KeyboardEvent === false || keyEventWasInInput(ev)) { + return; + } + + if (config.code !== ev.code) { + return; + } + + if ( + (typeof config.altKey !== "boolean" || + (typeof config.altKey === "boolean" && + ev.altKey === config.altKey)) && + (typeof config.ctrlKey !== "boolean" || + (typeof config.ctrlKey === "boolean" && + ev.ctrlKey === config.ctrlKey)) && + (typeof config.shiftKey !== "boolean" || + (typeof config.shiftKey === "boolean" && + ev.shiftKey === config.shiftKey)) + ) { + config.callback(ev); + } + }); + } +} + +export class ShortcutMouse extends Shortcut { + constructor(config: ShortcutMouseOptions) { + super(config); + } +} diff --git a/frontend/react/src/shortcut/shortcutmanager.ts b/frontend/react/src/shortcut/shortcutmanager.ts new file mode 100644 index 00000000..8a5273ef --- /dev/null +++ b/frontend/react/src/shortcut/shortcutmanager.ts @@ -0,0 +1,269 @@ +import { DEFAULT_CONTEXT } from "../constants/constants"; +import { ShortcutKeyboardOptions, ShortcutMouseOptions } from "../interfaces"; +import { getApp } from "../olympusapp"; +import { ShortcutKeyboard, ShortcutMouse } from "./shortcut"; + +export class ShortcutManager { + #items: { [key: string]: any } = {}; + #keysBeingHeld: string[] = []; + #keyDownCallbacks: CallableFunction[] = []; + #keyUpCallbacks: CallableFunction[] = []; + + constructor() { + document.addEventListener("keydown", (ev: KeyboardEvent) => { + if (this.#keysBeingHeld.indexOf(ev.code) < 0) { + this.#keysBeingHeld.push(ev.code); + } + this.#keyDownCallbacks.forEach((callback) => callback(ev)); + }); + + document.addEventListener("keyup", (ev: KeyboardEvent) => { + this.#keysBeingHeld = this.#keysBeingHeld.filter( + (held) => held !== ev.code + ); + this.#keyUpCallbacks.forEach((callback) => callback(ev)); + }); + + this.addKeyboardShortcut("togglePause", { + altKey: false, + callback: () => { + getApp() + .getServerManager() + .setPaused(!getApp().getServerManager().getPaused()); + }, + code: "Space", + context: DEFAULT_CONTEXT, + ctrlKey: false, + }) + .addKeyboardShortcut("deselectAll", { + callback: (ev: KeyboardEvent) => { + getApp().getUnitsManager().deselectAllUnits(); + }, + code: "Escape", + context: DEFAULT_CONTEXT, + }) + .addKeyboardShortcut("toggleUnitLabels", { + altKey: false, + callback: () => { + getApp() + .getMap() + .setOption( + "showUnitLabels", + !getApp().getMap().getOptions().showUnitLabels + ); + }, + code: "KeyL", + context: DEFAULT_CONTEXT, + ctrlKey: false, + shiftKey: false, + }) + .addKeyboardShortcut("toggleAcquisitionRings", { + altKey: false, + callback: () => { + getApp() + .getMap() + .setOption( + "showUnitsAcquisitionRings", + !getApp().getMap().getOptions().showUnitsAcquisitionRings + ); + }, + code: "KeyE", + context: DEFAULT_CONTEXT, + ctrlKey: false, + shiftKey: false, + }) + .addKeyboardShortcut("toggleEngagementRings", { + altKey: false, + callback: () => { + getApp() + .getMap() + .setOption( + "showUnitsEngagementRings", + !getApp().getMap().getOptions().showUnitsEngagementRings + ); + }, + code: "KeyQ", + context: DEFAULT_CONTEXT, + ctrlKey: false, + shiftKey: false, + }) + .addKeyboardShortcut("toggleHideShortEngagementRings", { + altKey: false, + callback: () => { + getApp() + .getMap() + .setOption( + "hideUnitsShortRangeRings", + !getApp().getMap().getOptions().hideUnitsShortRangeRings + ); + }, + code: "KeyR", + context: DEFAULT_CONTEXT, + ctrlKey: false, + shiftKey: false, + }) + .addKeyboardShortcut("toggleDetectionLines", { + altKey: false, + callback: () => { + getApp() + .getMap() + .setOption( + "showUnitTargets", + !getApp().getMap().getOptions().showUnitTargets + ); + }, + code: "KeyF", + context: DEFAULT_CONTEXT, + ctrlKey: false, + shiftKey: false, + }) + .addKeyboardShortcut("toggleGroupMembers", { + altKey: false, + callback: () => { + getApp() + .getMap() + .setOption( + "hideGroupMembers", + !getApp().getMap().getOptions().hideGroupMembers + ); + }, + code: "KeyG", + context: DEFAULT_CONTEXT, + ctrlKey: false, + shiftKey: false, + }) + .addKeyboardShortcut("increaseCameraZoom", { + altKey: true, + callback: () => { + //getApp().getMap().increaseCameraZoom(); + }, + code: "Equal", + context: DEFAULT_CONTEXT, + ctrlKey: false, + shiftKey: false, + }) + .addKeyboardShortcut("decreaseCameraZoom", { + altKey: true, + callback: () => { + //getApp().getMap().decreaseCameraZoom(); + }, + code: "Minus", + context: DEFAULT_CONTEXT, + ctrlKey: false, + shiftKey: false, + }); + + [ + "KeyW", + "KeyA", + "KeyS", + "KeyD", + "ArrowLeft", + "ArrowRight", + "ArrowUp", + "ArrowDown", + ].forEach((code) => { + this.addKeyboardShortcut(`pan${code}keydown`, { + altKey: false, + callback: (ev: KeyboardEvent) => { + //getApp().getMap().handleMapPanning(ev); + }, + code: code, + context: DEFAULT_CONTEXT, + ctrlKey: false, + event: "keydown", + }); + + this.addKeyboardShortcut(`pan${code}keyup`, { + callback: (ev: KeyboardEvent) => { + //getApp().getMap().handleMapPanning(ev); + }, + code: code, + context: DEFAULT_CONTEXT, + }); + }); + + const digits = [ + "Digit1", + "Digit2", + "Digit3", + "Digit4", + "Digit5", + "Digit6", + "Digit7", + "Digit8", + "Digit9", + ]; + + digits.forEach((code) => { + this.addKeyboardShortcut(`hotgroup${code}`, { + altKey: false, + callback: (ev: KeyboardEvent) => { + if (ev.ctrlKey && ev.shiftKey) + getApp() + .getUnitsManager() + .selectUnitsByHotgroup(parseInt(ev.code.substring(5)), false); // "Select hotgroup X in addition to any units already selected" + else if (ev.ctrlKey && !ev.shiftKey) + getApp() + .getUnitsManager() + .setHotgroup(parseInt(ev.code.substring(5))); // "These selected units are hotgroup X (forget any previous membership)" + else if (!ev.ctrlKey && ev.shiftKey) + getApp() + .getUnitsManager() + .addToHotgroup(parseInt(ev.code.substring(5))); // "Add (append) these units to hotgroup X (in addition to any existing members)" + else + getApp() + .getUnitsManager() + .selectUnitsByHotgroup(parseInt(ev.code.substring(5))); // "Select hotgroup X, deselect any units not in it." + }, + code: code, + }); + + // Stop hotgroup controls sending the browser to another tab + document.addEventListener("keydown", (ev: KeyboardEvent) => { + if ( + ev.code === code && + ev.ctrlKey === true && + ev.altKey === false && + ev.shiftKey === false + ) { + ev.preventDefault(); + } + }); + }); + } + + addKeyboardShortcut( + name: string, + shortcutKeyboardOptions: ShortcutKeyboardOptions + ) { + this.#items[name] = new ShortcutKeyboard(shortcutKeyboardOptions); + return this; + } + + addMouseShortcut(name: string, shortcutMouseOptions: ShortcutMouseOptions) { + this.#items[name] = new ShortcutMouse(shortcutMouseOptions); + return this; + } + + getKeysBeingHeld() { + return this.#keysBeingHeld; + } + + keyComboMatches(combo: string[]) { + const heldKeys = this.getKeysBeingHeld(); + if (combo.length !== heldKeys.length) { + return false; + } + + return combo.every((key) => heldKeys.indexOf(key) > -1); + } + + onKeyDown(callback: CallableFunction) { + this.#keyDownCallbacks.push(callback); + } + + onKeyUp(callback: CallableFunction) { + this.#keyUpCallbacks.push(callback); + } +} diff --git a/frontend/react/src/statecontext.tsx b/frontend/react/src/statecontext.tsx new file mode 100644 index 00000000..aeb39261 --- /dev/null +++ b/frontend/react/src/statecontext.tsx @@ -0,0 +1,22 @@ +import { createContext } from "react"; +import { + MAP_HIDDEN_TYPES_DEFAULTS, + MAP_OPTIONS_DEFAULTS, +} from "./constants/constants"; + +export const StateContext = createContext({ + mainMenuVisible: false, + spawnMenuVisible: false, + unitControlMenuVisible: false, + measureMenuVisible: false, + drawingMenuVisible: false, + optionsMenuVisible: false, + mapHiddenTypes: MAP_HIDDEN_TYPES_DEFAULTS, + mapOptions: MAP_OPTIONS_DEFAULTS, + mapSources: [] as string[], + activeMapSource: "", + mapBoxSelection: false +}); + +export const StateProvider = StateContext.Provider; +export const StateConsumer = StateContext.Consumer; diff --git a/frontend/react/src/types/types.ts b/frontend/react/src/types/types.ts new file mode 100644 index 00000000..da3a7319 --- /dev/null +++ b/frontend/react/src/types/types.ts @@ -0,0 +1,55 @@ +/* Types definition */ +export type MapMarkerVisibilityControl = { + category?: string; + image: string; + isProtected?: boolean; + name: string; + protectable?: boolean; + toggles: string[]; + tooltip: string; +}; + +export type MapOptions = { + hideGroupMembers: boolean; + hideUnitsShortRangeRings: boolean; + showUnitContacts: boolean; + showUnitPaths: boolean; + showUnitTargets: boolean; + showUnitLabels: boolean; + showUnitsEngagementRings: boolean; + showUnitsAcquisitionRings: boolean; + fillSelectedRing: boolean; + showMinimap: boolean; +}; + +export type MapHiddenTypes = { + human: boolean; + olympus: boolean; + dcs: boolean; + aircraft: boolean; + helicopter: boolean; + "groundunit-sam": boolean; + groundunit: boolean; + navyunit: boolean; + airbase: boolean; + dead: boolean; + blue: boolean; + red: boolean; + neutral: boolean; +}; + +export type MGRS = { + bandLetter: string; + columnLetter: string; + easting: string; + groups: string[]; + northing: string; + precision: number; + rowLetter: string; + string: string; + zoneNumber: string; +}; + +export type Coalition = "blue" | "neutral" | "red"; + +export type Context = string; diff --git a/frontend/react/src/ui/components/olaccordion.tsx b/frontend/react/src/ui/components/olaccordion.tsx new file mode 100644 index 00000000..194594a4 --- /dev/null +++ b/frontend/react/src/ui/components/olaccordion.tsx @@ -0,0 +1,112 @@ +import React, { useEffect, useRef, useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faArrowCircleDown } from "@fortawesome/free-solid-svg-icons"; + +export function OlAccordion(props: { + title: string; + children?: JSX.Element | JSX.Element[]; + showArrows?: boolean; +}) { + var [open, setOpen] = useState(false); + var [scrolledUp, setScrolledUp] = useState(true); + var [scrolledDown, setScrolledDown] = useState(false); + + var contentRef = useRef(null); + + useEffect(() => { + contentRef.current && + (contentRef.current as HTMLElement).children[0]?.addEventListener( + "scroll", + (e: any) => { + if (e.target.clientHeight < e.target.scrollHeight) { + setScrolledDown( + e.target.scrollTop === + e.target.scrollHeight - e.target.offsetHeight + ); + setScrolledUp(e.target.scrollTop === 0); + } + } + ); + }); + + return ( +
+

+ +

+
+ {props.showArrows && ( +
+ {" "} + {!scrolledUp && ( + + )} +
+ )} +
+ {props.children} +
+ {props.showArrows && ( +
+ {!scrolledDown && ( + + )} +
+ )} +
+
+ ); +} diff --git a/frontend/react/src/ui/components/olbuttongroup.tsx b/frontend/react/src/ui/components/olbuttongroup.tsx new file mode 100644 index 00000000..9a7d7976 --- /dev/null +++ b/frontend/react/src/ui/components/olbuttongroup.tsx @@ -0,0 +1,39 @@ +import { IconProp } from "@fortawesome/fontawesome-svg-core"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React from "react"; + +export function OlButtonGroup(props: { + children?: JSX.Element | JSX.Element[]; +}) { + return ( +
{props.children}
+ ); +} + +export function OlButtonGroupItem(props: { + icon: IconProp; + active: boolean; + onClick: () => void; +}) { + return ( + + ); +} diff --git a/frontend/react/src/ui/components/olcallout.tsx b/frontend/react/src/ui/components/olcallout.tsx new file mode 100644 index 00000000..be1d9f94 --- /dev/null +++ b/frontend/react/src/ui/components/olcallout.tsx @@ -0,0 +1,116 @@ +import React from "react"; +import { + faSkull, + faCamera, + faFlag, + faLink, + faUnlink, + faAngleDoubleRight, + faExclamationCircle, + faInfoCircle, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +// Error message callout, only to be used for error messages +export function ErrorCallout(props: { title?: string; description?: string }) { + return ( +
+ {props.title && ( + + )} +
+ {props.title} +
+ {props.description} +
+
+
+ ); +} + +// General information callout for something that is just nice to know +export function InfoCallout(props: { title?: string; description?: string }) { + return ( +
+ {props.title && ( + + )} +
+ {props.title} + {props.description && ( +
+ {props.description} +
+ )} +
+
+ ); +} + +// Used for the "You are playing as BLUE/RED Commander" callouts, only on the login page. Accepted values for coalition are 'blue' and 'red'. +export function CommandCallout(props: { coalition?: string }) { + return ( +
+ +
+ You are playing as + {props.coalition == "blue" ? ( +
+ {" "} + BLUE COMMANDER{" "} +
+ ) : ( +
+ {" "} + RED COMMANDER{" "} +
+ )} +
+
+ ); +} diff --git a/frontend/react/src/ui/components/olcheckbox.tsx b/frontend/react/src/ui/components/olcheckbox.tsx new file mode 100644 index 00000000..58d40b1d --- /dev/null +++ b/frontend/react/src/ui/components/olcheckbox.tsx @@ -0,0 +1,22 @@ +import React, { ChangeEvent } from "react"; + +export function OlCheckbox(props: { + checked: boolean; + onChange: (e: ChangeEvent) => void; +}) { + return ( + + ); +} diff --git a/frontend/react/src/ui/components/olcoalitiontoggle.tsx b/frontend/react/src/ui/components/olcoalitiontoggle.tsx new file mode 100644 index 00000000..ff5d1477 --- /dev/null +++ b/frontend/react/src/ui/components/olcoalitiontoggle.tsx @@ -0,0 +1,48 @@ +import React from "react"; +import { Coalition } from "../../types/types"; + +export function OlCoalitionToggle(props: { + coalition: Coalition | undefined; + onClick: () => void; +}) { + return ( +
+
+ ); +} diff --git a/frontend/react/src/ui/components/oldropdown.tsx b/frontend/react/src/ui/components/oldropdown.tsx new file mode 100644 index 00000000..defd78ba --- /dev/null +++ b/frontend/react/src/ui/components/oldropdown.tsx @@ -0,0 +1,178 @@ +import React, { useState, useEffect, useRef } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { IconProp } from "@fortawesome/fontawesome-svg-core"; + +export function OlDropdown(props: { + className: string; + leftIcon?: IconProp; + rightIcon?: IconProp; + label: string; + children?: JSX.Element | JSX.Element[]; +}) { + var [open, setOpen] = useState(false); + var contentRef = useRef(null); + var buttonRef = useRef(null); + + function setPosition(content: HTMLDivElement, button: HTMLButtonElement) { + /* Reset the position of the content */ + content.style.left = "0px"; + content.style.top = "0px"; + content.style.height = ""; + + /* Get the position and size of the button */ + var [bxl, byt, bxr, byb, bw, bh] = [ + button.getBoundingClientRect().x, + button.getBoundingClientRect().y, + button.getBoundingClientRect().x + button.clientWidth, + button.getBoundingClientRect().y + button.clientHeight, + button.clientWidth, + button.clientHeight, + ]; + + /* Set the minimum and maximum width to be equal to the button width */ + content.style.minWidth = `${bw}px`; + content.style.maxWidth = `${bw}px`; + + /* Get the position and size of the content element */ + var [cxl, cyt, cxr, cyb, cw, ch] = [ + content.getBoundingClientRect().x, + content.getBoundingClientRect().y, + content.getBoundingClientRect().x + content.clientWidth, + content.getBoundingClientRect().y + content.clientHeight, + content.clientWidth, + content.clientHeight, + ]; + + /* Limit the maximum height */ + if (ch > 400) { + ch = 400; + content.style.height = `${ch}px`; + } + + /* Compute the horizontal position of the center of the button and the content */ + var cxc = (cxl + cxr) / 2; + var bxc = (bxl + bxr) / 2; + + /* Compute the x and y offsets needed to align the button and element horizontally, and to put the content below the button */ + var offsetX = bxc - cxc; + var offsetY = byb - cyt + 8; + + /* Compute the new position of the left and right margins of the content */ + cxl += offsetX; + cxr += offsetX; + cyb += offsetY; + + /* Try and move the content so it is inside the screen */ + if (cxl < 0) offsetX -= cxl; + if (cxr > window.innerWidth) offsetX -= cxr - window.innerWidth; + if (cyb > window.innerHeight) offsetY -= bh + ch + 16; + + /* Apply the offset */ + content.style.left = `${offsetX}px`; + content.style.top = `${offsetY}px`; + } + + useEffect(() => { + if (contentRef.current && buttonRef.current) { + const content = contentRef.current as HTMLDivElement; + const button = buttonRef.current as HTMLButtonElement; + + setPosition(content, button); + + /* Register click events to automatically close the dropdown when clicked anywhere outside of it */ + document.addEventListener("click", function (event) { + const target = event.target; + if ( + target && + /*!content.contains(target as HTMLElement) &&*/ !button.contains( + target as HTMLElement + ) + ) { + setOpen(false); + } + }); + } + }); + + return ( +
+ + +
+
+ {props.children} +
+
+
+ ); +} + +/* Conveniency Component for dropdown elements */ +export function OlDropdownItem(props) { + return ( + + ); +} diff --git a/frontend/react/src/ui/components/olicons.tsx b/frontend/react/src/ui/components/olicons.tsx new file mode 100644 index 00000000..02d5766a --- /dev/null +++ b/frontend/react/src/ui/components/olicons.tsx @@ -0,0 +1,1688 @@ +import { + IconDefinition, + IconName, + IconPrefix, +} from "@fortawesome/fontawesome-svg-core"; +export const olButtonsCameraLinked: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 14.718784,8.2555996 C 16.190649999999998,6.7837308 16.190649999999998,4.4000862000000005 14.718784,2.9282205 C 13.416246,1.6256822 11.363445,1.4563517 9.8655269,2.5270381 L 9.8238459,2.5556831 C 9.4487143,2.8240079 9.3627479,3.3450208 9.63107,3.7175489 C 9.8993936,4.0900739 10.420406999999999,4.1786481 10.792933999999999,3.9103237 L 10.834623999999998,3.8816787 C 11.670853999999999,3.2851159 12.814483999999998,3.3788969 13.538693999999998,4.1057125 C 14.359291999999998,4.9263121000000005 14.359291999999998,6.2549 13.538693999999998,7.0754996000000006 L 10.615800999999998,10.003604000000001 C 9.795200599999998,10.824204000000002 8.466612799999996,10.824204000000002 7.646012999999998,10.003604000000001 C 6.9191889,9.2767887 6.8254045,8.1331608 7.4219671,7.2995366 L 7.4506141,7.2578546 C 7.7189395,6.8827242 7.630369,6.3617082 7.2578404,6.0959918 C 6.8853158,5.8302724 6.3616949,5.9162417 6.0959777,6.2887668 L 6.067330699999999,6.3304488 C 4.9940392,7.8257624 5.1633693,9.8785611 6.4659076,11.1811 C 7.9377770000000005,12.652969 10.321421,12.652969 11.793287,11.1811 L 14.718784,8.2555996 M 1.1828078,7.6460126 C -0.2890582800000001,9.1178785 -0.2890582800000001,11.501522999999999 1.1828078,12.973391 C 2.4853463,14.275929999999999 4.5381477,14.44526 6.0360657,13.374573 L 6.0777467,13.345922999999999 C 6.4528799,13.077605 6.5388455,12.556589 6.2705243,12.184063 C 6.0021998,11.811539 5.481187,11.722964 5.1086592,11.991289 L 5.0669782,12.019939 C 4.230752000000001,12.616501000000001 3.0871208,12.522717 2.3629103000000002,11.795901 C 1.5423106000000002,10.972696000000001 1.5423106000000002,9.6441089 2.3629103000000002,8.8235091 L 5.2858059,5.8980077 C 6.1064055999999995,5.0774111 7.4349934,5.0774111 8.2555932,5.8980077 C 8.9824085,6.6248233 9.0761929,7.7684541 8.4796304,8.604683399999999 L 8.450982,8.6463657 C 8.1826613,9.0214958 8.2712326,9.5425118 8.643758,9.8082277 C 9.0162857,10.073945 9.5399067,9.9879784 9.805623,9.6154532 L 9.83427,9.5737712 C 10.907561,8.0758525 10.73823,6.0230540999999995 9.4356923,4.720515699999999 C 7.963823699999999,3.248646799999999 5.5801791,3.248646799999999 4.108310599999999,4.720515699999999 L 1.1828078,7.6460126 ", + ], + iconName: "olympus-buttons-camera-linked" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsContextMissOnPurpose: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 12.943532,6.8396047 C 12.906571999999999,6.7524067 12.820846,6.6962347 12.726258,6.6962347 C 12.631658,6.6962347 12.545933999999999,6.7524067 12.508982,6.8396047 L 11.857156,8.3605312 C 11.806899,8.4787725 11.7803,8.6044105 11.7803,8.7330024 L 11.7803,9.8711105 L 9.6518899,11.112684 L 9.6518899,10.834807 C 9.6518899,10.638226 9.4937333,10.480072999999999 9.297155700000001,10.480072999999999 C 9.100572900000001,10.480072999999999 8.942419800000001,10.638228999999999 8.942419800000001,10.834807 L 8.942419800000001,11.662524 L 8.942419800000001,12.135503 L 8.942419800000001,12.490238 C 8.942419800000001,12.686819 9.100576300000002,12.844973 9.297155700000001,12.844973 C 9.4937368,12.844973 9.6518899,12.686816 9.6518899,12.490238 L 9.6518899,12.371997 L 11.7803,12.371997 L 11.7803,12.855323 L 10.915634,13.613568 C 10.863904000000002,13.657908 10.834334,13.722955 10.834334,13.790937000000001 L 10.834334,14.027427000000001 C 10.834334,14.157497000000001 10.940763,14.263916000000002 11.070823,14.263916000000002 L 12.489763,14.263916000000002 L 12.489763,13.317957000000002 C 12.489763,13.187886000000002 12.596192,13.081467000000002 12.726254,13.081467000000002 C 12.856325,13.081467000000002 12.962744,13.187896000000002 12.962744,13.317957000000002 L 12.962744,14.263916000000002 L 14.381684,14.263916000000002 C 14.511754999999999,14.263916000000002 14.618174,14.157487000000001 14.618174,14.027427000000001 L 14.618174,13.790937000000001 C 14.618174,13.722957000000001 14.588614,13.657909000000002 14.536874,13.613568 L 13.672208,12.855323 L 13.672208,12.371997 L 15.800618,12.371997 L 15.800618,12.490238 C 15.800618,12.686819 15.958775,12.844973 16.155352,12.844973 C 16.351935,12.844973 16.510088,12.686816 16.510088,12.490238 L 16.510088,12.135503 L 16.510088,11.662524 L 16.510088,10.834807 C 16.510088,10.638226 16.351931999999998,10.480072999999999 16.155352,10.480072999999999 C 15.958771,10.480072999999999 15.800618,10.638228999999999 15.800618,10.834807 L 15.800618,11.112684 L 13.672207,9.8711105 L 13.672207,8.7330024 C 13.672207,8.604419 13.645607,8.4787759 13.595347,8.3605312 L 12.943532,6.8396047 M 7.5302695,0.56363819 C 7.8731864,0.56363819 8.1502321,0.84068389 8.1502321,1.1836006000000001 L 8.1502321,1.3850885000000002 C 9.965560100000001,1.6543846000000002 11.399224,3.0899854 11.668519,4.9033755 L 11.870008,4.9033755 C 12.212923,4.9033755 12.489968000000001,5.1804212000000005 12.489968000000001,5.5233381 C 12.489968000000001,5.8662549 12.212923000000002,6.1433006 11.870008,6.1433006 L 11.668519,6.1433006 C 11.399224,7.9586287 9.9636216,9.3922904 8.1502321,9.6615873 L 8.1502321,9.863074500000002 C 8.1502321,10.205991000000001 7.8731864,10.483037000000001 7.5302695,10.483037000000001 C 7.1873526000000005,10.483037000000001 6.9103069,10.205991000000001 6.9103069,9.863074500000002 L 6.9103069,9.6615873 C 5.0949795,9.3922904 3.6613162,7.9586287 3.3920201,6.1433006 L 3.1905322,6.1433006 C 2.8476155,6.1433006 2.5705698,5.8662548999999995 2.5705698,5.5233381 C 2.5705698,5.1804212000000005 2.8476155,4.9033755 3.1905322,4.9033755 L 3.3920201,4.9033755 C 3.6613162,3.0880479 5.0949795,1.6543846 6.9103069,1.3850885 L 6.9103069,1.1836006 C 6.9103069,0.8406838899999999 7.1873526000000005,0.5636381899999999 7.5302695,0.5636381899999999 L 7.5302695,0.56363819 M 4.6513189,6.1433006 C 4.893491699999999,7.2727949 5.7827511,8.1601158 6.9103069,8.4022891 L 6.9103069,8.0031884 C 6.9103069,7.660271500000001 7.1873526000000005,7.383225800000001 7.5302695,7.383225800000001 C 7.8731864,7.383225800000001 8.1502321,7.660271500000001 8.1502321,8.0031884 L 8.1502321,8.4022891 C 9.2797263,8.1601158 10.167047,7.2708564 10.409221,6.1433006 L 10.01012,6.1433006 C 9.667202900000001,6.1433006 9.3901572,5.8662548999999995 9.3901572,5.5233381 C 9.3901572,5.1804212000000005 9.667202900000001,4.9033755 10.01012,4.9033755 L 10.409221,4.9033755 C 10.167047,3.7738812 9.2797263,2.8865601 8.1502321,2.6443873 L 8.1502321,3.0434882 C 8.1502321,3.3864046 7.8731864,3.6634503 7.5302695,3.6634503 C 7.1873526000000005,3.6634503 6.9103069,3.3864046 6.9103069,3.0434882 L 6.9103069,2.6443873 C 5.7808126,2.8865601 4.8934917,3.7738812 4.6513189,4.9033755 L 5.0504196,4.9033755 C 5.393336,4.9033755 5.6703817,5.1804212000000005 5.6703817,5.5233381 C 5.6703817,5.8662549 5.393336,6.1433006 5.0504196,6.1433006 L 4.6513189,6.1433006 M 7.5302695,4.9033755 A 0.61996259,0.61996259 0.0 1,1 7.5302695,6.1433006 A 0.61996259,0.61996259 0.0 1,1 7.5302695,4.9033755 ", + ], + iconName: "olympus-buttons-context-miss-on-purpose" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsContextScenicAaa: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 11.193211,6.498903 C 11.156611,6.41251 11.071674999999999,6.3568675 10.977962,6.3568675 C 10.884252,6.3568675 10.79932,6.4125125 10.762712,6.498903 L 10.116965,8.0056482 C 10.067175,8.122790799999999 10.040825,8.2472545 10.040825,8.374647099999999 L 10.040825,9.5021428 L 7.9322576,10.732138 L 7.9322576,10.456854000000002 C 7.9322576,10.262105000000002 7.77558,10.105427000000002 7.5808308,10.105427000000002 C 7.3860815,10.105427000000002 7.2294032,10.262105000000002 7.2294032,10.456854000000002 L 7.2294032,11.276852000000002 L 7.2294032,11.745421000000002 L 7.2294032,12.096849000000002 C 7.2294032,12.291597000000003 7.3860815,12.448276000000002 7.5808308,12.448276000000002 C 7.775580000000001,12.448276000000002 7.9322576,12.291597000000001 7.9322576,12.096849000000002 L 7.9322576,11.979706000000002 L 10.040822,11.979706000000002 L 10.040822,12.458526000000003 L 9.184218,13.209701000000003 C 9.132968,13.253631000000002 9.103688,13.318055000000003 9.103688,13.385415000000002 L 9.103688,13.6197 C 9.103688,13.748557 9.209116,13.853985 9.337973,13.853985 L 10.743682,13.853985 L 10.743682,12.916845 C 10.743682,12.787989 10.849113,12.68256 10.977967,12.68256 C 11.106823,12.68256 11.212251,12.787991 11.212251,12.916845 L 11.212251,13.853985 L 12.617962,13.853985 C 12.746819,13.853985 12.852246000000001,13.748555 12.852246000000001,13.6197 L 12.852246000000001,13.385415 C 12.852246000000001,13.318055 12.822966000000001,13.25363 12.771716000000001,13.209701 L 11.915109000000001,12.458526 L 11.915109000000001,11.979706 L 14.023673,11.979706 L 14.023673,12.096849 C 14.023673,12.291599000000001 14.180352000000001,12.448277000000001 14.3751,12.448277000000001 C 14.56985,12.448277000000001 14.726528,12.291599000000001 14.726528,12.096849 L 14.726528,11.745421 L 14.726528,11.276852 L 14.726528,10.456854 C 14.726528,10.262105 14.56985,10.105427 14.3751,10.105427 C 14.180352,10.105427 14.023673,10.262105 14.023673,10.456854 L 14.023673,10.732137999999999 L 11.915102,9.5021428 L 11.915102,8.3746471 C 11.915102,8.2472545 11.888732,8.1227903 11.838961999999999,8.005648200000001 L 11.193211,6.498903 M 5.375668,1.2470443 C 5.30062,1.1962303 5.2005546,1.2056133 5.1364508,1.2689323 C 5.0723498,1.3322513 5.0629648,1.4331009 5.1145628,1.5073675 L 5.9901294,2.7839753 L 5.2115006,3.0372652999999996 C 5.1341066,3.0622822999999997 5.0817284,3.1342022999999997 5.0817284,3.2155051999999995 C 5.0817284,3.2968081999999996 5.1341064,3.3687296999999994 5.2115006,3.3937458999999994 L 6.0174912,3.6548524 L 5.6039425,4.4412997 C 5.5656405,4.5140027 5.5789265,4.603123 5.637560499999999,4.6609731 C 5.696195499999999,4.718825099999999 5.784530599999999,4.732894099999999 5.857234699999999,4.694591099999999 L 6.6436816,4.2810428 L 6.9047879,5.0870331 C 6.9298049,5.1644281 7.001724899999999,5.2168053 7.083028499999999,5.2168053 C 7.164331499999999,5.2168053 7.236252899999999,5.1644273 7.261269099999999,5.0870331 L 7.522375099999999,4.2810424000000005 L 8.3088223,4.6945911 C 8.3815253,4.7328931 8.470645699999999,4.7196071 8.528495699999999,4.6609731000000005 C 8.586348699999999,4.602338100000001 8.600416699999998,4.514003000000001 8.5621137,4.441299600000001 L 8.1485644,3.6548524 L 8.9545554,3.3937462 C 9.0319494,3.3687302 9.0843269,3.2968081999999996 9.0843269,3.2155055 C 9.0843269,3.1342035 9.0319479,3.0622819 8.9545554,3.0372656 L 8.1219841,2.767559 L 8.3228958,2.2172025 C 8.347912,2.1484097 8.3307157,2.0717956 8.2791193,2.0202001 C 8.2275229,1.9686037 8.1509111,1.9514074 8.0821168,1.9764236 L 7.5317596,2.1773344 L 7.2612725,1.3439827 C 7.236256,1.2665882 7.1643354,1.2142105 7.0830319,1.2142105 C 7.0017289,1.2142105 6.9298073,1.2665885000000001 6.9047911,1.3439827000000002 L 6.6522839,2.1226115 L 5.375668,1.2470443 M 0.9232391,10.130493 C 0.8481911,10.079683 0.7481257,10.089063 0.6840219,10.152383 C 0.6199209,10.215703 0.6105358999999999,10.316551 0.6621338999999999,10.390818000000001 L 1.5377005,11.667426 L 0.7590716999999999,11.920716 C 0.6816776999999999,11.945736 0.6292994999999999,12.017656 0.6292994999999999,12.098955 C 0.6292994999999999,12.180255 0.6816774999999999,12.252180000000001 0.7590716999999999,12.277196 L 1.5650623,12.538302999999999 L 1.1515136,13.32475 C 1.1132115999999999,13.39745 1.1264976,13.486573 1.1851315999999998,13.544423 C 1.2437665999999998,13.602273 1.3321017,13.616343 1.4048057999999999,13.578043000000001 L 2.1912526999999997,13.164493 L 2.4523589999999995,13.970483 C 2.4773759999999996,14.047883 2.5492959999999996,14.100256 2.6305995999999996,14.100256 C 2.7119025999999997,14.100256 2.7838239999999996,14.047876 2.8088401999999997,13.970483 L 3.0699461999999995,13.164493 L 3.8563933999999995,13.578041 C 3.9290963999999997,13.616341 4.018216799999999,13.603061 4.0760667999999995,13.544421 C 4.133919799999999,13.485790999999999 4.147987799999999,13.397451 4.109684799999999,13.324748 L 3.696135499999999,12.538302999999999 L 4.502126499999999,12.277197 C 4.579520499999999,12.252177 4.631898,12.180257 4.631898,12.098956 C 4.631898,12.017655999999999 4.5795189999999995,11.945732 4.502126499999999,11.920715999999999 L 3.6695552,11.651007 L 3.8704669,11.100651 C 3.8954828999999997,11.031861 3.8782869,10.955243999999999 3.8266909,10.903647999999999 C 3.7750949,10.852047999999998 3.6984827,10.834857999999999 3.6296884,10.859867999999999 L 3.0793307,11.060783 L 2.8088436,10.227431 C 2.7838266,10.150041 2.7119066,10.097659 2.630603,10.097659 C 2.5492999999999997,10.097659 2.4773783999999996,10.150039 2.4523621999999996,10.227431 L 2.199855,11.00606 L 0.9232391,10.130493 M 3.8607391,5.442993 C 3.7856911,5.392183 3.6856257,5.401563 3.6215219,5.464883 C 3.5574209,5.528203 3.5480359,5.6290510000000005 3.5996338999999997,5.703318 L 4.4752005,6.979926000000001 L 3.6965717,7.2332160000000005 C 3.6191777,7.258236 3.5667994999999997,7.330156000000001 3.5667994999999997,7.411455 C 3.5667994999999997,7.492755 3.6191774999999997,7.56468 3.6965717,7.589696 L 4.5025623,7.850803 L 4.0890136,8.63725 C 4.0507116000000005,8.70995 4.0639976,8.799073 4.1226316,8.856923 C 4.1812666,8.914773 4.2696017,8.928843 4.3423058,8.890543000000001 L 5.1287527,8.476993 L 5.3898589999999995,9.282983 C 5.414876,9.360383 5.486795999999999,9.412756 5.568099599999999,9.412756 C 5.649402599999999,9.412756 5.721323999999999,9.360376 5.746340199999999,9.282983 L 6.007446199999999,8.476993 L 6.793893399999998,8.890541 C 6.866596399999998,8.928841 6.9557167999999985,8.915561 7.013566799999998,8.856921 C 7.0714197999999975,8.798290999999999 7.0854877999999974,8.709951 7.0471847999999975,8.637248 L 6.6336355,7.850803 L 7.4396265,7.589697 C 7.5170205,7.5646770000000005 7.5693980000000005,7.492757 7.5693980000000005,7.411456 C 7.5693980000000005,7.330156000000001 7.517019,7.2582320000000005 7.4396265,7.2332160000000005 L 6.6070552,6.963507 L 6.8079669,6.413151 C 6.8329829,6.344361 6.8157869,6.267744 6.7641909,6.216148 C 6.7125949,6.164548 6.6359827,6.147358 6.5671884,6.172368 L 6.0168307,6.373283 L 5.7463436,5.539931 C 5.7213266,5.462541 5.6494066,5.410159 5.568103,5.410159 C 5.4868,5.410159 5.4148784,5.4625390000000005 5.3898622,5.539931 L 5.137355,6.31856 L 3.8607391,5.442993 M 13.173239,2.1617426 C 13.098189000000001,2.1109286000000003 12.998126000000001,2.1203116 12.934022,2.1836306000000003 C 12.869922,2.2469496 12.860532000000001,2.3477992000000003 12.912132,2.4220658000000004 L 13.787697999999999,3.6986736000000002 L 13.00907,3.9519636 C 12.93168,3.9769806 12.879297,4.0489006 12.879297,4.1302035 C 12.879297,4.2115065000000005 12.931676999999999,4.283428000000001 13.00907,4.3084442 L 13.815059999999999,4.569550700000001 L 13.401511,5.3559980000000005 C 13.363211,5.428701 13.376491,5.5178213000000005 13.435131,5.5756714 C 13.493771,5.6335234 13.582102,5.6475924 13.654806,5.6092894 L 14.441253000000001,5.195741099999999 L 14.702359000000001,6.0017314 C 14.727379,6.0791264 14.799299000000001,6.131503599999999 14.880599000000002,6.131503599999999 C 14.961899000000003,6.131503599999999 15.033824000000003,6.079125599999999 15.058840000000002,6.0017314 L 15.319946000000002,5.1957407 L 16.106393,5.6092894 C 16.179093,5.6475914 16.268217,5.6343054 16.326067000000002,5.5756714 C 16.383917,5.5170364 16.397987,5.4287013 16.359687,5.3559979 L 15.946137,4.569550700000001 L 16.752128,4.3084445 C 16.829518,4.2834285 16.881899999999998,4.2115065000000005 16.881899999999998,4.1302038 C 16.881899999999998,4.0489018 16.82952,3.9769802000000003 16.752128,3.9519639000000004 L 15.919555,3.6822573 L 16.120467,3.1319008 C 16.145487000000003,3.0631078 16.128267,2.9864939 16.076687,2.9348984 C 16.025087,2.8833024 15.948478999999999,2.8661054 15.879685,2.8911224 L 15.329331,3.0920327 L 15.058843,2.258681 C 15.033823,2.181286 14.961903,2.1289088 14.880602999999999,2.1289088 C 14.799302999999998,2.1289088 14.727377999999998,2.1812868 14.702361999999999,2.258681 L 14.449855,3.0373098 L 13.173239,2.1617426 ", + ], + iconName: "olympus-buttons-context-scenic-aaa" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsContextSimulateFireFight: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 7.2492654,5.8221874 C 7.8660011999999995,5.8221874 8.4584561,5.9945821 8.9683555,6.305378 L 8.9683555,13.59209 L 4.3064157,13.59209 L 4.3064157,9.3599202 L 3.0049573,11.559776 C 2.7330108,12.021113 2.1356998,12.174082 1.6743618,11.902135 C 1.2130242,11.630189 1.060054,11.032878 1.3320006,10.571539 L 3.1822081,7.4441541 C 3.7770914,6.4389231 4.857593,5.8221874 6.0255062,5.8221874 L 7.2492654,5.8221874 M 4.6949108,3.1027222 C 4.6944571999999996,0.5123030700000002 8.5794073,0.5123030700000002 8.579860799999999,3.1027222 C 8.580314699999999,5.6931415 4.695364399999999,5.6931415 4.694910799999999,3.1027222 L 4.6949108,3.1027222 M 18.380988,10.005352 C 18.380988,10.219024000000001 18.206167999999998,10.393847000000001 17.992494999999998,10.393847000000001 L 15.168622,10.393847000000001 C 15.035079999999999,10.626944000000002 14.782554,10.782342000000002 14.496037999999999,10.782342000000002 L 11.842132,10.782342000000002 L 11.970820999999999,11.170836000000001 L 13.330554,11.170836000000001 C 13.544226,11.170836000000001 13.719049,11.34566 13.719049,11.559335 L 13.719049,11.947829 C 13.719049,12.161502 13.544226,12.336326 13.330554,12.336326 L 11.278815999999999,12.336326 C 11.111275999999998,12.336326 10.963163,12.229491 10.909745999999998,12.071662 L 10.4824,10.782342 L 9.8340985,10.782342 L 9.8340985,11.947829 C 9.8340985,12.161502 9.6592755,12.336326 9.445603499999999,12.336326 L 9.057108499999998,12.336326 C 8.843436099999998,12.336326 8.668613299999999,12.161502 8.668613299999999,11.947829 L 8.668613299999999,10.879466 L 6.432339,11.437928 C 6.1871018,11.49863 5.9491484,11.314095 5.9491484,11.061573 L 5.9491484,9.6168567 C 5.9491484,9.4031845 6.1239711,9.2283618 6.3376431,9.2283618 L 8.6686133,9.2283618 L 8.6686133,8.839867 C 8.6686133,8.4100941 9.0158305,8.0628769 9.4456035,8.0628769 L 12.942059,8.0628769 C 13.371832000000001,8.0628769 13.719049,8.410094099999998 13.719049,8.839867 L 14.496038,8.839867 C 14.782554000000001,8.839867 15.035076,8.9952646 15.168622000000001,9.2283618 L 17.604,9.2283618 C 17.604,9.0146897 17.778823,8.839867 17.992494999999998,8.839867 C 18.206167999999998,8.839867 18.380988,9.0146897 18.380988,9.2283618 L 18.380988,9.6168567 L 18.380988,10.005352 ", + ], + iconName: "olympus-buttons-context-simulate-fire-fight" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsEmissionsAttack: IconDefinition = { + icon: [ + 15.0, + 15.0, + [], + "", + "M 7.5000002,0.0 C 7.9980002,0.0 8.437500199999999,0.4395 8.437500199999999,0.9375 L 8.437500199999999,1.2598 C 11.1621,1.6699 13.3301,3.8379002 13.7402,6.5625002 L 14.0625,6.5625002 C 14.5605,6.5625002 15.0,7.0020001999999995 15.0,7.5000002 C 15.0,8.027300199999999 14.5605,8.437500199999999 14.0625,8.437500199999999 L 13.7402,8.437500199999999 C 13.3301,11.1914 11.1621,13.3594 8.4375002,13.7695 L 8.4375002,14.0625 C 8.4375002,14.5898 7.998000200000001,15.0 7.500000200000001,15.0 C 6.9727002,15.0 6.562500200000001,14.5898 6.562500200000001,14.0625 L 6.562500200000001,13.7695 C 3.8086002,13.3594 1.6406,11.1914 1.2305,8.4375002 L 0.9375,8.4375002 C 0.4102,8.4375002 0.0,8.0273002 0.0,7.500000200000001 C 0.0,7.0020002 0.4102,6.562500200000001 0.9375,6.562500200000001 L 1.2305,6.562500200000001 C 1.6406,3.8379002 3.8086002,1.6699 6.5625002,1.2598 L 6.5625002,0.9375 C 6.5625002,0.4395 6.972700199999999,0.0 7.5000002,0.0 M 3.1348002,8.4375002 C 3.4863002,10.166 4.8340002,11.5137 6.562500200000001,11.865200000000002 L 6.562500200000001,11.25 C 6.562500200000001,10.752 6.9727002,10.3125 7.500000200000001,10.3125 C 7.998000200000001,10.3125 8.4375002,10.752 8.4375002,11.25 L 8.4375002,11.8652 C 10.1367,11.5137 11.4844,10.166 11.8359,8.4375002 L 11.25,8.4375002 C 10.7227,8.4375002 10.3125,8.0273002 10.3125,7.500000200000001 C 10.3125,7.0020002 10.7227,6.562500200000001 11.25,6.562500200000001 L 11.8359,6.562500200000001 C 11.4844,4.8633002 10.136700000000001,3.5156002000000006 8.4375002,3.1641002000000005 L 8.4375002,3.7500002000000006 C 8.4375002,4.277300200000001 7.998000200000001,4.687500200000001 7.500000200000001,4.687500200000001 C 6.9727002,4.687500200000001 6.562500200000001,4.277300200000001 6.562500200000001,3.7500002000000006 L 6.562500200000001,3.1641002000000005 C 4.8340002,3.5156002000000006 3.4863002000000005,4.8633002 3.1348002000000004,6.562500200000001 L 3.7500002000000006,6.562500200000001 C 4.248000200000001,6.562500200000001 4.687500200000001,7.0020002 4.687500200000001,7.500000200000001 C 4.687500200000001,8.0273002 4.248000200000001,8.4375002 3.7500002000000006,8.4375002 L 3.1348002,8.4375002 M 7.5000002,8.4375002 C 6.972700199999999,8.4375002 6.5625002,8.0273002 6.5625002,7.500000200000001 C 6.5625002,7.0020002 6.972700199999999,6.562500200000001 7.5000002,6.562500200000001 C 7.9980002,6.562500200000001 8.437500199999999,7.0020002 8.437500199999999,7.500000200000001 C 8.437500199999999,8.0273002 7.998000199999999,8.4375002 7.500000199999999,8.4375002 L 7.5000002,8.4375002 ", + ], + iconName: "olympus-buttons-emissions-attack" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsEmissionsDefend: IconDefinition = { + icon: [ + 14.063629, + 14.9414, + [], + "", + "M 7.0324294,0.0 C 7.1496294,0.0 7.2961294,0.0293 7.4133294,0.0879 L 12.921129,2.4316 C 13.565629000000001,2.7246 14.063629,3.3398 14.063629,4.1015999999999995 C 14.034429000000001,7.0312 12.833229000000001,12.334 7.794129400000001,14.7656 C 7.296129400000001,15.0 6.739429400000001,15.0 6.241429400000001,14.7656 C 1.2023294000000009,12.334 0.0012293600000008453,7.031199999999999 0.0012293600000008453,4.1015999999999995 C -0.028070639999999154,3.3397999999999994 0.46992936000000085,2.7245999999999997 1.1144294000000008,2.4315999999999995 L 6.6222294,0.08789999999999942 C 6.7394294,0.0293 6.8859294,0.0 7.0324294,0.0 M 7.0324294,1.9629 L 7.0324294,13.0371 C 11.075429,11.0742 12.159429,6.7676 12.188629,4.1602 L 7.0324294,1.9629 ", + ], + iconName: "olympus-buttons-emissions-defend" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsEmissionsFree: IconDefinition = { + icon: [ + 13.126647, + 15.015483, + [], + "", + "M 10.796771,3.75 C 10.796771,5.06836 10.034970999999999,6.21094 8.9217214,6.88476 L 8.9217214,7.50001 C 8.9217214,8.02731 8.482271399999998,8.43751 7.984221399999999,8.43751 L 5.171721399999999,8.43751 C 4.644381399999999,8.43751 4.234221399999999,8.02731 4.234221399999999,7.50001 L 4.234221399999999,6.88476 C 3.0916413999999994,6.21094 2.359221399999999,5.06836 2.359221399999999,3.75 C 2.359221399999999,1.69922 4.234221399999999,0.0 6.577971399999999,0.0 C 8.8924214,0.0 10.796771,1.69922 10.796771,3.75 M 4.9373514,5.15625 C 5.435391399999999,5.15625 5.8748514,4.74609 5.8748514,4.21875 C 5.8748514,3.7207 5.435391399999999,3.28125 4.9373514,3.28125 C 4.4100014,3.28125 3.9998514,3.7207 3.9998514,4.21875 C 3.9998514,4.74609 4.4100014,5.15625 4.9373514,5.15625 M 9.1560714,4.21875 C 9.1560714,3.7207 8.7166414,3.28125 8.2185914,3.28125 C 7.6912514,3.28125 7.281091399999999,3.7207 7.281091399999999,4.21875 C 7.281091399999999,4.74609 7.6912514,5.15625 8.2185914,5.15625 C 8.716641399999999,5.15625 9.1560714,4.74609 9.1560714,4.21875 M 0.10336144,8.02731 C 0.33774144,7.55861 0.89438144,7.38281 1.3631314,7.61721 L 6.5779714,10.22461 L 11.763471,7.61721 C 12.232270999999999,7.38281 12.788870999999999,7.55861 13.023271,8.02731 C 13.257671,8.49611 13.081871,9.05271 12.613171,9.28711 L 8.6580514,11.25001 L 12.613171,13.24221 C 13.081871,13.47661 13.257671,14.03321 13.023271,14.50191 C 12.788870999999999,14.97071 12.232270999999999,15.146510000000001 11.763471,14.91211 L 6.577971399999999,12.30471 L 1.3631313999999994,14.91211 C 0.8943814399999994,15.146510000000001 0.3377414399999994,14.97071 0.10336143999999936,14.50191 C -0.13101256000000064,14.03321 0.04476843999999936,13.47661 0.5135214399999994,13.24221 L 4.4685914,11.25001 L 0.51352144,9.28711 C 0.04476844000000002,9.05271 -0.13101256000000006,8.49611 0.10336143999999997,8.02731 L 0.10336144,8.02731 ", + ], + iconName: "olympus-buttons-emissions-free" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsEmissionsSilent: IconDefinition = { + icon: [ + 9.3896503, + 9.3896503, + [], + "", + "M 9.103975,1.603975 C 9.484875,1.252475 9.484875,0.6371749999999999 9.103975,0.2856749999999999 C 8.752475,-0.09522500000000012 8.137175000000001,-0.09522500000000012 7.785675,0.2856749999999999 L 4.709475,3.3617749999999997 L 1.6039750000000002,0.2856749999999999 C 1.2524750000000002,-0.09522500000000012 0.6371750000000002,-0.09522500000000012 0.2856750000000001,0.2856749999999999 C -0.0952249999999999,0.6371749999999998 -0.0952249999999999,1.252475 0.2856750000000001,1.603975 L 3.3617749999999997,4.680175 L 0.2856749999999999,7.785675 C -0.09522500000000012,8.137175000000001 -0.09522500000000012,8.752475 0.2856749999999999,9.103975 C 0.6371749999999998,9.484875 1.252475,9.484875 1.603975,9.103975 L 4.709475,6.027875 L 7.785675,9.103975 C 8.137175000000001,9.484875 8.752475,9.484875 9.103975,9.103975 C 9.484875,8.752475 9.484875,8.137175000000001 9.103975,7.785675 L 6.027875,4.680175 L 9.103975,1.603975 ", + ], + iconName: "olympus-buttons-emissions-silent" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsIntensity1: IconDefinition = { + icon: [ + 15.0, + 15.0, + [], + "", + "M 1.7050781,9.2421875 L 1.3769531,9.5722656 L 1.3769531,13.523437999999999 L 1.7050781,13.853515999999999 L 4.5351562,13.853515999999999 L 4.8652344,13.523438 L 4.8652344,9.5722656 L 4.5351562,9.2421875 L 1.7050781,9.2421875 M 2.0351563,9.9003906 L 4.2070312,9.9003906 L 4.2070312,13.193359 L 2.0351563,13.193359 L 2.0351563,9.9003906 M 1.7056587,9.5718069 L 4.5356138,9.5718069 L 4.5356138,13.523144 L 1.7056587,13.523144 L 1.7056587,9.5718069 M 6.0058594,5.4882812 L 5.6757812,5.8183594 L 5.6757812,13.517578 L 6.0058594,13.845703 L 8.8359375,13.845703 L 9.1640625,13.517578 L 9.1640625,5.8183594 L 8.8359375,5.4882812 L 6.0058594,5.4882812 M 6.3339844,6.1464844 L 8.5058594,6.1464844 L 8.5058594,13.1875 L 6.3339844,13.1875 L 6.3339844,6.1464844 M 10.304688,1.3828125 L 9.9746094,1.7128906 L 9.9746094,13.605469 L 10.304688,13.935547 L 13.134766,13.935547 L 13.464844000000001,13.605469 L 13.464844000000001,1.7128906 L 13.134766,1.3828125 L 10.304688,1.3828125 M 10.634766,2.0429688 L 12.804688,2.0429688 L 12.804688,13.277344 L 10.634766,13.277344 L 10.634766,2.0429688 ", + ], + iconName: "olympus-buttons-intensity-1" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsIntensity2: IconDefinition = { + icon: [ + 15.0, + 15.0, + [], + "", + "M 1.7050781,9.2421875 L 1.3769531,9.5722656 L 1.3769531,13.523437999999999 L 1.7050781,13.853515999999999 L 4.5351562,13.853515999999999 L 4.8652344,13.523438 L 4.8652344,9.5722656 L 4.5351562,9.2421875 L 1.7050781,9.2421875 M 2.0351563,9.9003906 L 4.2070312,9.9003906 L 4.2070312,13.193359 L 2.0351563,13.193359 L 2.0351563,9.9003906 M 1.7056587,9.5718069 L 4.5356138,9.5718069 L 4.5356138,13.523144 L 1.7056587,13.523144 L 1.7056587,9.5718069 M 6.0058594,5.4882812 L 5.6757812,5.8183594 L 5.6757812,13.517578 L 6.0058594,13.845703 L 8.8359375,13.845703 L 9.1640625,13.517578 L 9.1640625,5.8183594 L 8.8359375,5.4882812 L 6.0058594,5.4882812 M 6.3339844,6.1464844 L 8.5058594,6.1464844 L 8.5058594,13.1875 L 6.3339844,13.1875 L 6.3339844,6.1464844 M 6.0053182,5.817802 L 8.835273299999999,5.817802 L 8.835273299999999,13.517145 L 6.0053182,13.517145 L 6.0053182,5.817802 M 10.304688,1.3828125 L 9.9746094,1.7128906 L 9.9746094,13.605469 L 10.304688,13.935547 L 13.134766,13.935547 L 13.464844000000001,13.605469 L 13.464844000000001,1.7128906 L 13.134766,1.3828125 L 10.304688,1.3828125 M 10.634766,2.0429688 L 12.804688,2.0429688 L 12.804688,13.277344 L 10.634766,13.277344 L 10.634766,2.0429688 ", + ], + iconName: "olympus-buttons-intensity-2" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsIntensity3: IconDefinition = { + icon: [ + 15.0, + 15.0, + [], + "", + "M 1.7057,9.5718 L 4.5357,9.5718 L 4.5357,13.5231 L 1.7057,13.5231 L 1.7057,9.5718 M 6.0053,5.8178 L 8.8353,5.8178 L 8.8353,13.5171 L 6.0053,13.5171 L 6.0053,5.8178 M 10.305,1.7128 L 13.135,1.7128 L 13.135,13.6068 L 10.305,13.6068 L 10.305,1.7128 ", + ], + iconName: "olympus-buttons-intensity-3" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsOtherArrowDownSolid: IconDefinition = { + icon: [ + 12.0, + 16.0, + [], + "", + "M 169.4,470.6 C 181.9,483.1 202.2,483.1 214.7,470.6 L 374.7,310.6 C 387.2,298.1 387.2,277.8 374.7,265.3 C 362.2,252.8 341.9,252.8 329.4,265.3 L 224.0,370.8 L 224.0,64.0 C 224.0,46.3 209.7,32.0 192.0,32.0 C 174.3,32.0 160.0,46.3 160.0,64.0 L 160.0,370.7 L 54.6,265.4 C 42.1,252.89999999999998 21.800000000000004,252.89999999999998 9.300000000000004,265.4 C -3.1999999999999957,277.9 -3.1999999999999957,298.2 9.300000000000004,310.7 L 169.3,470.7 L 169.4,470.6 ", + ], + iconName: "olympus-buttons-other-arrow-down-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsOtherBack: IconDefinition = { + icon: [ + 32.0, + 32.0, + [], + "", + "M 29.911273,24.547406 L 2.1935652,24.547406 C 1.2353560000000001,24.547406 0.46120806000000014,25.321551999999997 0.46120806000000014,26.279763 C 0.46120806000000014,27.237970999999998 1.2353560000000001,28.012119 2.1935652,28.012119 L 29.911273,28.012119 C 30.869482,28.012119 31.64363,27.237970999999998 31.64363,26.279763 C 31.64363,25.321552 30.869482,24.547406 29.911273,24.547406 M 22.696072,14.656730999999999 C 22.019370000000002,13.980028999999998 20.920406,13.980028999999998 20.243704,14.656730999999999 L 18.007882000000002,16.897969 L 18.007882000000002,5.4914811 C 18.007882000000002,4.5332718 17.233736,3.7591256 16.275525000000002,3.7591256 C 15.317314000000001,3.7591256 14.543170000000002,4.5332718 14.543170000000002,5.4914811 L 14.543170000000002,16.897969 L 12.301932,14.656731 C 11.62523,13.980029 10.526266000000001,13.980029 9.849564500000001,14.656731 C 9.172864200000001,15.333433000000001 9.172864200000001,16.432397 9.849564500000001,17.109099 L 15.046634000000001,22.306168 C 15.723335,22.98287 16.822302,22.98287 17.499002,22.306168 L 22.696072,17.109099 C 23.372775,16.432397 23.372775,15.333433000000001 22.696072,14.656731 L 22.696072,14.656730999999999 ", + ], + iconName: "olympus-buttons-other-back" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsOtherClockRotateLeftSolid: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 75.0,75.0 L 41.0,41.0 C 25.9,25.9 0.0,36.6 0.0,57.9 L 0.0,168.0 C 0.0,181.3 10.7,192.0 24.0,192.0 L 134.1,192.0 C 155.5,192.0 166.2,166.1 151.1,151.0 L 120.3,120.2 C 155.0,85.5 203.0,64.0 256.0,64.0 C 362.0,64.0 448.0,150.0 448.0,256.0 C 448.0,362.0 362.0,448.0 256.0,448.0 C 215.2,448.0 177.4,435.3 146.3,413.6 C 131.8,403.5 111.9,407.0 101.70000000000002,421.5 C 91.50000000000003,436.0 95.10000000000002,455.9 109.60000000000002,466.1 C 151.2,495.0 201.7,512.0 256.0,512.0 C 397.4,512.0 512.0,397.4 512.0,256.0 C 512.0,114.60000000000002 397.4,0.0 256.0,0.0 C 185.3,0.0 121.3,28.7 75.0,75.0 M 256.0,128.0 C 242.7,128.0 232.0,138.7 232.0,152.0 L 232.0,256.0 C 232.0,262.4 234.5,268.5 239.0,273.0 L 311.0,345.0 C 320.4,354.4 335.6,354.4 344.9,345.0 C 354.19999999999993,335.6 354.29999999999995,320.4 344.9,311.1 L 279.9,246.10000000000002 L 279.9,152.0 C 279.9,138.7 269.2,128.0 255.89999999999998,128.0 L 256.0,128.0 ", + ], + iconName: "olympus-buttons-other-clock-rotate-left-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsOtherDelete: IconDefinition = { + icon: [ + 32.0, + 32.0, + [], + "", + "M 13.120438,4.047182 L 12.000234,5.7215873 L 20.549147,5.7215873 L 19.428943,4.047182 C 19.340506,3.9174745 19.193112,3.8349334 19.033925,3.8349334 L 13.509561,3.8349334 C 13.350375999999999,3.8349334 13.20298,3.9115784000000002 13.114541,4.047182 L 13.120438,4.047182 M 21.787263,2.4788996 L 23.95102,5.7215872999999995 L 24.764643,5.7215872999999995 L 27.594624,5.7215872999999995 L 28.066288,5.7215872999999995 C 28.85043,5.7215872999999995 29.481281,6.3524388 29.481281,7.136580599999999 C 29.481281,7.920722399999999 28.85043,8.5515718 28.066288,8.5515718 L 27.594624,8.5515718 L 27.594624,26.474805 C 27.594624,29.080749 25.483929,31.191443 22.877985,31.191443 L 9.6713954,31.191443 C 7.0654537,31.191443 4.9547552,29.080749 4.9547552,26.474805 L 4.9547552,8.5515718 L 4.4830908,8.5515718 C 3.6989506000000003,8.5515718 3.0681001000000006,7.9207224 3.0681001000000006,7.136580599999999 C 3.0681001000000006,6.3524388 3.6989506000000008,5.7215872999999995 4.4830908,5.7215872999999995 L 4.9547552,5.7215872999999995 L 7.7847397,5.7215872999999995 L 8.5983591,5.7215872999999995 L 10.762118,2.4730039 C 11.375281,1.559155 12.407047,1.0049496 13.509561,1.0049496 L 19.033925,1.0049496 C 20.136439,1.0049496 21.168205,1.5591549 21.781366,2.4730039 L 21.787263,2.4788996 M 7.7847397,8.5515718 L 7.7847397,26.474805 C 7.7847397,27.518362 8.6278386,28.361461 9.6713954,28.361461 L 22.877985,28.361461 C 23.921542,28.361461 24.764643,27.518362 24.764643,26.474805 L 24.764643,8.5515718 L 7.7847397,8.5515718 M 12.501377999999999,12.324888 L 12.501377999999999,24.588149 C 12.501377999999999,25.106979000000003 12.076880999999998,25.531476 11.558050999999999,25.531476 C 11.039221,25.531476 10.614723999999999,25.106979000000003 10.614723999999999,24.588149 L 10.614723999999999,12.324888 C 10.614723999999999,11.806056 11.039221,11.38156 11.558050999999999,11.38156 C 12.076880999999998,11.38156 12.501377999999999,11.806056 12.501377999999999,12.324888 M 17.218018,12.324888 L 17.218018,24.588149 C 17.218018,25.106979000000003 16.793519,25.531476 16.274691,25.531476 C 15.755859000000001,25.531476 15.331363000000001,25.106979000000003 15.331363000000001,24.588149 L 15.331363000000001,12.324888 C 15.331363000000001,11.806056 15.755859000000001,11.38156 16.274691,11.38156 C 16.793519,11.38156 17.218018,11.806056 17.218018,12.324888 M 21.934658,12.324888 L 21.934658,24.588149 C 21.934658,25.106979000000003 21.51016,25.531476 20.991329999999998,25.531476 C 20.472500999999998,25.531476 20.048002999999998,25.106979000000003 20.048002999999998,24.588149 L 20.048002999999998,12.324888 C 20.048002999999998,11.806056 20.472500999999998,11.38156 20.991329999999998,11.38156 C 21.51016,11.38156 21.934658,11.806056 21.934658,12.324888 ", + ], + iconName: "olympus-buttons-other-delete" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsOtherEdit: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 362.7,19.3 L 314.3,67.7 L 444.3,197.7 L 492.7,149.29999999999998 C 517.7,124.29999999999998 517.7,83.79999999999998 492.7,58.79999999999998 L 453.3,19.3 C 428.3,-5.699999999999999 387.8,-5.699999999999999 362.8,19.3 L 362.7,19.3 M 291.7,90.3 L 58.6,323.5 C 48.2,333.9 40.6,346.8 36.400000000000006,360.9 L 1.0,481.2 C -1.5,489.7 0.8,498.8 7.0,505.0 C 13.2,511.2 22.3,513.5 30.7,511.1 L 151.0,475.70000000000005 C 165.1,471.50000000000006 178.0,463.90000000000003 188.4,453.50000000000006 L 421.7,220.3 L 291.7,90.3 ", + ], + iconName: "olympus-buttons-other-edit" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsOtherLockOpenSolid: IconDefinition = { + icon: [ + 576.0, + 512.0, + [], + "", + "M 352.0,144.0 C 352.0,99.8 387.8,64.0 432.0,64.0 C 476.2,64.0 512.0,99.8 512.0,144.0 L 512.0,192.0 C 512.0,209.7 526.3,224.0 544.0,224.0 C 561.7,224.0 576.0,209.7 576.0,192.0 L 576.0,144.0 C 576.0,64.5 511.5,0.0 432.0,0.0 C 352.5,0.0 288.0,64.5 288.0,144.0 L 288.0,192.0 L 64.0,192.0 C 28.700000000000003,192.0 0.0,220.7 0.0,256.0 L 0.0,448.0 C 0.0,483.3 28.7,512.0 64.0,512.0 L 384.0,512.0 C 419.3,512.0 448.0,483.3 448.0,448.0 L 448.0,256.0 C 448.0,220.7 419.3,192.0 384.0,192.0 L 352.0,192.0 L 352.0,144.0 ", + ], + iconName: "olympus-buttons-other-lock-open-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsOtherLockSolid: IconDefinition = { + icon: [ + 448.0, + 512.0, + [], + "", + "M 144.0,144.0 L 144.0,192.0 L 304.0,192.0 L 304.0,144.0 C 304.0,99.8 268.2,64.0 224.0,64.0 C 179.8,64.0 144.0,99.8 144.0,144.0 M 80.0,192.0 L 80.0,144.0 C 80.0,64.5 144.5,0.0 224.0,0.0 C 303.5,0.0 368.0,64.5 368.0,144.0 L 368.0,192.0 L 384.0,192.0 C 419.3,192.0 448.0,220.7 448.0,256.0 L 448.0,448.0 C 448.0,483.3 419.3,512.0 384.0,512.0 L 64.0,512.0 C 28.700000000000003,512.0 0.0,483.3 0.0,448.0 L 0.0,256.0 C 0.0,220.7 28.7,192.0 64.0,192.0 L 80.0,192.0 ", + ], + iconName: "olympus-buttons-other-lock-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsRoeDesignated: IconDefinition = { + icon: [ + 15.0, + 15.0, + [], + "", + "M 7.5000002,0.0 C 7.9980002,0.0 8.437500199999999,0.4395 8.437500199999999,0.9375 L 8.437500199999999,1.2598 C 11.1621,1.6699 13.3301,3.8379002 13.7402,6.5625002 L 14.0625,6.5625002 C 14.5605,6.5625002 15.0,7.0020001999999995 15.0,7.5000002 C 15.0,8.027300199999999 14.5605,8.437500199999999 14.0625,8.437500199999999 L 13.7402,8.437500199999999 C 13.3301,11.1914 11.1621,13.3594 8.4375002,13.7695 L 8.4375002,14.0625 C 8.4375002,14.5898 7.998000200000001,15.0 7.500000200000001,15.0 C 6.9727002,15.0 6.562500200000001,14.5898 6.562500200000001,14.0625 L 6.562500200000001,13.7695 C 3.8086002,13.3594 1.6406,11.1914 1.2305,8.4375002 L 0.9375,8.4375002 C 0.4102,8.4375002 0.0,8.0273002 0.0,7.500000200000001 C 0.0,7.0020002 0.4102,6.562500200000001 0.9375,6.562500200000001 L 1.2305,6.562500200000001 C 1.6406,3.8379002 3.8086002,1.6699 6.5625002,1.2598 L 6.5625002,0.9375 C 6.5625002,0.4395 6.972700199999999,0.0 7.5000002,0.0 M 3.1348002,8.4375002 C 3.4863002,10.166 4.8340002,11.5137 6.562500200000001,11.865200000000002 L 6.562500200000001,11.25 C 6.562500200000001,10.752 6.9727002,10.3125 7.500000200000001,10.3125 C 7.998000200000001,10.3125 8.4375002,10.752 8.4375002,11.25 L 8.4375002,11.8652 C 10.1367,11.5137 11.4844,10.166 11.8359,8.4375002 L 11.25,8.4375002 C 10.7227,8.4375002 10.3125,8.0273002 10.3125,7.500000200000001 C 10.3125,7.0020002 10.7227,6.562500200000001 11.25,6.562500200000001 L 11.8359,6.562500200000001 C 11.4844,4.8633002 10.136700000000001,3.5156002000000006 8.4375002,3.1641002000000005 L 8.4375002,3.7500002000000006 C 8.4375002,4.277300200000001 7.998000200000001,4.687500200000001 7.500000200000001,4.687500200000001 C 6.9727002,4.687500200000001 6.562500200000001,4.277300200000001 6.562500200000001,3.7500002000000006 L 6.562500200000001,3.1641002000000005 C 4.8340002,3.5156002000000006 3.4863002000000005,4.8633002 3.1348002000000004,6.562500200000001 L 3.7500002000000006,6.562500200000001 C 4.248000200000001,6.562500200000001 4.687500200000001,7.0020002 4.687500200000001,7.500000200000001 C 4.687500200000001,8.0273002 4.248000200000001,8.4375002 3.7500002000000006,8.4375002 L 3.1348002,8.4375002 M 7.5000002,8.4375002 C 6.972700199999999,8.4375002 6.5625002,8.0273002 6.5625002,7.500000200000001 C 6.5625002,7.0020002 6.972700199999999,6.562500200000001 7.5000002,6.562500200000001 C 7.9980002,6.562500200000001 8.437500199999999,7.0020002 8.437500199999999,7.500000200000001 C 8.437500199999999,8.0273002 7.998000199999999,8.4375002 7.500000199999999,8.4375002 L 7.5000002,8.4375002 ", + ], + iconName: "olympus-buttons-roe-designated" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsRoeFree: IconDefinition = { + icon: [ + 13.126647, + 15.015483, + [], + "", + "M 10.796771,3.75 C 10.796771,5.06836 10.034970999999999,6.21094 8.9217214,6.88476 L 8.9217214,7.50001 C 8.9217214,8.02731 8.482271399999998,8.43751 7.984221399999999,8.43751 L 5.171721399999999,8.43751 C 4.644381399999999,8.43751 4.234221399999999,8.02731 4.234221399999999,7.50001 L 4.234221399999999,6.88476 C 3.0916413999999994,6.21094 2.359221399999999,5.06836 2.359221399999999,3.75 C 2.359221399999999,1.69922 4.234221399999999,0.0 6.577971399999999,0.0 C 8.8924214,0.0 10.796771,1.69922 10.796771,3.75 M 4.9373514,5.15625 C 5.435391399999999,5.15625 5.8748514,4.74609 5.8748514,4.21875 C 5.8748514,3.7207 5.435391399999999,3.28125 4.9373514,3.28125 C 4.4100014,3.28125 3.9998514,3.7207 3.9998514,4.21875 C 3.9998514,4.74609 4.4100014,5.15625 4.9373514,5.15625 M 9.1560714,4.21875 C 9.1560714,3.7207 8.7166414,3.28125 8.2185914,3.28125 C 7.6912514,3.28125 7.281091399999999,3.7207 7.281091399999999,4.21875 C 7.281091399999999,4.74609 7.6912514,5.15625 8.2185914,5.15625 C 8.716641399999999,5.15625 9.1560714,4.74609 9.1560714,4.21875 M 0.10336144,8.02731 C 0.33774144,7.55861 0.89438144,7.38281 1.3631314,7.61721 L 6.5779714,10.22461 L 11.763471,7.61721 C 12.232270999999999,7.38281 12.788870999999999,7.55861 13.023271,8.02731 C 13.257671,8.49611 13.081871,9.05271 12.613171,9.28711 L 8.6580514,11.25001 L 12.613171,13.24221 C 13.081871,13.47661 13.257671,14.03321 13.023271,14.50191 C 12.788870999999999,14.97071 12.232270999999999,15.146510000000001 11.763471,14.91211 L 6.577971399999999,12.30471 L 1.3631313999999994,14.91211 C 0.8943814399999994,15.146510000000001 0.3377414399999994,14.97071 0.10336143999999936,14.50191 C -0.13101256000000064,14.03321 0.04476843999999936,13.47661 0.5135214399999994,13.24221 L 4.4685914,11.25001 L 0.51352144,9.28711 C 0.04476844000000002,9.05271 -0.13101256000000006,8.49611 0.10336143999999997,8.02731 L 0.10336144,8.02731 ", + ], + iconName: "olympus-buttons-roe-free" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsRoeHold: IconDefinition = { + icon: [ + 9.3896503, + 9.3896503, + [], + "", + "M 9.103975,1.603975 C 9.484875,1.252475 9.484875,0.6371749999999999 9.103975,0.2856749999999999 C 8.752475,-0.09522500000000012 8.137175000000001,-0.09522500000000012 7.785675,0.2856749999999999 L 4.709475,3.3617749999999997 L 1.6039750000000002,0.2856749999999999 C 1.2524750000000002,-0.09522500000000012 0.6371750000000002,-0.09522500000000012 0.2856750000000001,0.2856749999999999 C -0.0952249999999999,0.6371749999999998 -0.0952249999999999,1.252475 0.2856750000000001,1.603975 L 3.3617749999999997,4.680175 L 0.2856749999999999,7.785675 C -0.09522500000000012,8.137175000000001 -0.09522500000000012,8.752475 0.2856749999999999,9.103975 C 0.6371749999999998,9.484875 1.252475,9.484875 1.603975,9.103975 L 4.709475,6.027875 L 7.785675,9.103975 C 8.137175000000001,9.484875 8.752475,9.484875 9.103975,9.103975 C 9.484875,8.752475 9.484875,8.137175000000001 9.103975,7.785675 L 6.027875,4.680175 L 9.103975,1.603975 ", + ], + iconName: "olympus-buttons-roe-hold" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsRoeReturn: IconDefinition = { + icon: [ + 14.063629, + 14.9414, + [], + "", + "M 7.0324294,0.0 C 7.1496294,0.0 7.2961294,0.0293 7.4133294,0.0879 L 12.921129,2.4316 C 13.565629000000001,2.7246 14.063629,3.3398 14.063629,4.1015999999999995 C 14.034429000000001,7.0312 12.833229000000001,12.334 7.794129400000001,14.7656 C 7.296129400000001,15.0 6.739429400000001,15.0 6.241429400000001,14.7656 C 1.2023294000000009,12.334 0.0012293600000008453,7.031199999999999 0.0012293600000008453,4.1015999999999995 C -0.028070639999999154,3.3397999999999994 0.46992936000000085,2.7245999999999997 1.1144294000000008,2.4315999999999995 L 6.6222294,0.08789999999999942 C 6.7394294,0.0293 6.8859294,0.0 7.0324294,0.0 M 7.0324294,1.9629 L 7.0324294,13.0371 C 11.075429,11.0742 12.159429,6.7676 12.188629,4.1602 L 7.0324294,1.9629 ", + ], + iconName: "olympus-buttons-roe-return" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsScatter1: IconDefinition = { + icon: [ + 15.0, + 15.0, + [], + "", + "M 1.880341,3.4754242 A 11.467682,10.686775 0.0 0,1 13.348023,3.4754244 L 7.614182,12.730443 L 1.880341,3.4754242 ", + ], + iconName: "olympus-buttons-scatter-1" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsScatter2: IconDefinition = { + icon: [ + 15.0, + 15.0, + [], + "", + "M 3.6920035,2.6881593 A 11.467682,10.686775 0.0 0,1 11.53636,2.6881591 L 7.614182,12.730443 L 3.6920035,2.6881593 ", + ], + iconName: "olympus-buttons-scatter-2" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsScatter3: IconDefinition = { + icon: [ + 15.0, + 15.0, + [], + "", + "M 5.6228404,2.2060238 A 11.467682,10.686775 0.0 0,1 9.605524,2.2060239 L 7.614182,12.730443 L 5.6228404,2.2060238 ", + ], + iconName: "olympus-buttons-scatter-3" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsSpawnAircraft: IconDefinition = { + icon: [ + 32.0, + 32.0, + [], + "", + "M 25.924821,12.489287 C 27.614671,12.489287 30.596674,13.930667 30.596674,15.670138 C 30.596674,17.459412999999998 27.614671,18.850991 25.924821,18.850991 L 20.109861000000002,18.850991 L 15.139736000000003,27.598332 C 14.841463000000003,28.09527 14.294721000000003,28.393544 13.748159000000003,28.393544 L 10.964823000000003,28.393544 C 10.418080000000003,28.393544 10.020564000000002,27.896603 10.169610000000002,27.399480999999998 L 12.605051000000003,18.850991 L 7.5355007,18.850991 L 5.348676,21.733567 C 5.1995608,21.932416 5.0007624,22.031842 4.7522572,22.031842 L 2.6648175,22.031842 C 2.2672122999999997,22.031842 1.9690120999999998,21.733567 1.9690120999999998,21.336053 C 1.9690120999999998,21.286243 1.9690120999999998,21.236622999999998 1.9690120999999998,21.187005 L 3.5594380999999995,15.670137999999998 L 1.9690120999999996,10.203072999999998 C 1.9690120999999996,10.153262999999997 1.9690120999999996,10.103642999999998 1.9690120999999996,10.004223999999999 C 1.9690120999999996,9.656330299999999 2.2672122999999997,9.308435199999998 2.6648175,9.308435199999998 L 4.7522572,9.308435199999998 C 5.0007624,9.308435199999998 5.1995575,9.457483099999997 5.348676,9.656330299999999 L 7.5355007,12.489287 L 12.605051,12.489287 L 10.16961,3.9904523 C 10.020569,3.4934397 10.41808,2.9467331 10.964823,2.9467331 L 13.748159000000001,2.9467331 C 14.294721000000001,2.9467331 14.841463000000001,3.2946454999999997 15.139736000000001,3.79164 L 20.109861000000002,12.489287000000001 L 25.924821,12.489287 ", + ], + iconName: "olympus-buttons-spawn-aircraft" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsSpawnExplosion: IconDefinition = { + icon: [ + 32.0, + 31.999584, + [], + "", + "M 26.759564,2.1225723 C 27.100252,1.5157184999999997 27.801965000000003,1.3002002999999998 28.371472,1.6404921 C 28.940979000000002,1.9807839999999999 29.174882,2.7464407 28.910469,3.3986668 L 21.939094,20.685494 C 22.050958,20.815935999999997 22.157747,20.952054999999998 22.259442,21.088172 L 27.201949,17.985844 C 27.735861,17.651225 28.401982,17.810027 28.773177999999998,18.348823 C 29.144374,18.887618 29.093525999999997,19.653274 28.661315,20.135354 L 24.237467,25.069586 L 20.601775999999997,25.069586 C 19.930570999999997,22.954106000000003 18.125437999999995,21.439807000000002 15.999956999999998,21.439807000000002 C 13.874474999999999,21.439807000000002 12.064256999999998,22.954106000000003 11.398138999999999,25.069586 L 7.345485,25.069586 L 3.506398,22.109048 C 3.013164,21.729056 2.840278,20.997429 3.104692,20.390574 C 3.369106,19.783721 3.989462,19.488801 4.564053,19.687305 L 9.50656,21.411449 C 9.659102,21.190258 9.8167362,20.974741 9.9845364,20.770566 L 6.816656,14.883519 C 6.506479,14.310692 6.618345,13.573393 7.075986,13.142357 C 7.533625000000001,12.711321 8.204830000000001,12.716992000000001 8.657383,13.147857 L 13.864303,18.133134 C 13.940563,18.110453999999997 14.016845,18.087764 14.093123,18.070743999999998 L 14.784667,9.977551999999998 C 14.845677,9.279955699999997 15.369428000000001,8.746830899999997 15.999953000000001,8.746830899999997 C 16.630479,8.746830899999997 17.154220000000002,9.279955699999997 17.215238000000003,9.977551999999998 L 17.901699000000004,18.025456 L 26.759564,2.1225723 M 4.609817,26.890147 L 4.609817,26.890147 L 27.39009,26.890147 L 27.39009,26.890147 L 29.017251,26.890147 C 29.917275,26.890147 30.644415000000002,27.701176999999998 30.644415000000002,28.705038 C 30.644415000000002,29.7089 29.917275000000004,30.519927 29.017251,30.519927 L 2.982655,30.519927 C 2.0826309999999997,30.519927 1.355492,29.7089 1.355492,28.705038 C 1.355492,27.701176999999998 2.082631,26.890147 2.982655,26.890147 L 4.609817,26.890147 M 15.999953,1.4816894 C 16.676241,1.4816894 17.220323999999998,2.0885432 17.220323999999998,2.8428567 L 17.220323999999998,5.5651915 C 17.220323999999998,6.319505 16.676240999999997,6.9263592 15.999952999999998,6.9263592 C 15.323663999999997,6.9263592 14.779580999999999,6.319505 14.779580999999999,5.5651915 L 14.779580999999999,2.8428567 C 14.779580999999999,2.0885432 15.323663999999999,1.4816894 15.999952999999998,1.4816894 L 15.999953,1.4816894 ", + ], + iconName: "olympus-buttons-spawn-explosion" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsSpawnGroundunit: IconDefinition = { + icon: [ + 32.0, + 32.0, + [], + "", + "M 22.4511,18.3916 L 9.54882,18.3916 C 8.6,18.3916 7.828119999999999,19.1635 7.828119999999999,20.1123 C 7.828119999999999,20.1385 7.828899999999999,20.1645 7.83013,20.1905 C 7.8305,20.1988 7.830979999999999,20.207 7.83146,20.2153 C 7.83254,20.2336 7.83395,20.2518 7.83562,20.27 C 7.836399999999999,20.2788 7.83707,20.287499999999998 7.83803,20.2962 C 7.84056,20.319399999999998 7.84345,20.342599999999997 7.8469,20.3656 C 7.84865,20.377200000000002 7.85072,20.3887 7.85269,20.4003 C 7.85484,20.4128 7.857,20.4253 7.85941,20.437700000000003 C 7.86201,20.451200000000004 7.86471,20.464600000000004 7.86761,20.478 C 7.86972,20.4877 7.87203,20.497300000000003 7.87433,20.507 C 7.881119999999999,20.5359 7.88861,20.564400000000003 7.89685,20.5927 C 7.89826,20.5976 7.8995999999999995,20.6025 7.90105,20.607400000000002 C 7.90565,20.6228 7.91062,20.637900000000002 7.91559,20.653000000000002 C 7.91808,20.660500000000003 7.92064,20.668000000000003 7.9232,20.675500000000003 C 7.928389999999999,20.690300000000004 7.93363,20.7052 7.93919,20.719900000000003 C 7.94164,20.7264 7.94428,20.7327 7.94676,20.739100000000004 C 7.9566,20.764200000000002 7.96699,20.789000000000005 7.97794,20.813500000000005 C 7.98228,20.823200000000003 7.98658,20.832900000000006 7.99111,20.842600000000004 C 7.99649,20.853900000000003 8.00198,20.865200000000005 8.00759,20.876500000000004 C 8.01364,20.888700000000004 8.019870000000001,20.900700000000004 8.02622,20.912800000000004 C 8.030890000000001,20.921700000000005 8.03557,20.930700000000005 8.04039,20.939500000000006 C 8.0519,20.960500000000007 8.06381,20.981200000000005 8.07616,21.001700000000007 C 8.078059999999999,21.004800000000007 8.08002,21.007800000000007 8.081949999999999,21.010900000000007 C 8.09394,21.030400000000007 8.1063,21.049600000000005 8.119029999999999,21.068700000000007 C 8.121289999999998,21.072000000000006 8.123479999999999,21.075300000000006 8.125739999999999,21.07870000000001 C 8.292879999999998,21.324700000000007 8.523589999999999,21.52800000000001 8.801059999999998,21.66200000000001 C 8.804399999999998,21.66360000000001 8.807809999999998,21.66510000000001 8.811189999999998,21.66670000000001 C 8.824399999999999,21.67290000000001 8.837579999999997,21.67930000000001 8.851009999999999,21.68530000000001 L 8.86225,21.68980000000001 C 8.89383,21.70360000000001 8.925709999999999,21.71680000000001 8.95826,21.72870000000001 L 11.5773,22.78950000000001 C 11.581299999999999,22.79130000000001 11.5855,22.79270000000001 11.5895,22.79450000000001 C 11.606599999999998,22.80180000000001 11.624099999999999,22.80850000000001 11.6413,22.81540000000001 C 11.6593,22.822500000000012 11.6771,22.830000000000013 11.6952,22.83670000000001 C 11.713099999999999,22.84330000000001 11.7313,22.84930000000001 11.7495,22.85550000000001 C 11.7677,22.86170000000001 11.7858,22.86830000000001 11.8042,22.87410000000001 C 11.819799999999999,22.87900000000001 11.835799999999999,22.88320000000001 11.8515,22.88770000000001 C 11.8728,22.89390000000001 11.894,22.90040000000001 11.9154,22.90600000000001 C 11.9257,22.90860000000001 11.9363,22.91080000000001 11.9467,22.91330000000001 C 11.9737,22.91990000000001 12.0007,22.92650000000001 12.028,22.93210000000001 C 12.0289,22.93230000000001 12.0298,22.93240000000001 12.0306,22.932500000000008 C 12.1748,22.962000000000007 12.322,22.977100000000007 12.4713,22.978300000000008 C 12.4775,22.978300000000008 12.4836,22.978700000000007 12.4897,22.978700000000007 L 12.489799999999999,22.978700000000007 L 19.5098,22.978700000000007 C 19.510299999999997,22.978700000000007 19.5107,22.978700000000007 19.5111,22.978700000000007 C 19.511499999999998,22.978700000000007 19.512,22.978700000000007 19.5124,22.978700000000007 C 19.8402,22.978700000000007 20.151799999999998,22.909200000000006 20.4341,22.784700000000008 L 23.0686,21.717900000000007 C 23.0894,21.709900000000008 23.1102,21.701700000000006 23.1306,21.69280000000001 L 23.1321,21.69220000000001 L 23.148500000000002,21.68530000000001 C 23.161900000000003,21.67930000000001 23.1751,21.67290000000001 23.1883,21.66670000000001 C 23.1917,21.66510000000001 23.1951,21.66350000000001 23.198500000000003,21.66200000000001 C 23.475900000000003,21.52800000000001 23.7067,21.32470000000001 23.873800000000003,21.07870000000001 C 23.876,21.07540000000001 23.878300000000003,21.07200000000001 23.8805,21.068700000000007 C 23.8932,21.049600000000005 23.9056,21.030400000000007 23.9176,21.010900000000007 C 23.9195,21.007800000000007 23.9215,21.004700000000007 23.9233,21.001700000000007 C 23.9357,20.98120000000001 23.9476,20.960400000000007 23.959200000000003,20.939500000000006 C 23.964000000000002,20.930600000000005 23.968700000000002,20.921700000000005 23.973300000000002,20.912800000000004 C 23.9797,20.900700000000004 23.9859,20.888700000000004 23.992,20.876500000000004 C 23.997600000000002,20.865200000000005 24.0031,20.854000000000003 24.0084,20.842600000000004 C 24.012900000000002,20.832900000000006 24.017300000000002,20.823200000000003 24.021600000000003,20.813500000000005 C 24.032600000000002,20.789000000000005 24.043000000000003,20.764200000000006 24.0528,20.739100000000004 C 24.055300000000003,20.732700000000005 24.058,20.726300000000005 24.0604,20.719900000000003 C 24.066000000000003,20.7052 24.0712,20.690300000000004 24.0764,20.675400000000003 C 24.079,20.668000000000003 24.0815,20.660500000000003 24.084,20.653000000000002 C 24.089,20.637800000000002 24.094,20.622700000000002 24.0985,20.607400000000002 C 24.1,20.602500000000003 24.101300000000002,20.597500000000004 24.102700000000002,20.5926 C 24.1109,20.564400000000003 24.1185,20.535800000000002 24.125300000000003,20.507 C 24.127600000000005,20.497300000000003 24.129800000000003,20.4877 24.132,20.4779 C 24.134900000000002,20.4646 24.137600000000003,20.4512 24.1402,20.437700000000003 C 24.1426,20.425200000000004 24.1447,20.412700000000005 24.1469,20.4002 C 24.148899999999998,20.3887 24.1509,20.377200000000002 24.1527,20.3656 C 24.1561,20.3425 24.159,20.3194 24.1616,20.2961 C 24.1625,20.287399999999998 24.1631,20.2787 24.164,20.27 C 24.1657,20.2518 24.167,20.2336 24.168100000000003,20.2152 C 24.1686,20.207 24.169100000000004,20.1988 24.169500000000003,20.1905 C 24.170600000000004,20.1645 24.1715,20.1384 24.1715,20.1123 C 24.1718,19.163500000000003 23.399900000000002,18.3916 22.4511,18.3916 M 9.54882,20.7573 C 9.46599,20.7573 9.38698,20.7411 9.314169999999999,20.712500000000002 L 9.29001,20.7027 C 9.27506,20.6961 9.26033,20.6891 9.24604,20.6814 C 9.24433,20.6806 9.24251,20.6798 9.24081,20.6788 C 9.224,20.6696 9.20767,20.6596 9.19179,20.649 C 9.18856,20.6468 9.18544,20.6446 9.18225,20.6423 C 9.16933,20.6333 9.15675,20.624 9.14458,20.6141 C 9.14139,20.6116 9.13816,20.609 9.13505,20.6064 C 9.10599,20.5821 9.07916,20.5552 9.05481,20.5261 C 9.05177,20.5225 9.04888,20.5188 9.04591,20.5151 C 9.03704,20.5041 9.02858,20.4927 9.02041,20.4811 C 9.01722,20.4766 9.01399,20.472 9.01091,20.4674 C 9.00104,20.4525 8.99162,20.4373 8.98301,20.4215 C 8.98082,20.4176 8.979,20.4134 8.97689,20.4094 C 8.97054,20.3972 8.96449,20.3848 8.95896,20.3722 C 8.95596,20.3654 8.95313,20.3586 8.95039,20.3517 C 8.94594,20.3405 8.94178,20.3292 8.93792,20.3177 C 8.93577,20.3114 8.93347,20.3052 8.93154,20.2987 C 8.92642,20.2818 8.922,20.2647 8.91825,20.2472 C 8.91706,20.2415 8.91614,20.2357 8.9151,20.23 C 8.91254,20.2163 8.91042,20.2025 8.90875,20.1886 C 8.90805,20.1826 8.90734,20.1766 8.90679,20.1707 C 8.90504,20.1515 8.90382,20.1321 8.90382,20.1124 C 8.90382,19.756800000000002 9.19312,19.4674 9.548779999999999,19.4674 C 9.90444,19.4674 10.1937,19.756700000000002 10.1937,20.1124 C 10.1937,20.4681 9.90447,20.7573 9.54882,20.7573 M 12.489899999999999,21.902900000000002 C 12.469,21.902900000000002 12.447999999999999,21.902400000000004 12.427299999999999,21.901400000000002 C 12.366599999999998,21.898300000000003 12.307099999999998,21.890700000000002 12.249099999999999,21.879 C 12.247599999999998,21.878700000000002 12.245999999999999,21.878400000000003 12.244499999999999,21.8781 C 12.2289,21.8749 12.213499999999998,21.871199999999998 12.197999999999999,21.8674 C 12.193599999999998,21.8663 12.189099999999998,21.8654 12.1847,21.8642 C 12.1715,21.8608 12.158399999999999,21.8569 12.145299999999999,21.853 C 12.138699999999998,21.851100000000002 12.1321,21.849300000000003 12.125499999999999,21.8472 C 12.113999999999999,21.843600000000002 12.102699999999999,21.8396 12.091399999999998,21.8356 C 12.0834,21.8328 12.075299999999999,21.830199999999998 12.067299999999998,21.827199999999998 C 12.056699999999998,21.823199999999996 12.046199999999997,21.8189 12.035599999999997,21.8147 C 12.027299999999997,21.8113 12.018999999999997,21.808 12.010699999999996,21.804499999999997 C 11.576799999999997,21.618 11.272099999999996,21.1866 11.272099999999996,20.6851 C 11.272099999999996,20.013599999999997 11.818399999999997,19.467299999999998 12.489899999999997,19.467299999999998 C 13.161399999999997,19.467299999999998 13.707699999999997,20.013599999999997 13.707699999999997,20.6851 C 13.707699999999997,21.3566 13.161399999999997,21.9029 12.489899999999997,21.9029 L 12.489899999999999,21.902900000000002 M 16.0013,21.902900000000002 C 15.3298,21.902900000000002 14.7835,21.356600000000004 14.7835,20.685200000000002 C 14.7835,20.0137 15.3298,19.4674 16.0013,19.4674 C 16.672800000000002,19.4674 17.219,20.0137 17.219,20.685200000000002 C 17.219,21.3566 16.672800000000002,21.902900000000002 16.0013,21.902900000000002 M 20.018900000000002,21.7923 L 20.012200000000004,21.795 L 19.998100000000004,21.801000000000002 C 19.844100000000005,21.8685 19.680300000000006,21.902700000000003 19.511400000000005,21.902900000000002 C 18.840500000000006,21.902300000000004 18.294900000000005,21.3563 18.294900000000005,20.685200000000002 C 18.294900000000005,20.0137 18.841200000000004,19.4674 19.512700000000006,19.4674 C 20.184200000000004,19.4674 20.730400000000007,20.0137 20.730400000000007,20.685200000000002 C 20.730400000000007,21.176000000000002 20.438200000000005,21.599700000000002 20.018900000000006,21.7923 L 20.018900000000002,21.7923 M 23.093100000000003,20.1706 C 23.092600000000004,20.1766 23.091900000000003,20.1825 23.091200000000004,20.1885 C 23.089500000000005,20.2024 23.087400000000006,20.2162 23.084800000000005,20.2299 C 23.083700000000004,20.2356 23.082900000000006,20.241500000000002 23.081600000000005,20.2472 C 23.077900000000007,20.264599999999998 23.073500000000006,20.2817 23.068400000000004,20.2986 C 23.066400000000005,20.3051 23.064100000000003,20.3113 23.062000000000005,20.317700000000002 C 23.058100000000003,20.329200000000004 23.054000000000006,20.340500000000002 23.049500000000005,20.3516 C 23.046800000000005,20.358500000000003 23.043900000000004,20.3653 23.041000000000004,20.3721 C 23.035400000000003,20.3847 23.029300000000003,20.397199999999998 23.023000000000003,20.409299999999998 C 23.020900000000005,20.4133 23.0191,20.417399999999997 23.016900000000003,20.421499999999998 C 23.008300000000002,20.437199999999997 22.998900000000003,20.452399999999997 22.989100000000004,20.467299999999998 C 22.986000000000004,20.471999999999998 22.982700000000005,20.476499999999998 22.979500000000005,20.480999999999998 C 22.971400000000006,20.4927 22.963000000000005,20.503999999999998 22.954100000000004,20.514999999999997 C 22.951100000000004,20.518699999999995 22.948200000000003,20.522399999999998 22.945200000000003,20.526099999999996 C 22.920800000000003,20.555099999999996 22.893900000000002,20.581899999999997 22.864900000000002,20.606299999999997 C 22.861800000000002,20.608999999999998 22.858600000000003,20.611499999999996 22.855400000000003,20.613999999999997 C 22.843200000000003,20.623899999999995 22.830600000000004,20.6333 22.817800000000002,20.642199999999995 C 22.814600000000002,20.644399999999994 22.811400000000003,20.646699999999996 22.808200000000003,20.648899999999994 C 22.792300000000004,20.659499999999994 22.776000000000003,20.669499999999996 22.759200000000003,20.678699999999996 C 22.757500000000004,20.679699999999997 22.755700000000004,20.680499999999995 22.754000000000005,20.681399999999996 C 22.739700000000006,20.688999999999997 22.724900000000005,20.695999999999998 22.710000000000004,20.702599999999997 L 22.685800000000004,20.712399999999995 C 22.613000000000003,20.740999999999996 22.534000000000002,20.757299999999994 22.451200000000004,20.757299999999994 C 22.095600000000005,20.757299999999994 21.806300000000004,20.467899999999993 21.806300000000004,20.112299999999994 C 21.806300000000004,19.756599999999995 22.095600000000005,19.467299999999994 22.451200000000004,19.467299999999994 C 22.806800000000003,19.467299999999994 23.096200000000003,19.756599999999995 23.096200000000003,20.112299999999994 C 23.096100000000003,20.131999999999994 23.094800000000003,20.151399999999995 23.093100000000003,20.170599999999993 L 23.093100000000003,20.1706 M 22.4512,16.24 L 22.1936,16.24 L 19.7359,13.892999999999999 L 18.3393,13.892999999999999 C 18.282500000000002,13.591 18.1769,13.306099999999999 18.0306,13.0468 L 22.9532,11.0072 L 23.157799999999998,11.5011 L 24.198099999999997,11.0701 L 23.993399999999998,10.5762 L 25.2352,10.0617 L 24.8042,9.02148 L 23.5624,9.5359 L 23.3578,9.04204 L 22.3176,9.473 L 22.5222,9.96688 L 17.2366,12.1569 C 16.7786,11.8245 16.216,11.6278 15.608,11.6278 L 13.5135,11.6278 C 12.156500000000001,11.6278 11.0243,12.6053 10.7821,13.893 L 9.06456,13.893 L 9.06456,16.2701 C 8.05574,16.3958 7.13969,16.9114 6.5,17.7281 L 7.34687,18.3915 C 7.88236,17.7078 8.68493,17.3157 9.54888,17.3157 L 22.4511,17.3157 C 23.3151,17.3157 24.1176,17.7078 24.653100000000002,18.3915 L 25.5,17.7281 C 24.7593,16.7824 23.648,16.24 22.4512,16.24 M 8.0,0.5 L 24.0,0.5 A 7.5,7.5 0.0 0,1 31.5,8.0 L 31.5,24.0 A 7.5,7.5 0.0 0,1 24.0,31.5 L 8.0,31.5 A 7.5,7.5 0.0 0,1 0.5,24.0 L 0.5,8.0 A 7.5,7.5 0.0 0,1 8.0,0.5 M 0.0,0.0 L 19.0,0.0 L 19.0,19.0 L 0.0,19.0 L 0.0,0.0 ", + ], + iconName: "olympus-buttons-spawn-groundunit" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsSpawnHelicopter: IconDefinition = { + icon: [ + 32.0, + 32.0, + [], + "", + "M 6.3544349,4.6930773 C 6.3544349,3.8208808999999997 7.0590934,3.1162221 7.9312916,3.1162221 L 26.853493,3.1162221 C 27.72569,3.1162221 28.430349,3.8208808999999997 28.430349,4.6930773 C 28.430349,5.5652751 27.72569,6.2699251 26.853493,6.2699251 L 18.969239,6.2699251 L 18.969239,9.4236269 L 20.546094,9.4236269 C 24.902139,9.4236269 28.430349,12.951830000000001 28.430349,17.307881000000002 L 28.430349,20.461578000000003 C 28.430349,21.333773000000004 27.72569,22.038433 26.853493,22.038433 L 18.969239,22.038433 L 15.815544000000003,22.038433 C 14.825078000000003,22.038433 13.888829000000003,21.570304 13.292578000000002,20.776953000000002 L 9.7742292,16.085817 C 9.6017601,15.854216999999998 9.3652384,15.676825999999998 9.0991392,15.568418999999999 L 2.3728891999999995,12.877913999999999 C 1.90476,12.690662 1.5499693,12.286593 1.4267781,11.793826 L 0.29342123,7.25053 C 0.16529133,6.7528385 0.54472759,6.2699251 1.0572018,6.2699251 L 2.4123131,6.2699251 C 2.9100031,6.2699251 3.3781324,6.5015247 3.6737924,6.9006692 L 5.5660161,9.4236269 L 15.815544,9.4236269 L 15.815544,6.2699251 L 7.9312916,6.2699251 C 7.0590934,6.2699251 6.354434899999999,5.5652751 6.354434899999999,4.693077300000001 L 6.3544349,4.6930773 M 18.969239,18.884729 L 25.276646000000003,18.884729 L 25.276646000000003,17.307881000000002 C 25.276646000000003,14.696222000000002 23.157754000000004,12.577331000000001 20.546094000000004,12.577331000000001 L 18.969239000000005,12.577331000000001 L 18.969239,18.884729 M 31.120845000000003,24.078479 C 31.736806,24.694436000000003 31.736806,25.694758 31.120845000000003,26.310708 L 30.928669000000003,26.502891 C 29.746028000000003,27.685525000000002 28.139612000000003,28.350761000000002 26.469140000000003,28.350761000000002 L 12.661840000000003,28.350761000000002 C 11.789645000000004,28.350761000000002 11.084985000000003,27.646103000000004 11.084985000000003,26.773914 C 11.084985000000003,25.901717 11.789645000000004,25.197059000000003 12.661840000000003,25.197059000000003 L 26.469140000000003,25.197059000000003 C 27.306838000000003,25.197059000000003 28.110051000000002,24.866905000000003 28.701371,24.275585000000003 L 28.893547,24.083408000000002 C 29.509506000000002,23.467449000000002 30.509817,23.467449000000002 31.125776000000002,24.083408000000002 L 31.120845000000003,24.078479 ", + ], + iconName: "olympus-buttons-spawn-helicopter" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsSpawnMore: IconDefinition = { + icon: [ + 32.0, + 32.0, + [], + "", + "M 14.8473673,4.5254831 L 17.2569437,4.5254831 A 1.6436043,1.6436043 0.0 0,1 18.900548,6.1690873999999996 L 18.900548,25.5813758 A 1.6436043,1.6436043 0.0 0,1 17.2569437,27.2249801 L 14.8473673,27.2249801 A 1.6436043,1.6436043 0.0 0,1 13.203763,25.5813758 L 13.203763,6.1690873999999996 A 1.6436043,1.6436043 0.0 0,1 14.8473673,4.5254831 M 14.394818299999999,-27.588247 L 16.8043947,-27.588247 A 1.6436043,1.6436043 0.0 0,1 18.447999,-25.9446427 L 18.447999,-6.532354299999998 A 1.6436043,1.6436043 0.0 0,1 16.8043947,-4.888749999999998 L 14.394818299999999,-4.888749999999998 A 1.6436043,1.6436043 0.0 0,1 12.751214,-6.532354299999998 L 12.751214,-25.9446427 A 1.6436043,1.6436043 0.0 0,1 14.394818299999999,-27.588247 ", + ], + iconName: "olympus-buttons-spawn-more" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsSpawnNavyunit: IconDefinition = { + icon: [ + 32.0, + 32.0, + [], + "", + "M 11.24439,3.5672501 C 11.24439,2.6471823 11.987720999999999,1.9038498999999998 12.907791,1.9038498999999998 L 19.561387,1.9038498999999998 C 20.481455,1.9038498999999998 21.224785,2.6471823 21.224785,3.5672501 L 21.224785,5.2306477 L 23.719883,5.2306477 C 25.097386,5.2306477 26.214985,6.3482465999999995 26.214985,7.725748299999999 L 26.214985,14.379344999999999 L 28.522948999999997,15.148667999999999 C 29.723716999999997,15.548922999999998 30.056395999999996,17.097962 29.120734,17.950453 L 23.87063,22.763916 C 23.028533,23.252540999999997 22.066882,23.548833 21.224784999999997,23.548833 C 20.205954,23.548833 19.103951999999996,23.14858 18.147496999999998,22.493613999999997 C 16.998711999999998,21.687905999999998 15.465264999999999,21.687905999999998 14.316479999999999,22.493613999999997 C 13.427599999999998,23.106992999999996 12.341193999999998,23.548833 11.239190999999998,23.548833 C 10.397096999999999,23.548833 9.435445099999999,23.252540999999997 8.593346499999999,22.763916 L 3.3432428,17.950453 C 2.4075824,17.092766 2.7402625,15.548923 3.9410271,15.148668 L 6.25419,14.379345 L 6.25419,7.7257483 C 6.25419,6.3482466 7.3717886,5.2306477000000005 8.7492917,5.2306477000000005 L 11.24439,5.2306477000000005 L 11.24439,3.5672501 M 9.5809881,13.272145 L 15.184569,11.406021 C 15.865521,11.177313000000002 16.603654,11.177313000000002 17.289807,11.406021 L 22.888187,13.272145 L 22.888187,8.5574463 L 9.5809881,8.5574463 L 9.5809881,13.272145 M 17.196241,23.834729 C 18.365818,24.640439999999998 19.795302,25.19144 21.224785,25.19144 C 22.62308,25.19144 24.104544,24.630044 25.248132000000002,23.834729 L 25.248132000000002,23.834729 C 25.866707,23.392889 26.708806000000003,23.429275999999998 27.285797000000002,23.923089 C 28.034328000000002,24.541667 28.975186,25.014696 29.916044000000003,25.233018 C 30.810123000000004,25.440951000000002 31.366324000000002,26.335018 31.158397000000004,27.229097000000003 C 30.950466000000006,28.123175000000003 30.056396000000003,28.679373000000002 29.162317000000005,28.471448000000002 C 27.888780000000004,28.175156 26.828362000000006,27.613757000000003 26.137011000000005,27.171914 C 24.629557000000005,27.982824 22.940168000000003,28.518233000000002 21.224785000000004,28.518233000000002 C 19.566585000000003,28.518233000000002 18.074722000000005,28.003617000000002 17.045495000000003,27.535784000000003 C 16.744002000000002,27.395446000000003 16.468504000000003,27.260286000000004 16.234589000000003,27.135529000000002 C 16.000665000000005,27.260299000000003 15.730369000000003,27.400634 15.423681000000004,27.535784000000003 C 14.394451000000004,28.003617000000002 12.902590000000004,28.518233000000002 11.244390000000003,28.518233000000002 C 9.529008500000003,28.518233000000002 7.839618000000003,27.982824 6.332162300000003,27.177115 C 5.6356148,27.613758 4.5803957,28.180351 3.306857,28.476646 C 2.4127783,28.684579 1.5186998,28.128372 1.3107769,27.234294 C 1.1028445,26.340218 1.6590517,25.44614 2.5531281,25.238215 C 3.4939891,25.019896 4.4348476,24.546866 5.1833783,23.928289 C 5.7603695,23.439666 6.6024647,23.403277 7.2210429,23.83993 L 7.2210429,23.83993 C 8.3698262,24.630043999999998 9.8460953,25.19144 11.24439,25.19144 C 12.673874999999999,25.19144 14.103356999999999,24.640442 15.272934,23.834729 C 15.849929,23.424077999999998 16.619248,23.424077999999998 17.196241,23.834732 L 17.196241,23.834729 ", + ], + iconName: "olympus-buttons-spawn-navyunit" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsSpawnSam: IconDefinition = { + icon: [ + 32.0, + 32.0, + [], + "", + "M 22.4511,18.3916 L 9.54882,18.3916 C 8.6,18.3916 7.828119999999999,19.1635 7.828119999999999,20.1123 C 7.828119999999999,20.1385 7.828899999999999,20.1645 7.83013,20.1905 C 7.8305,20.1988 7.830979999999999,20.207 7.83146,20.2153 C 7.83254,20.2336 7.83395,20.2518 7.83562,20.27 C 7.836399999999999,20.2788 7.83707,20.287499999999998 7.83803,20.2962 C 7.84056,20.319399999999998 7.84345,20.342599999999997 7.8469,20.3656 C 7.84865,20.377200000000002 7.85072,20.3887 7.85269,20.4003 C 7.85484,20.4128 7.857,20.4253 7.85941,20.437700000000003 C 7.86201,20.451200000000004 7.86471,20.464600000000004 7.86761,20.478 C 7.86972,20.4877 7.87203,20.497300000000003 7.87433,20.507 C 7.881119999999999,20.5359 7.88861,20.564400000000003 7.89685,20.5927 C 7.89826,20.5976 7.8995999999999995,20.6025 7.90105,20.607400000000002 C 7.90565,20.6228 7.91062,20.637900000000002 7.91559,20.653000000000002 C 7.91808,20.660500000000003 7.92064,20.668000000000003 7.9232,20.675500000000003 C 7.928389999999999,20.690300000000004 7.93363,20.7052 7.93919,20.719900000000003 C 7.94164,20.7264 7.94428,20.7327 7.94676,20.739100000000004 C 7.9566,20.764200000000002 7.96699,20.789000000000005 7.97794,20.813500000000005 C 7.98228,20.823200000000003 7.98658,20.832900000000006 7.99111,20.842600000000004 C 7.99649,20.853900000000003 8.00198,20.865200000000005 8.00759,20.876500000000004 C 8.01364,20.888700000000004 8.019870000000001,20.900700000000004 8.02622,20.912800000000004 C 8.030890000000001,20.921700000000005 8.03557,20.930700000000005 8.04039,20.939500000000006 C 8.0519,20.960500000000007 8.06381,20.981200000000005 8.07616,21.001700000000007 C 8.078059999999999,21.004800000000007 8.08002,21.007800000000007 8.081949999999999,21.010900000000007 C 8.09394,21.030400000000007 8.1063,21.049600000000005 8.119029999999999,21.068700000000007 C 8.121289999999998,21.072000000000006 8.123479999999999,21.075300000000006 8.125739999999999,21.07870000000001 C 8.292879999999998,21.324700000000007 8.523589999999999,21.52800000000001 8.801059999999998,21.66200000000001 C 8.804399999999998,21.66360000000001 8.807809999999998,21.66510000000001 8.811189999999998,21.66670000000001 C 8.824399999999999,21.67290000000001 8.837579999999997,21.67930000000001 8.851009999999999,21.68530000000001 L 8.86225,21.68980000000001 C 8.89383,21.70360000000001 8.925709999999999,21.71680000000001 8.95826,21.72870000000001 L 11.5773,22.78950000000001 C 11.581299999999999,22.79130000000001 11.5855,22.79270000000001 11.5895,22.79450000000001 C 11.606599999999998,22.80180000000001 11.624099999999999,22.80850000000001 11.6413,22.81540000000001 C 11.6593,22.822500000000012 11.6771,22.830000000000013 11.6952,22.83670000000001 C 11.713099999999999,22.84330000000001 11.7313,22.84930000000001 11.7495,22.85550000000001 C 11.7677,22.86170000000001 11.7858,22.86830000000001 11.8042,22.87410000000001 C 11.819799999999999,22.87900000000001 11.835799999999999,22.88320000000001 11.8515,22.88770000000001 C 11.8728,22.89390000000001 11.894,22.90040000000001 11.9154,22.90600000000001 C 11.9257,22.90860000000001 11.9363,22.91080000000001 11.9467,22.91330000000001 C 11.9737,22.91990000000001 12.0007,22.92650000000001 12.028,22.93210000000001 C 12.0289,22.93230000000001 12.0298,22.93240000000001 12.0306,22.932500000000008 C 12.1748,22.962000000000007 12.322,22.977100000000007 12.4713,22.978300000000008 C 12.4775,22.978300000000008 12.4836,22.978700000000007 12.4897,22.978700000000007 L 12.489799999999999,22.978700000000007 L 19.5098,22.978700000000007 C 19.510299999999997,22.978700000000007 19.5107,22.978700000000007 19.5111,22.978700000000007 C 19.511499999999998,22.978700000000007 19.512,22.978700000000007 19.5124,22.978700000000007 C 19.8402,22.978700000000007 20.151799999999998,22.909200000000006 20.4341,22.784700000000008 L 23.0686,21.717900000000007 C 23.0894,21.709900000000008 23.1102,21.701700000000006 23.1306,21.69280000000001 L 23.1321,21.69220000000001 L 23.148500000000002,21.68530000000001 C 23.161900000000003,21.67930000000001 23.1751,21.67290000000001 23.1883,21.66670000000001 C 23.1917,21.66510000000001 23.1951,21.66350000000001 23.198500000000003,21.66200000000001 C 23.475900000000003,21.52800000000001 23.7067,21.32470000000001 23.873800000000003,21.07870000000001 C 23.876,21.07540000000001 23.878300000000003,21.07200000000001 23.8805,21.068700000000007 C 23.8932,21.049600000000005 23.9056,21.030400000000007 23.9176,21.010900000000007 C 23.9195,21.007800000000007 23.9215,21.004700000000007 23.9233,21.001700000000007 C 23.9357,20.98120000000001 23.9476,20.960400000000007 23.959200000000003,20.939500000000006 C 23.964000000000002,20.930600000000005 23.968700000000002,20.921700000000005 23.973300000000002,20.912800000000004 C 23.9797,20.900700000000004 23.9859,20.888700000000004 23.992,20.876500000000004 C 23.997600000000002,20.865200000000005 24.0031,20.854000000000003 24.0084,20.842600000000004 C 24.012900000000002,20.832900000000006 24.017300000000002,20.823200000000003 24.021600000000003,20.813500000000005 C 24.032600000000002,20.789000000000005 24.043000000000003,20.764200000000006 24.0528,20.739100000000004 C 24.055300000000003,20.732700000000005 24.058,20.726300000000005 24.0604,20.719900000000003 C 24.066000000000003,20.7052 24.0712,20.690300000000004 24.0764,20.675400000000003 C 24.079,20.668000000000003 24.0815,20.660500000000003 24.084,20.653000000000002 C 24.089,20.637800000000002 24.094,20.622700000000002 24.0985,20.607400000000002 C 24.1,20.602500000000003 24.101300000000002,20.597500000000004 24.102700000000002,20.5926 C 24.1109,20.564400000000003 24.1185,20.535800000000002 24.125300000000003,20.507 C 24.127600000000005,20.497300000000003 24.129800000000003,20.4877 24.132,20.4779 C 24.134900000000002,20.4646 24.137600000000003,20.4512 24.1402,20.437700000000003 C 24.1426,20.425200000000004 24.1447,20.412700000000005 24.1469,20.4002 C 24.148899999999998,20.3887 24.1509,20.377200000000002 24.1527,20.3656 C 24.1561,20.3425 24.159,20.3194 24.1616,20.2961 C 24.1625,20.287399999999998 24.1631,20.2787 24.164,20.27 C 24.1657,20.2518 24.167,20.2336 24.168100000000003,20.2152 C 24.1686,20.207 24.169100000000004,20.1988 24.169500000000003,20.1905 C 24.170600000000004,20.1645 24.1715,20.1384 24.1715,20.1123 C 24.1718,19.163500000000003 23.399900000000002,18.3916 22.4511,18.3916 M 9.54882,20.7573 C 9.46599,20.7573 9.38698,20.7411 9.314169999999999,20.712500000000002 L 9.29001,20.7027 C 9.27506,20.6961 9.26033,20.6891 9.24604,20.6814 C 9.24433,20.6806 9.24251,20.6798 9.24081,20.6788 C 9.224,20.6696 9.20767,20.6596 9.19179,20.649 C 9.18856,20.6468 9.18544,20.6446 9.18225,20.6423 C 9.16933,20.6333 9.15675,20.624 9.14458,20.6141 C 9.14139,20.6116 9.13816,20.609 9.13505,20.6064 C 9.10599,20.5821 9.07916,20.5552 9.05481,20.5261 C 9.05177,20.5225 9.04888,20.5188 9.04591,20.5151 C 9.03704,20.5041 9.02858,20.4927 9.02041,20.4811 C 9.01722,20.4766 9.01399,20.472 9.01091,20.4674 C 9.00104,20.4525 8.99162,20.4373 8.98301,20.4215 C 8.98082,20.4176 8.979,20.4134 8.97689,20.4094 C 8.97054,20.3972 8.96449,20.3848 8.95896,20.3722 C 8.95596,20.3654 8.95313,20.3586 8.95039,20.3517 C 8.94594,20.3405 8.94178,20.3292 8.93792,20.3177 C 8.93577,20.3114 8.93347,20.3052 8.93154,20.2987 C 8.92642,20.2818 8.922,20.2647 8.91825,20.2472 C 8.91706,20.2415 8.91614,20.2357 8.9151,20.23 C 8.91254,20.2163 8.91042,20.2025 8.90875,20.1886 C 8.90805,20.1826 8.90734,20.1766 8.90679,20.1707 C 8.90504,20.1515 8.90382,20.1321 8.90382,20.1124 C 8.90382,19.756800000000002 9.19312,19.4674 9.548779999999999,19.4674 C 9.90444,19.4674 10.1937,19.756700000000002 10.1937,20.1124 C 10.1937,20.4681 9.90447,20.7573 9.54882,20.7573 M 12.489899999999999,21.902900000000002 C 12.469,21.902900000000002 12.447999999999999,21.902400000000004 12.427299999999999,21.901400000000002 C 12.366599999999998,21.898300000000003 12.307099999999998,21.890700000000002 12.249099999999999,21.879 C 12.247599999999998,21.878700000000002 12.245999999999999,21.878400000000003 12.244499999999999,21.8781 C 12.2289,21.8749 12.213499999999998,21.871199999999998 12.197999999999999,21.8674 C 12.193599999999998,21.8663 12.189099999999998,21.8654 12.1847,21.8642 C 12.1715,21.8608 12.158399999999999,21.8569 12.145299999999999,21.853 C 12.138699999999998,21.851100000000002 12.1321,21.849300000000003 12.125499999999999,21.8472 C 12.113999999999999,21.843600000000002 12.102699999999999,21.8396 12.091399999999998,21.8356 C 12.0834,21.8328 12.075299999999999,21.830199999999998 12.067299999999998,21.827199999999998 C 12.056699999999998,21.823199999999996 12.046199999999997,21.8189 12.035599999999997,21.8147 C 12.027299999999997,21.8113 12.018999999999997,21.808 12.010699999999996,21.804499999999997 C 11.576799999999997,21.618 11.272099999999996,21.1866 11.272099999999996,20.6851 C 11.272099999999996,20.013599999999997 11.818399999999997,19.467299999999998 12.489899999999997,19.467299999999998 C 13.161399999999997,19.467299999999998 13.707699999999997,20.013599999999997 13.707699999999997,20.6851 C 13.707699999999997,21.3566 13.161399999999997,21.9029 12.489899999999997,21.9029 L 12.489899999999999,21.902900000000002 M 16.0013,21.902900000000002 C 15.3298,21.902900000000002 14.7835,21.356600000000004 14.7835,20.685200000000002 C 14.7835,20.0137 15.3298,19.4674 16.0013,19.4674 C 16.672800000000002,19.4674 17.219,20.0137 17.219,20.685200000000002 C 17.219,21.3566 16.672800000000002,21.902900000000002 16.0013,21.902900000000002 M 20.018900000000002,21.7923 L 20.012200000000004,21.795 L 19.998100000000004,21.801000000000002 C 19.844100000000005,21.8685 19.680300000000006,21.902700000000003 19.511400000000005,21.902900000000002 C 18.840500000000006,21.902300000000004 18.294900000000005,21.3563 18.294900000000005,20.685200000000002 C 18.294900000000005,20.0137 18.841200000000004,19.4674 19.512700000000006,19.4674 C 20.184200000000004,19.4674 20.730400000000007,20.0137 20.730400000000007,20.685200000000002 C 20.730400000000007,21.176000000000002 20.438200000000005,21.599700000000002 20.018900000000006,21.7923 L 20.018900000000002,21.7923 M 23.093100000000003,20.1706 C 23.092600000000004,20.1766 23.091900000000003,20.1825 23.091200000000004,20.1885 C 23.089500000000005,20.2024 23.087400000000006,20.2162 23.084800000000005,20.2299 C 23.083700000000004,20.2356 23.082900000000006,20.241500000000002 23.081600000000005,20.2472 C 23.077900000000007,20.264599999999998 23.073500000000006,20.2817 23.068400000000004,20.2986 C 23.066400000000005,20.3051 23.064100000000003,20.3113 23.062000000000005,20.317700000000002 C 23.058100000000003,20.329200000000004 23.054000000000006,20.340500000000002 23.049500000000005,20.3516 C 23.046800000000005,20.358500000000003 23.043900000000004,20.3653 23.041000000000004,20.3721 C 23.035400000000003,20.3847 23.029300000000003,20.397199999999998 23.023000000000003,20.409299999999998 C 23.020900000000005,20.4133 23.0191,20.417399999999997 23.016900000000003,20.421499999999998 C 23.008300000000002,20.437199999999997 22.998900000000003,20.452399999999997 22.989100000000004,20.467299999999998 C 22.986000000000004,20.471999999999998 22.982700000000005,20.476499999999998 22.979500000000005,20.480999999999998 C 22.971400000000006,20.4927 22.963000000000005,20.503999999999998 22.954100000000004,20.514999999999997 C 22.951100000000004,20.518699999999995 22.948200000000003,20.522399999999998 22.945200000000003,20.526099999999996 C 22.920800000000003,20.555099999999996 22.893900000000002,20.581899999999997 22.864900000000002,20.606299999999997 C 22.861800000000002,20.608999999999998 22.858600000000003,20.611499999999996 22.855400000000003,20.613999999999997 C 22.843200000000003,20.623899999999995 22.830600000000004,20.6333 22.817800000000002,20.642199999999995 C 22.814600000000002,20.644399999999994 22.811400000000003,20.646699999999996 22.808200000000003,20.648899999999994 C 22.792300000000004,20.659499999999994 22.776000000000003,20.669499999999996 22.759200000000003,20.678699999999996 C 22.757500000000004,20.679699999999997 22.755700000000004,20.680499999999995 22.754000000000005,20.681399999999996 C 22.739700000000006,20.688999999999997 22.724900000000005,20.695999999999998 22.710000000000004,20.702599999999997 L 22.685800000000004,20.712399999999995 C 22.613000000000003,20.740999999999996 22.534000000000002,20.757299999999994 22.451200000000004,20.757299999999994 C 22.095600000000005,20.757299999999994 21.806300000000004,20.467899999999993 21.806300000000004,20.112299999999994 C 21.806300000000004,19.756599999999995 22.095600000000005,19.467299999999994 22.451200000000004,19.467299999999994 C 22.806800000000003,19.467299999999994 23.096200000000003,19.756599999999995 23.096200000000003,20.112299999999994 C 23.096100000000003,20.131999999999994 23.094800000000003,20.151399999999995 23.093100000000003,20.170599999999993 L 23.093100000000003,20.1706 M 22.4512,16.2401 L 22.1936,16.2401 L 19.7359,13.893100000000002 L 18.3393,13.893100000000002 C 18.2825,13.591 18.1463,14.2593 18.0,14.0 L 17.5,15.0 L 18.3393,13.8931 L 17.5,13.893 L 15.0,15.0001 L 16.0,15.5001 L 15.6257,14.723 L 15.0,15.0001 L 17.5,13.893 C 16.6501,13.892800000000001 16.108,13.892900000000001 15.5,13.892900000000001 L 13.5,13.893 C 12.1431,13.893 12.5,13.893 10.7821,13.893 L 9.06456,13.893 L 9.06456,16.270200000000003 C 8.05574,16.3958 7.13969,16.9115 6.5,17.7282 L 7.34687,18.3915 C 7.88236,17.7079 8.68493,17.3158 9.54888,17.3158 L 22.4511,17.3158 C 23.3151,17.3158 24.1176,17.7079 24.653100000000002,18.3915 L 25.5,17.7282 C 24.7593,16.782500000000002 23.648,16.2401 22.4512,16.2401 M 10.0072,10.1775 L 10.3123,10.0351 L 10.1175,8.80853 L 11.0387,8.66225 L 11.8662,9.4227 L 13.4481,9.1715 L 13.2636,8.00948 C 13.239,7.85454 13.2781,7.71959 13.3506,7.70807 L 15.3812,8.86439 L 18.0682,8.4377 C 18.099700000000002,8.432699999999999 18.131,8.42836 18.162200000000002,8.42395 L 18.446600000000004,10.215 C 18.415500000000005,10.2204 18.384400000000003,10.225999999999999 18.352900000000005,10.231 L 15.559800000000006,10.6745 L 14.093700000000005,12.3862 C 14.021000000000006,12.3978 13.942300000000005,12.281500000000001 13.917600000000006,12.1263 L 13.733100000000006,10.9646 L 12.249900000000006,11.2001 L 11.620500000000005,12.325800000000001 L 10.699300000000004,12.472000000000001 L 10.481300000000005,11.099300000000001 L 10.146500000000005,11.054400000000001 C 9.8594,10.6341 10.0072,10.1775 10.0072,10.1775 M 20.5299,8.96609 C 20.4589,8.51896 19.601,8.27526 18.5452,8.37328 L 18.826500000000003,10.1441 C 19.860500000000002,9.91034 20.600900000000003,9.41313 20.5299,8.96609 M 0.0,0.0 L 19.0,0.0 L 19.0,19.0 L 0.0,19.0 L 0.0,0.0 M 0.0,0.0 L 12.7515,0.0 L 12.7515,12.7515 L 0.0,12.7515 L 0.0,0.0 ", + ], + iconName: "olympus-buttons-spawn-sam" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsSpawnSmoke: IconDefinition = { + icon: [ + 32.0, + 32.0, + [], + "", + "M 2.1124942,10.397531 C 2.1124942,14.294360000000001 5.2041401,17.455944000000002 9.0147772,17.455944000000002 L 14.924857,17.455944000000002 C 16.008131,18.431376000000004 17.426933,19.024477 18.984738999999998,19.024477 C 20.542545999999998,19.024477 21.961346999999996,18.431376 23.044622999999998,17.455944000000002 L 24.353181999999997,17.455944000000002 C 27.320204999999998,17.455944000000002 29.721621999999996,15.000203000000003 29.721621999999996,11.966066000000001 C 29.721621999999996,8.9319281 27.320204999999998,6.476188900000001 24.353181999999997,6.476188900000001 C 23.840300999999997,6.476188900000001 23.346596999999996,6.5497279000000015 22.876858,6.686961200000002 C 21.851101999999997,4.696880500000002 19.804384,3.3391160000000015 17.450898,3.3391160000000015 C 15.888297999999999,3.3391160000000015 14.459909,3.9371201000000013 13.371841,4.922357500000001 C 12.183116,3.9322186 10.668447,3.339116 9.0147772,3.339116 C 5.204140099999999,3.339116 2.1124941999999995,6.5006982 2.1124941999999995,10.397531 L 2.1124942,10.397531 M 30.105081,21.377284 L 13.999759,21.377284 C 13.362257999999999,21.377284 12.849376999999999,21.901764 12.849376999999999,22.553686 C 12.849376999999999,23.205607 13.362257999999999,23.730088 13.999759,23.730088 L 30.105081,23.730088 C 30.742586,23.730088 31.255463,23.205606999999997 31.255463,22.553686 C 31.255463,21.901764 30.742586,21.377284 30.105081,21.377284 M 27.037402,26.082892 L 21.668962,26.082892 C 21.031459,26.082892 20.518579,26.607372 20.518579,27.259297 C 20.518579,27.911218 21.031458999999998,28.435696 21.668962,28.435696 L 27.037402,28.435696 C 27.674903,28.435696 28.187782,27.911218 28.187782,27.259297 C 28.187782,26.607372 27.674902999999997,26.082892 27.037402,26.082892 M 17.834359,26.082892 L 1.7290339,26.082892 C 1.0915304,26.082892 0.5786527499999998,26.607372 0.5786527499999998,27.259297 C 0.5786527499999998,27.911218 1.0915304,28.435696 1.7290339,28.435696 L 17.834359,28.435696 C 18.471861999999998,28.435696 18.984738999999998,27.911218 18.984738999999998,27.259297 C 18.984738999999998,26.607372 18.471861999999998,26.082892 17.834359,26.082892 M 11.315535999999998,22.553686000000003 C 11.315535999999998,21.901764000000004 10.802659999999998,21.377284000000003 10.165156999999997,21.377284000000003 L 5.180174,21.377284000000003 C 4.5426727,21.377284000000003 4.0297955000000005,21.901764000000004 4.0297955000000005,22.553686000000003 C 4.0297955000000005,23.205607000000004 4.542672700000001,23.730088000000002 5.180174000000001,23.730088000000002 L 10.165157,23.730088000000002 C 10.802660000000001,23.730088000000002 11.315536000000002,23.205607 11.315536000000002,22.553686000000003 L 11.315535999999998,22.553686000000003 M 0.0,0.0 L 19.0,0.0 L 19.0,19.0 L 0.0,19.0 L 0.0,0.0 ", + ], + iconName: "olympus-buttons-spawn-smoke" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsThreatEvade: IconDefinition = { + icon: [ + 23.317165, + 17.896727, + [], + "", + "M 0.02182384,14.515426 C -0.02347616,14.627326 0.0031838400000000003,14.755226 0.08844384,14.840425999999999 C 0.17370384,14.925726 0.30158384,14.952326 0.41349384,14.907025999999998 L 2.3718038,14.123725999999998 C 2.5236837999999997,14.062425999999999 2.6609038,13.973225999999999 2.7768037999999997,13.857325999999997 L 3.8025838,12.831525999999997 L 6.8399338,13.630825999999997 L 6.5895338,13.881225999999998 C 6.4123338,14.058425999999997 6.4123338,14.343525999999999 6.5895338,14.520725999999998 C 6.7667338,14.697925999999997 7.0518338,14.697925999999997 7.2289338,14.520725999999998 L 7.9750338,13.774725999999998 L 8.4013338,13.348425999999998 L 8.721033799999999,13.028625999999997 C 8.898233799999998,12.851525999999998 8.898233799999998,12.566425999999998 8.721033799999999,12.389225999999997 C 8.5438338,12.212025999999998 8.258733799999998,12.212025999999998 8.081533799999999,12.389225999999997 L 7.975033799999999,12.495825999999997 L 6.056633799999999,10.577425999999997 L 6.492233799999999,10.141825999999998 L 7.955033799999999,10.237725999999999 C 8.0416338,10.244326 8.126833799999998,10.212425999999999 8.1881338,10.151125999999998 L 8.4013338,9.938026099999998 C 8.5185338,9.820726099999998 8.5185338,9.628926099999997 8.4013338,9.511726099999999 L 7.1224338,8.232826099999999 L 6.2698338,9.0854261 C 6.1525338,9.2026261 5.9607338,9.2026261 5.8435337999999994,9.0854261 C 5.726233799999999,8.9681261 5.726233799999999,8.776326099999999 5.8435337999999994,8.6591261 L 6.696133799999999,7.8065261 L 5.417233799999999,6.5276261 C 5.299933799999999,6.4103261 5.108133799999999,6.4103261 4.990933799999999,6.5276261 L 4.777733799999999,6.7407261 C 4.716433799999999,6.8020261 4.684433799999999,6.8872260999999995 4.691133799999999,6.9738261 L 4.7870338,8.4366261 L 4.3514338,8.872226099999999 L 2.4330938,6.9539260999999986 L 2.5396638,6.847326099999998 C 2.7168338,6.670126099999998 2.7168338,6.385026099999998 2.5396638,6.207826099999998 C 2.3624938,6.030726099999998 2.0773838,6.030726099999998 1.9002138,6.207826099999998 L 1.5804938,6.527626099999998 L 1.1541937999999998,6.9539260999999986 L 0.40816383999999983,7.699926099999999 C 0.23099383999999984,7.877126099999999 0.23099383999999984,8.1622261 0.40816383999999983,8.3393261 C 0.5853338399999999,8.516526099999998 0.8704438399999999,8.516526099999998 1.0476137999999997,8.3393261 L 1.2980237999999997,8.088926099999998 L 2.0973838,11.126325999999999 L 1.0716037999999999,12.152125999999999 C 0.9556938399999999,12.268025999999999 0.8664338399999999,12.405225999999999 0.8051538399999999,12.557125999999998 L 0.02182384,14.515426 M 9.09163,5.31113 C 9.52102,4.92078 10.0419,4.48075 10.6248,4.02913 M 12.2481,2.86193 C 12.7995,2.4957700000000003 13.375800000000002,2.14408 13.9604,1.8283200000000002 M 15.775,0.9903200000000002 C 16.4395,0.7411140000000002 17.0926,0.5670900000000002 17.709500000000002,0.4998920000000002 M 19.6703,0.7456600000000002 C 19.8858,0.8416020000000002 20.0893,0.9641550000000002 20.2789,1.1158500000000002 C 20.6127,1.3828300000000002 20.9209,1.6816800000000003 21.1994,2.0105500000000003 M 22.2458,3.7060700000000004 C 22.4984,4.2942100000000005 22.6786,4.93694 22.7744,5.62908 M 22.8177,7.62517 C 22.763499999999997,8.25235 22.647299999999998,8.90866 22.4626,9.59138 M 21.801599999999997,11.476799999999999 C 21.552599999999998,12.058 21.256399999999996,12.654499999999999 20.909699999999997,13.264899999999999 M 19.841599999999996,14.9558 C 19.477799999999995,15.4794 19.077599999999997,16.0117 18.639299999999995,16.5518 M 17.644531,0.00390625 L 17.402344,0.03515625 L 17.148436999999998,0.078125 L 16.892577999999997,0.13085937 L 16.636718999999996,0.19335937 L 16.376952999999997,0.26367187000000003 L 16.119140999999996,0.34179687000000003 L 15.859374999999995,0.42773437000000003 L 15.605468999999994,0.51953127 A 0.5,0.5 0.0 0,0 15.304687999999993,1.16015622 A 0.5,0.5 0.0 0,0 15.945312999999993,1.4609375199999999 L 16.187499999999993,1.37304652 L 16.421874999999993,1.29492152 L 16.654296999999993,1.22460952 L 16.884765999999992,1.16210952 L 17.109374999999993,1.10742252 L 17.332030999999994,1.06054752 L 17.550780999999994,1.0253915200000001 L 17.773436999999994,0.9960947200000001 A 0.5,0.5 0.0 0,0 18.205078,0.43554688 A 0.5,0.5 0.0 0,0 17.644531,0.00390625 M 19.498047,0.27539063 A 0.5,0.5 0.0 0,0 19.216797,0.53515625 A 0.5,0.5 0.0 0,0 19.458984,1.1992186999999999 L 19.533204,1.2324217 L 19.597654000000002,1.2656247 L 19.662104000000003,1.3007807 L 19.724604000000003,1.3378897 L 19.787104000000003,1.3769527000000001 L 19.847654000000002,1.4179687 L 19.908204,1.4609377000000001 L 19.966794,1.5078127000000001 L 20.082028,1.5996097 L 20.193356,1.6972657 L 20.304684,1.7968747 L 20.412106,1.8984372 L 20.517575,2.003906 L 20.619138,2.1113278 L 20.7207,2.2207028 L 20.822263,2.3378903 A 0.5,0.5 0.0 0,0 21.527341,2.3886713000000004 A 0.5,0.5 0.0 0,0 21.576171,1.6835931000000004 L 21.466796,1.5566400000000005 L 21.349608,1.4277338000000004 L 21.230468,1.3027338000000004 L 21.107421,1.1816400000000005 L 20.982421,1.0624994000000005 L 20.855468,0.9472650300000005 L 20.724608,0.8339837800000005 L 20.589843,0.7246087700000006 L 20.505862999999998,0.6601556700000005 L 20.419922999999997,0.5976556700000005 L 20.332032999999996,0.5390618700000005 L 20.244142999999994,0.4824212700000005 L 20.152342999999995,0.4296868700000005 L 20.060542999999996,0.37890557000000047 L 19.968742999999996,0.33203057000000047 L 19.880852999999995,0.29296807000000047 A 0.5,0.5 0.0 0,0 19.498047,0.27539063 M 14.099609,1.3496094 A 0.5,0.5 0.0 0,0 13.71875,1.390625 L 13.498047,1.5117187 L 13.275390999999999,1.6386719 L 13.052734,1.7675781000000002 L 12.832030999999999,1.8984375000000002 L 12.615234,2.0332031 L 12.398437999999999,2.1679688 L 12.183594,2.3066406 L 11.972655999999999,2.4433594000000003 A 0.5,0.5 0.0 0,0 11.830077999999999,3.1367188 A 0.5,0.5 0.0 0,0 12.523437999999999,3.2792969000000003 L 12.728515999999999,3.1445313 L 12.933594,3.0117188 L 13.142577999999999,2.8828125 L 13.351562999999999,2.7539063 L 13.560546999999998,2.6289063 L 13.773437999999999,2.5058594000000003 L 13.984374999999998,2.3847656 L 14.201171999999998,2.2675781 A 0.5,0.5 0.0 0,0 14.398438,1.5878906 A 0.5,0.5 0.0 0,0 14.099609,1.3496094 M 22.056641,3.2441406 A 0.5,0.5 0.0 0,0 21.783203,3.8945313 L 21.871093000000002,4.1113281 L 21.949223000000003,4.3222656 L 22.021493000000003,4.5390625 L 22.085943000000004,4.7617187 L 22.144533000000003,4.9882812 L 22.197263000000003,5.220703100000001 L 22.242183000000004,5.4570312 L 22.279293000000003,5.705078100000001 A 0.5,0.5 0.0 0,0 22.851558000000004,6.1230469 A 0.5,0.5 0.0 0,0 23.267574000000003,5.5527344 L 23.226554000000004,5.2871094 L 23.175774000000004,5.017578100000001 L 23.117184000000005,4.7539062 L 23.050774000000004,4.4960937 L 22.976554000000004,4.2402344 L 22.892574000000003,3.9921875000000004 L 22.802734000000004,3.7480469000000003 L 22.708984000000004,3.5175781 A 0.5,0.5 0.0 0,0 22.056641,3.2441406 M 10.316406,3.6347656 L 10.099609,3.8046875 L 9.8867188,3.9765625 L 9.6796875,4.1445312 L 9.4785156,4.3105469 L 9.1015625,4.6328125 L 8.7597656,4.9375 A 0.5,0.5 0.0 0,0 8.71875,5.6425781 A 0.5,0.5 0.0 0,0 9.4238281,5.6855469 L 9.7597656,5.3867187 L 10.123047,5.0761719 L 10.314453,4.9160156 L 10.513672,4.7539062 L 10.71875,4.5898437 L 10.933594,4.4238281 A 0.5,0.5 0.0 0,0 11.019534,3.7207030999999997 A 0.5,0.5 0.0 0,0 10.316409,3.6347660999999998 L 10.316406,3.6347656 M 22.867187,7.1269531 A 0.5,0.5 0.0 0,0 22.320312,7.576171899999999 L 22.296872,7.8066406 L 22.269532,8.0351563 L 22.236332,8.265625 L 22.197272,8.4980469 L 22.152352,8.734375 L 22.101572,8.9746094 L 22.042982000000002,9.2167969 L 21.978532,9.4648438 A 0.5,0.5 0.0 0,0 22.337907,10.074219000000001 A 0.5,0.5 0.0 0,0 22.947282,9.7167969 L 23.013692000000002,9.4570313 L 23.076192000000002,9.1933594 L 23.132832000000004,8.9335938 L 23.181662000000003,8.6757813 L 23.224632000000003,8.4199219 L 23.261742,8.1679688 L 23.291042,7.916015600000001 L 23.314482,7.673828100000001 A 0.5,0.5 0.0 0,0 22.867216000000003,7.126953100000001 L 22.867187,7.1269531 M 21.619141000000003,11.011719 A 0.5,0.5 0.0 0,0 21.343750000000004,11.277344 L 21.250000000000004,11.492187999999999 L 21.152340000000002,11.705077999999999 L 21.050777000000004,11.919921999999998 L 20.945308000000004,12.136718999999998 L 20.833980000000004,12.355468999999998 L 20.718746000000003,12.574218999999998 L 20.599605000000004,12.794921999999998 L 20.472652000000004,13.021483999999997 A 0.5,0.5 0.0 0,0 20.666012000000002,13.701171999999998 A 0.5,0.5 0.0 0,0 21.345699000000003,13.509765999999997 L 21.474605000000004,13.277343999999998 L 21.601558000000004,13.044921999999998 L 21.722652000000004,12.812499999999998 L 21.839840000000002,12.582030999999999 L 21.951168000000003,12.353515999999999 L 22.060543000000003,12.124999999999998 L 22.162105000000004,11.898437999999999 L 22.259765000000005,11.677734 A 0.5,0.5 0.0 0,0 22.001952000000006,11.019530999999999 A 0.5,0.5 0.0 0,0 21.619140000000005,11.011731 L 21.619141000000003,11.011719 M 20.130859,14.548828 A 0.5,0.5 0.0 0,0 19.433594,14.666016 L 19.15625,15.056641 L 18.869141,15.447266 L 18.566406,15.839844000000001 L 18.248047,16.240234 A 0.5,0.5 0.0 0,0 18.328127,16.943359 A 0.5,0.5 0.0 0,0 19.031252,16.863279000000002 L 19.355470999999998,16.457029000000002 L 19.667970999999998,16.048826000000002 L 19.966798999999998,15.642576000000002 L 20.25,15.244141 A 0.5,0.5 0.0 0,0 20.130859,14.548828 M 14.783034,12.805026 L 14.682934000000001,13.703526 L 15.593534000000002,13.449626 L 15.674134000000002,14.064826 L 14.844034000000002,14.123426 L 15.388434000000002,14.848526 L 14.834234000000002,15.143926 L 14.453434000000001,14.379726 L 14.118934000000001,15.139026 L 13.542734000000001,14.848526 L 14.082334000000001,14.123426 L 13.257134,14.059926 L 13.352334,13.449626 L 14.243434,13.703526 L 14.143334000000001,12.805026 L 14.783034,12.805026 M 13.384534,7.2113261 L 13.284434000000001,8.1097261 L 14.195134000000001,7.8558261 L 14.275634000000002,8.4710261 L 13.445634000000002,8.5296261 L 13.990034000000001,9.2547261 L 13.435834000000002,9.5501261 L 13.054934000000001,8.7860261 L 12.720534,9.5453261 L 12.144334,9.254726100000001 L 12.683834000000001,8.529626100000002 L 11.858634,8.466226100000002 L 11.953934,7.855826100000002 L 12.845034,8.109726100000001 L 12.744934,7.211326100000002 L 13.384534,7.2113261 M 18.977834,7.2113261 L 18.877734,8.1097261 L 19.788334,7.8558261 L 19.868934,8.4710261 L 19.038833999999998,8.5296261 L 19.583333999999997,9.2547261 L 19.029133999999996,9.5501261 L 18.648233999999995,8.7860261 L 18.313733999999997,9.5453261 L 17.737633999999996,9.254726100000001 L 18.277133999999997,8.529626100000002 L 17.451933999999998,8.466226100000002 L 17.547133999999996,7.855826100000002 L 18.438233999999998,8.109726100000001 L 18.338133999999997,7.211326100000002 L 18.977834,7.2113261 ", + ], + iconName: "olympus-buttons-threat-evade" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsThreatManoeuvre: IconDefinition = { + icon: [ + 23.317165, + 17.896727, + [], + "", + "M 0.02182384,14.515426 C -0.02347616,14.627326 0.0031838400000000003,14.755226 0.08844384,14.840425999999999 C 0.17370384,14.925726 0.30158384,14.952326 0.41349384,14.907025999999998 L 2.3718038,14.123725999999998 C 2.5236837999999997,14.062425999999999 2.6609038,13.973225999999999 2.7768037999999997,13.857325999999997 L 3.8025838,12.831525999999997 L 6.8399338,13.630825999999997 L 6.5895338,13.881225999999998 C 6.4123338,14.058425999999997 6.4123338,14.343525999999999 6.5895338,14.520725999999998 C 6.7667338,14.697925999999997 7.0518338,14.697925999999997 7.2289338,14.520725999999998 L 7.9750338,13.774725999999998 L 8.4013338,13.348425999999998 L 8.721033799999999,13.028625999999997 C 8.898233799999998,12.851525999999998 8.898233799999998,12.566425999999998 8.721033799999999,12.389225999999997 C 8.5438338,12.212025999999998 8.258733799999998,12.212025999999998 8.081533799999999,12.389225999999997 L 7.975033799999999,12.495825999999997 L 6.056633799999999,10.577425999999997 L 6.492233799999999,10.141825999999998 L 7.955033799999999,10.237725999999999 C 8.0416338,10.244326 8.126833799999998,10.212425999999999 8.1881338,10.151125999999998 L 8.4013338,9.938026099999998 C 8.5185338,9.820726099999998 8.5185338,9.628926099999997 8.4013338,9.511726099999999 L 7.1224338,8.232826099999999 L 6.2698338,9.0854261 C 6.1525338,9.2026261 5.9607338,9.2026261 5.8435337999999994,9.0854261 C 5.726233799999999,8.9681261 5.726233799999999,8.776326099999999 5.8435337999999994,8.6591261 L 6.696133799999999,7.8065261 L 5.417233799999999,6.5276261 C 5.299933799999999,6.4103261 5.108133799999999,6.4103261 4.990933799999999,6.5276261 L 4.777733799999999,6.7407261 C 4.716433799999999,6.8020261 4.684433799999999,6.8872260999999995 4.691133799999999,6.9738261 L 4.7870338,8.4366261 L 4.3514338,8.872226099999999 L 2.4330938,6.9539260999999986 L 2.5396638,6.847326099999998 C 2.7168338,6.670126099999998 2.7168338,6.385026099999998 2.5396638,6.207826099999998 C 2.3624938,6.030726099999998 2.0773838,6.030726099999998 1.9002138,6.207826099999998 L 1.5804938,6.527626099999998 L 1.1541937999999998,6.9539260999999986 L 0.40816383999999983,7.699926099999999 C 0.23099383999999984,7.877126099999999 0.23099383999999984,8.1622261 0.40816383999999983,8.3393261 C 0.5853338399999999,8.516526099999998 0.8704438399999999,8.516526099999998 1.0476137999999997,8.3393261 L 1.2980237999999997,8.088926099999998 L 2.0973838,11.126325999999999 L 1.0716037999999999,12.152125999999999 C 0.9556938399999999,12.268025999999999 0.8664338399999999,12.405225999999999 0.8051538399999999,12.557125999999998 L 0.02182384,14.515426 M 17.644531,0.00390625 L 17.402344,0.03515625 L 17.148436999999998,0.078125 L 16.892577999999997,0.13085937 L 16.636718999999996,0.19335937 L 16.376952999999997,0.26367187000000003 L 16.119140999999996,0.34179687000000003 L 15.859374999999995,0.42773437000000003 L 15.605468999999994,0.51953127 A 0.5,0.5 0.0 0,0 15.304687999999993,1.16015622 A 0.5,0.5 0.0 0,0 15.945312999999993,1.4609375199999999 L 16.187499999999993,1.37304652 L 16.421874999999993,1.29492152 L 16.654296999999993,1.22460952 L 16.884765999999992,1.16210952 L 17.109374999999993,1.10742252 L 17.332030999999994,1.06054752 L 17.550780999999994,1.0253915200000001 L 17.773436999999994,0.9960947200000001 A 0.5,0.5 0.0 0,0 18.205078,0.43554688 A 0.5,0.5 0.0 0,0 17.644531,0.00390625 M 19.498047,0.27539063 A 0.5,0.5 0.0 0,0 19.216797,0.53515625 A 0.5,0.5 0.0 0,0 19.458984,1.1992186999999999 L 19.533204,1.2324217 L 19.597654000000002,1.2656247 L 19.662104000000003,1.3007807 L 19.724604000000003,1.3378897 L 19.787104000000003,1.3769527000000001 L 19.847654000000002,1.4179687 L 19.908204,1.4609377000000001 L 19.966794,1.5078127000000001 L 20.082028,1.5996097 L 20.193356,1.6972657 L 20.304684,1.7968747 L 20.412106,1.8984372 L 20.517575,2.003906 L 20.619138,2.1113278 L 20.7207,2.2207028 L 20.822263,2.3378903 A 0.5,0.5 0.0 0,0 21.527341,2.3886713000000004 A 0.5,0.5 0.0 0,0 21.576171,1.6835931000000004 L 21.466796,1.5566400000000005 L 21.349608,1.4277338000000004 L 21.230468,1.3027338000000004 L 21.107421,1.1816400000000005 L 20.982421,1.0624994000000005 L 20.855468,0.9472650300000005 L 20.724608,0.8339837800000005 L 20.589843,0.7246087700000006 L 20.505862999999998,0.6601556700000005 L 20.419922999999997,0.5976556700000005 L 20.332032999999996,0.5390618700000005 L 20.244142999999994,0.4824212700000005 L 20.152342999999995,0.4296868700000005 L 20.060542999999996,0.37890557000000047 L 19.968742999999996,0.33203057000000047 L 19.880852999999995,0.29296807000000047 A 0.5,0.5 0.0 0,0 19.498047,0.27539063 M 14.099609,1.3496094 A 0.5,0.5 0.0 0,0 13.71875,1.390625 L 13.498047,1.5117187 L 13.275390999999999,1.6386719 L 13.052734,1.7675781000000002 L 12.832030999999999,1.8984375000000002 L 12.615234,2.0332031 L 12.398437999999999,2.1679688 L 12.183594,2.3066406 L 11.972655999999999,2.4433594000000003 A 0.5,0.5 0.0 0,0 11.830077999999999,3.1367188 A 0.5,0.5 0.0 0,0 12.523437999999999,3.2792969000000003 L 12.728515999999999,3.1445313 L 12.933594,3.0117188 L 13.142577999999999,2.8828125 L 13.351562999999999,2.7539063 L 13.560546999999998,2.6289063 L 13.773437999999999,2.5058594000000003 L 13.984374999999998,2.3847656 L 14.201171999999998,2.2675781 A 0.5,0.5 0.0 0,0 14.398438,1.5878906 A 0.5,0.5 0.0 0,0 14.099609,1.3496094 M 22.056641,3.2441406 A 0.5,0.5 0.0 0,0 21.783203,3.8945313 L 21.871093000000002,4.1113281 L 21.949223000000003,4.3222656 L 22.021493000000003,4.5390625 L 22.085943000000004,4.7617187 L 22.144533000000003,4.9882812 L 22.197263000000003,5.220703100000001 L 22.242183000000004,5.4570312 L 22.279293000000003,5.705078100000001 A 0.5,0.5 0.0 0,0 22.851558000000004,6.1230469 A 0.5,0.5 0.0 0,0 23.267574000000003,5.5527344 L 23.226554000000004,5.2871094 L 23.175774000000004,5.017578100000001 L 23.117184000000005,4.7539062 L 23.050774000000004,4.4960937 L 22.976554000000004,4.2402344 L 22.892574000000003,3.9921875000000004 L 22.802734000000004,3.7480469000000003 L 22.708984000000004,3.5175781 A 0.5,0.5 0.0 0,0 22.056641,3.2441406 M 10.316406,3.6347656 L 10.099609,3.8046875 L 9.8867188,3.9765625 L 9.6796875,4.1445312 L 9.4785156,4.3105469 L 9.1015625,4.6328125 L 8.7597656,4.9375 A 0.5,0.5 0.0 0,0 8.71875,5.6425781 A 0.5,0.5 0.0 0,0 9.4238281,5.6855469 L 9.7597656,5.3867187 L 10.123047,5.0761719 L 10.314453,4.9160156 L 10.513672,4.7539062 L 10.71875,4.5898437 L 10.933594,4.4238281 A 0.5,0.5 0.0 0,0 11.019534,3.7207030999999997 A 0.5,0.5 0.0 0,0 10.316409,3.6347660999999998 L 10.316406,3.6347656 M 22.867187,7.1269531 A 0.5,0.5 0.0 0,0 22.320312,7.576171899999999 L 22.296872,7.8066406 L 22.269532,8.0351563 L 22.236332,8.265625 L 22.197272,8.4980469 L 22.152352,8.734375 L 22.101572,8.9746094 L 22.042982000000002,9.2167969 L 21.978532,9.4648438 A 0.5,0.5 0.0 0,0 22.337907,10.074219000000001 A 0.5,0.5 0.0 0,0 22.947282,9.7167969 L 23.013692000000002,9.4570313 L 23.076192000000002,9.1933594 L 23.132832000000004,8.9335938 L 23.181662000000003,8.6757813 L 23.224632000000003,8.4199219 L 23.261742,8.1679688 L 23.291042,7.916015600000001 L 23.314482,7.673828100000001 A 0.5,0.5 0.0 0,0 22.867216000000003,7.126953100000001 L 22.867187,7.1269531 M 21.619141000000003,11.011719 A 0.5,0.5 0.0 0,0 21.343750000000004,11.277344 L 21.250000000000004,11.492187999999999 L 21.152340000000002,11.705077999999999 L 21.050777000000004,11.919921999999998 L 20.945308000000004,12.136718999999998 L 20.833980000000004,12.355468999999998 L 20.718746000000003,12.574218999999998 L 20.599605000000004,12.794921999999998 L 20.472652000000004,13.021483999999997 A 0.5,0.5 0.0 0,0 20.666012000000002,13.701171999999998 A 0.5,0.5 0.0 0,0 21.345699000000003,13.509765999999997 L 21.474605000000004,13.277343999999998 L 21.601558000000004,13.044921999999998 L 21.722652000000004,12.812499999999998 L 21.839840000000002,12.582030999999999 L 21.951168000000003,12.353515999999999 L 22.060543000000003,12.124999999999998 L 22.162105000000004,11.898437999999999 L 22.259765000000005,11.677734 A 0.5,0.5 0.0 0,0 22.001952000000006,11.019530999999999 A 0.5,0.5 0.0 0,0 21.619140000000005,11.011731 L 21.619141000000003,11.011719 M 20.130859,14.548828 A 0.5,0.5 0.0 0,0 19.433594,14.666016 L 19.15625,15.056641 L 18.869141,15.447266 L 18.566406,15.839844000000001 L 18.248047,16.240234 A 0.5,0.5 0.0 0,0 18.328127,16.943359 A 0.5,0.5 0.0 0,0 19.031252,16.863279000000002 L 19.355470999999998,16.457029000000002 L 19.667970999999998,16.048826000000002 L 19.966798999999998,15.642576000000002 L 20.25,15.244141 A 0.5,0.5 0.0 0,0 20.130859,14.548828 ", + ], + iconName: "olympus-buttons-threat-manoeuvre" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsThreatNone: IconDefinition = { + icon: [ + 9.3896503, + 9.3896503, + [], + "", + "M 9.103975,1.603975 C 9.484875,1.252475 9.484875,0.6371749999999999 9.103975,0.2856749999999999 C 8.752475,-0.09522500000000012 8.137175000000001,-0.09522500000000012 7.785675,0.2856749999999999 L 4.709475,3.3617749999999997 L 1.6039750000000002,0.2856749999999999 C 1.2524750000000002,-0.09522500000000012 0.6371750000000002,-0.09522500000000012 0.2856750000000001,0.2856749999999999 C -0.0952249999999999,0.6371749999999998 -0.0952249999999999,1.252475 0.2856750000000001,1.603975 L 3.3617749999999997,4.680175 L 0.2856749999999999,7.785675 C -0.09522500000000012,8.137175000000001 -0.09522500000000012,8.752475 0.2856749999999999,9.103975 C 0.6371749999999998,9.484875 1.252475,9.484875 1.603975,9.103975 L 4.709475,6.027875 L 7.785675,9.103975 C 8.137175000000001,9.484875 8.752475,9.484875 9.103975,9.103975 C 9.484875,8.752475 9.484875,8.137175000000001 9.103975,7.785675 L 6.027875,4.680175 L 9.103975,1.603975 ", + ], + iconName: "olympus-buttons-threat-none" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsThreatPassive: IconDefinition = { + icon: [ + 23.2749, + 12.9971, + [], + "", + "M 0.1977,6.4546 C 0.07745,6.5055 0.0,6.6237 0.0,6.7542 C 0.0,6.8846 0.07745,7.0028 0.1977,7.0538 L 2.2948899999999997,7.9525 C 2.4579299999999997,8.0219 2.6311799999999996,8.0585 2.8084999999999996,8.0585 L 4.3778,8.0585 L 6.089799999999999,10.993400000000001 L 5.7067,10.993400000000001 C 5.4356,10.993400000000001 5.217499999999999,11.211500000000001 5.217499999999999,11.482500000000002 C 5.217499999999999,11.753600000000002 5.435599999999999,11.971700000000002 5.7067,11.971700000000002 L 6.848,11.971700000000002 L 7.5002,11.971700000000002 L 7.9893,11.971700000000002 C 8.2604,11.971700000000002 8.4785,11.753600000000002 8.4785,11.482500000000002 C 8.4785,11.211500000000001 8.2604,10.993400000000001 7.9893,10.993400000000001 L 7.8263,10.993400000000001 L 7.8263,8.0585 L 8.4927,8.0585 L 9.5383,9.2508 C 9.5994,9.3221 9.6891,9.3629 9.7828,9.3629 L 10.1089,9.3629 C 10.2883,9.3629 10.435,9.2162 10.435,9.0368 L 10.435,7.0802 L 9.1306,7.0802 C 8.9513,7.0802 8.804599999999999,6.9334999999999996 8.804599999999999,6.7542 C 8.804599999999999,6.5748 8.951299999999998,6.4281 9.1306,6.4281 L 10.435,6.4281 L 10.435,4.4715 C 10.435,4.2921 10.288300000000001,4.1453999999999995 10.1089,4.1453999999999995 L 9.7828,4.1453999999999995 C 9.6891,4.1453999999999995 9.5994,4.1861 9.5383,4.2574 L 8.4927,5.4498 L 7.8263,5.4498 L 7.8263,2.5149 L 7.9893,2.5149 C 8.2604,2.5149 8.4785,2.2967999999999997 8.4785,2.0258 C 8.4785,1.7546999999999997 8.2604,1.5365999999999997 7.9893,1.5365999999999997 L 7.5002,1.5365999999999997 L 6.848,1.5365999999999997 L 5.7067,1.5365999999999997 C 5.4356,1.5365999999999997 5.217499999999999,1.7546999999999997 5.217499999999999,2.0258 C 5.217499999999999,2.2967999999999997 5.435599999999999,2.5149 5.7067,2.5149 L 6.0898,2.5149 L 4.3778,5.4498 L 2.8085,5.4498 C 2.63118,5.4498 2.45793,5.4864999999999995 2.29489,5.5558 L 0.1977,6.4546 M 12.839844,6.0488281 L 12.839844,7.0488281 L 14.839844,7.0488281 L 14.839844,6.0488281 L 12.839844,6.0488281 M 16.839844,6.0488281 L 16.839844,7.0488281 L 18.839844,7.0488281 L 18.839844,6.0488281 L 16.839844,6.0488281 M 20.839844,6.0488281 L 20.839844,7.0488281 L 22.839844,7.0488281 L 22.839844,6.0488281 L 20.839844,6.0488281 M 16.4116,9.0 L 16.3116,9.8984 L 17.222199999999997,9.6445 L 17.302799999999998,10.2597 L 16.472699999999996,10.3183 L 17.017099999999996,11.0434 L 16.462899999999994,11.3389 L 16.0821,10.5747 L 15.7476,11.334 L 15.1714,11.0434 L 15.711,10.3183 L 14.8858,10.2549 L 14.981,9.6445 L 15.8721,9.8984 L 15.772,9.0 L 16.4116,9.0 M 21.4116,10.6582 L 21.3116,11.556600000000001 L 22.222199999999997,11.302700000000002 L 22.302799999999998,11.918000000000001 L 21.472699999999996,11.976500000000001 L 22.017099999999996,12.701600000000001 L 21.462899999999994,12.997100000000001 L 21.082099999999993,12.2329 L 20.747599999999995,12.9922 L 20.171399999999995,12.701600000000001 L 20.710999999999995,11.976500000000001 L 19.885799999999996,11.913100000000002 L 19.980999999999995,11.302700000000002 L 20.872099999999996,11.556600000000001 L 20.771999999999995,10.6582 L 21.4116,10.6582 M 21.4116,0.0 L 21.3116,0.8984 L 22.222199999999997,0.6445 L 22.302799999999998,1.2597 L 21.472699999999996,1.3183 L 22.017099999999996,2.0434 L 21.4629,2.3389 L 21.0821,1.5747 L 20.7476,2.334 L 20.1714,2.0434 L 20.711,1.3183 L 19.8858,1.2549 L 19.981,0.6445 L 20.8721,0.8984 L 20.772,0.0 L 21.4116,0.0 M 16.4116,1.6582 L 16.3116,2.5566 L 17.222199999999997,2.3026999999999997 L 17.302799999999998,2.9179999999999997 L 16.472699999999996,2.9764999999999997 L 17.017099999999996,3.7015999999999996 L 16.4629,3.9971 L 16.0821,3.2329 L 15.7476,3.9922 L 15.1714,3.7016 L 15.711,2.9765 L 14.8858,2.9131 L 14.981,2.3027 L 15.8721,2.5566 L 15.772,1.6582 L 16.4116,1.6582 ", + ], + iconName: "olympus-buttons-threat-passive" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsToolsDrawPolygonSolid: IconDefinition = { + icon: [ + 448.0, + 512.0, + [], + "", + "M 96.0,151.4 L 96.0,360.6 C 105.7,366.20000000000005 113.8,374.3 119.4,384.0 L 328.6,384.0 C 328.6,383.9 328.70000000000005,383.8 328.70000000000005,383.7 L 324.20000000000005,375.8 L 292.20000000000005,319.8 L 292.20000000000005,319.8 C 290.80000000000007,319.90000000000003 289.40000000000003,319.90000000000003 288.00000000000006,319.90000000000003 C 252.70000000000005,319.90000000000003 224.00000000000006,291.20000000000005 224.00000000000006,255.90000000000003 C 224.00000000000006,220.60000000000002 252.70000000000005,191.90000000000003 288.00000000000006,191.90000000000003 C 289.40000000000003,191.90000000000003 290.80000000000007,191.90000000000003 292.20000000000005,192.00000000000003 L 292.20000000000005,192.00000000000003 L 324.20000000000005,136.00000000000003 L 328.70000000000005,128.10000000000002 L 328.6,127.80000000000003 L 119.4,127.80000000000003 C 113.80000000000001,137.50000000000003 105.7,145.60000000000002 96.0,151.20000000000002 L 96.0,151.4 M 384.3,352.0 C 419.5,352.2 448.0,380.7 448.0,416.0 C 448.0,451.3 419.3,480.0 384.0,480.0 C 360.3,480.0 339.6,467.1 328.6,448.0 L 119.4,448.0 C 108.30000000000001,467.1 87.7,480.0 64.0,480.0 C 28.700000000000003,480.0 0.0,451.3 0.0,416.0 C 0.0,392.3 12.9,371.6 32.0,360.6 L 32.0,151.4 C 12.9,140.4 0.0,119.7 0.0,96.0 C 0.0,60.7 28.7,32.0 64.0,32.0 C 87.7,32.0 108.4,44.9 119.4,64.0 L 328.6,64.0 C 339.70000000000005,44.9 360.3,32.0 384.0,32.0 C 419.3,32.0 448.0,60.7 448.0,96.0 C 448.0,131.3 419.5,159.8 384.3,160.0 L 379.8,167.9 L 347.8,223.9 L 345.5,227.9 C 349.7,236.4 352.0,245.9 352.0,256.0 C 352.0,266.1 349.7,275.6 345.5,284.1 L 347.8,288.1 L 379.8,344.1 L 384.3,352.0 ", + ], + iconName: "olympus-buttons-tools-draw-polygon-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsToolsGround: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 130.61192,122.94993 C 135.4459,120.53282999999999 141.13926,120.53282999999999 145.97324,122.94993 L 231.91074,165.92077999999998 C 240.39707,170.16413999999997 243.83457,180.47714999999997 239.5914,188.96389999999997 C 236.58359,194.97982999999996 230.51425999999998,198.47119999999995 224.23008,198.47119999999995 L 224.23008,241.44204999999994 C 224.23008,250.94933999999995 216.54942,258.63037999999995 207.04258,258.63037999999995 L 204.41073999999998,258.63037999999995 L 221.59823999999998,361.76041999999995 L 488.28553,361.76041999999995 C 497.79236,361.76041999999995 505.47303,369.44147 505.47303,378.94876999999997 C 505.47303,388.45606999999995 497.79236,396.1371 488.28553,396.1371 L 207.31112000000002,396.1371 L 206.72031,396.1371 L 69.86485,396.1371 L 69.27404,396.1371 L 17.98008,396.1371 C 8.47325,396.1371 0.792580000000001,388.45606999999995 0.792580000000001,378.94876999999997 C 0.792580000000001,369.44147 8.47325,361.76041999999995 17.98008,361.76041999999995 L 54.98692,361.76041999999995 L 72.17442,258.63037999999995 L 69.54258,258.63037999999995 C 60.035740000000004,258.63037999999995 52.35508,250.94933999999995 52.35508,241.44204999999994 L 52.35508,198.4712 C 46.0709,198.4712 40.00157,194.97983000000002 36.99376,188.96390000000002 C 32.75059,180.47715000000002 36.18809,170.16414000000003 44.67442,165.92078000000004 L 130.61192,122.94993 M 169.71347,361.76041999999995 L 138.29258,335.54819999999995 L 106.87167999999998,361.76041999999995 L 169.71347,361.76041999999995 M 107.03281,258.63037999999995 L 104.5084,273.83133999999995 L 138.29258,302.03094999999996 L 172.07675999999998,273.83133999999995 L 169.55235,258.63037999999995 L 107.03281,258.63037999999995 M 99.56699,303.32006999999993 L 93.55138000000001,339.30814999999996 L 118.15099000000001,318.78957999999994 L 99.56699,303.32006999999993 M 158.43417,318.78957999999994 L 183.03377999999998,339.25444999999996 L 177.01816999999997,303.26635999999996 L 158.43417,318.78957999999994 M 95.32383,189.87702 C 90.59727,189.87702 86.73009,193.74439999999998 86.73009,198.47119999999998 C 86.73009,203.19798999999998 90.59727000000001,207.06536999999997 95.32383,207.06536999999997 L 181.26133,207.06536999999997 C 185.98789,207.06536999999997 189.85506999999998,203.19798999999998 189.85506999999998,198.47119999999998 C 189.85506999999998,193.74439999999998 185.98789,189.87702 181.26133,189.87702 L 95.32383,189.87702 M 398.88439,290.60444 L 342.70131,231.25412 C 337.87633,226.19114 331.19374999999997,223.3234 324.20610999999997,223.40853 L 304.06771,223.5857 C 299.18694999999997,223.6504 296.23593,228.98179 298.75190999999995,233.1365 L 334.31388999999996,291.77314 L 290.89824,292.56170000000003 L 274.82212,273.40229000000005 C 272.42384999999996,270.52825000000007 268.82572,268.8598400000001 265.08617,268.91354000000007 L 250.95253999999997,269.05021000000005 C 246.86185999999998,269.10751000000005 243.89640999999997,272.94628000000006 244.93553999999997,276.90456000000006 L 256.04164999999995,319.58833000000004 C 256.97155999999995,323.14381000000003 259.40593999999993,326.12283 262.68738999999994,327.7241 L 311.27397999999994,351.43296000000004 C 313.03819999999996,352.29385 314.97372999999993,352.71410000000003 316.90505999999993,352.69542 L 436.68116999999995,351.5548 C 457.1001299999999,351.33981 476.68962999999997,343.42446 491.53171999999995,329.3918 C 499.22259999999994,322.13583 497.27323999999993,309.38933 487.74643999999995,304.74052 L 467.49319999999994,294.85752 C 460.36576999999994,291.37954 452.48243999999994,289.62964 444.54720999999995,289.77661 L 398.88439,290.60444 ", + ], + iconName: "olympus-buttons-tools-ground" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsToolsPenSolid: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 362.7,19.3 L 314.3,67.7 L 444.3,197.7 L 492.7,149.29999999999998 C 517.7,124.29999999999998 517.7,83.79999999999998 492.7,58.79999999999998 L 453.3,19.3 C 428.3,-5.699999999999999 387.8,-5.699999999999999 362.8,19.3 L 362.7,19.3 M 291.7,90.3 L 58.6,323.5 C 48.2,333.9 40.6,346.8 36.400000000000006,360.9 L 1.0,481.2 C -1.5,489.7 0.8,498.8 7.0,505.0 C 13.2,511.2 22.3,513.5 30.7,511.1 L 151.0,475.70000000000005 C 165.1,471.50000000000006 178.0,463.90000000000003 188.4,453.50000000000006 L 421.7,220.3 L 291.7,90.3 ", + ], + iconName: "olympus-buttons-tools-pen-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsToolsTower: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 130.61192,122.94993 C 135.4459,120.53282999999999 141.13926,120.53282999999999 145.97324,122.94993 L 231.91074,165.92077999999998 C 240.39707,170.16413999999997 243.83457,180.47714999999997 239.5914,188.96389999999997 C 236.58359,194.97982999999996 230.51425999999998,198.47119999999995 224.23008,198.47119999999995 L 224.23008,241.44204999999994 C 224.23008,250.94933999999995 216.54942,258.63037999999995 207.04258,258.63037999999995 L 204.41073999999998,258.63037999999995 L 221.59823999999998,361.76041999999995 L 488.28553,361.76041999999995 C 497.79236,361.76041999999995 505.47303,369.44147 505.47303,378.94876999999997 C 505.47303,388.45606999999995 497.79236,396.1371 488.28553,396.1371 L 207.31112000000002,396.1371 L 206.72031,396.1371 L 69.86485,396.1371 L 69.27404,396.1371 L 17.98008,396.1371 C 8.47325,396.1371 0.792580000000001,388.45606999999995 0.792580000000001,378.94876999999997 C 0.792580000000001,369.44147 8.47325,361.76041999999995 17.98008,361.76041999999995 L 54.98692,361.76041999999995 L 72.17442,258.63037999999995 L 69.54258,258.63037999999995 C 60.035740000000004,258.63037999999995 52.35508,250.94933999999995 52.35508,241.44204999999994 L 52.35508,198.4712 C 46.0709,198.4712 40.00157,194.97983000000002 36.99376,188.96390000000002 C 32.75059,180.47715000000002 36.18809,170.16414000000003 44.67442,165.92078000000004 L 130.61192,122.94993 M 169.71347,361.76041999999995 L 138.29258,335.54819999999995 L 106.87167999999998,361.76041999999995 L 169.71347,361.76041999999995 M 107.03281,258.63037999999995 L 104.5084,273.83133999999995 L 138.29258,302.03094999999996 L 172.07675999999998,273.83133999999995 L 169.55235,258.63037999999995 L 107.03281,258.63037999999995 M 99.56699,303.32006999999993 L 93.55138000000001,339.30814999999996 L 118.15099000000001,318.78957999999994 L 99.56699,303.32006999999993 M 158.43417,318.78957999999994 L 183.03377999999998,339.25444999999996 L 177.01816999999997,303.26635999999996 L 158.43417,318.78957999999994 M 95.32383,189.87702 C 90.59727,189.87702 86.73009,193.74439999999998 86.73009,198.47119999999998 C 86.73009,203.19798999999998 90.59727000000001,207.06536999999997 95.32383,207.06536999999997 L 181.26133,207.06536999999997 C 185.98789,207.06536999999997 189.85506999999998,203.19798999999998 189.85506999999998,198.47119999999998 C 189.85506999999998,193.74439999999998 185.98789,189.87702 181.26133,189.87702 L 95.32383,189.87702 M 387.14987,87.347348 L 328.52455000000003,65.35909799999999 C 323.50125,63.49415799999999 317.9365,63.764867999999986 313.15383,66.17124799999999 L 299.34725000000003,73.05949799999999 C 296.00841,74.74395799999999 295.76777000000004,79.406308 298.89606000000003,81.42164799999999 L 343.08313000000004,109.84696 L 313.45463000000007,124.97704999999999 L 295.9482500000001,117.18641 C 293.3313100000001,116.0133 290.29327000000006,116.07346 287.73649000000006,117.36689 L 278.0508300000001,122.20972 C 275.25342000000006,123.62346000000001 274.5014300000001,127.26310000000001 276.54685000000006,129.6394 L 298.53510000000006,155.29738 C 300.36996000000005,157.43304 303.04706000000004,158.6663 305.84447000000006,158.6663 L 347.2642000000001,158.6663 C 348.76819000000006,158.6663 350.2420900000001,158.30535 351.5656000000001,157.64359000000002 L 433.65308000000005,116.61489000000002 C 447.64014000000003,109.60633000000001 458.46883,97.57444800000002 463.97341000000006,82.92563800000002 C 466.83098000000007,75.34555800000003 461.20608000000004,67.22403800000002 453.08456000000007,67.22403800000002 L 435.8188200000001,67.22403800000002 C 429.7427200000001,67.22403800000002 423.7267800000001,68.66785800000002 418.3124400000001,71.43519800000001 L 387.14987,87.347348 ", + ], + iconName: "olympus-buttons-tools-tower" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityAirbase: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 5.921875,4.6113281 L 5.3164062,5.0527344 L 5.5371094,5.3554687 L 9.5761719,10.880859 L 9.796875,11.183594 L 10.400391,10.740234 L 10.179688,10.439453 L 6.1425781,4.9140625 L 5.921875,4.6113281 M 5.5449219,8.1777344 L 5.4941409000000005,8.9257813 L 5.8691409000000005,8.951172300000001 L 10.7597663,9.275391 L 11.1328133,9.300782000000002 L 11.1835933,8.552735100000001 L 10.810547,8.5292969 L 5.9179687,8.203125 L 5.5449219,8.1777344 M 8.0019531,0.08203125 C 3.6285235999999994,0.08203125 0.0546875,3.6558674 0.0546875,8.0292969 C 0.0546875,12.402726000000001 3.6285236,15.976563 8.0019531,15.976563 C 12.375383,15.976563 15.949219,12.402726000000001 15.949219,8.0292969 C 15.949219,3.6558674 12.375383,0.08203125 8.0019531,0.08203125 M 8.0019531,2.7792969 C 10.917666,2.7792969 13.251953,5.1135842 13.251953,8.0292969 C 13.251953,10.94501 10.917666,13.279297 8.001953100000001,13.279297 C 5.0862405000000015,13.279297 2.7519531000000015,10.94501 2.7519531000000015,8.029296899999999 C 2.7519531000000015,5.113584199999998 5.0862405000000015,2.7792968999999985 8.001953100000001,2.7792968999999985 L 8.0019531,2.7792969 ", + ], + iconName: "olympus-buttons-visibility-airbase" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityAircraft: IconDefinition = { + icon: [ + 15.75, + 14.0, + [], + "", + "M 13.1797,5.25 C 14.1094,5.25 15.75,6.043 15.75,7.0 C 15.75,7.9844 14.1094,8.75 13.1797,8.75 L 9.9805,8.75 L 7.2461,13.5625 C 7.082,13.8359 6.7812,14.0 6.4805,14.0 L 4.9492,14.0 C 4.6484,14.0 4.4297,13.7266 4.5117,13.4531 L 5.8516,8.75 L 3.0625,8.75 L 1.85938,10.3359 C 1.77734,10.4453 1.66797,10.5 1.53125,10.5 L 0.38281,10.5 C 0.16406,10.5 0.0,10.3359 0.0,10.1172 C 0.0,10.0898 0.0,10.0625 0.0,10.0352 L 0.875,7.0 L 0.0,3.9922 C 0.0,3.9648 0.0,3.9375 0.0,3.8828 C 0.0,3.6914 0.16406,3.5 0.38281,3.5 L 1.53125,3.5 C 1.66797,3.5 1.77734,3.582 1.85938,3.6914 L 3.0625,5.25 L 5.8516,5.25 L 4.5117,0.57422 C 4.4297,0.30078 4.6484,0.0 4.9492,0.0 L 6.4805,0.0 C 6.7812,0.0 7.082,0.19141 7.2461,0.46484 L 9.9805,5.25 L 13.1797,5.25 ", + ], + iconName: "olympus-buttons-visibility-aircraft" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityCircleDot: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 256.0,512.0 A 256.0,256.0 0.0 1,0 256.0,0.0 A 256.0,256.0 0.0 1,0 256.0,512.0 M 256.0,160.0 A 96.0,96.0 0.0 1,1 256.0,352.0 A 96.0,96.0 0.0 1,1 256.0,160.0 ", + ], + iconName: "olympus-buttons-visibility-circle-dot" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityDcs: IconDefinition = { + icon: [ + 12.952619, + 10.362093, + [], + "", + "M 6.4763089,0.0 C 6.834529900000001,0.0 7.123939200000001,0.2894099 7.123939200000001,0.6476303 L 7.123939200000001,1.9428921 L 9.5525552,1.9428921 C 10.358047000000001,1.9428921 11.009726,2.5945706 11.009726,3.4000616 L 11.009726,8.904923499999999 C 11.009726,9.710414499999999 10.358047000000001,10.362091999999999 9.5525552,10.362091999999999 L 3.4000627,10.362091999999999 C 2.5945717999999998,10.362091999999999 1.9428933,9.710414499999999 1.9428933,8.904923499999999 L 1.9428933,3.4000616 C 1.9428933,2.5945706 2.5945717999999998,1.9428921 3.4000627,1.9428921 L 5.8286776,1.9428921 L 5.8286776,0.6476303 C 5.8286776,0.2894099 6.1180887,0.0 6.4763089,0.0 M 4.2096006,7.7715699 C 4.0315027,7.7715699 3.8857854,7.9172859 3.8857854,8.0953845 C 3.8857854,8.2734835 4.0315027,8.4192015 4.2096006,8.4192015 L 4.8572309,8.4192015 C 5.03533,8.4192015 5.1810473,8.2734835 5.1810473,8.0953845 C 5.1810473,7.9172858999999995 5.03533,7.771569899999999 4.8572309,7.771569899999999 L 4.2096006,7.7715699 M 6.1524939,7.7715699 C 5.9743949,7.7715699 5.8286776,7.9172859 5.8286776,8.0953845 C 5.8286776,8.2734835 5.9743949,8.4192015 6.1524939,8.4192015 L 6.8001239,8.4192015 C 6.9782229000000005,8.4192015 7.1239392,8.2734835 7.1239392,8.0953845 C 7.1239392,7.9172858999999995 6.9782229,7.771569899999999 6.8001239,7.771569899999999 L 6.1524939,7.7715699 M 8.0953862,7.7715699 C 7.9172882,7.7715699 7.7715712,7.9172859 7.7715712,8.0953845 C 7.7715712,8.2734835 7.917288200000001,8.4192015 8.0953862,8.4192015 L 8.7430172,8.4192015 C 8.921115200000001,8.4192015 9.066833200000001,8.2734835 9.066833200000001,8.0953845 C 9.066833200000001,7.9172858999999995 8.921115200000001,7.771569899999999 8.7430172,7.771569899999999 L 8.0953862,7.7715699 M 5.3429549,5.1810458 A 0.8095391,0.8095391 0.0 1,0 3.7238767,5.1810458 A 0.8095391,0.8095391 0.0 1,0 5.3429549,5.1810458 M 8.419202199999999,5.9905838 A 0.80953865,0.80953865 0.0 1,0 8.419202199999999,4.371506699999999 A 0.80953865,0.80953865 0.0 1,0 8.419202199999999,5.9905838 M 0.9714467,4.5334156 L 1.2952617,4.5334156 L 1.2952617,8.4192015 L 0.9714467,8.4192015 C 0.4351272,8.4192015 0.0,7.9840739 0.0,7.4477529 L 0.0,5.504861 C 0.0,4.9685428 0.4351272,4.5334156 0.9714467,4.5334156 M 11.981171999999999,4.5334156 C 12.517491,4.5334156 12.952618,4.9685428 12.952618,5.504861 L 12.952618,7.4477529 C 12.952618,7.9840739 12.517491,8.4192015 11.981171999999999,8.4192015 L 11.657355,8.4192015 L 11.657355,4.5334156 L 11.981171999999999,4.5334156 ", + ], + iconName: "olympus-buttons-visibility-dcs" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityFlag: IconDefinition = { + icon: [ + 14.0, + 16.0, + [], + "", + "M 64.0,32.0 C 64.0,14.3 49.7,0.0 32.0,0.0 C 14.299999999999997,0.0 0.0,14.3 0.0,32.0 L 0.0,64.0 L 0.0,368.0 L 0.0,480.0 C 0.0,497.7 14.3,512.0 32.0,512.0 C 49.7,512.0 64.0,497.7 64.0,480.0 L 64.0,352.0 L 128.3,335.9 C 169.4,325.59999999999997 212.9,330.4 250.8,349.29999999999995 C 295.0,371.4 346.3,374.09999999999997 392.5,356.69999999999993 L 427.2,343.69999999999993 C 439.7,338.99999999999994 448.0,327.0999999999999 448.0,313.69999999999993 L 448.0,66.1 C 448.0,43.099999999999994 423.8,28.099999999999994 403.2,38.39999999999999 L 393.59999999999997,43.19999999999999 C 347.29999999999995,66.39999999999999 292.79999999999995,66.39999999999999 246.49999999999997,43.19999999999999 C 211.39999999999998,25.599999999999987 171.09999999999997,21.19999999999999 132.99999999999997,30.69999999999999 L 64.0,48.0 L 64.0,32.0 ", + ], + iconName: "olympus-buttons-visibility-flag" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityGroundunitSam: IconDefinition = { + icon: [ + 19.0, + 15.27063, + [], + "", + "M 15.914594,10.690544 L 3.0123142,10.690544 C 2.0634942,10.690544 1.2916142000000002,11.462444 1.2916142000000002,12.411244 C 1.2916142000000002,12.437444 1.2923942000000002,12.463443999999999 1.2936242000000002,12.489444 C 1.2939942000000002,12.497744 1.2944742000000002,12.505944000000001 1.2949542000000003,12.514244000000001 C 1.2960342000000002,12.532544000000001 1.2974442000000004,12.550744000000002 1.2991142000000002,12.568944000000002 C 1.2998942000000002,12.577744000000003 1.3005642000000002,12.586444000000002 1.3015242000000002,12.595144000000001 C 1.3040542000000002,12.618344 1.3069442000000002,12.641544000000001 1.3103942000000002,12.664544000000001 C 1.3121442,12.676144 1.3142142,12.687644 1.3161842000000001,12.699244000000002 C 1.3183342000000002,12.711744000000001 1.3204942000000002,12.724244000000002 1.3229042000000002,12.736644000000002 C 1.3255042000000001,12.750144000000002 1.3282042000000003,12.763544000000001 1.3311042000000002,12.776944000000002 C 1.3332142000000002,12.786644000000003 1.3355242000000003,12.796244000000002 1.3378242000000002,12.805944000000002 C 1.3446142000000003,12.834844000000002 1.3521042000000003,12.863344000000001 1.3603442000000003,12.891644000000001 C 1.3617542000000002,12.896544 1.3630942000000004,12.901444000000001 1.3645442000000003,12.906344 C 1.3691442000000003,12.921744 1.3741142000000004,12.936844 1.3790842000000003,12.951944000000001 C 1.3815742000000004,12.959444000000001 1.3841342000000003,12.966944000000002 1.3866942000000002,12.974444000000002 C 1.3918842000000002,12.989244000000001 1.3971242000000001,13.004144000000002 1.4026842000000002,13.018844000000001 C 1.4051342000000002,13.025344000000002 1.4077742000000002,13.031644000000002 1.4102542000000002,13.038044000000001 C 1.4200942000000003,13.063144000000001 1.4304842000000002,13.087944 1.4414342000000002,13.112444000000002 C 1.4457742000000002,13.122144000000002 1.4500742000000002,13.131844000000001 1.4546042000000001,13.141544000000001 C 1.4599842,13.152844000000002 1.4654742,13.164144000000002 1.4710842000000002,13.175444 C 1.4771342,13.187644 1.4833642000000002,13.199644000000001 1.4897142,13.211744000000001 C 1.4943842,13.220644000000002 1.4990642,13.229644 1.5038842000000001,13.238444000000001 C 1.5153942,13.259444000000002 1.5273042000000001,13.280144000000002 1.5396542000000002,13.300644000000002 C 1.5415542000000002,13.303744000000002 1.5435142000000002,13.306744000000002 1.5454442000000002,13.309844000000002 C 1.5574342,13.329344000000003 1.5697942000000003,13.348544000000002 1.5825242000000002,13.367644000000002 C 1.5847842,13.370944000000001 1.5869742000000002,13.374244000000003 1.5892342000000002,13.377644000000002 C 1.7563742000000002,13.623644000000002 1.9870842000000002,13.826944000000001 2.2645542,13.960944000000001 C 2.2678942,13.962544000000001 2.2713042,13.964044000000001 2.2746842000000003,13.965644000000001 C 2.2878942,13.971844 2.3010742000000004,13.978244000000002 2.3145042000000005,13.984244 L 2.3257442000000004,13.988744 C 2.3573242000000003,14.002544 2.3892042000000004,14.015744 2.4217542000000005,14.027644 L 5.040794200000001,15.088444 C 5.0447942,15.090244 5.048994200000001,15.091644 5.0529942000000005,15.093444000000002 C 5.070094200000001,15.100744000000002 5.087594200000001,15.107444000000001 5.104794200000001,15.114344000000001 C 5.1227942,15.121444 5.140594200000001,15.128944 5.1586942,15.135644000000001 C 5.1765942,15.142244000000002 5.1947942000000005,15.148244000000002 5.2129942,15.154444000000002 C 5.2311942,15.160644000000001 5.2492942,15.167244000000002 5.2676942,15.173044 C 5.2832942,15.177944 5.2992942,15.182144000000001 5.3149942,15.186644000000001 C 5.3362942,15.192844000000001 5.3574942000000005,15.199344000000002 5.3788942,15.204944000000001 C 5.3891942,15.207544 5.3997942000000005,15.209744 5.4101942,15.212244000000002 C 5.4371942,15.218844000000002 5.464194200000001,15.225444000000001 5.4914942,15.231044000000002 C 5.4923942,15.231244000000002 5.4932942,15.231344000000002 5.4940942,15.231444000000003 C 5.6382942,15.260944000000004 5.7854942000000005,15.276044000000004 5.9347942,15.277244000000003 C 5.9409942,15.277244000000003 5.9470941999999996,15.277644000000004 5.9531941999999995,15.277644000000004 L 5.953294199999999,15.277644000000004 L 12.973294,15.277644000000004 C 12.973794,15.277644000000004 12.974193999999999,15.277644000000004 12.974594,15.277644000000004 C 12.974994,15.277644000000004 12.975494,15.277644000000004 12.975894,15.277644000000004 C 13.303694,15.277644000000004 13.615294,15.208144000000004 13.897594,15.083644000000003 L 16.532094,14.016844000000003 C 16.552894000000002,14.008844000000003 16.573694,14.000644000000003 16.594094000000002,13.991744000000002 L 16.595594000000002,13.991144000000002 L 16.611994000000003,13.984244000000002 C 16.625394000000004,13.978244000000002 16.638594,13.971844000000003 16.651794000000002,13.965644000000003 C 16.655194,13.964044000000003 16.658594,13.962444000000003 16.661994000000004,13.960944000000003 C 16.939394000000004,13.826944000000003 17.170194000000002,13.623644000000002 17.337294000000004,13.377644000000004 C 17.339494000000002,13.374344000000004 17.341794000000004,13.370944000000003 17.343994000000002,13.367644000000004 C 17.356694,13.348544000000004 17.369094,13.329344000000004 17.381094,13.309844000000004 C 17.382994,13.306744000000004 17.384994000000003,13.303644000000004 17.386794000000002,13.300644000000004 C 17.399194,13.280144000000004 17.411094000000002,13.259344000000004 17.422694000000003,13.238444000000003 C 17.427494000000003,13.229544000000002 17.432194000000003,13.220644000000004 17.436794000000003,13.211744000000003 C 17.443194000000002,13.199644000000003 17.449394,13.187644000000002 17.455494,13.175444000000002 C 17.461094000000003,13.164144000000002 17.466594,13.152944000000002 17.471894000000002,13.141544000000003 C 17.476394000000003,13.131844000000003 17.480794000000003,13.122144000000004 17.485094000000004,13.112444000000004 C 17.496094000000003,13.087944000000004 17.506494000000004,13.063144000000003 17.516294000000002,13.038044000000003 C 17.518794000000003,13.031644000000004 17.521494,13.025244000000002 17.523894000000002,13.018844000000003 C 17.529494000000003,13.004144000000004 17.534694000000002,12.989244000000003 17.539894,12.974344000000004 C 17.542494,12.966944000000003 17.544994,12.959444000000003 17.547494,12.951944000000005 C 17.552494,12.936744000000004 17.557494000000002,12.921644000000004 17.561994000000002,12.906344000000004 C 17.563494000000002,12.901444000000005 17.564794000000003,12.896444000000004 17.566194000000003,12.891544000000005 C 17.574394,12.863344000000005 17.581994,12.834744000000004 17.588794000000004,12.805944000000006 C 17.591094000000005,12.796244000000005 17.593294000000004,12.786644000000006 17.595494000000002,12.776844000000006 C 17.598394000000003,12.763544000000007 17.601094000000003,12.750144000000006 17.603694,12.736644000000005 C 17.606094000000002,12.724144000000006 17.608194,12.711644000000005 17.610394,12.699144000000006 C 17.612394,12.687644000000006 17.614394,12.676144000000006 17.616194,12.664544000000006 C 17.619594,12.641444000000007 17.622494,12.618344000000006 17.625094,12.595044000000007 C 17.625994000000002,12.586344000000008 17.626594,12.577644000000006 17.627494000000002,12.568944000000007 C 17.629194000000002,12.550744000000007 17.630494000000002,12.532544000000007 17.631594000000003,12.514144000000007 C 17.632094000000002,12.505944000000007 17.632594000000005,12.497744000000006 17.632994000000004,12.489444000000008 C 17.634094000000005,12.463444000000008 17.634994000000003,12.437344000000008 17.634994000000003,12.411244000000007 C 17.635294000000002,11.462444000000007 16.863394000000003,10.690544000000006 15.914594000000003,10.690544000000006 L 15.914594,10.690544 M 3.0123141999999987,13.056244 C 2.9294841999999988,13.056244 2.8504741999999985,13.040044 2.777664199999999,13.011444 L 2.7535041999999987,13.001643999999999 C 2.738554199999999,12.995043999999998 2.723824199999999,12.988043999999999 2.709534199999999,12.980343999999999 C 2.707824199999999,12.979543999999999 2.706004199999999,12.978743999999999 2.704304199999999,12.977744 C 2.687494199999999,12.968544 2.671164199999999,12.958544 2.6552841999999988,12.947944 C 2.652054199999999,12.945744 2.648934199999999,12.943544 2.645744199999999,12.941244 C 2.632824199999999,12.932243999999999 2.620244199999999,12.922944 2.608074199999999,12.913044 C 2.604884199999999,12.910544 2.601654199999999,12.907943999999999 2.598544199999999,12.905344 C 2.5694841999999993,12.881044 2.542654199999999,12.854144 2.5183041999999993,12.825044 C 2.5152641999999994,12.821444 2.512374199999999,12.817744 2.509404199999999,12.814044 C 2.5005341999999993,12.803044000000002 2.4920741999999994,12.791644000000002 2.483904199999999,12.780044 C 2.480714199999999,12.775544 2.4774841999999992,12.770944 2.474404199999999,12.766344 C 2.4645341999999992,12.751444 2.4551141999999992,12.736244000000001 2.4465041999999992,12.720444 C 2.444314199999999,12.716544 2.442494199999999,12.712344 2.440384199999999,12.708344 C 2.4340341999999993,12.696144 2.427984199999999,12.683744 2.422454199999999,12.671144 C 2.419454199999999,12.664344 2.416624199999999,12.657544 2.4138841999999987,12.650644 C 2.409434199999999,12.639444 2.4052741999999987,12.628143999999999 2.4014141999999987,12.616643999999999 C 2.399264199999999,12.610344 2.396964199999999,12.604144 2.3950341999999987,12.597643999999999 C 2.389914199999999,12.580744 2.385494199999999,12.563643999999998 2.3817441999999986,12.546143999999998 C 2.380554199999999,12.540443999999999 2.3796341999999986,12.534643999999998 2.3785941999999984,12.528943999999997 C 2.3760341999999985,12.515243999999997 2.3739141999999984,12.501443999999998 2.3722441999999986,12.487543999999998 C 2.3715441999999984,12.481543999999998 2.3708341999999987,12.475543999999998 2.3702841999999986,12.469643999999999 C 2.3685341999999987,12.450444 2.3673141999999987,12.431043999999998 2.3673141999999987,12.411344 C 2.3673141999999987,12.055743999999999 2.6566141999999986,11.766344 3.0122741999999985,11.766344 C 3.3679341999999983,11.766344 3.6571941999999984,12.055644000000001 3.6571941999999984,12.411344 C 3.6571941999999984,12.767044 3.3679641999999985,13.056244 3.0123141999999983,13.056244 L 3.0123141999999987,13.056244 M 5.953394199999998,14.201844 C 5.932494199999998,14.201844 5.911494199999998,14.201343999999999 5.890794199999998,14.200344 C 5.830094199999999,14.197244 5.770594199999999,14.189644 5.712594199999998,14.177944 C 5.711094199999998,14.177644 5.709494199999998,14.177344 5.707994199999998,14.177044 C 5.692394199999998,14.173844 5.676994199999998,14.170144 5.661494199999998,14.166344 C 5.657094199999998,14.165244000000001 5.6525941999999985,14.164344 5.648194199999998,14.163144 C 5.634994199999998,14.159744000000002 5.621894199999998,14.155844 5.608794199999998,14.151944 C 5.602194199999999,14.150044000000001 5.595594199999998,14.148244 5.588994199999998,14.146144 C 5.5774941999999985,14.142544 5.566194199999998,14.138544 5.554894199999999,14.134544 C 5.546894199999999,14.131744 5.538794199999999,14.129144 5.530794199999999,14.126144 C 5.520194199999999,14.122144 5.509694199999999,14.117844 5.499094199999999,14.113644 C 5.490794199999999,14.110244000000002 5.482494199999999,14.106944 5.4741941999999995,14.103444000000001 C 5.040294199999999,13.916944 4.7355941999999995,13.485544 4.7355941999999995,12.984044 C 4.7355941999999995,12.312544 5.2818942,11.766244 5.9533942,11.766244 C 6.6248942,11.766244 7.1711942,12.312544 7.1711942,12.984044 C 7.1711942,13.655544 6.6248942,14.201844000000001 5.9533942,14.201844000000001 L 5.953394199999998,14.201844 M 9.464794199999998,14.201844 C 8.793294199999998,14.201844 8.246994199999998,13.655543999999999 8.246994199999998,12.984143999999999 C 8.246994199999998,12.312643999999999 8.793294199999998,11.766343999999998 9.464794199999998,11.766343999999998 C 10.136293999999998,11.766343999999998 10.682493999999998,12.312643999999999 10.682493999999998,12.984143999999999 C 10.682493999999998,13.655543999999999 10.136293999999998,14.201844 9.464794199999998,14.201844 M 13.482394,14.091244 L 13.475693999999999,14.093944 L 13.461594,14.099944 C 13.307594,14.167444000000001 13.143794,14.201644 12.974893999999999,14.201844000000001 C 12.303994,14.201244 11.758394,13.655244000000001 11.758394,12.984144 C 11.758394,12.312644 12.304694,11.766344 12.976194,11.766344 C 13.647694,11.766344 14.193894,12.312644 14.193894,12.984144 C 14.193894,13.474944 13.901694,13.898644 13.482394,14.091244 M 16.556594,12.469543999999999 C 16.556094,12.475544 16.555394,12.481444 16.554694,12.487443999999998 C 16.552994,12.501343999999998 16.550894000000003,12.515143999999998 16.548294000000002,12.528843999999998 C 16.547194,12.534543999999997 16.546394000000003,12.540443999999997 16.545094000000002,12.546143999999998 C 16.541394000000004,12.563543999999998 16.536994000000004,12.580643999999998 16.531894,12.597543999999997 C 16.529894000000002,12.604043999999998 16.527594,12.610243999999998 16.525494000000002,12.616643999999997 C 16.521594,12.628143999999997 16.517494000000003,12.639443999999997 16.512994000000003,12.650543999999996 C 16.510294000000002,12.657443999999996 16.507394,12.664243999999997 16.504494,12.671043999999997 C 16.498894,12.683643999999997 16.492794,12.696143999999997 16.486494,12.708243999999997 C 16.484394,12.712243999999997 16.482594,12.716343999999998 16.480394,12.720443999999997 C 16.471794,12.736143999999998 16.462394,12.751343999999998 16.452594,12.766243999999997 C 16.449494,12.770943999999997 16.446194000000002,12.775443999999997 16.442994000000002,12.779943999999997 C 16.434894000000003,12.791643999999996 16.426494,12.802943999999997 16.417594,12.813943999999998 C 16.414594,12.817643999999998 16.411694,12.821343999999998 16.408694,12.825043999999998 C 16.384294,12.854043999999998 16.357394,12.880843999999998 16.328394,12.905243999999998 C 16.325294,12.907943999999999 16.322094,12.910443999999998 16.318894,12.912943999999998 C 16.306694,12.922843999999998 16.294094,12.932243999999997 16.281294,12.941143999999998 C 16.278094,12.943343999999998 16.274894,12.945643999999998 16.271694,12.947843999999998 C 16.255794,12.958443999999998 16.239494,12.968443999999998 16.222694,12.977643999999998 C 16.220994,12.978643999999997 16.219194,12.979443999999997 16.217494000000002,12.980343999999999 C 16.203194000000003,12.987943999999999 16.188394000000002,12.994943999999998 16.173494,13.001543999999999 L 16.149294,13.011344 C 16.076494,13.039944 15.997494000000001,13.056244 15.914694,13.056244 C 15.559094,13.056244 15.269794000000001,12.766843999999999 15.269794000000001,12.411244 C 15.269794000000001,12.055544 15.559094000000002,11.766244 15.914694,11.766244 C 16.270294,11.766244 16.559694,12.055544000000001 16.559694,12.411244 C 16.559594,12.430944 16.558294,12.450344 16.556594,12.469543999999999 M 15.914694,8.5390443 L 15.657094,8.5390443 L 13.199394000000002,6.192044300000001 L 11.802794000000002,6.192044300000001 C 11.745994000000001,5.889944300000001 11.609794000000003,6.558244300000001 11.463494000000003,6.2989443000000005 L 10.963494000000003,7.2989443000000005 L 11.802794000000002,6.192044300000001 L 10.963494000000003,6.191944300000001 L 8.463494200000003,7.299044300000001 L 9.463494200000003,7.799044300000001 L 9.089194200000003,7.021944300000001 L 8.463494200000003,7.299044300000001 L 10.963494000000003,6.191944300000001 C 10.113594000000003,6.191744300000001 9.571494200000002,6.191844300000001 8.963494200000003,6.191844300000001 L 6.963494200000003,6.191944300000001 C 5.6065942000000035,6.191944300000001 5.963494200000003,6.191944300000001 4.245594200000003,6.191944300000001 L 2.528054200000003,6.191944300000001 L 2.528054200000003,8.569144300000001 C 1.5192342000000028,8.694744300000002 0.6031842200000028,9.2104443 -0.036505779999997046,10.027144000000002 L 0.810364220000003,10.690444000000001 C 1.3458542,10.006844 2.1484242,9.6147443 3.0123742,9.6147443 L 15.914594,9.6147443 C 16.778594,9.6147443 17.581094,10.006844 18.116594,10.690444 L 18.963494,10.027144 C 18.222794,9.0814443 17.111494,8.5390443 15.914694,8.5390443 M 3.4706942,2.4764443 L 3.7757942,2.3340443 L 3.5809942,1.1074743 L 4.5021942,0.96119434 L 5.3296942,1.7216443 L 6.9115942,1.4704443 L 6.7270942,0.30842433999999996 C 6.702494199999999,0.15348433999999997 6.7415942,0.018534339999999982 6.8140941999999995,0.007014339999999952 L 8.8446942,1.1633343 L 11.531694,0.73664434 C 11.563194,0.73164434 11.594494,0.72730434 11.625694,0.72289434 L 11.910093999999999,2.5139443 C 11.878993999999999,2.5193442999999998 11.847893999999998,2.5249443 11.816393999999999,2.5299443 L 9.023294199999999,2.9734442999999997 L 7.557194199999999,4.685144299999999 C 7.4844941999999985,4.696744299999999 7.405794199999999,4.580444299999999 7.381094199999999,4.425244299999999 L 7.196594199999999,3.2635442999999995 L 5.713394199999999,3.4990442999999996 L 5.083994199999999,4.6247443 L 4.1627942,4.7709443 L 3.9447941999999996,3.3982443 L 3.6099941999999996,3.3533443 C 3.3228941999999995,2.9330442999999997 3.4706941999999996,2.4764443 3.4706941999999996,2.4764443 L 3.4706942,2.4764443 M 13.993394,1.2650342999999997 C 13.922394,0.8179043399999997 13.064494,0.5742043399999998 12.008694,0.6722243399999998 L 12.289994,2.4430443 C 13.323994,2.2092842999999998 14.064394,1.7120742999999998 13.993394,1.2650343 L 13.993394,1.2650342999999997 ", + ], + iconName: "olympus-buttons-visibility-groundunit-sam" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityGroundunit: IconDefinition = { + icon: [ + 19.0, + 13.95722, + [], + "", + "M 15.961766,8.7777708 L 3.0594852,8.7777708 C 2.1106652,8.7777708 1.3387852000000002,9.549670800000001 1.3387852000000002,10.498471 C 1.3387852000000002,10.524671 1.3395652000000002,10.550671 1.3407952000000003,10.576671000000001 C 1.3411652000000003,10.584971000000001 1.3416452000000003,10.593171000000002 1.3421252000000004,10.601471000000002 C 1.3432052000000003,10.619771000000002 1.3446152000000005,10.637971000000002 1.3462852000000003,10.656171000000002 C 1.3470652000000003,10.664971000000003 1.3477352000000002,10.673671000000002 1.3486952000000003,10.682371000000002 C 1.3512252000000002,10.705571 1.3541152000000003,10.728771000000002 1.3575652000000002,10.751771000000002 C 1.3593152000000002,10.763371000000001 1.3613852000000002,10.774871000000001 1.3633552000000002,10.786471000000002 C 1.3655052000000003,10.798971000000002 1.3676652000000002,10.811471000000003 1.3700752000000003,10.823871000000002 C 1.3726752000000002,10.837371000000003 1.3753752000000004,10.850771000000002 1.3782752000000003,10.864171000000002 C 1.3803852000000003,10.873871000000003 1.3826952000000003,10.883471000000002 1.3849952000000003,10.893171000000002 C 1.3917852000000004,10.922071000000003 1.3992752000000004,10.950571000000002 1.4075152000000004,10.978871000000002 C 1.4089252000000003,10.983771 1.4102652000000004,10.988671000000002 1.4117152000000004,10.993571000000001 C 1.4163152000000003,11.008971 1.4212852000000005,11.024071000000001 1.4262552000000004,11.039171000000001 C 1.4287452000000005,11.046671000000002 1.4313052000000004,11.054171000000002 1.4338652000000003,11.061671000000002 C 1.4390552000000003,11.076471000000002 1.4442952000000002,11.091371000000002 1.4498552000000002,11.106071000000002 C 1.4523052000000003,11.112571000000003 1.4549452000000003,11.118871000000002 1.4574252000000003,11.125271000000001 C 1.4672652000000004,11.150371000000002 1.4776552000000003,11.175171 1.4886052000000003,11.199671000000002 C 1.4929452000000003,11.209371000000003 1.4972452000000003,11.219071000000001 1.5017752000000002,11.228771000000002 C 1.5071552000000001,11.240071000000002 1.5126452000000001,11.251371000000002 1.5182552000000002,11.262671000000001 C 1.5243052000000001,11.274871000000001 1.5305352000000003,11.286871000000001 1.5368852000000002,11.298971000000002 C 1.5415552000000001,11.307871000000002 1.5462352000000001,11.316871 1.5510552000000002,11.325671000000002 C 1.5625652,11.346671000000002 1.5744752000000002,11.367371000000002 1.5868252000000003,11.387871000000002 C 1.5887252000000003,11.390971000000002 1.5906852000000002,11.393971000000002 1.5926152000000002,11.397071000000002 C 1.6046052000000002,11.416571000000003 1.6169652000000003,11.435771000000003 1.6296952000000002,11.454871000000002 C 1.6319552000000002,11.458171000000002 1.6341452000000003,11.461471000000003 1.6364052000000002,11.464871000000002 C 1.8035452000000003,11.710871000000003 2.0342552,11.914171000000001 2.3117252,12.048171000000002 C 2.3150652000000003,12.049771000000002 2.3184752,12.051271000000002 2.3218552000000003,12.052871000000001 C 2.3350652000000003,12.059071000000001 2.3482452000000005,12.065471000000002 2.3616752000000005,12.071471 L 2.3729152000000004,12.075971000000001 C 2.4044952000000004,12.089771 2.4363752000000005,12.102971 2.4689252000000006,12.114871 L 5.087965200000001,13.175671000000001 C 5.091965200000001,13.177471 5.0961652000000015,13.178871000000001 5.100165200000001,13.180671000000002 C 5.117265200000001,13.187971000000003 5.134765200000001,13.194671000000001 5.151965200000001,13.201571000000001 C 5.169965200000001,13.208671 5.187765200000001,13.216171000000001 5.205865200000001,13.222871000000001 C 5.223765200000001,13.229471000000002 5.241965200000001,13.235471000000002 5.2601652,13.241671000000002 C 5.2783652000000005,13.247871000000002 5.2964652,13.254471000000002 5.314865200000001,13.260271000000001 C 5.330465200000001,13.265171 5.346465200000001,13.269371000000001 5.362165200000001,13.273871000000002 C 5.383465200000001,13.280071000000001 5.404665200000001,13.286571000000002 5.426065200000001,13.292171000000002 C 5.436365200000001,13.294771 5.446965200000001,13.296971000000001 5.457365200000001,13.299471000000002 C 5.484365200000001,13.306071000000003 5.511365200000001,13.312671000000002 5.5386652000000005,13.318271000000003 C 5.5395652,13.318471000000002 5.540465200000001,13.318571000000002 5.541265200000001,13.318671000000004 C 5.6854652,13.348171000000004 5.832665200000001,13.363271000000005 5.9819652,13.364471000000004 C 5.9881652,13.364471000000004 5.9942652,13.364871000000004 6.0003652,13.364871000000004 L 6.0004652,13.364871000000004 L 13.020465999999999,13.364871000000004 C 13.020966,13.364871000000004 13.021365999999999,13.364871000000004 13.021766,13.364871000000004 C 13.022166,13.364871000000004 13.022666,13.364871000000004 13.023066,13.364871000000004 C 13.350866,13.364871000000004 13.662466,13.295371000000005 13.944766,13.170871000000004 L 16.579266,12.104071000000003 C 16.600066,12.096071000000004 16.620866,12.087871000000003 16.641266,12.078971000000003 L 16.642766,12.078371000000002 L 16.659166000000003,12.071471000000003 C 16.672566000000003,12.065471000000002 16.685766,12.059071000000003 16.698966000000002,12.052871000000003 C 16.702366,12.051271000000003 16.705766,12.049671000000004 16.709166000000003,12.048171000000004 C 16.986566000000003,11.914171000000003 17.217366000000002,11.710871000000003 17.384466000000003,11.464871000000004 C 17.386666,11.461571000000005 17.388966000000003,11.458171000000004 17.391166000000002,11.454871000000004 C 17.403866,11.435771000000004 17.416266,11.416571000000005 17.428266,11.397071000000004 C 17.430166,11.393971000000004 17.432166000000002,11.390871000000004 17.433966,11.387871000000004 C 17.446366,11.367371000000004 17.458266000000002,11.346571000000004 17.469866000000003,11.325671000000003 C 17.474666000000003,11.316771000000003 17.479366000000002,11.307871000000004 17.483966000000002,11.298971000000003 C 17.490366,11.286871000000003 17.496566,11.274871000000003 17.502666,11.262671000000003 C 17.508266000000003,11.251371000000002 17.513766,11.240171000000002 17.519066000000002,11.228771000000004 C 17.523566000000002,11.219071000000003 17.527966000000003,11.209371000000004 17.532266000000003,11.199671000000004 C 17.543266000000003,11.175171000000004 17.553666000000003,11.150371000000003 17.563466000000002,11.125271000000003 C 17.565966000000003,11.118871000000004 17.568666,11.112471000000003 17.571066000000002,11.106071000000004 C 17.576666000000003,11.091371000000004 17.581866,11.076471000000003 17.587066,11.061571000000004 C 17.589666,11.054171000000004 17.592166,11.046671000000003 17.594666,11.039171000000005 C 17.599666,11.023971000000005 17.604666,11.008871000000005 17.609166000000002,10.993571000000005 C 17.610666000000002,10.988671000000005 17.611966000000002,10.983671000000005 17.613366000000003,10.978771000000005 C 17.621566,10.950571000000005 17.629166,10.921971000000005 17.635966000000003,10.893171000000006 C 17.638266000000005,10.883471000000005 17.640466000000004,10.873871000000007 17.642666000000002,10.864071000000006 C 17.645566000000002,10.850771000000007 17.648266000000003,10.837371000000006 17.650866,10.823871000000006 C 17.653266000000002,10.811371000000007 17.655366,10.798871000000005 17.657566,10.786371000000006 C 17.659565999999998,10.774871000000006 17.661566,10.763371000000006 17.663366,10.751771000000007 C 17.666766,10.728671000000007 17.669666,10.705571000000006 17.672266,10.682271000000007 C 17.673166000000002,10.673571000000008 17.673766,10.664871000000007 17.674666000000002,10.656171000000008 C 17.676366,10.637971000000007 17.677666000000002,10.619771000000007 17.678766000000003,10.601371000000007 C 17.679266000000002,10.593171000000007 17.679766000000004,10.584971000000007 17.680166000000003,10.576671000000008 C 17.681266000000004,10.550671000000008 17.682166000000002,10.524571000000009 17.682166000000002,10.498471000000007 C 17.682466,9.549670800000008 16.910566000000003,8.777770800000008 15.961766000000003,8.777770800000008 L 15.961766,8.7777708 M 3.0594852,11.143471 C 2.9766552,11.143471 2.8976452,11.127271 2.8248352000000003,11.098671 L 2.8006752,11.088871 C 2.7857252000000003,11.082270999999999 2.7709952,11.075270999999999 2.7567052000000003,11.067571 C 2.7549952,11.066771 2.7531752000000003,11.065971 2.7514752000000002,11.064971 C 2.7346652000000002,11.055771 2.7183352000000003,11.045771 2.7024552,11.035171 C 2.6992252000000003,11.032971 2.6961052000000003,11.030771 2.6929152000000003,11.028471 C 2.6799952000000005,11.019471 2.6674152,11.010171 2.6552452000000004,11.000271 C 2.6520552000000004,10.997771 2.6488252000000005,10.995171 2.6457152000000006,10.992571 C 2.6166552000000007,10.968271 2.5898252000000004,10.941371 2.5654752000000007,10.912271 C 2.562435200000001,10.908671 2.5595452000000005,10.904971 2.5565752000000006,10.901271000000001 C 2.5477052000000007,10.890271000000002 2.5392452000000008,10.878871000000002 2.5310752000000005,10.867271 C 2.5278852000000005,10.862771 2.5246552000000007,10.858171 2.5215752000000005,10.853571 C 2.5117052000000006,10.838671 2.5022852000000007,10.823471000000001 2.4936752000000006,10.807671000000001 C 2.4914852000000005,10.803771000000001 2.4896652000000006,10.799571 2.4875552000000005,10.795571 C 2.4812052000000007,10.783371 2.4751552000000006,10.770971000000001 2.4696252000000003,10.758371 C 2.4666252,10.751571 2.4637952000000003,10.744771 2.4610552,10.737871 C 2.4566052000000003,10.726671 2.4524452,10.715371 2.4485852,10.703871 C 2.4464352000000003,10.697571 2.4441352000000003,10.691371 2.4422052,10.684871 C 2.4370852000000003,10.667971 2.4326652,10.650870999999999 2.4289152,10.633370999999999 C 2.4277252000000002,10.627671 2.4268052,10.621870999999999 2.4257652,10.616170999999998 C 2.4232052,10.602470999999998 2.4210852,10.588670999999998 2.4194152,10.574770999999998 C 2.4187152,10.568770999999998 2.4180052,10.562770999999998 2.4174552,10.556871 C 2.4157052,10.537671 2.4144852,10.518270999999999 2.4144852,10.498571 C 2.4144852,10.142971 2.7037852,9.8535708 3.0594452,9.8535708 C 3.4151051999999997,9.8535708 3.7043652,10.142871 3.7043652,10.498571 C 3.7043652,10.854271 3.4151352,11.143471 3.0594851999999997,11.143471 L 3.0594852,11.143471 M 6.0005652000000005,12.289071 C 5.9796652,12.289071 5.9586652,12.288571 5.937965200000001,12.287571 C 5.877265200000001,12.284471 5.817765200000001,12.276871 5.7597652,12.265171 C 5.7582652,12.264871000000001 5.7566652000000005,12.264571 5.7551652,12.264271 C 5.7395652,12.261071000000001 5.724165200000001,12.257371000000001 5.7086652,12.253571 C 5.7042652,12.252471000000002 5.699765200000001,12.251571 5.6953652,12.250371000000001 C 5.6821652,12.246971000000002 5.6690652,12.243071 5.655965200000001,12.239171 C 5.649365200000001,12.237271000000002 5.6427652,12.235471 5.636165200000001,12.233371 C 5.624665200000001,12.229771 5.6133652000000005,12.225771 5.602065200000001,12.221771 C 5.594065200000001,12.218971 5.585965200000001,12.216371 5.577965200000001,12.213371 C 5.567365200000001,12.209371 5.556865200000002,12.205071 5.5462652000000014,12.200871000000001 C 5.537965200000001,12.197471000000002 5.529665200000001,12.194171 5.521365200000002,12.190671000000002 C 5.087465200000001,12.004171000000001 4.782765200000002,11.572771000000001 4.782765200000002,11.071271000000001 C 4.782765200000002,10.399771000000001 5.329065200000002,9.8534708 6.000565200000002,9.8534708 C 6.672065200000002,9.8534708 7.218365200000003,10.399771 7.218365200000003,11.071271 C 7.218365200000003,11.742771 6.672065200000002,12.289071 6.000565200000002,12.289071 L 6.0005652000000005,12.289071 M 9.5119652,12.289071 C 8.8404652,12.289071 8.2941652,11.742771 8.2941652,11.071371 C 8.2941652,10.399871 8.8404652,9.8535708 9.5119652,9.8535708 C 10.183466000000001,9.8535708 10.729666,10.399871 10.729666,11.071371 C 10.729666,11.742771 10.183466,12.289071 9.5119652,12.289071 M 13.529566,12.178471 L 13.522866,12.181171 L 13.508766000000001,12.187171000000001 C 13.354766000000001,12.254671000000002 13.190966000000001,12.288871 13.022066,12.289071000000002 C 12.351166000000001,12.288471000000001 11.805566,11.742471000000002 11.805566,11.071371000000001 C 11.805566,10.399871000000001 12.351866000000001,9.8535708 13.023366000000001,9.8535708 C 13.694866000000001,9.8535708 14.241066000000002,10.399871 14.241066000000002,11.071371 C 14.241066000000002,11.562171 13.948866000000002,11.985871 13.529566000000003,12.178470999999998 L 13.529566,12.178471 M 16.603766,10.556771 C 16.603266,10.562771 16.602566,10.568671 16.601866,10.574670999999999 C 16.600166,10.588570999999998 16.598066000000003,10.602370999999998 16.595466000000002,10.616070999999998 C 16.594366,10.621770999999997 16.593566000000003,10.627670999999998 16.592266000000002,10.633370999999999 C 16.588566000000004,10.650770999999999 16.584166000000003,10.667870999999998 16.579066,10.684770999999998 C 16.577066000000002,10.691270999999999 16.574766,10.697470999999998 16.572666,10.703870999999998 C 16.568766,10.715370999999998 16.564666000000003,10.726670999999998 16.560166000000002,10.737770999999997 C 16.557466,10.744670999999997 16.554566,10.751470999999997 16.551666,10.758270999999997 C 16.546066,10.770870999999998 16.539966,10.783370999999997 16.533666,10.795470999999997 C 16.531566,10.799470999999997 16.529766,10.803570999999998 16.527566,10.807670999999997 C 16.518966,10.823370999999998 16.509566,10.838570999999998 16.499766,10.853470999999997 C 16.496666,10.858170999999997 16.493366,10.862670999999997 16.490166000000002,10.867170999999997 C 16.482066000000003,10.878870999999997 16.473666,10.890170999999997 16.464766,10.901170999999998 C 16.461766,10.904870999999998 16.458866,10.908570999999998 16.455866,10.912270999999999 C 16.431466,10.941270999999999 16.404566,10.968070999999998 16.375566,10.992470999999998 C 16.372466,10.995171 16.369266,10.997670999999999 16.366066,11.000170999999998 C 16.353866,11.010070999999998 16.341266,11.019470999999998 16.328466,11.028370999999998 C 16.325266,11.030570999999998 16.322066,11.032870999999998 16.318866,11.035070999999999 C 16.302966,11.045670999999999 16.286666,11.055670999999998 16.269866,11.064870999999998 C 16.268166,11.065870999999998 16.266366,11.066670999999998 16.264666000000002,11.067571 C 16.250366000000003,11.075171 16.235566000000002,11.082170999999999 16.220666,11.088771 L 16.196466,11.098571 C 16.123666,11.127171 16.044666,11.143471 15.961866,11.143471 C 15.606266,11.143471 15.316966,10.854071 15.316966,10.498471 C 15.316966,10.142771 15.606266000000002,9.8534708 15.961866,9.8534708 C 16.317466,9.8534708 16.606866,10.142771 16.606866,10.498471 C 16.606766,10.518171 16.605466,10.537571 16.603766,10.556771 M 15.961865,7.3472079 L 15.704265,7.3472079 L 13.246565,5.0002078999999995 L 11.849965000000001,5.0002078999999995 C 11.793165,4.6982079 11.687565000000001,4.4133078999999995 11.541265000000001,4.1540079 L 16.463865000000002,2.1144079 L 16.668465,2.6083079 L 17.708765,2.1773078999999997 L 17.504065,1.6834078999999997 L 18.745865000000002,1.1689078999999998 L 18.314865,0.12868787999999975 L 17.073065,0.6431078799999997 L 16.868465,0.14924787999999972 L 15.828265,0.5802078799999997 L 16.032865,1.0740878999999997 L 10.747265000000002,3.2641079 C 10.289265000000002,2.9317079 9.726665200000003,2.7350079 9.118665200000002,2.7350079 L 7.024165200000002,2.7350079 C 5.667165200000002,2.7350079 4.534965200000002,3.7125079 4.2927652000000025,5.0002078999999995 L 2.5752252000000024,5.0002078999999995 L 2.5752252000000024,7.3773079 C 1.5664052000000024,7.5030079 0.6503552100000025,8.0186079 0.010665210000002645,8.8353079 L 0.8575352100000027,9.4987079 C 1.3930252000000025,8.8150079 2.1955952000000027,8.422907899999998 3.0595452000000027,8.422907899999998 L 15.961765,8.422907899999998 C 16.825765,8.422907899999998 17.628265,8.815007899999998 18.163764999999998,9.4987079 L 19.010665,8.8353079 C 18.269965,7.8896079 17.158665,7.3472079 15.961865,7.3472079 ", + ], + iconName: "olympus-buttons-visibility-groundunit" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityHelicopter: IconDefinition = { + icon: [ + 15.75, + 14.0, + [], + "", + "M 3.173155,1.0409694 C 3.173155,0.57445126 3.5207821,0.19754528000000005 3.9510613,0.19754528000000005 L 13.285898,0.19754528000000005 C 13.716175999999999,0.19754528000000005 14.063804,0.57445126 14.063804,1.0409694 C 14.063804,1.5074881 13.716175999999999,1.8843896 13.285898,1.8843896 L 9.3963807,1.8843896 L 9.3963807,3.571233 L 10.174286,3.571233 C 12.323242,3.571233 14.063804000000001,5.4583887 14.063804000000001,7.7883417 L 14.063804000000001,9.4751827 C 14.063804000000001,9.9416999 13.716176,10.318605999999999 13.285898000000001,10.318605999999999 L 9.3963807,10.318605999999999 L 7.8405774,10.318605999999999 C 7.3519531,10.318605999999999 6.8900763,10.068214999999999 6.5959295000000004,9.6438695 L 4.8602324,7.1346873 C 4.7751488,7.0108098 4.6584662,6.9159274 4.5271922,6.8579429 L 1.2089503,5.4188529 C 0.97800953,5.318696 0.80298167,5.1025686 0.7422081,4.8389987 L 0.18309237,2.4088928 C 0.11988251,2.1426888 0.30706869,1.8843896 0.55988607,1.8843896 L 1.2283992,1.8843896 C 1.4739232,1.8843896 1.7048641,2.0082669 1.8507213,2.2217602 L 2.7842066,3.571233 L 7.8405774,3.571233 L 7.8405774,1.8843896 L 3.9510613,1.8843896 C 3.5207821,1.8843896 3.173155,1.5074881 3.173155,1.0409694 M 9.3963807,8.6317617 L 12.507996,8.6317617 L 12.507996,7.7883417 C 12.507996,6.391424600000001 11.462689000000001,5.258077800000001 10.174286,5.258077800000001 L 9.3963807,5.258077800000001 L 9.3963807,8.6317617 M 15.391098,11.409781 C 15.694969,11.739243 15.694969,12.274292 15.391098,12.603749 L 15.296287999999999,12.706543 C 14.712858999999998,13.339108 13.920371,13.694927999999999 13.096281999999999,13.694927999999999 L 6.2847694,13.694927999999999 C 5.8544919,13.694927999999999 5.506864,13.318022 5.506864,12.851507 C 5.506864,12.384989 5.8544919,12.008083 6.2847694,12.008083 L 13.096286,12.008083 C 13.509545,12.008083 13.905792,11.831491999999999 14.197507,11.515208999999999 L 14.292317,11.412415999999999 C 14.596187,11.082954999999998 15.089667,11.082954999999998 15.393536000000001,11.412415999999999 L 15.391098,11.409781 ", + ], + iconName: "olympus-buttons-visibility-helicopter" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityHuman: IconDefinition = { + icon: [ + 12.14064, + 10.677204, + [], + "", + "M 5.9808108,5.7908995 C 7.6223381,5.7908995 8.9541451,4.4939798 8.9541451,2.8954501 C 8.9541451,1.2969203 7.6223381,0.0 5.9808108,0.0 C 4.3392825,0.0 3.0074758,1.2969203 3.0074758,2.8954501 C 3.0074758,4.4939798 4.3392824999999995,5.7908995 5.9808108,5.7908995 M 8.6237741,6.4343342 L 7.4860601,6.4343342 C 7.0276691,6.6394281 6.5176619,6.7560505 5.9808108,6.7560505 C 5.4439597,6.7560505 4.9360143,6.6394281 4.475561,6.4343342 L 3.3378464,6.4343342 C 1.8780213000000001,6.4343342 0.69488123,7.586482200000001 0.69488123,9.0080728 L 0.69488123,9.329788800000001 C 0.69488123,9.8626318 1.138817,10.294938000000002 1.6859932,10.294938000000002 L 10.275627,10.294938000000002 C 10.822804,10.294938000000002 11.266739,9.862631800000003 11.266739,9.329788800000001 L 11.266739,9.0080728 C 11.266739,7.586482200000001 10.083599,6.4343342 8.623774099999999,6.4343342 L 8.6237741,6.4343342 ", + ], + iconName: "olympus-buttons-visibility-human" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityNavyunit: IconDefinition = { + icon: [ + 15.767666, + 14.022505, + [], + "", + "M 5.2724978,0.875 C 5.2724978,0.41016 5.6552978,0.0 6.1474978,0.0 L 9.6474978,0.0 C 10.112298,0.0 10.522498,0.41016 10.522498,0.875 L 10.522498,1.75 L 11.834998,1.75 C 12.545898000000001,1.75 13.147498,2.3516 13.147498,3.0625 L 13.147498,6.5625 L 14.350598000000002,6.9727 C 14.979498000000001,7.1914 15.143598,8.0117 14.651398000000002,8.4492 L 11.889698000000003,10.9922 C 11.452198000000003,11.2383 10.959998000000002,11.4023 10.522498000000002,11.4023 C 9.975597800000003,11.4023 9.401397800000002,11.1836 8.881897800000003,10.855500000000001 C 8.280297800000003,10.418000000000001 7.487297800000002,10.418000000000001 6.885797800000002,10.855500000000001 C 6.420897800000002,11.156200000000002 5.846697800000003,11.4023 5.245197800000002,11.4023 C 4.807697800000002,11.4023 4.315497800000003,11.2383 3.8779978000000024,10.9922 L 1.1162478000000022,8.449200000000001 C 0.62405778,8.0117 0.78811778,7.1914 1.4170278,6.9727 L 2.6474978,6.5625 L 2.6474978,3.0625 C 2.6474978,2.3516 3.2216978000000003,1.75 3.9599978,1.75 L 5.2724978,1.75 L 5.2724978,0.875 M 4.3974978,5.9883 L 7.323297800000001,5.0039 C 7.678697800000001,4.8945 8.0888978,4.8945 8.4443978,5.0039 L 11.397498,5.9883 L 11.397498,3.5 L 4.3974978,3.5 L 4.3974978,5.9883 M 8.3896978,11.5391 C 9.0185978,11.9766 9.7568978,12.25 10.522498,12.25 C 11.233398000000001,12.25 12.026398,11.9766 12.627998000000002,11.5391 C 12.956098,11.3203 13.393598,11.3477 13.694398000000001,11.5938 C 14.104498000000001,11.921899999999999 14.596698000000002,12.168 15.088898000000002,12.2773 C 15.553698000000002,12.386700000000001 15.854498000000001,12.851600000000001 15.745198000000002,13.3438 C 15.635798000000001,13.8086 15.143598000000003,14.109399999999999 14.678698000000002,14.0 C 14.022498000000002,13.8359 13.448298000000003,13.5352 13.092798000000002,13.3164 C 12.299798000000003,13.7266 11.424798000000003,14.0 10.522498000000002,14.0 C 9.647497800000002,14.0 8.854497800000003,13.7539 8.307697800000003,13.5078 C 8.143597800000004,13.425799999999999 8.006897800000003,13.3438 7.897497800000004,13.2891 C 7.760797800000003,13.3438 7.624097800000004,13.425799999999999 7.459997800000004,13.5078 C 6.913097800000004,13.7539 6.120197800000003,14.0 5.272497800000004,14.0 C 4.370197800000003,14.0 3.4677978000000036,13.7266 2.6747978000000034,13.3164 C 2.3193978000000035,13.5352 1.7451578000000034,13.8359 1.0889078000000034,14.0 C 0.6240577800000034,14.1094 0.1318777800000034,13.8086 0.022497780000003464,13.3438 C -0.08688221999999654,12.8789 0.21390778000000346,12.3867 0.6787477800000035,12.2773 C 1.1709378000000035,12.168000000000001 1.6904678000000035,11.9219 2.0732978000000033,11.5938 C 2.3740978000000035,11.3477 2.811597800000003,11.3203 3.139697800000003,11.5391 C 3.741297800000003,11.9766 4.534197800000003,12.25 5.272497800000004,12.25 C 6.010797800000003,12.25 6.776397800000003,11.9766 7.377997800000004,11.5391 C 7.678697800000004,11.3203 8.088897800000003,11.3203 8.389697800000004,11.5391 L 8.3896978,11.5391 ", + ], + iconName: "olympus-buttons-visibility-navyunit" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityOlympus: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 0.12088324,6.9633961 C 0.12088324,3.1303818999999997 3.2282296,0.010631720000000122 7.067444200000001,0.010631720000000122 L 7.811720200000001,0.010631720000000122 C 10.764009000000001,0.010631720000000122 13.430993,2.1597231000000003 13.930278000000001,4.9786637 C 14.001598000000001,5.3818121 14.141153000000001,5.7756589 14.398550000000002,6.0950755 L 15.701030000000003,7.7262773 C 15.893301000000003,7.9681666 15.998739000000002,8.2658759 15.998739000000002,8.575990899999999 C 15.998739000000002,9.326467599999999 15.390915000000001,9.934291899999998 14.640438000000003,9.934291899999998 L 14.014007000000003,9.934291899999998 L 14.014007000000003,11.919023999999999 C 14.014007000000003,13.013727999999999 13.123978000000003,13.903755999999998 12.029275000000004,13.903755999999998 L 10.044543000000004,13.903755999999998 L 10.044543000000004,14.896122999999998 C 10.044543000000004,15.445024999999998 9.601080000000005,15.888487999999997 9.052177900000004,15.888487999999997 L 3.0979803,15.888487999999997 C 2.5490781,15.888487999999997 2.1056152,15.445024999999998 2.1056152,14.896122999999998 L 2.1056152,12.64159 C 2.1056152,12.123700000000001 1.8916361,11.633719000000001 1.5753182,11.221267000000001 C 0.63567188,10.00872 0.12088324,8.5108657 0.12088324,6.9633961 M 7.0674442,1.9953635 C 6.7945452,1.9953635 6.5712625,2.2186461 6.5712625,2.4915453000000003 C 6.5712625,3.5149236000000004 5.333905399999999,4.0266128000000005 4.6113387999999995,3.3040467000000002 C 4.4190672,3.1117752000000003 4.102751199999999,3.1117752000000003 3.9104797,3.3040467000000002 C 3.71821,3.4963158 3.71821,3.8126341000000004 3.9104797,4.0049032 C 4.6330464,4.7274705 4.1213583,5.9648275 3.0979802999999997,5.9648275 C 2.8250794999999997,5.9648275 2.6017968,6.1881101 2.6017968,6.4610105 C 2.6017968,6.7339121 2.8250794999999997,6.9571927 3.0979802999999997,6.9571927 C 4.1213583,6.9571927 4.6330464,8.1945497 3.9104797,8.917117000000001 C 3.71821,9.1093884 3.71821,9.4257044 3.9104797,9.617975900000001 C 4.1027512,9.810245000000002 4.4190672,9.810245000000002 4.6113387999999995,9.617975900000001 C 5.333905399999999,8.895408600000001 6.5712625,9.4070978 6.5712625,10.430475000000001 C 6.5712625,10.703376 6.7945452,10.926659 7.0674442,10.926659 C 7.340345,10.926659 7.563627599999999,10.703376 7.563627599999999,10.430475000000001 C 7.563627599999999,9.4070978 8.800984699999999,8.895408600000001 9.523551399999999,9.617975900000001 C 9.715820999999998,9.810245000000002 10.032138999999999,9.810245000000002 10.224409999999999,9.617975900000001 C 10.41668,9.4257044 10.41668,9.1093884 10.224409999999999,8.917117000000001 C 9.5018438,8.194549700000001 10.013532,6.957192700000001 11.036909999999999,6.957192700000001 C 11.309810999999998,6.957192700000001 11.533091999999998,6.733912100000001 11.533091999999998,6.461010500000001 C 11.533091999999998,6.188110100000001 11.309810999999998,5.964827500000001 11.036909999999999,5.964827500000001 C 10.013532,5.964827500000001 9.5018438,4.727470500000001 10.224409999999999,4.004903200000001 C 10.41668,3.8126341000000012 10.41668,3.496315800000001 10.224409999999999,3.304046700000001 C 10.032138999999999,3.111775200000001 9.715820999999998,3.111775200000001 9.523551399999999,3.304046700000001 C 8.8009847,4.0266128 7.5636276,3.5149236 7.5636276,2.4915453 C 7.5636276,2.2186461 7.340345,1.9953635 7.0674442,1.9953635 M 6.3231699,4.9724603 A 0.74427515,0.74427515 0.0 1,1 6.3231699,6.4610104999999995 A 0.74427515,0.74427515 0.0 1,1 6.3231699,4.9724603 M 7.5636276,7.4533769 A 0.49618347,0.49618347 0.0 1,1 8.5559945,7.4533769 A 0.49618347,0.49618347 0.0 1,1 7.5636276,7.4533769 ", + ], + iconName: "olympus-buttons-visibility-olympus" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olButtonsVisibilityShield: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 256.0,0.0 C 260.6,0.0 265.2,1.0 269.4,2.9 L 457.7,82.8 C 479.7,92.1 496.09999999999997,113.8 496.0,140.0 C 495.5,239.2 454.7,420.7 282.4,503.2 C 265.7,511.2 246.29999999999998,511.2 229.59999999999997,503.2 C 57.3,420.7 16.5,239.2 16.0,140.0 C 15.9,113.8 32.3,92.1 54.3,82.8 L 242.7,2.9 C 246.8,1.0 251.4,0.0 256.0,0.0 M 256.0,66.8 L 256.0,444.8 C 394.0,378.0 431.1,230.1 432.0,141.4 L 256.0,66.8 L 256.0,66.8 ", + ], + iconName: "olympus-buttons-visibility-shield" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsAltitude: IconDefinition = { + icon: [ + 640.0, + 512.0, + [], + "", + "M 132.70945,183.88092 C 134.40789,189.87618 138.52223,194.86441 144.05677,197.64515 L 222.34337,236.95017 A 44.034591,44.034591 0.0 0,0 242.25621999999998,241.63214000000002 L 461.20651999999995,240.99313 C 481.32881,240.93403 501.54218999999995,236.56274000000002 518.97649,226.28292000000002 C 538.54836,214.74312000000003 545.96357,202.99243 546.02664,192.08377000000002 C 546.10474,181.17515 538.82959,169.46998000000002 519.40533,158.04611 C 502.10204000000004,147.8711 481.93580000000003,143.61751 461.81653000000006,143.67058 L 387.68668,143.88712 L 281.39609,28.67846 A 11.944098,11.944098 0.0 0,0 270.94388000000004,22.57864 L 221.46496000000002,22.72582 C 213.43705000000003,22.74652 207.59150000000002,30.50154 209.75275000000002,38.26283 L 273.75641,144.22014000000001 L 196.08828,144.44996 L 163.74022,100.74953000000001 A 11.947453,11.947453 0.0 0,0 154.10347,95.90963 L 123.90352999999999,96.00123 C 116.04668,96.02543 110.22604999999999,103.47744 112.08747,111.14779 L 132.70945,183.88092 M 624.0,448.0 L 16.0,448.0 C 7.16,448.0 0.0,455.16 0.0,464.0 L 0.0,496.0 C 0.0,504.84 7.16,512.0 16.0,512.0 L 624.0,512.0 C 632.84,512.0 640.0,504.84 640.0,496.0 L 640.0,464.0 C 640.0,455.16 632.84,448.0 624.0,448.0 ", + ], + iconName: "olympus-icons-altitude" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsArrowPointerSolid: IconDefinition = { + icon: [ + 320.0, + 512.0, + [], + "", + "M 0.0,55.2 L 0.0,426.0 C 0.0,438.2 9.9,448.0 22.0,448.0 C 28.3,448.0 34.4,445.3 38.6,440.5 L 121.2,346.0 L 179.3,462.3 C 187.20000000000002,478.1 206.4,484.5 222.20000000000002,476.6 C 238.00000000000003,468.70000000000005 244.4,449.5 236.50000000000003,433.70000000000005 L 179.8,320.0 L 297.9,320.0 C 310.09999999999997,320.0 320.0,310.1 320.0,297.9 C 320.0,291.59999999999997 317.3,285.59999999999997 312.6,281.4 L 38.6,37.9 C 34.3,34.1 28.9,32.0 23.2,32.0 C 10.4,32.0 0.0,42.4 0.0,55.2 ", + ], + iconName: "olympus-icons-arrow-pointer-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsArrowsToEyeSolid: IconDefinition = { + icon: [ + 640.0, + 512.0, + [], + "", + "M 15.0,15.0 C 24.4,5.7 39.6,5.7 49.0,15.0 L 112.0,78.0 L 112.0,40.0 C 112.0,26.7 122.7,16.0 136.0,16.0 C 149.3,16.0 160.0,26.7 160.0,40.0 L 160.0,136.0 C 160.0,149.3 149.3,160.0 136.0,160.0 L 40.0,160.0 C 26.7,160.0 16.0,149.3 16.0,136.0 C 16.0,122.69999999999999 26.7,112.0 40.0,112.0 L 78.1,112.0 L 15.0,49.0 C 5.7,39.6 5.7,24.4 15.0,15.0 M 133.5,243.9 C 158.6,193.6 222.7,112.0 320.0,112.0 C 417.3,112.0 481.4,193.6 506.5,243.9 C 510.3,251.5 510.3,260.4 506.5,268.1 C 481.4,318.4 417.3,400.0 320.0,400.0 C 222.7,400.0 158.6,318.4 133.5,268.1 C 129.7,260.5 129.7,251.60000000000002 133.5,243.90000000000003 L 133.5,243.9 M 320.0,320.0 A 64.0,64.0 0.0 1,0 320.0,192.0 A 64.0,64.0 0.0 1,0 320.0,320.0 M 591.0,15.0 C 600.4,5.6 615.6,5.6 624.9,15.0 C 634.1999999999999,24.4 634.3,39.6 624.9,48.9 L 561.9,111.9 L 600.0,111.9 C 613.3,111.9 624.0,122.60000000000001 624.0,135.9 C 624.0,149.2 613.3,159.9 600.0,159.9 L 504.0,159.9 C 490.7,159.9 480.0,149.20000000000002 480.0,135.9 L 480.0,40.0 C 480.0,26.7 490.7,16.0 504.0,16.0 C 517.3,16.0 528.0,26.7 528.0,40.0 L 528.0,78.1 L 591.0,15.099999999999994 L 591.0,15.0 M 15.0,497.0 C 5.6,487.6 5.6,472.4 15.0,463.1 L 78.0,400.1 L 40.0,400.1 C 26.7,400.1 16.0,389.40000000000003 16.0,376.1 C 16.0,362.8 26.7,352.1 40.0,352.1 L 136.0,352.1 C 149.3,352.1 160.0,362.8 160.0,376.1 L 160.0,472.1 C 160.0,485.40000000000003 149.3,496.1 136.0,496.1 C 122.69999999999999,496.1 112.0,485.40000000000003 112.0,472.1 L 112.0,433.9 L 49.0,497.0 C 39.6,506.4 24.4,506.4 15.100000000000001,497.0 L 15.0,497.0 M 591.0,497.0 L 528.0,434.0 L 528.0,472.0 C 528.0,485.3 517.3,496.0 504.0,496.0 C 490.70000000000005,496.0 480.0,485.3 480.0,472.0 L 480.0,376.0 C 480.0,362.7 490.7,352.0 504.0,352.0 L 600.0,352.0 C 613.3,352.0 624.0,362.7 624.0,376.0 C 624.0,389.3 613.3,400.0 600.0,400.0 L 561.9,400.0 L 624.9,463.0 C 634.3,472.4 634.3,487.6 624.9,496.9 C 615.5,506.19999999999993 600.3,506.29999999999995 591.0,496.9 L 591.0,497.0 ", + ], + iconName: "olympus-icons-arrows-to-eye-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsBombSolid: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 459.1,52.4 L 442.6,6.5 C 440.7,2.6 436.5,0.0 432.1,0.0 C 427.70000000000005,0.0 423.6,2.6 421.70000000000005,6.5 L 405.2,52.4 L 359.2,69.2 C 354.9,70.8 351.9,75.10000000000001 352.0,79.60000000000001 C 352.0,84.10000000000001 355.0,88.30000000000001 359.2,89.80000000000001 L 404.9,106.60000000000001 L 421.7,152.4 C 423.2,156.8 427.5,159.9 432.09999999999997,159.9 C 436.69999999999993,159.9 440.99999999999994,156.8 442.49999999999994,152.4 L 458.99999999999994,106.60000000000001 L 504.69999999999993,89.80000000000001 C 508.8999999999999,88.30000000000001 511.8999999999999,84.10000000000001 511.8999999999999,79.60000000000001 C 511.8999999999999,75.00000000000001 508.8999999999999,70.7 504.69999999999993,69.2 L 459.1,52.4 M 326.70000000000005,105.4 C 314.20000000000005,92.9 293.90000000000003,92.9 281.40000000000003,105.4 L 278.50000000000006,108.30000000000001 C 256.5,100.3 232.7,96.0 208.0,96.0 C 93.1,96.0 0.0,189.1 0.0,304.0 C 0.0,418.9 93.1,512.0 208.0,512.0 C 322.9,512.0 416.0,418.9 416.0,304.0 C 416.0,279.3 411.7,255.5 403.8,233.5 L 406.7,230.6 C 419.2,218.1 419.2,197.8 406.7,185.3 L 326.7,105.30000000000001 L 326.70000000000005,105.4 M 200.0,192.0 C 142.6,192.0 96.0,238.6 96.0,296.0 L 96.0,304.0 C 96.0,312.8 88.8,320.0 80.0,320.0 C 71.2,320.0 64.0,312.8 64.0,304.0 L 64.0,296.0 C 64.0,220.9 124.9,160.0 200.0,160.0 L 208.0,160.0 C 216.8,160.0 224.0,167.2 224.0,176.0 C 224.0,184.8 216.8,192.0 208.0,192.0 L 200.0,192.0 ", + ], + iconName: "olympus-icons-bomb-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsBurstSolid: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 37.6,4.2 C 28.0,-2.3 15.2,-1.1 7.0,7.0 C -1.1999999999999993,15.1 -2.4000000000000004,28.0 4.2,37.5 L 116.2,200.8 L 16.6,233.2 C 6.7,236.4 0.0,245.6 0.0,256.0 C 0.0,266.4 6.7,275.6 16.6,278.8 L 119.69999999999999,312.2 L 66.8,412.8 C 61.9,422.1 63.599999999999994,433.5 71.1,440.90000000000003 C 78.6,448.30000000000007 89.89999999999999,450.1 99.19999999999999,445.20000000000005 L 199.79999999999998,392.30000000000007 L 233.2,495.4000000000001 C 236.39999999999998,505.30000000000007 245.6,512.0000000000001 256.0,512.0000000000001 C 266.4,512.0000000000001 275.6,505.3000000000001 278.8,495.4000000000001 L 312.2,392.30000000000007 L 412.79999999999995,445.20000000000005 C 422.09999999999997,450.1 433.49999999999994,448.40000000000003 440.9,440.90000000000003 C 448.3,433.40000000000003 450.09999999999997,422.1 445.2,412.8 L 392.3,312.2 L 495.4,278.8 C 505.29999999999995,275.6 512.0,266.40000000000003 512.0,256.0 C 512.0,245.59999999999997 505.3,236.4 495.4,233.2 L 388.9,198.7 L 414.59999999999997,128.29999999999998 C 417.79999999999995,119.49999999999999 415.59999999999997,109.69999999999999 408.99999999999994,103.09999999999998 C 402.3999999999999,96.49999999999997 392.59999999999997,94.29999999999998 383.79999999999995,97.49999999999999 L 313.4,123.19999999999999 L 278.8,16.6 C 275.6,6.7 266.4,0.0 256.0,0.0 C 245.60000000000002,0.0 236.4,6.7 233.2,16.6 L 200.89999999999998,116.19999999999999 L 37.6,4.2 ", + ], + iconName: "olympus-icons-burst-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsCamera: IconDefinition = { + icon: [ + 576.0, + 512.0, + [], + "", + "M 18.892988,123.94151 C 18.892988,90.64844399999998 45.961287,63.58015399999999 79.254339,63.58015399999999 L 320.69975,63.58015399999999 C 353.99280999999996,63.58015399999999 381.0611,90.648444 381.0611,123.94151 L 381.0611,365.3869 C 381.0611,398.67996000000005 353.99281,425.74825000000004 320.69975,425.74825000000004 L 79.254339,425.74825000000004 C 45.961287,425.74825000000004 18.892988000000003,398.67996000000005 18.892988000000003,365.3869 L 18.892988,123.94151 M 546.20598,97.344781 C 556.0147,102.62640999999999 562.14515,112.81239 562.14515,123.94151 L 562.14515,365.3869 C 562.14515,376.51602 556.0147,386.702 546.20598,391.98363 C 536.39726,397.26524 524.51361,396.69935 515.17647,390.47459 L 424.63444,330.11323999999996 L 411.24177,321.15333999999996 L 411.24177,305.02555 L 411.24177,184.30286 L 411.24177,168.17507 L 424.63444,159.21517 L 515.17647,98.853816 C 524.41931,92.723365 536.30293,92.06317 546.20598,97.344781 ", + ], + iconName: "olympus-icons-camera" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsCheckSquare: IconDefinition = { + icon: [ + 13.0, + 13.0, + [], + "", + "M 1.75,0.125 C 0.765625,0.125 0.0,0.917969 0.0,1.875 L 0.0,10.625 C 0.0,11.6094 0.765625,12.375 1.75,12.375 L 10.5,12.375 C 11.457,12.375 12.25,11.6094 12.25,10.625 L 12.25,1.875 C 12.25,0.917969 11.457,0.125 10.5,0.125 L 1.75,0.125 M 9.21484,4.96484 L 5.71484,8.46484 C 5.44141,8.73828 5.03125,8.73828 4.78516,8.46484 L 3.03516,6.71484 C 2.76172,6.46875 2.76172,6.05859 3.03516,5.8125 C 3.28125,5.53906 3.69141,5.53906 3.96484,5.8125 L 5.25,7.09766 L 8.28516,4.03516 C 8.53125,3.78906 8.94141,3.78906 9.1875,4.03516 C 9.46094,4.30859 9.46094,4.71875 9.1875,4.96484 L 9.21484,4.96484 ", + ], + iconName: "olympus-icons-check-square" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsChevronDownWarning: IconDefinition = { + icon: [ + 14.0, + 8.0, + [], + "", + "M 6.37109,7.37891 C 6.69922,7.73438 7.27344,7.73438 7.60156,7.37891 L 12.8516,2.12891 C 13.207,1.80078 13.207,1.22656 12.8516,0.898438 C 12.5234,0.542969 11.9492,0.542969 11.6211,0.898438 L 7.0,5.51953 L 2.35156,0.898438 C 2.02344,0.542969 1.44922,0.542969 1.12109,0.898438 C 0.765625,1.22656 0.765625,1.80078 1.12109,2.12891 L 6.37109,7.37891 ", + ], + iconName: "olympus-icons-chevron-down-warning" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsChevronDown: IconDefinition = { + icon: [ + 14.0, + 8.0, + [], + "", + "M 6.37109,7.37891 C 6.69922,7.73438 7.27344,7.73438 7.60156,7.37891 L 12.8516,2.12891 C 13.207,1.80078 13.207,1.22656 12.8516,0.898438 C 12.5234,0.542969 11.9492,0.542969 11.6211,0.898438 L 7.0,5.51953 L 2.35156,0.898438 C 2.02344,0.542969 1.44922,0.542969 1.12109,0.898438 C 0.765625,1.22656 0.765625,1.80078 1.12109,2.12891 L 6.37109,7.37891 ", + ], + iconName: "olympus-icons-chevron-down" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsCircleInfoSolid: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 256.0,512.0 A 256.0,256.0 0.0 1,0 256.0,0.0 A 256.0,256.0 0.0 1,0 256.0,512.0 M 216.0,336.0 L 240.0,336.0 L 240.0,272.0 L 216.0,272.0 C 202.7,272.0 192.0,261.3 192.0,248.0 C 192.0,234.7 202.7,224.0 216.0,224.0 L 264.0,224.0 C 277.3,224.0 288.0,234.7 288.0,248.0 L 288.0,336.0 L 296.0,336.0 C 309.3,336.0 320.0,346.7 320.0,360.0 C 320.0,373.3 309.3,384.0 296.0,384.0 L 216.0,384.0 C 202.7,384.0 192.0,373.3 192.0,360.0 C 192.0,346.7 202.7,336.0 216.0,336.0 M 256.0,128.0 A 32.0,32.0 0.0 1,1 256.0,192.0 A 32.0,32.0 0.0 1,1 256.0,128.0 ", + ], + iconName: "olympus-icons-circle-info-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsCircleQuestionRegular: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 464.0,256.0 A 208.0,208.0 0.0 1,0 48.0,256.0 A 208.0,208.0 0.0 1,0 464.0,256.0 M 0.0,256.0 A 256.0,256.0 0.0 1,1 512.0,256.0 A 256.0,256.0 0.0 1,1 0.0,256.0 M 169.8,165.3 C 177.70000000000002,143.0 198.9,128.0 222.60000000000002,128.0 L 280.90000000000003,128.0 C 315.8,128.0 344.00000000000006,156.3 344.00000000000006,191.1 C 344.00000000000006,213.7 331.90000000000003,234.6 312.30000000000007,245.89999999999998 L 280.0,264.4 C 279.8,277.4 269.1,288.0 256.0,288.0 C 242.7,288.0 232.0,277.3 232.0,264.0 L 232.0,250.5 C 232.0,241.9 236.6,234.0 244.1,229.7 L 288.4,204.29999999999998 C 293.09999999999997,201.6 296.0,196.6 296.0,191.2 C 296.0,182.79999999999998 289.2,176.1 280.9,176.1 L 222.6,176.1 C 219.2,176.1 216.2,178.2 215.1,181.4 L 214.7,182.6 C 210.29999999999998,195.1 196.5,201.6 184.1,197.2 C 171.7,192.79999999999998 165.1,179.0 169.5,166.6 L 169.9,165.4 L 169.8,165.3 M 224.0,352.0 A 32.0,32.0 0.0 1,1 288.0,352.0 A 32.0,32.0 0.0 1,1 224.0,352.0 ", + ], + iconName: "olympus-icons-circle-question-regular" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsClimb: IconDefinition = { + icon: [ + 640.0, + 512.0, + [], + "", + "M 0.0,480.0 C 0.0,497.7 14.3,512.0 32.0,512.0 L 608.0,512.0 C 625.7,512.0 640.0,497.7 640.0,480.0 C 640.0,462.3 625.7,448.0 608.0,448.0 L 32.0,448.0 C 14.3,448.0 0.0,462.3 0.0,480.0 M 381.0,114.9 L 186.1,41.8 C 169.4,35.6 150.9,36.5 135.0,44.5 L 89.1,67.4 C 78.0,73.0 77.2,88.5 87.6,95.2 L 234.5,189.7 L 136.0,240.0 L 77.8,214.1 C 69.1,210.2 59.0,210.4 50.5,214.7 L 18.299999999999997,230.79999999999998 C 8.999999999999996,235.49999999999997 6.4999999999999964,247.6 13.299999999999997,255.49999999999997 L 86.39999999999999,340.79999999999995 C 92.49999999999999,347.9 101.39999999999999,351.99999999999994 110.69999999999999,351.99999999999994 L 248.39999999999998,351.99999999999994 C 253.39999999999998,351.99999999999994 258.29999999999995,350.79999999999995 262.7,348.59999999999997 L 535.6,212.2 C 582.1,188.89999999999998 618.1,148.89999999999998 636.4,100.19999999999999 C 645.9,75.0 627.2,48.0 600.2,48.0 L 542.8000000000001,48.0 C 522.6,48.0 502.6000000000001,52.8 484.6000000000001,62.0 L 381.0,114.9 ", + ], + iconName: "olympus-icons-climb" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsCrosshairsSolid: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 256.0,0.0 C 273.7,0.0 288.0,14.3 288.0,32.0 L 288.0,42.4 C 381.7,56.3 455.7,130.4 469.6,224.0 L 480.0,224.0 C 497.7,224.0 512.0,238.3 512.0,256.0 C 512.0,273.7 497.7,288.0 480.0,288.0 L 469.6,288.0 C 455.70000000000005,381.7 381.6,455.7 288.0,469.6 L 288.0,480.0 C 288.0,497.7 273.7,512.0 256.0,512.0 C 238.3,512.0 224.0,497.7 224.0,480.0 L 224.0,469.6 C 130.3,455.7 56.3,381.7 42.4,288.0 L 32.0,288.0 C 14.3,288.0 0.0,273.7 0.0,256.0 C 0.0,238.3 14.3,224.0 32.0,224.0 L 42.4,224.0 C 56.3,130.3 130.3,56.3 224.0,42.4 L 224.0,32.0 C 224.0,14.3 238.3,0.0 256.0,0.0 M 107.4,288.0 C 119.9,346.3 165.8,392.1 224.0,404.6 L 224.0,384.0 C 224.0,366.3 238.3,352.0 256.0,352.0 C 273.7,352.0 288.0,366.3 288.0,384.0 L 288.0,404.6 C 346.3,392.1 392.1,346.20000000000005 404.6,288.0 L 384.0,288.0 C 366.3,288.0 352.0,273.7 352.0,256.0 C 352.0,238.3 366.3,224.0 384.0,224.0 L 404.6,224.0 C 392.1,165.7 346.3,119.9 288.0,107.4 L 288.0,128.0 C 288.0,145.7 273.7,160.0 256.0,160.0 C 238.3,160.0 224.0,145.7 224.0,128.0 L 224.0,107.4 C 165.7,119.9 119.9,165.7 107.4,224.0 L 128.0,224.0 C 145.7,224.0 160.0,238.3 160.0,256.0 C 160.0,273.7 145.7,288.0 128.0,288.0 L 107.4,288.0 M 256.0,224.0 A 32.0,32.0 0.0 1,1 256.0,288.0 A 32.0,32.0 0.0 1,1 256.0,224.0 ", + ], + iconName: "olympus-icons-crosshairs-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsDescent: IconDefinition = { + icon: [ + 640.0, + 512.0, + [], + "", + "M 0.0,480.0 C 0.0,497.7 14.3,512.0 32.0,512.0 L 608.0,512.0 C 625.7,512.0 640.0,497.7 640.0,480.0 C 640.0,462.3 625.7,448.0 608.0,448.0 L 32.0,448.0 C 14.3,448.0 0.0,462.3 0.0,480.0 M 390.60902,242.29848 L 295.63089,57.072198 C 287.44991,41.248114 273.15967,29.46469 256.01489,24.682806 L 206.65223,10.734745 C 194.67308,7.4076141 183.65093,18.33475 186.83528,30.289244 L 231.90676,199.04475 L 125.19723,169.9687 L 99.575041,111.64587 C 95.764001,102.90653 88.158361,96.257906 78.977251,93.718766 L 44.324506,83.959798 C 34.282459,81.178199 24.290763,88.44635 24.004651,98.865954 L 20.676595,211.15409 C 20.411029,220.51087 24.235429,229.53273 31.114716,235.79095999999998 L 132.97255,328.4531 C 136.67109000000002,331.81774 141.10317,334.22744 145.83833,335.56096 L 439.49205000000006,418.30671 C 489.56770000000006,432.36265000000003 543.11431,426.99971 589.42255,403.2905 C 613.40755,391.04266 617.74406,358.48679 597.77193,340.31774 L 555.31268,301.69169 C 540.37057,288.09856 522.34635,278.1906 502.84067,272.88322 L 390.60902,242.29848 ", + ], + iconName: "olympus-icons-descent" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsDiamond: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 7.7738456,0.73991536 C 7.8025025999999995,0.67297536 7.8690576,0.62986052 7.942534899999999,0.62986052 C 8.015954899999999,0.62986052 8.0825093,0.6729805200000001 8.111225,0.73991536 L 8.6172383,1.907376 C 8.6563133,1.998136 8.676922300000001,2.094581 8.676922300000001,2.193291 L 8.676922300000001,3.066887 L 10.329417,4.01992 L 10.329417,3.806656 C 10.329417,3.655741 10.452217,3.5343289999999996 10.604804,3.5343289999999996 C 10.757448,3.5343289999999996 10.880248,3.6557409999999995 10.880248,3.8066559999999994 L 10.880248,4.441993 L 10.880248,4.805059 L 10.880248,5.07733 C 10.880248,5.2282459999999995 10.757448,5.349658 10.604804,5.349658 C 10.452217,5.349658 10.329417,5.2282459999999995 10.329417,5.07733 L 10.329417,4.98659 L 8.676921,4.98659 L 8.676921,5.357559999999999 L 9.3482453,5.939622999999999 C 9.3883913,5.973642999999999 9.4113653,6.023572999999999 9.4113653,6.0757319999999995 L 9.4113653,6.257263999999999 C 9.4113653,6.357133999999999 9.3287633,6.438795999999999 9.2277547,6.438795999999999 L 8.1260895,6.438795999999999 L 8.1260895,5.712665999999999 C 8.1260895,5.612855999999999 8.043489500000002,5.531187999999998 7.942534900000001,5.531187999999998 C 7.841524000000001,5.531187999999998 7.758924700000001,5.612847999999999 7.758924700000001,5.712665999999999 L 7.758924700000001,6.438795999999999 L 6.657261,6.438795999999999 C 6.55625,6.438795999999999 6.4736508,6.357125999999999 6.4736508,6.257263999999999 L 6.4736508,6.075732 C 6.4736508,6.023572000000001 6.4965627999999995,5.973636 6.5367087999999995,5.939623 L 7.2080928,5.35756 L 7.2080928,4.98659 L 5.5555976,4.98659 L 5.5555976,5.07733 C 5.5555976,5.228245 5.4327963,5.349657 5.280209899999999,5.349657 C 5.127566899999999,5.349657 5.004765699999999,5.228244999999999 5.004765699999999,5.07733 L 5.004765699999999,4.805059 L 5.004765699999999,4.441993 L 5.004765699999999,3.806656 C 5.004765699999999,3.655741 5.127566899999999,3.5343289999999996 5.280209899999999,3.5343289999999996 C 5.432796299999999,3.5343289999999996 5.555597599999999,3.6557409999999995 5.555597599999999,3.8066559999999994 L 5.555597599999999,4.01992 L 7.2080933,3.066887 L 7.2080933,2.193291 C 7.2080933,2.094581 7.2287583,1.998136 7.2677773,1.907376 L 7.7738456,0.73991536 M 3.184664,4.4905966 C 3.213321,4.4236556 3.2798760000000002,4.3805414 3.3533541000000002,4.3805414 C 3.4267741000000003,4.3805414 3.4933285,4.4236554 3.5220443,4.4905966 L 4.0280567,5.658057 C 4.0671317,5.748817000000001 4.0877406999999994,5.845262600000001 4.0877406999999994,5.9439725 L 4.0877406999999994,6.8175682 L 5.7402356999999995,7.7706016 L 5.7402356999999995,7.5573376 C 5.7402356999999995,7.4064226 5.8630365,7.2850111 6.015623499999999,7.2850111 C 6.1682665,7.2850111 6.291067299999999,7.4064226 6.291067299999999,7.5573376 L 6.291067299999999,8.1926747 L 6.291067299999999,8.555740799999999 L 6.291067299999999,8.828011799999999 C 6.291067299999999,8.9789281 6.168266499999999,9.1003397 6.015623499999999,9.1003397 C 5.8630365,9.1003397 5.7402356999999995,8.9789281 5.7402356999999995,8.828011799999999 L 5.7402356999999995,8.7372709 L 4.0877394,8.7372709 L 4.0877394,9.1082413 L 4.759064,9.6903046 C 4.79921,9.7243246 4.822179,9.7742446 4.822179,9.826413599999999 L 4.822179,10.007945999999999 C 4.822179,10.107815999999998 4.73958,10.189478999999999 4.6385688,10.189478999999999 L 3.5369055,10.189478999999999 L 3.5369055,9.4633456 C 3.5369055,9.3635356 3.4543065,9.281868600000001 3.3533517,9.281868600000001 C 3.2523407,9.281868600000001 3.1697406000000004,9.3635286 3.1697406000000004,9.4633456 L 3.1697406000000004,10.189479 L 2.0680777,10.189479 C 1.9670667,10.189479 1.8844667,10.107819000000001 1.8844667,10.007946 L 1.8844667,9.8264136 C 1.8844667,9.7742536 1.9073787,9.724317600000001 1.9475247,9.690304600000001 L 2.6189119,9.1082413 L 2.6189119,8.7372709 L 0.96641662,8.7372709 L 0.96641662,8.8280119 C 0.96641662,8.9789282 0.84361522,9.1003398 0.6910291199999999,9.1003398 C 0.5383858799999999,9.1003398 0.4155852099999999,8.9789282 0.4155852099999999,8.8280119 L 0.4155852099999999,8.5557408 L 0.4155852099999999,8.1926747 L 0.4155852099999999,7.5573376 C 0.4155852099999999,7.4064226 0.5383858799999999,7.2850111 0.6910291199999999,7.2850111 C 0.84361522,7.2850111 0.96641662,7.4064226 0.96641662,7.5573376 L 0.96641662,7.7706016 L 2.6189116,6.8175682 L 2.6189116,5.9439725 C 2.6189116,5.8452625000000005 2.6395766000000003,5.7488178 2.6785956,5.658057 L 3.184664,4.4905966 M 12.484629,4.5143881 C 12.513279,4.4474471 12.579839,4.4043328 12.653319,4.4043328 C 12.726739,4.4043328 12.793293,4.4474468 12.822009,4.5143881 L 13.328021,5.681848499999999 C 13.367101,5.7726085 13.387701,5.869053999999999 13.387701,5.967763999999999 L 13.387701,6.841359599999999 L 15.040196,7.794393099999999 L 15.040196,7.581129 C 15.040196,7.430213999999999 15.162998,7.3088025 15.315585,7.3088025 C 15.468227,7.3088025 15.591029,7.430213999999999 15.591029,7.581129 L 15.591029,8.2164661 L 15.591029,8.5795323 L 15.591029,8.8518033 C 15.591029,9.0027196 15.468227,9.1241312 15.315585,9.1241312 C 15.162998,9.1241312 15.040196,9.0027196 15.040196,8.8518033 L 15.040196,8.7610623 L 13.387701,8.7610623 L 13.387701,9.1320326 L 14.059025,9.714096600000001 C 14.099175,9.748116600000001 14.122135,9.798036600000001 14.122135,9.850203600000002 L 14.122135,10.031736000000002 C 14.122135,10.131606000000001 14.039535,10.213269000000002 13.938524,10.213269000000002 L 12.836865,10.213269000000002 L 12.836865,9.4871406 C 12.836865,9.3873306 12.754265,9.3056626 12.653310999999999,9.3056626 C 12.552299999999999,9.3056626 12.469699999999998,9.3873226 12.469699999999998,9.4871406 L 12.469699999999998,10.213272 L 11.368041999999997,10.213272 C 11.267030999999998,10.213272 11.184430999999996,10.131612 11.184430999999996,10.031739 L 11.184430999999996,9.8502066 C 11.184430999999996,9.7980466 11.207340999999996,9.7481106 11.247490999999997,9.7140986 L 11.918873999999997,9.1320356 L 11.918873999999997,8.7610653 L 10.266377999999998,8.7610653 L 10.266377999999998,8.8518063 C 10.266377999999998,9.0027226 10.143575999999998,9.1241342 9.990990199999997,9.1241342 C 9.838346199999997,9.1241342 9.715546199999997,9.0027226 9.715546199999997,8.8518063 L 9.715546199999997,8.5795323 L 9.715546199999997,8.2164661 L 9.715546199999997,7.581129 C 9.715546199999997,7.430213999999999 9.838346199999997,7.3088025 9.990990199999997,7.3088025 C 10.143575999999998,7.3088025 10.266377999999998,7.430213999999999 10.266377999999998,7.581129 L 10.266377999999998,7.7943931 L 11.918876,6.8413596 L 11.918876,5.967764 C 11.918876,5.869054 11.939546,5.7726093 11.978556,5.6818485 L 12.484629,4.5143881 M 7.7976374,9.4146894 C 7.8262934,9.3477494 7.8928494,9.3046341 7.9663275,9.3046341 C 8.0397475,9.3046341 8.1063019,9.3477491 8.1350177,9.4146894 L 8.6410301,10.582146 C 8.6801051,10.672906 8.7007141,10.76935 8.7007141,10.86806 L 8.7007141,11.741652 L 10.35321,12.694685 L 10.35321,12.481421 C 10.35321,12.330506999999999 10.47601,12.209095 10.628597000000001,12.209095 C 10.781241000000001,12.209095 10.904041000000001,12.330506999999999 10.904041000000001,12.481421 L 10.904041000000001,13.116757999999999 L 10.904041000000001,13.479823999999999 L 10.904041000000001,13.752094999999999 C 10.904041000000001,13.903011999999999 10.781241000000001,14.024423999999998 10.628597000000001,14.024423999999998 C 10.47601,14.024423999999998 10.35321,13.903011999999999 10.35321,13.752094999999999 L 10.35321,13.661354999999999 L 8.7007128,13.661354999999999 L 8.7007128,14.032324999999998 L 9.3720378,14.614389 C 9.4121838,14.648409 9.435157799999999,14.698329 9.435157799999999,14.750497 L 9.435157799999999,14.932029 C 9.435157799999999,15.031899 9.3525558,15.113562 9.251547299999999,15.113562 L 8.1498788,15.113562 L 8.1498788,14.38743 C 8.1498788,14.28762 8.0672798,14.205953000000001 7.9663251,14.205953000000001 C 7.8653141,14.205953000000001 7.7827139999999995,14.287613 7.7827139999999995,14.38743 L 7.7827139999999995,15.113562 L 6.6810511,15.113562 C 6.5800402,15.113562 6.4974401,15.031902 6.4974401,14.932029 L 6.4974401,14.750497 C 6.4974401,14.698336999999999 6.5203521,14.648401 6.5604991,14.614389 L 7.231885800000001,14.032324999999998 L 7.231885800000001,13.661354999999999 L 5.5793901,13.661354999999999 L 5.5793901,13.752094999999999 C 5.5793901,13.903011 5.4565885000000005,14.024422999999999 5.3040025,14.024422999999999 C 5.1513593,14.024422999999999 5.0285586,13.903011999999999 5.0285586,13.752094999999999 L 5.0285586,13.479823999999999 L 5.0285586,13.116757999999999 L 5.0285586,12.481421 C 5.0285586,12.330506999999999 5.1513593,12.209095 5.3040025,12.209095 C 5.4565885000000005,12.209095 5.5793901,12.330506999999999 5.5793901,12.481421 L 5.5793901,12.694685 L 7.2318853,11.741652 L 7.2318853,10.86806 C 7.2318853,10.76935 7.2525503,10.672906 7.2915693,10.582146 L 7.7976374,9.4146894 ", + ], + iconName: "olympus-icons-diamond" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsEchelonLh: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 11.760336,0.82277727 C 11.795406,0.74085617 11.876855,0.68809291 11.966776000000001,0.68809291 C 12.056626000000001,0.68809291 12.138075,0.7408560099999999 12.173217000000001,0.82277727 L 12.79247,2.2515013 C 12.84029,2.3625732 12.86551,2.480601 12.86551,2.6014012 L 12.86551,3.6704969000000003 L 14.887814,4.836807500000001 L 14.887814,4.5758186 C 14.887814,4.3911298 15.038096000000001,4.2425479 15.22483,4.2425479 C 15.411633,4.2425479 15.561915,4.3911298 15.561915,4.5758186 L 15.561915,5.353336 L 15.561915,5.7976518 L 15.561915,6.1308542 C 15.561915,6.3155427 15.411633,6.4641253 15.22483,6.4641253 C 15.038096000000001,6.4641253 14.887814,6.3155427 14.887814,6.1308542 L 14.887814,6.0198095 L 12.865509,6.0198095 L 12.865509,6.473799 L 13.687068,7.186120799999999 C 13.736198,7.2277477999999995 13.764308,7.288854 13.764308,7.352688199999999 L 13.764308,7.574845399999999 C 13.764308,7.697062899999999 13.663224,7.7970025 13.539607,7.7970025 L 12.191408,7.7970025 L 12.191408,6.9083724 C 12.191408,6.786223000000001 12.090323,6.6862824000000005 11.966776,6.6862824000000005 C 11.84316,6.6862824000000005 11.742075999999999,6.786223400000001 11.742075999999999,6.9083724 L 11.742075999999999,7.7970025000000005 L 10.393873,7.7970025000000005 C 10.270256999999999,7.7970025000000005 10.169172999999999,7.6970625 10.169172999999999,7.574845400000001 L 10.169172999999999,7.3526882 C 10.169172999999999,7.2888542 10.197213,7.2277453000000005 10.246343,7.1861208 L 11.067975,6.473799 L 11.067975,6.0198095 L 9.0456705,6.0198095 L 9.0456705,6.1308542 C 9.0456705,6.3155427 8.8953878,6.4641253 8.7086543,6.4641253 C 8.5218516,6.4641253 8.3715689,6.3155427 8.3715689,6.1308542 L 8.3715689,5.7976518 L 8.3715689,5.353336 L 8.3715689,4.5758186 C 8.3715689,4.3911298 8.5218516,4.2425479 8.7086543,4.2425479 C 8.8953878,4.2425479 9.0456705,4.3911298 9.0456705,4.5758186 L 9.0456705,4.8368075 L 11.067975,3.6704969 L 11.067975,2.6014012 C 11.067975,2.480601 11.093265,2.3625732000000004 11.141015000000001,2.2515013 L 11.760336,0.82277727 M 4.3098319,8.5178559 C 4.3449019,8.435934900000001 4.4263509,8.3831716 4.5162729,8.3831716 C 4.6061229,8.3831716 4.6875719,8.435934600000001 4.7227139,8.5178559 L 5.3419659,9.94658 C 5.3897859,10.057652000000001 5.4150059,10.175680000000002 5.4150059,10.29648 L 5.4150059,11.365576 L 7.4373102,12.531887000000001 L 7.4373102,12.270897000000001 C 7.4373102,12.086209000000002 7.5875924,11.937627 7.7743265,11.937627 C 7.9611292,11.937627 8.1114113,12.086209 8.1114113,12.270897000000001 L 8.1114113,13.048415000000002 L 8.1114113,13.492731000000003 L 8.1114113,13.825933000000003 C 8.1114113,14.010622000000003 7.9611292,14.159204000000003 7.7743265,14.159204000000003 C 7.5875924,14.159204000000003 7.4373102,14.010622000000003 7.4373102,13.825933000000003 L 7.4373102,13.714889 L 5.4150049,13.714889 L 5.4150049,14.168878 L 6.236563899999999,14.8812 C 6.285693899999999,14.92283 6.313803899999999,14.983933 6.313803899999999,15.047767 L 6.313803899999999,15.269924 C 6.313803899999999,15.392142 6.212719899999999,15.492082 6.089103899999999,15.492082 L 4.740900899999999,15.492082 L 4.740900899999999,14.603451 C 4.740900899999999,14.481302 4.639816899999999,14.381361 4.516269899999999,14.381361 C 4.392653899999999,14.381361 4.2915689,14.481301 4.2915689,14.603451 L 4.2915689,15.492082 L 2.9433669,15.492082 C 2.8197509,15.492082 2.7186659,15.392142 2.7186659,15.269924 L 2.7186659,15.047767 C 2.7186659,14.983937000000001 2.7467059,14.922824 2.7958359,14.8812 L 3.6174709000000003,14.168878 L 3.6174709000000003,13.714889 L 1.5951669000000002,13.714889 L 1.5951669000000002,13.825933 C 1.5951669000000002,14.010622 1.4448839000000002,14.159203999999999 1.2581509000000002,14.159203999999999 C 1.0713479000000001,14.159203999999999 0.9210659100000003,14.010622 0.9210659100000003,13.825933 L 0.9210659100000003,13.492731 L 0.9210659100000003,13.048414999999999 L 0.9210659100000003,12.270896999999998 C 0.9210659100000003,12.086208999999998 1.0713479000000004,11.937626999999997 1.2581509000000002,11.937626999999997 C 1.4448839000000002,11.937626999999997 1.5951669000000002,12.086208999999997 1.5951669000000002,12.270896999999998 L 1.5951669000000002,12.531886999999998 L 3.6174709000000003,11.365575999999997 L 3.6174709000000003,10.29648 C 3.6174709000000003,10.175680000000002 3.6427609000000003,10.057652000000001 3.6905109000000005,9.94658 L 4.3098319,8.5178559 ", + ], + iconName: "olympus-icons-echelon-lh" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsEchelonRh: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 4.7226453,0.82277727 C 4.687573,0.74085619 4.6061264,0.68809291 4.516205,0.68809291 C 4.4263520000000005,0.68809291 4.3449057,0.7408560099999999 4.309764,0.82277727 L 3.6905114,2.2515013 C 3.6426914,2.3625732 3.6174714000000003,2.480601 3.6174714000000003,2.6014012 L 3.6174714000000003,3.6704969 L 1.5951671,4.8368075 L 1.5951671,4.5758186 C 1.5951671,4.3911298 1.4448849000000001,4.2425479 1.2581508000000001,4.2425479 C 1.0713481000000002,4.2425479 0.92106591,4.3911298 0.92106591,4.5758186 L 0.92106591,5.353336 L 0.92106591,5.7976518 L 0.92106591,6.1308542 C 0.92106591,6.3155427 1.0713481,6.4641253 1.2581508000000001,6.4641253 C 1.4448849000000001,6.4641253 1.5951671,6.3155427 1.5951671,6.1308542 L 1.5951671,6.0198095 L 3.6174719,6.0198095 L 3.6174719,6.473799 L 2.7959129,7.186120799999999 C 2.7467808999999996,7.2277477999999995 2.7186698999999996,7.288854 2.7186698999999996,7.352688199999999 L 2.7186698999999996,7.574845399999999 C 2.7186698999999996,7.697062899999999 2.8197542999999996,7.7970025 2.9433705999999997,7.7970025 L 4.2915732,7.7970025 L 4.2915732,6.9083724 C 4.2915732,6.786223000000001 4.392657600000001,6.6862824000000005 4.516205,6.6862824000000005 C 4.6398207000000005,6.6862824000000005 4.7409051,6.786223400000001 4.7409051,6.9083724 L 4.7409051,7.7970025000000005 L 6.0891075,7.7970025000000005 C 6.2127238,7.7970025000000005 6.3138081999999995,7.6970625 6.3138081999999995,7.574845400000001 L 6.3138081999999995,7.3526882 C 6.3138081999999995,7.2888542 6.285764199999999,7.2277453000000005 6.236634199999999,7.1861208 L 5.4150063,6.473799 L 5.4150063,6.0198095 L 7.437310399999999,6.0198095 L 7.437310399999999,6.1308542 C 7.437310399999999,6.3155427 7.587593099999999,6.4641253 7.774326599999999,6.4641253 C 7.9611293,6.4641253 8.111412,6.3155427 8.111412,6.1308542 L 8.111412,5.7976518 L 8.111412,5.353336 L 8.111412,4.5758186 C 8.111412,4.3911298 7.9611293,4.2425479 7.774326599999999,4.2425479 C 7.587593099999999,4.2425479 7.437310399999999,4.3911298 7.437310399999999,4.5758186 L 7.437310399999999,4.8368075 L 5.4150063,3.6704969 L 5.4150063,2.6014012 C 5.4150063,2.480601 5.3897173,2.3625732000000004 5.3419663,2.2515013 L 4.7226453,0.82277727 M 12.173149,8.5178559 C 12.138079000000001,8.435934900000001 12.05663,8.3831716 11.966708,8.3831716 C 11.876858,8.3831716 11.795409000000001,8.435934600000001 11.760267,8.5178559 L 11.141015,9.94658 C 11.093195,10.057652000000001 11.067974999999999,10.175680000000002 11.067974999999999,10.29648 L 11.067974999999999,11.365576 L 9.045670699999999,12.531887000000001 L 9.045670699999999,12.270897000000001 C 9.045670699999999,12.086209000000002 8.8953885,11.937627 8.708654399999999,11.937627 C 8.5218517,11.937627 8.371569599999999,12.086209 8.371569599999999,12.270897000000001 L 8.371569599999999,13.048415000000002 L 8.371569599999999,13.492731000000003 L 8.371569599999999,13.825933000000003 C 8.371569599999999,14.010622000000003 8.5218517,14.159204000000003 8.708654399999999,14.159204000000003 C 8.8953885,14.159204000000003 9.045670699999999,14.010622000000003 9.045670699999999,13.825933000000003 L 9.045670699999999,13.714889000000003 L 11.067975999999998,13.714889000000003 L 11.067975999999998,14.168878000000003 L 10.246417,14.8812 C 10.197287,14.92283 10.169177,14.983933 10.169177,15.047767 L 10.169177,15.269924 C 10.169177,15.392142 10.270261,15.492082 10.393877,15.492082 L 11.74208,15.492082 L 11.74208,14.603451 C 11.74208,14.481302 11.843164,14.381361 11.966711,14.381361 C 12.090327,14.381361 12.191412,14.481301 12.191412,14.603451 L 12.191412,15.492082 L 13.539614,15.492082 C 13.66323,15.492082 13.764315,15.392142 13.764315,15.269924 L 13.764315,15.047767 C 13.764315,14.983937000000001 13.736275,14.922824 13.687145,14.8812 L 12.86551,14.168878 L 12.86551,13.714889 L 14.887814,13.714889 L 14.887814,13.825933 C 14.887814,14.010622 15.038097,14.159203999999999 15.22483,14.159203999999999 C 15.411633,14.159203999999999 15.561915,14.010622 15.561915,13.825933 L 15.561915,13.492731 L 15.561915,13.048414999999999 L 15.561915,12.270896999999998 C 15.561915,12.086208999999998 15.411633,11.937626999999997 15.22483,11.937626999999997 C 15.038097,11.937626999999997 14.887814,12.086208999999997 14.887814,12.270896999999998 L 14.887814,12.531886999999998 L 12.86551,11.365576 L 12.86551,10.29648 C 12.86551,10.175680000000002 12.84022,10.057652000000001 12.79247,9.94658 L 12.173149,8.5178559 ", + ], + iconName: "olympus-icons-echelon-rh" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsEchelon: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 4.7226453,0.82277727 C 4.687573,0.74085619 4.6061264,0.68809291 4.516205,0.68809291 C 4.4263520000000005,0.68809291 4.3449057,0.7408560099999999 4.309764,0.82277727 L 3.6905114,2.2515013 C 3.6426914,2.3625732 3.6174714000000003,2.480601 3.6174714000000003,2.6014012 L 3.6174714000000003,3.6704969 L 1.5951671,4.8368075 L 1.5951671,4.5758186 C 1.5951671,4.3911298 1.4448849000000001,4.2425479 1.2581508000000001,4.2425479 C 1.0713481000000002,4.2425479 0.92106591,4.3911298 0.92106591,4.5758186 L 0.92106591,5.353336 L 0.92106591,5.7976518 L 0.92106591,6.1308542 C 0.92106591,6.3155427 1.0713481,6.4641253 1.2581508000000001,6.4641253 C 1.4448849000000001,6.4641253 1.5951671,6.3155427 1.5951671,6.1308542 L 1.5951671,6.0198095 L 3.6174719,6.0198095 L 3.6174719,6.473799 L 2.7959129,7.186120799999999 C 2.7467808999999996,7.2277477999999995 2.7186698999999996,7.288854 2.7186698999999996,7.352688199999999 L 2.7186698999999996,7.574845399999999 C 2.7186698999999996,7.697062899999999 2.8197542999999996,7.7970025 2.9433705999999997,7.7970025 L 4.2915732,7.7970025 L 4.2915732,6.9083724 C 4.2915732,6.786223000000001 4.392657600000001,6.6862824000000005 4.516205,6.6862824000000005 C 4.6398207000000005,6.6862824000000005 4.7409051,6.786223400000001 4.7409051,6.9083724 L 4.7409051,7.7970025000000005 L 6.0891075,7.7970025000000005 C 6.2127238,7.7970025000000005 6.3138081999999995,7.6970625 6.3138081999999995,7.574845400000001 L 6.3138081999999995,7.3526882 C 6.3138081999999995,7.2888542 6.285764199999999,7.2277453000000005 6.236634199999999,7.1861208 L 5.4150063,6.473799 L 5.4150063,6.0198095 L 7.437310399999999,6.0198095 L 7.437310399999999,6.1308542 C 7.437310399999999,6.3155427 7.587593099999999,6.4641253 7.774326599999999,6.4641253 C 7.9611293,6.4641253 8.111412,6.3155427 8.111412,6.1308542 L 8.111412,5.7976518 L 8.111412,5.353336 L 8.111412,4.5758186 C 8.111412,4.3911298 7.9611293,4.2425479 7.774326599999999,4.2425479 C 7.587593099999999,4.2425479 7.437310399999999,4.3911298 7.437310399999999,4.5758186 L 7.437310399999999,4.8368075 L 5.4150063,3.6704969 L 5.4150063,2.6014012 C 5.4150063,2.480601 5.3897173,2.3625732000000004 5.3419663,2.2515013 L 4.7226453,0.82277727 M 12.173149,8.5178559 C 12.138079000000001,8.435934900000001 12.05663,8.3831716 11.966708,8.3831716 C 11.876858,8.3831716 11.795409000000001,8.435934600000001 11.760267,8.5178559 L 11.141015,9.94658 C 11.093195,10.057652000000001 11.067974999999999,10.175680000000002 11.067974999999999,10.29648 L 11.067974999999999,11.365576 L 9.045670699999999,12.531887000000001 L 9.045670699999999,12.270897000000001 C 9.045670699999999,12.086209000000002 8.8953885,11.937627 8.708654399999999,11.937627 C 8.5218517,11.937627 8.371569599999999,12.086209 8.371569599999999,12.270897000000001 L 8.371569599999999,13.048415000000002 L 8.371569599999999,13.492731000000003 L 8.371569599999999,13.825933000000003 C 8.371569599999999,14.010622000000003 8.5218517,14.159204000000003 8.708654399999999,14.159204000000003 C 8.8953885,14.159204000000003 9.045670699999999,14.010622000000003 9.045670699999999,13.825933000000003 L 9.045670699999999,13.714889000000003 L 11.067975999999998,13.714889000000003 L 11.067975999999998,14.168878000000003 L 10.246417,14.8812 C 10.197287,14.92283 10.169177,14.983933 10.169177,15.047767 L 10.169177,15.269924 C 10.169177,15.392142 10.270261,15.492082 10.393877,15.492082 L 11.74208,15.492082 L 11.74208,14.603451 C 11.74208,14.481302 11.843164,14.381361 11.966711,14.381361 C 12.090327,14.381361 12.191412,14.481301 12.191412,14.603451 L 12.191412,15.492082 L 13.539614,15.492082 C 13.66323,15.492082 13.764315,15.392142 13.764315,15.269924 L 13.764315,15.047767 C 13.764315,14.983937000000001 13.736275,14.922824 13.687145,14.8812 L 12.86551,14.168878 L 12.86551,13.714889 L 14.887814,13.714889 L 14.887814,13.825933 C 14.887814,14.010622 15.038097,14.159203999999999 15.22483,14.159203999999999 C 15.411633,14.159203999999999 15.561915,14.010622 15.561915,13.825933 L 15.561915,13.492731 L 15.561915,13.048414999999999 L 15.561915,12.270896999999998 C 15.561915,12.086208999999998 15.411633,11.937626999999997 15.22483,11.937626999999997 C 15.038097,11.937626999999997 14.887814,12.086208999999997 14.887814,12.270896999999998 L 14.887814,12.531886999999998 L 12.86551,11.365576 L 12.86551,10.29648 C 12.86551,10.175680000000002 12.84022,10.057652000000001 12.79247,9.94658 L 12.173149,8.5178559 ", + ], + iconName: "olympus-icons-echelon" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsExplosionSolid: IconDefinition = { + icon: [ + 576.0, + 512.0, + [], + "", + "M 499.6,11.3 C 506.3,0.6000000000000014 520.1,-3.1999999999999993 531.3000000000001,2.8000000000000007 C 542.5000000000001,8.8 547.1,22.3 541.9000000000001,33.8 L 404.8,338.6 C 407.0,340.90000000000003 409.1,343.3 411.1,345.70000000000005 L 508.3,291.00000000000006 C 518.8,285.1000000000001 531.9,287.90000000000003 539.2,297.40000000000003 C 546.5000000000001,306.90000000000003 545.5,320.40000000000003 537.0,328.90000000000003 L 450.0,415.90000000000003 L 378.5,415.90000000000003 C 365.3,378.6 329.8,351.90000000000003 288.0,351.90000000000003 C 246.2,351.90000000000003 210.6,378.6 197.5,415.90000000000003 L 117.8,415.90000000000003 L 42.3,363.7 C 32.599999999999994,357.0 29.199999999999996,344.09999999999997 34.4,333.4 C 39.6,322.7 51.8,317.5 63.099999999999994,321.0 L 160.3,351.4 C 163.3,347.5 166.4,343.7 169.70000000000002,340.09999999999997 L 107.4,236.3 C 101.30000000000001,226.20000000000002 103.5,213.20000000000002 112.5,205.60000000000002 C 121.5,198.00000000000003 134.7,198.10000000000002 143.6,205.70000000000002 L 246.0,293.6 C 247.5,293.20000000000005 249.0,292.8 250.5,292.5 L 264.1,149.8 C 265.3,137.5 275.6,128.10000000000002 288.0,128.10000000000002 C 300.4,128.10000000000002 310.7,137.50000000000003 311.9,149.8 L 325.4,291.70000000000005 L 499.6,11.3 M 64.0,448.0 L 64.0,448.0 L 512.0,448.0 L 512.0,448.0 L 544.0,448.0 C 561.7,448.0 576.0,462.3 576.0,480.0 C 576.0,497.7 561.7,512.0 544.0,512.0 L 32.0,512.0 C 14.3,512.0 0.0,497.7 0.0,480.0 C 0.0,462.3 14.3,448.0 32.0,448.0 L 64.0,448.0 M 288.0,0.0 C 301.3,0.0 312.0,10.7 312.0,24.0 L 312.0,72.0 C 312.0,85.3 301.3,96.0 288.0,96.0 C 274.7,96.0 264.0,85.3 264.0,72.0 L 264.0,24.0 C 264.0,10.7 274.7,0.0 288.0,0.0 ", + ], + iconName: "olympus-icons-explosion-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsEyeSolid: IconDefinition = { + icon: [ + 18.0, + 16.0, + [], + "", + "M 288.0,32.0 C 207.2,32.0 142.5,68.8 95.4,112.6 C 48.6,156.0 17.3,208.0 2.5,243.7 C -0.7999999999999998,251.6 -0.7999999999999998,260.4 2.5,268.3 C 17.3,304.0 48.6,356.0 95.4,399.4 C 142.5,443.2 207.2,480.0 288.0,480.0 C 368.8,480.0 433.5,443.2 480.6,399.4 C 527.4,355.9 558.7,304.0 573.6,268.29999999999995 C 576.9,260.4 576.9,251.59999999999997 573.6,243.69999999999996 C 558.7,207.99999999999994 527.4,155.99999999999994 480.6,112.59999999999997 C 433.5,68.8 368.8,32.0 288.0,32.0 M 144.0,256.0 A 144.0,144.0 0.0 1,1 432.0,256.0 A 144.0,144.0 0.0 1,1 144.0,256.0 M 288.0,192.0 C 288.0,227.3 259.3,256.0 224.0,256.0 C 216.9,256.0 210.1,254.8 203.7,252.7 C 198.2,250.89999999999998 191.79999999999998,254.29999999999998 192.0,260.09999999999997 C 192.3,266.99999999999994 193.3,273.9 195.2,280.79999999999995 C 208.89999999999998,331.99999999999994 261.6,362.4 312.79999999999995,348.69999999999993 C 363.9999999999999,334.9999999999999 394.4,282.29999999999995 380.69999999999993,231.09999999999994 C 369.5999999999999,189.59999999999994 332.8999999999999,161.69999999999993 292.0999999999999,159.99999999999994 C 286.2999999999999,159.79999999999995 282.8999999999999,166.09999999999994 284.69999999999993,171.69999999999993 C 286.79999999999995,178.09999999999994 287.99999999999994,184.89999999999992 287.99999999999994,191.99999999999994 L 288.0,192.0 ", + ], + iconName: "olympus-icons-eye-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsFireSolid: IconDefinition = { + icon: [ + 448.0, + 512.0, + [], + "", + "M 159.3,5.4 C 167.10000000000002,-1.8999999999999995 179.20000000000002,-1.7999999999999998 187.0,5.5 C 214.6,31.4 240.5,59.3 264.7,89.5 C 275.7,75.1 288.2,59.4 301.7,46.6 C 309.59999999999997,39.2 321.8,39.2 329.7,46.7 C 364.3,79.7 393.59999999999997,123.3 414.2,164.7 C 434.5,205.5 448.0,247.2 448.0,276.6 C 448.0,404.2 348.2,512.0 224.0,512.0 C 98.4,512.0 0.0,404.1 0.0,276.5 C 0.0,238.1 17.8,191.2 45.4,144.8 C 73.3,97.7 112.7,48.6 159.3,5.4 M 225.7,416.0 C 251.0,416.0 273.4,409.0 294.5,395.0 C 336.6,365.6 347.9,306.8 322.6,260.6 C 318.1,251.60000000000002 306.6,251.00000000000003 300.1,258.6 L 274.90000000000003,287.90000000000003 C 268.3,295.50000000000006 256.40000000000003,295.3 250.20000000000005,287.40000000000003 C 233.70000000000005,266.40000000000003 204.20000000000005,228.90000000000003 187.40000000000003,207.60000000000002 C 181.10000000000002,199.60000000000002 169.10000000000002,199.50000000000003 162.70000000000005,207.50000000000003 C 128.90000000000003,250.00000000000003 111.90000000000005,276.8 111.90000000000005,306.90000000000003 C 112.0,375.4 162.6,416.0 225.7,416.0 ", + ], + iconName: "olympus-icons-fire-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsFollow: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 8.6152043,0.96068491 C 8.544220300000001,0.79488221 8.379378,0.68809291 8.1973831,0.68809291 C 8.0155266,0.68809291 7.8506851,0.79488191 7.7795606,0.9606849099999999 L 6.5262355,3.8523252 C 6.4294515,4.0771272 6.3784085,4.3160075 6.3784085,4.560499 L 6.3784085,6.7242759 L 2.2854009,9.0848093 L 2.2854009,8.5565855 C 2.2854009,8.182788 1.9812398999999998,7.8820684000000005 1.6033029,7.8820684000000005 C 1.2252269,7.8820684000000005 0.92106591,8.182788 0.92106591,8.5565855 L 0.92106591,10.130228 L 0.92106591,11.029493 L 0.92106591,11.703872 C 0.92106591,12.077669 1.2252269,12.37839 1.6033029,12.37839 C 1.9812399,12.37839 2.2854009,12.077669 2.2854009,11.703872 L 2.2854009,11.479125 L 6.3784085,11.479125 L 6.3784085,12.397969 L 4.7156289,13.83966 C 4.616188899999999,13.923910000000001 4.559293899999999,14.047585 4.559293899999999,14.176781 L 4.559293899999999,14.626412 C 4.559293899999999,14.873772 4.7638818999999994,15.076043 5.0140728999999995,15.076043 L 7.7427437,15.076043 L 7.7427437,13.277516 C 7.7427437,13.030294 7.9473316,12.828021 8.1973831,12.828021 C 8.447573,12.828021 8.6521609,13.030294 8.6521609,13.277516 L 8.6521609,15.076043 L 11.380831,15.076043 C 11.631022,15.076043 11.83561,14.873772 11.83561,14.626412 L 11.83561,14.176781 C 11.83561,14.047585 11.77885,13.923905 11.679415,13.83966 L 10.016496,12.397969 L 10.016496,11.479125 L 14.109501999999999,11.479125 L 14.109501999999999,11.703872 C 14.109501999999999,12.077669 14.413663999999999,12.37839 14.791599999999999,12.37839 C 15.169675999999999,12.37839 15.473837999999999,12.077669 15.473837999999999,11.703872 L 15.473837999999999,11.029493 L 15.473837999999999,10.130228 L 15.473837999999999,8.5565855 C 15.473837999999999,8.182788 15.169675999999999,7.8820684000000005 14.791599999999999,7.8820684000000005 C 14.413663999999999,7.8820684000000005 14.109501999999999,8.182788 14.109501999999999,8.5565855 L 14.109501999999999,9.0848093 L 10.016496,6.7242759 L 10.016496,4.560499 C 10.016496,4.3160075 9.965312,4.0771272 9.8686685,3.8523252 L 8.6152043,0.96068491 ", + ], + iconName: "olympus-icons-follow" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsFormationEnd: IconDefinition = { + icon: [ + 36.0, + 36.0, + [], + "", + "M 7.509551,4.8476603 L 4.2913461,4.8476603 M 4.2913461,0.24555387 L 4.2913461,4.8476603 ", + ], + iconName: "olympus-icons-formation-end" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsFormationMiddle: IconDefinition = { + icon: [ + 36.0, + 36.0, + [], + "", + "M 7.509551,4.8476603 L 4.2913461,4.8476603 M 4.2913461,0.24555387 L 4.2913461,9.312504 ", + ], + iconName: "olympus-icons-formation-middle" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsFront: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 7.5384925,0.85189343 C 7.5735625,0.76997233 7.6550115000000005,0.71720907 7.7449325,0.71720907 C 7.8347825,0.71720907 7.9162315,0.76997217 7.9513735,0.8518934300000001 L 8.5706265,2.2806175 C 8.6184465,2.3916893999999997 8.6436665,2.5097172 8.6436665,2.6305174 L 8.6436665,3.6996131 L 10.665971,4.8659237 L 10.665971,4.6049348 C 10.665971,4.420246 10.816253000000001,4.2716641 11.002987000000001,4.2716641 C 11.18979,4.2716641 11.340072000000001,4.420246 11.340072000000001,4.6049348 L 11.340072000000001,5.3824522 L 11.340072000000001,5.826768 L 11.340072000000001,6.1599704 C 11.340072000000001,6.3446589 11.18979,6.4932415 11.002987000000001,6.4932415 C 10.816253000000001,6.4932415 10.665971,6.3446589 10.665971,6.1599704 L 10.665971,6.0489257 L 8.6436655,6.0489257 L 8.6436655,6.5029151999999995 L 9.4652245,7.215236999999999 C 9.5143545,7.256863999999999 9.5424645,7.3179701999999995 9.5424645,7.381804399999999 L 9.5424645,7.603961599999999 C 9.5424645,7.726179099999999 9.4413805,7.8261186999999985 9.3177635,7.8261186999999985 L 7.9695645,7.8261186999999985 L 7.9695645,6.9374886 C 7.9695645,6.8153392 7.868479499999999,6.7153986 7.7449325,6.7153986 C 7.6213165,6.7153986 7.5202325,6.815339600000001 7.5202325,6.9374886 L 7.5202325,7.8261187 L 6.1720295,7.8261187 C 6.0484135,7.8261187 5.9473294999999995,7.7261787 5.9473294999999995,7.6039616 L 5.9473294999999995,7.3818044 C 5.9473294999999995,7.3179704 5.975369499999999,7.2568615 6.024499499999999,7.215237 L 6.8461315,6.5029152 L 6.8461315,6.0489257 L 4.823827,6.0489257 L 4.823827,6.1599704 C 4.823827,6.3446589 4.6735443,6.4932415 4.4868108,6.4932415 C 4.3000080999999994,6.4932415 4.1497253999999995,6.3446589 4.1497253999999995,6.1599704 L 4.1497253999999995,5.826768 L 4.1497253999999995,5.3824522 L 4.1497253999999995,4.6049348 C 4.1497253999999995,4.420246 4.3000080999999994,4.2716641 4.4868108,4.2716641 C 4.6735443,4.2716641 4.823827,4.420246 4.823827,4.6049348 L 4.823827,4.8659237 L 6.8461315,3.6996131 L 6.8461315,2.6305174 C 6.8461315,2.5097172 6.8714215,2.3916894 6.9191715,2.2806175 L 7.5384925,0.85189343 M 7.5417259,8.4887398 C 7.5767959000000005,8.4068188 7.658244900000001,8.3540555 7.7481669,8.3540555 C 7.8380169,8.3540555 7.9194659000000005,8.4068185 7.9546079,8.4887398 L 8.5738599,9.9174639 C 8.6216799,10.028535999999999 8.646899900000001,10.146564 8.646899900000001,10.267363999999999 L 8.646899900000001,11.336459999999999 L 10.669204,12.502771 L 10.669204,12.241781 C 10.669204,12.057093 10.819486000000001,11.908510999999999 11.00622,11.908510999999999 C 11.193023,11.908510999999999 11.343305,12.057092999999998 11.343305,12.241781 L 11.343305,13.019299 L 11.343305,13.463615 L 11.343305,13.796817 C 11.343305,13.981506000000001 11.193023,14.130088 11.00622,14.130088 C 10.819486000000001,14.130088 10.669204,13.981506000000001 10.669204,13.796817 L 10.669204,13.685773 L 8.6468989,13.685773 L 8.6468989,14.139762 L 9.4684579,14.852084 C 9.5175879,14.893714 9.5456979,14.954817 9.5456979,15.018651 L 9.5456979,15.240808 C 9.5456979,15.363026 9.4446139,15.462966 9.3209979,15.462966 L 7.9727949,15.462966 L 7.9727949,14.574335 C 7.9727949,14.452186 7.8717109,14.352245 7.748163900000001,14.352245 C 7.6245479000000005,14.352245 7.523462900000001,14.452185 7.523462900000001,14.574335 L 7.523462900000001,15.462966 L 6.175260900000001,15.462966 C 6.051644900000001,15.462966 5.950559900000002,15.363026 5.950559900000002,15.240808 L 5.950559900000002,15.018651 C 5.950559900000002,14.954821 5.978599900000002,14.893708 6.0277299000000015,14.852084 L 6.849364900000001,14.139762 L 6.849364900000001,13.685773 L 4.827060900000001,13.685773 L 4.827060900000001,13.796816999999999 C 4.827060900000001,13.981506 4.676777900000001,14.130087999999999 4.490044900000001,14.130087999999999 C 4.303241900000001,14.130087999999999 4.152959900000001,13.981506 4.152959900000001,13.796816999999999 L 4.152959900000001,13.463614999999999 L 4.152959900000001,13.019298999999998 L 4.152959900000001,12.241780999999998 C 4.152959900000001,12.057092999999998 4.303241900000001,11.908510999999997 4.490044900000001,11.908510999999997 C 4.676777900000001,11.908510999999997 4.827060900000001,12.057092999999997 4.827060900000001,12.241780999999998 L 4.827060900000001,12.502770999999997 L 6.849364900000001,11.336459999999997 L 6.849364900000001,10.267363999999997 C 6.849364900000001,10.146563999999998 6.874654900000001,10.028535999999997 6.922404900000001,9.917463899999998 L 7.5417259,8.4887398 ", + ], + iconName: "olympus-icons-front" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsFuel: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 336.0,448.0 L 16.0,448.0 C 7.199999999999999,448.0 0.0,455.2 0.0,464.0 L 0.0,496.0 C 0.0,504.8 7.2,512.0 16.0,512.0 L 336.0,512.0 C 344.8,512.0 352.0,504.8 352.0,496.0 L 352.0,464.0 C 352.0,455.2 344.8,448.0 336.0,448.0 M 493.2,107.30000000000001 L 412.2,26.30000000000001 C 406.0,20.100000000000012 395.8,20.100000000000012 389.59999999999997,26.30000000000001 L 378.29999999999995,37.60000000000001 C 372.09999999999997,43.80000000000001 372.09999999999997,54.00000000000001 378.29999999999995,60.20000000000001 L 416.0,97.9 L 416.0,160.0 C 416.0,188.1 436.9,211.3 464.0,215.2 L 464.0,376.0 C 464.0,389.2 453.2,400.0 440.0,400.0 C 426.8,400.0 416.0,389.2 416.0,376.0 L 416.0,344.0 C 416.0,295.4 376.6,256.0 328.0,256.0 L 320.0,256.0 L 320.0,64.0 C 320.0,28.700000000000003 291.3,0.0 256.0,0.0 L 96.0,0.0 C 60.7,0.0 32.0,28.7 32.0,64.0 L 32.0,416.0 L 320.0,416.0 L 320.0,304.0 L 328.0,304.0 C 350.1,304.0 368.0,321.9 368.0,344.0 L 368.0,371.8 C 368.0,409.5 395.0,443.8 432.5,447.70000000000005 C 475.5,452.00000000000006 512.0,418.20000000000005 512.0,376.00000000000006 L 512.0,152.6 C 512.0,135.6 505.2,119.3 493.2,107.3 L 493.2,107.30000000000001 M 256.0,192.0 L 96.0,192.0 L 96.0,64.0 L 256.0,64.0 L 256.0,192.0 ", + ], + iconName: "olympus-icons-fuel" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsGamepadSolid: IconDefinition = { + icon: [ + 640.0, + 512.0, + [], + "", + "M 192.0,64.0 C 86.0,64.0 0.0,150.0 0.0,256.0 C 0.0,362.0 86.0,448.0 192.0,448.0 L 448.0,448.0 C 554.0,448.0 640.0,362.0 640.0,256.0 C 640.0,150.0 554.0,64.0 448.0,64.0 L 192.0,64.0 M 496.0,168.0 A 40.0,40.0 0.0 1,1 496.0,248.0 A 40.0,40.0 0.0 1,1 496.0,168.0 M 392.0,304.0 A 40.0,40.0 0.0 1,1 472.0,304.0 A 40.0,40.0 0.0 1,1 392.0,304.0 M 168.0,200.0 C 168.0,186.7 178.7,176.0 192.0,176.0 C 205.3,176.0 216.0,186.7 216.0,200.0 L 216.0,232.0 L 248.0,232.0 C 261.3,232.0 272.0,242.7 272.0,256.0 C 272.0,269.3 261.3,280.0 248.0,280.0 L 216.0,280.0 L 216.0,312.0 C 216.0,325.3 205.3,336.0 192.0,336.0 C 178.7,336.0 168.0,325.3 168.0,312.0 L 168.0,280.0 L 136.0,280.0 C 122.7,280.0 112.0,269.3 112.0,256.0 C 112.0,242.7 122.7,232.0 136.0,232.0 L 168.0,232.0 L 168.0,200.0 ", + ], + iconName: "olympus-icons-gamepad-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsGearsSolid: IconDefinition = { + icon: [ + 640.0, + 512.0, + [], + "", + "M 305.5,135.3 C 312.6,129.0 315.4,119.10000000000001 311.7,110.30000000000001 C 309.4,105.00000000000001 306.9,99.80000000000001 304.09999999999997,94.80000000000001 L 301.0,89.4 C 298.0,84.4 294.7,79.5 291.2,74.80000000000001 C 285.5,67.20000000000002 275.5,64.70000000000002 266.5,67.70000000000002 L 238.3,77.00000000000001 C 227.60000000000002,68.20000000000002 215.3,61.000000000000014 202.10000000000002,56.100000000000016 L 196.0,27.1 C 194.1,17.8 186.9,10.400000000000002 177.5,9.3 C 170.9,8.4 164.2,8.0 157.4,8.0 L 156.70000000000002,8.0 C 149.9,8.0 143.20000000000002,8.4 136.60000000000002,9.2 C 127.20000000000002,10.299999999999999 120.00000000000003,17.799999999999997 118.10000000000002,27.0 L 112.0,56.1 C 98.7,61.1 86.5,68.2 75.8,77.0 L 47.5,67.8 C 38.5,64.8 28.5,67.3 22.8,74.89999999999999 C 19.3,79.6 16.0,84.49999999999999 12.9,89.49999999999999 L 9.9,94.79999999999998 C 7.1000000000000005,99.79999999999998 4.6000000000000005,104.99999999999999 2.3000000000000007,110.39999999999998 C -1.3999999999999995,119.09999999999998 1.4000000000000008,128.99999999999997 8.5,135.39999999999998 L 30.7,155.2 C 29.6,161.9 29.0,168.9 29.0,176.0 C 29.0,183.1 29.6,190.1 30.7,196.9 L 8.5,216.7 C 1.4000000000000004,223.0 -1.4000000000000004,232.89999999999998 2.3,241.7 C 4.6,247.0 7.1,252.2 9.899999999999999,257.3 L 12.899999999999999,262.5 C 15.899999999999999,267.6 19.2,272.4 22.799999999999997,277.1 C 28.499999999999996,284.70000000000005 38.5,287.20000000000005 47.5,284.20000000000005 L 75.7,274.90000000000003 C 86.4,283.70000000000005 98.7,290.90000000000003 111.9,295.8 L 118.0,324.90000000000003 C 119.9,334.20000000000005 127.1,341.6 136.5,342.70000000000005 C 143.2,343.50000000000006 150.0,343.90000000000003 156.9,343.90000000000003 C 163.8,343.90000000000003 170.6,343.50000000000006 177.3,342.70000000000005 C 186.70000000000002,341.6 193.9,334.1 195.8,324.90000000000003 L 201.9,295.8 C 215.20000000000002,290.8 227.4,283.7 238.10000000000002,274.90000000000003 L 266.3,284.20000000000005 C 275.3,287.20000000000005 285.3,284.70000000000005 291.0,277.1 C 294.5,272.40000000000003 297.8,267.6 300.8,262.5 L 303.90000000000003,257.1 C 306.70000000000005,252.10000000000002 309.20000000000005,246.90000000000003 311.50000000000006,241.60000000000002 C 315.20000000000005,232.90000000000003 312.40000000000003,223.00000000000003 305.30000000000007,216.60000000000002 L 283.1000000000001,196.8 C 284.2000000000001,190.0 284.80000000000007,183.0 284.80000000000007,175.9 C 284.80000000000007,168.8 284.20000000000005,161.8 283.1000000000001,155.0 L 305.30000000000007,135.2 L 305.5,135.3 M 109.0,176.0 A 48.0,48.0 0.0 1,1 205.0,176.0 A 48.0,48.0 0.0 1,1 109.0,176.0 M 501.7,500.5 C 508.0,507.6 517.9,510.4 526.7,506.7 C 532.0,504.4 537.2,501.9 542.2,499.09999999999997 L 547.6,495.99999999999994 C 552.6,492.99999999999994 557.5,489.69999999999993 562.2,486.19999999999993 C 569.8000000000001,480.49999999999994 572.3000000000001,470.49999999999994 569.3000000000001,461.49999999999994 L 560.0000000000001,433.29999999999995 C 568.8000000000001,422.59999999999997 576.0000000000001,410.29999999999995 580.9000000000001,397.09999999999997 L 610.0000000000001,390.99999999999994 C 619.3000000000001,389.09999999999997 626.7000000000002,381.8999999999999 627.8000000000001,372.49999999999994 C 628.6,365.79999999999995 629.0000000000001,358.99999999999994 629.0000000000001,352.09999999999997 C 629.0000000000001,345.2 628.6000000000001,338.4 627.8000000000001,331.7 C 626.7,322.3 619.2,315.09999999999997 610.0000000000001,313.2 L 580.9,307.0 C 575.9,293.7 568.8,281.5 560.0,270.8 L 569.3,242.60000000000002 C 572.3,233.60000000000002 569.8,223.60000000000002 562.1999999999999,217.90000000000003 C 557.4999999999999,214.40000000000003 552.5999999999999,211.10000000000002 547.5999999999999,208.00000000000003 L 542.3,205.00000000000003 C 537.3,202.20000000000002 532.0999999999999,199.70000000000002 526.6999999999999,197.40000000000003 C 517.9999999999999,193.70000000000005 508.0999999999999,196.50000000000003 501.69999999999993,203.60000000000002 L 481.8999999999999,225.8 C 475.0999999999999,224.70000000000002 468.0999999999999,224.10000000000002 460.99999999999994,224.10000000000002 C 453.9,224.10000000000002 446.8999999999999,224.70000000000002 440.09999999999997,225.8 L 420.29999999999995,203.60000000000002 C 413.99999999999994,196.50000000000003 404.09999999999997,193.70000000000002 395.29999999999995,197.40000000000003 C 389.99999999999994,199.70000000000005 384.79999999999995,202.20000000000005 379.69999999999993,205.00000000000003 L 374.49999999999994,208.00000000000003 C 369.3999999999999,211.00000000000003 364.59999999999997,214.30000000000004 359.8999999999999,217.90000000000003 C 352.2999999999999,223.60000000000002 349.7999999999999,233.60000000000002 352.7999999999999,242.60000000000002 L 362.0999999999999,270.8 C 353.2999999999999,281.5 346.0999999999999,293.8 341.19999999999993,307.0 L 312.1,313.0 C 302.8,314.9 295.40000000000003,322.1 294.3,331.5 C 293.5,338.2 293.1,345.0 293.1,351.9 C 293.1,358.79999999999995 293.5,365.59999999999997 294.3,372.29999999999995 C 295.40000000000003,381.69999999999993 302.90000000000003,388.9 312.1,390.79999999999995 L 341.20000000000005,396.9 C 346.20000000000005,410.2 353.30000000000007,422.4 362.1,433.09999999999997 L 352.8,461.29999999999995 C 349.8,470.29999999999995 352.3,480.29999999999995 359.90000000000003,485.99999999999994 C 364.6,489.49999999999994 369.40000000000003,492.79999999999995 374.50000000000006,495.79999999999995 L 379.90000000000003,498.9 C 384.90000000000003,501.7 390.1,504.2 395.40000000000003,506.5 C 404.1,510.2 414.00000000000006,507.4 420.40000000000003,500.3 L 440.20000000000005,478.1 C 447.00000000000006,479.20000000000005 454.00000000000006,479.8 461.1,479.8 C 468.2,479.8 475.20000000000005,479.2 482.0,478.1 L 501.8,500.3 L 501.7,500.5 M 461.0,304.0 A 48.0,48.0 0.0 1,1 461.0,400.0 A 48.0,48.0 0.0 1,1 461.0,304.0 ", + ], + iconName: "olympus-icons-gears-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsGripLinesSolid: IconDefinition = { + icon: [ + 448.0, + 512.0, + [], + "", + "M 32.0,288.0 C 14.3,288.0 0.0,302.3 0.0,320.0 C 0.0,337.7 14.3,352.0 32.0,352.0 L 416.0,352.0 C 433.7,352.0 448.0,337.7 448.0,320.0 C 448.0,302.3 433.7,288.0 416.0,288.0 L 32.0,288.0 M 32.0,160.0 C 14.3,160.0 0.0,174.3 0.0,192.0 C 0.0,209.7 14.3,224.0 32.0,224.0 L 416.0,224.0 C 433.7,224.0 448.0,209.7 448.0,192.0 C 448.0,174.3 433.7,160.0 416.0,160.0 L 32.0,160.0 ", + ], + iconName: "olympus-icons-grip-lines-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsGroupGround: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 205.77493000000004,139.82932 A 52.56604,52.56604 0.0 1,0 310.90701,139.82932 A 52.56604,52.56604 0.0 1,0 205.77493,139.82932 L 205.77493000000004,139.82932 M 205.77493000000004,139.82932 A 52.56604,52.56604 0.0 1,0 310.90701,139.82932 A 52.56604,52.56604 0.0 1,0 205.77493,139.82932 L 205.77493000000004,139.82932 M 205.77493000000004,139.82932 A 52.56604,52.56604 0.0 1,0 310.90701,139.82932 A 52.56604,52.56604 0.0 1,0 205.77493,139.82932 L 205.77493000000004,139.82932 M 201.8963943,-165.09651 L 361.2014057,-165.09651 A 1.6436043,1.6436043 0.0 0,1 362.84501,-163.4529057 L 362.84501,-4.147894299999997 A 1.6436043,1.6436043 0.0 0,1 361.2014057,-2.5042899999999975 L 201.8963943,-2.5042899999999975 A 1.6436043,1.6436043 0.0 0,1 200.25279,-4.147894299999997 L 200.25279,-163.4529057 A 1.6436043,1.6436043 0.0 0,1 201.8963943,-165.09651 M 201.8963943,-165.09651 L 361.2014057,-165.09651 A 1.6436043,1.6436043 0.0 0,1 362.84501,-163.4529057 L 362.84501,-4.147894299999997 A 1.6436043,1.6436043 0.0 0,1 361.2014057,-2.5042899999999975 L 201.8963943,-2.5042899999999975 A 1.6436043,1.6436043 0.0 0,1 200.25279,-4.147894299999997 L 200.25279,-163.4529057 A 1.6436043,1.6436043 0.0 0,1 201.8963943,-165.09651 M 201.8963943,-165.09651 L 361.2014057,-165.09651 A 1.6436043,1.6436043 0.0 0,1 362.84501,-163.4529057 L 362.84501,-4.147894299999997 A 1.6436043,1.6436043 0.0 0,1 361.2014057,-2.5042899999999975 L 201.8963943,-2.5042899999999975 A 1.6436043,1.6436043 0.0 0,1 200.25279,-4.147894299999997 L 200.25279,-163.4529057 A 1.6436043,1.6436043 0.0 0,1 201.8963943,-165.09651 ", + ], + iconName: "olympus-icons-group-ground" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsGroupNavy: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 146.26115,46.680378 A 226.81407,212.6382 0.0 0,1 373.07523,46.680381999999994 L 259.66818,230.83046 L 146.26115,46.680378 M 273.4033,311.27878 A 226.81407,212.6382 0.0 0,1 500.21738,311.27878999999996 L 386.81033,495.42886 L 273.4033,311.27878 M 14.337485,311.27878 A 226.81407,212.6382 0.0 0,1 241.15157,311.27878999999996 L 127.74452,495.42886 L 14.337485,311.27878 ", + ], + iconName: "olympus-icons-group-navy" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsHandSolid: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 288.0,32.0 C 288.0,14.3 273.7,0.0 256.0,0.0 C 238.3,0.0 224.0,14.3 224.0,32.0 L 224.0,240.0 C 224.0,248.8 216.8,256.0 208.0,256.0 C 199.2,256.0 192.0,248.8 192.0,240.0 L 192.0,64.0 C 192.0,46.3 177.7,32.0 160.0,32.0 C 142.3,32.0 128.0,46.3 128.0,64.0 L 128.0,336.0 C 128.0,337.5 128.0,339.1 128.1,340.6 L 67.6,283.0 C 51.599999999999994,267.8 26.299999999999997,268.4 10.999999999999993,284.4 C -4.300000000000011,300.4 -3.6000000000000068,325.7 12.399999999999993,341.0 L 124.8,448.0 C 167.9,489.1 225.2,512.0 284.8,512.0 L 304.0,512.0 C 401.2,512.0 480.0,433.2 480.0,336.0 L 480.0,128.0 C 480.0,110.3 465.7,96.0 448.0,96.0 C 430.3,96.0 416.0,110.3 416.0,128.0 L 416.0,240.0 C 416.0,248.8 408.8,256.0 400.0,256.0 C 391.2,256.0 384.0,248.8 384.0,240.0 L 384.0,64.0 C 384.0,46.3 369.7,32.0 352.0,32.0 C 334.3,32.0 320.0,46.3 320.0,64.0 L 320.0,240.0 C 320.0,248.8 312.8,256.0 304.0,256.0 C 295.2,256.0 288.0,248.8 288.0,240.0 L 288.0,32.0 ", + ], + iconName: "olympus-icons-hand-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsHeading: IconDefinition = { + icon: [ + 496.0, + 512.0, + [], + "", + "M 347.94,129.86 L 203.6,195.83 A 31.938,31.938 0.0 0,0 187.82999999999998,211.60000000000002 L 121.85999999999999,355.94000000000005 C 114.24999999999999,372.59000000000003 131.39999999999998,389.75000000000006 148.05999999999997,382.14000000000004 L 292.4,316.1700000000001 A 31.938,31.938 0.0 0,0 308.16999999999996,300.4000000000001 L 374.14,156.0600000000001 C 381.75,139.4000000000001 364.59999999999997,122.25000000000009 347.94,129.8600000000001 L 347.94,129.86 M 270.58,278.58000000000004 C 258.10999999999996,291.05000000000007 237.89,291.05000000000007 225.42,278.58000000000004 C 212.95,266.11 212.95,245.89000000000004 225.42,233.42000000000004 C 237.89,220.95000000000005 258.11,220.95000000000005 270.58,233.42000000000004 C 283.05,245.89000000000004 283.05,266.11 270.58,278.58000000000004 M 248.0,8.0 C 111.03,8.0 0.0,119.03 0.0,256.0 C 0.0,392.97 111.03,504.0 248.0,504.0 C 384.97,504.0 496.0,392.97 496.0,256.0 C 496.0,119.02999999999997 384.97,8.0 248.0,8.0 M 248.0,456.0 C 137.72,456.0 48.0,366.28 48.0,256.0 C 48.0,145.72000000000003 137.72,56.0 248.0,56.0 C 358.28,56.0 448.0,145.72 448.0,256.0 C 448.0,366.28 358.28,456.0 248.0,456.0 ", + ], + iconName: "olympus-icons-heading" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsJetFighterUpSolid: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 270.7,9.7 C 268.2,3.8 262.4,0.0 256.0,0.0 C 249.60000000000002,0.0 243.8,3.8 241.3,9.7 L 197.2,112.6 C 193.79999999999998,120.6 192.0,129.1 192.0,137.79999999999998 L 192.0,214.79999999999998 L 48.0,298.79999999999995 L 48.0,280.0 C 48.0,266.7 37.3,256.0 24.0,256.0 C 10.700000000000003,256.0 0.0,266.7 0.0,280.0 L 0.0,336.0 L 0.0,368.0 L 0.0,392.0 C 0.0,405.3 10.7,416.0 24.0,416.0 C 37.3,416.0 48.0,405.3 48.0,392.0 L 48.0,384.0 L 192.0,384.0 L 192.0,416.7 L 133.5,468.0 C 130.0,471.0 128.0,475.4 128.0,480.0 L 128.0,496.0 C 128.0,504.8 135.2,512.0 144.0,512.0 L 240.0,512.0 L 240.0,448.0 C 240.0,439.2 247.2,432.0 256.0,432.0 C 264.8,432.0 272.0,439.2 272.0,448.0 L 272.0,512.0 L 368.0,512.0 C 376.8,512.0 384.0,504.8 384.0,496.0 L 384.0,480.0 C 384.0,475.4 382.0,471.0 378.5,468.0 L 320.0,416.7 L 320.0,384.0 L 464.0,384.0 L 464.0,392.0 C 464.0,405.3 474.7,416.0 488.0,416.0 C 501.3,416.0 512.0,405.3 512.0,392.0 L 512.0,368.0 L 512.0,336.0 L 512.0,280.0 C 512.0,266.7 501.3,256.0 488.0,256.0 C 474.7,256.0 464.0,266.7 464.0,280.0 L 464.0,298.8 L 320.0,214.8 L 320.0,137.8 C 320.0,129.10000000000002 318.2,120.60000000000001 314.8,112.60000000000001 L 270.7,9.7 ", + ], + iconName: "olympus-icons-jet-fighter-up-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsKeyboardSolid: IconDefinition = { + icon: [ + 576.0, + 512.0, + [], + "", + "M 64.0,64.0 C 28.7,64.0 0.0,92.7 0.0,128.0 L 0.0,384.0 C 0.0,419.3 28.7,448.0 64.0,448.0 L 512.0,448.0 C 547.3,448.0 576.0,419.3 576.0,384.0 L 576.0,128.0 C 576.0,92.7 547.3,64.0 512.0,64.0 L 64.0,64.0 M 80.0,128.0 L 112.0,128.0 C 120.8,128.0 128.0,135.2 128.0,144.0 L 128.0,176.0 C 128.0,184.8 120.8,192.0 112.0,192.0 L 80.0,192.0 C 71.2,192.0 64.0,184.8 64.0,176.0 L 64.0,144.0 C 64.0,135.2 71.2,128.0 80.0,128.0 M 64.0,240.0 C 64.0,231.2 71.2,224.0 80.0,224.0 L 112.0,224.0 C 120.8,224.0 128.0,231.2 128.0,240.0 L 128.0,272.0 C 128.0,280.8 120.8,288.0 112.0,288.0 L 80.0,288.0 C 71.2,288.0 64.0,280.8 64.0,272.0 L 64.0,240.0 M 80.0,320.0 L 112.0,320.0 C 120.8,320.0 128.0,327.2 128.0,336.0 L 128.0,368.0 C 128.0,376.8 120.8,384.0 112.0,384.0 L 80.0,384.0 C 71.2,384.0 64.0,376.8 64.0,368.0 L 64.0,336.0 C 64.0,327.2 71.2,320.0 80.0,320.0 M 160.0,144.0 C 160.0,135.2 167.2,128.0 176.0,128.0 L 208.0,128.0 C 216.8,128.0 224.0,135.2 224.0,144.0 L 224.0,176.0 C 224.0,184.8 216.8,192.0 208.0,192.0 L 176.0,192.0 C 167.2,192.0 160.0,184.8 160.0,176.0 L 160.0,144.0 M 176.0,224.0 L 208.0,224.0 C 216.8,224.0 224.0,231.2 224.0,240.0 L 224.0,272.0 C 224.0,280.8 216.8,288.0 208.0,288.0 L 176.0,288.0 C 167.2,288.0 160.0,280.8 160.0,272.0 L 160.0,240.0 C 160.0,231.2 167.2,224.0 176.0,224.0 M 160.0,336.0 C 160.0,327.2 167.2,320.0 176.0,320.0 L 400.0,320.0 C 408.8,320.0 416.0,327.2 416.0,336.0 L 416.0,368.0 C 416.0,376.8 408.8,384.0 400.0,384.0 L 176.0,384.0 C 167.2,384.0 160.0,376.8 160.0,368.0 L 160.0,336.0 M 272.0,128.0 L 304.0,128.0 C 312.8,128.0 320.0,135.2 320.0,144.0 L 320.0,176.0 C 320.0,184.8 312.8,192.0 304.0,192.0 L 272.0,192.0 C 263.2,192.0 256.0,184.8 256.0,176.0 L 256.0,144.0 C 256.0,135.2 263.2,128.0 272.0,128.0 M 256.0,240.0 C 256.0,231.2 263.2,224.0 272.0,224.0 L 304.0,224.0 C 312.8,224.0 320.0,231.2 320.0,240.0 L 320.0,272.0 C 320.0,280.8 312.8,288.0 304.0,288.0 L 272.0,288.0 C 263.2,288.0 256.0,280.8 256.0,272.0 L 256.0,240.0 M 368.0,128.0 L 400.0,128.0 C 408.8,128.0 416.0,135.2 416.0,144.0 L 416.0,176.0 C 416.0,184.8 408.8,192.0 400.0,192.0 L 368.0,192.0 C 359.2,192.0 352.0,184.8 352.0,176.0 L 352.0,144.0 C 352.0,135.2 359.2,128.0 368.0,128.0 M 352.0,240.0 C 352.0,231.2 359.2,224.0 368.0,224.0 L 400.0,224.0 C 408.8,224.0 416.0,231.2 416.0,240.0 L 416.0,272.0 C 416.0,280.8 408.8,288.0 400.0,288.0 L 368.0,288.0 C 359.2,288.0 352.0,280.8 352.0,272.0 L 352.0,240.0 M 464.0,128.0 L 496.0,128.0 C 504.8,128.0 512.0,135.2 512.0,144.0 L 512.0,176.0 C 512.0,184.8 504.8,192.0 496.0,192.0 L 464.0,192.0 C 455.2,192.0 448.0,184.8 448.0,176.0 L 448.0,144.0 C 448.0,135.2 455.2,128.0 464.0,128.0 M 448.0,240.0 C 448.0,231.2 455.2,224.0 464.0,224.0 L 496.0,224.0 C 504.8,224.0 512.0,231.2 512.0,240.0 L 512.0,272.0 C 512.0,280.8 504.8,288.0 496.0,288.0 L 464.0,288.0 C 455.2,288.0 448.0,280.8 448.0,272.0 L 448.0,240.0 M 464.0,320.0 L 496.0,320.0 C 504.8,320.0 512.0,327.2 512.0,336.0 L 512.0,368.0 C 512.0,376.8 504.8,384.0 496.0,384.0 L 464.0,384.0 C 455.2,384.0 448.0,376.8 448.0,368.0 L 448.0,336.0 C 448.0,327.2 455.2,320.0 464.0,320.0 ", + ], + iconName: "olympus-icons-keyboard-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsLandAtPoint: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 3.4418938,1.8579231 C 3.4418938,1.4108616 3.7750223,1.0496755000000002 4.18736,1.0496755000000002 L 13.132879,1.0496755000000002 C 13.545212000000001,1.0496755000000002 13.878341,1.4108616000000003 13.878341,1.8579231000000003 C 13.878341,2.3049855000000004 13.545212000000001,2.6661674000000004 13.132879,2.6661674000000004 L 9.4055765,2.6661674000000004 L 9.4055765,4.2826604 L 10.151038,4.2826604 C 12.210371,4.2826604 13.878340999999999,6.0911104 13.878340999999999,8.3238904 L 13.878340999999999,9.9403814 C 13.878340999999999,10.387440999999999 13.545212,10.748628 13.132878999999999,10.748628 L 9.4055765,10.748628 L 7.9146585,10.748628 C 7.4464125,10.748628 7.0038005,10.508679 6.7219204999999995,10.102032 L 5.0586105,7.6974974 C 4.9770785,7.5787864 4.865263,7.4878614 4.7394601,7.4322944 L 1.5596118,6.0532234 C 1.3382988,5.9572434 1.1705709,5.7501304 1.1123358,5.4975524 L 0.57653646,3.1687964 C 0.5159646600000001,2.9136944000000002 0.6953433600000001,2.6661674 0.9376164600000001,2.6661674 L 1.5782493,2.6661674 C 1.813531,2.6661674 2.0348393,2.7848794 2.1746157,2.9894684 L 3.0691677,4.282660399999999 L 7.9146585,4.282660399999999 L 7.9146585,2.6661674 L 4.18736,2.6661674 C 3.7750223,2.6661674 3.4418938,2.3049855 3.4418938,1.8579230999999998 L 3.4418938,1.8579231 M 9.405576499999999,9.1321344 L 12.387417999999998,9.1321344 L 12.387417999999998,8.3238904 C 12.387417999999998,6.9852324 11.385709999999998,5.899153399999999 10.151037999999998,5.899153399999999 L 9.4055765,5.899153399999999 L 9.405576499999999,9.1321344 M 15.150277999999998,11.794294 C 15.441476999999999,12.110017000000001 15.441476999999999,12.62275 15.150277999999998,12.938467000000001 L 15.059427999999999,13.036977 C 14.500331,13.643161000000001 13.740891999999999,13.984141000000001 12.951172999999999,13.984141000000001 L 6.4237353,13.984141000000001 C 6.0114069,13.984141000000001 5.6782737,13.622954000000002 5.6782737,13.175895 C 5.6782737,12.728834 6.0114069,12.367647 6.4237353,12.367647 L 12.951173,12.367647 C 13.347196,12.367647 13.726918000000001,12.198421 14.006466000000001,11.895329 L 14.097316000000001,11.796819000000001 C 14.388515000000002,11.481099 14.861415000000001,11.481099 15.152609000000002,11.796819000000001 L 15.150277999999998,11.794294 M 0.90212206,15.260973 L 15.104269,15.260973 ", + ], + iconName: "olympus-icons-land-at-point" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsLineAbreast: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 3.8116238,3.5888127 C 3.8466938,3.5068917 3.9281428,3.4541283000000003 4.0180638,3.4541283000000003 C 4.1079138,3.4541283000000003 4.1893628000000005,3.5068913000000004 4.2245048,3.5888127 L 4.843757800000001,5.0175367 C 4.8915778,5.1286086 4.9167978,5.2466364 4.9167978,5.3674366 L 4.9167978,6.4365323 L 6.9391023,7.6028429 L 6.9391023,7.341854 C 6.9391023,7.1571652 7.0893843,7.0085833 7.2761183,7.0085833 C 7.4629213000000005,7.0085833 7.6132033,7.1571652 7.6132033,7.341854 L 7.6132033,8.1193714 L 7.6132033,8.5636872 L 7.6132033,8.8968896 C 7.6132033,9.0815781 7.4629213000000005,9.230160699999999 7.2761183,9.230160699999999 C 7.0893843,9.230160699999999 6.9391023,9.0815781 6.9391023,8.8968896 L 6.9391023,8.7858449 L 4.9167968,8.7858449 L 4.9167968,9.239834400000001 L 5.7383558,9.952156200000001 C 5.7874858,9.993783200000001 5.8155958,10.054889000000001 5.8155958,10.118724 L 5.8155958,10.340881 C 5.8155958,10.463097999999999 5.7145117999999995,10.563037999999999 5.5908948,10.563037999999999 L 4.2426958,10.563037999999999 L 4.2426958,9.6744078 C 4.2426958,9.5522584 4.1416108,9.4523178 4.0180638,9.4523178 C 3.8944478,9.4523178 3.7933638000000003,9.552258799999999 3.7933638000000003,9.6744078 L 3.7933638000000003,10.563037999999999 L 2.4451608,10.563037999999999 C 2.3215448,10.563037999999999 2.2204608,10.463097999999999 2.2204608,10.340881 L 2.2204608,10.118724 C 2.2204608,10.054894 2.2485008,9.9937807 2.2976308000000003,9.952156200000001 L 3.1192628,9.2398344 L 3.1192628,8.7858449 L 1.0969583,8.7858449 L 1.0969583,8.896889600000002 C 1.0969583,9.081578100000002 0.94667557,9.2301607 0.75994207,9.2301607 C 0.57313937,9.2301607 0.42285667000000005,9.081578100000002 0.42285667000000005,8.896889600000002 L 0.42285667000000005,8.5636872 L 0.42285667000000005,8.1193714 L 0.42285667000000005,7.341854 C 0.42285667000000005,7.1571652 0.57313937,7.0085833 0.75994207,7.0085833 C 0.94667557,7.0085833 1.0969583,7.1571652 1.0969583,7.341854 L 1.0969583,7.6028429 L 3.1192628,6.4365323 L 3.1192628,5.3674366 C 3.1192628,5.2466364 3.1445528,5.1286086 3.1923028,5.0175367 L 3.8116238,3.5888127 M 11.763569,3.5972246 C 11.798639,3.5153036 11.880088,3.4625403 11.97001,3.4625403 C 12.05986,3.4625403 12.141309,3.5153033000000002 12.176451,3.5972246 L 12.795703,5.0259487 C 12.843523,5.1370208 12.868743,5.2550488 12.868743,5.3758488 L 12.868743,6.4449448 L 14.891047,7.6112558 L 14.891047,7.350265800000001 C 14.891047,7.1655778 15.041329000000001,7.016995800000001 15.228063,7.016995800000001 C 15.414866,7.016995800000001 15.565148,7.165577800000001 15.565148,7.350265800000001 L 15.565148,8.127783800000001 L 15.565148,8.572099800000002 L 15.565148,8.905301800000002 C 15.565148,9.089990800000002 15.414866,9.238572800000002 15.228063,9.238572800000002 C 15.041329000000001,9.238572800000002 14.891047,9.089990800000002 14.891047,8.905301800000002 L 14.891047,8.794257800000002 L 12.868742000000001,8.794257800000002 L 12.868742000000001,9.248246800000002 L 13.690301000000002,9.960568800000003 C 13.739431000000002,10.002198800000002 13.767541000000001,10.063302000000002 13.767541000000001,10.127136000000002 L 13.767541000000001,10.349293000000001 C 13.767541000000001,10.471511000000001 13.666457000000001,10.571451000000001 13.542841000000001,10.571451000000001 L 12.194638,10.571451000000001 L 12.194638,9.6828198 C 12.194638,9.5606708 12.093554,9.460729800000001 11.970006999999999,9.460729800000001 C 11.846390999999999,9.460729800000001 11.745306,9.560669800000001 11.745306,9.6828198 L 11.745306,10.571451000000001 L 10.397103999999999,10.571451000000001 C 10.273487999999999,10.571451000000001 10.172403,10.471511000000001 10.172403,10.349293000000001 L 10.172403,10.127136000000002 C 10.172403,10.063306000000003 10.200443,10.002193000000002 10.249573,9.960568800000003 L 11.071208,9.248246800000002 L 11.071208,8.7942578 L 9.0489044,8.7942578 L 9.0489044,8.9053018 C 9.0489044,9.0899908 8.8986214,9.2385728 8.7118884,9.2385728 C 8.5250854,9.2385728 8.3748034,9.0899908 8.3748034,8.9053018 L 8.3748034,8.5720998 L 8.3748034,8.1277838 L 8.3748034,7.3502658 C 8.3748034,7.165577799999999 8.5250854,7.0169958 8.7118884,7.0169958 C 8.8986214,7.0169958 9.0489044,7.1655778 9.0489044,7.3502658 L 9.0489044,7.6112557999999995 L 11.071207999999999,6.444944799999999 L 11.071207999999999,5.375848799999999 C 11.071207999999999,5.255048799999999 11.096497999999999,5.137020799999999 11.144248,5.025948699999999 L 11.763569,3.5972246 ", + ], + iconName: "olympus-icons-line-abreast" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsMapSource: IconDefinition = { + icon: [ + 16.0, + 15.0, + [], + "", + "M 11.1562,3.53125 C 11.1562,5.03516 9.13281,7.6875 8.25781,8.78125 C 8.06641,9.05469 7.65625,9.05469 7.46484,8.78125 C 6.58984,7.6875 4.59375,5.03516 4.59375,3.53125 C 4.59375,1.72656 6.04297,0.25 7.875,0.25 C 9.67969,0.25 11.1562,1.72656 11.1562,3.53125 M 11.375,5.74609 C 11.457,5.55469 11.5391,5.36328 11.6211,5.17188 C 11.6484,5.14453 11.6484,5.11719 11.6758,5.08984 L 14.8477,3.80469 C 15.2578,3.64062 15.75,3.94141 15.75,4.40625 L 15.75,11.8164 C 15.75,12.0898 15.5859,12.3359 15.3125,12.4453 L 11.375,14.0039 L 11.375,5.74609 M 3.74609,4.05078 C 3.82812,4.43359 3.9375,4.81641 4.10156,5.17188 C 4.18359,5.36328 4.26562,5.55469 4.375,5.74609 L 4.375,12.6094 L 0.875,14.0039 C 0.464844,14.168 0.0,13.8672 0.0,13.4023 L 0.0,5.99219 C 0.0,5.71875 0.164062,5.47266 0.410156,5.39062 L 3.74609,4.05078 M 8.94141,9.32812 C 9.32422,8.86328 9.92578,8.09766 10.5,7.22266 L 10.5,14.0586 L 5.25,12.5547 L 5.25,7.22266 C 5.79688,8.09766 6.39844,8.86328 6.78125,9.32812 C 7.32812,10.0391 8.39453,10.0391 8.94141,9.32812 M 7.875,4.40625 C 8.47656,4.40625 8.96875,3.94141 8.96875,3.3125 C 8.96875,2.71094 8.47656,2.21875 7.875,2.21875 C 7.24609,2.21875 6.78125,2.71094 6.78125,3.3125 C 6.78125,3.94141 7.24609,4.40625 7.875,4.40625 ", + ], + iconName: "olympus-icons-map-source" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsMissBlue: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 184.66044,8.5185895 C 196.83951,8.5185895 206.67909,18.358172 206.67909,30.537233999999998 L 206.67909,37.693293999999995 C 271.15243,47.257643 322.07055,98.244571 331.6349,162.6491 L 338.79096000000004,162.6491 C 350.97002000000003,162.6491 360.80960000000005,172.48868000000002 360.80960000000005,184.66774 C 360.80960000000005,196.84681 350.97002000000003,206.68639000000002 338.79096000000004,206.68639000000002 L 331.6349,206.68639000000002 C 322.07055,271.15973 271.08362,322.07785 206.67909000000003,331.6422 L 206.67909000000003,338.79826 C 206.67909000000003,350.97732 196.83951000000002,360.81690000000003 184.66044000000002,360.81690000000003 C 172.48138000000003,360.81690000000003 162.64180000000002,350.97732 162.64180000000002,338.79826 L 162.64180000000002,331.6422 C 98.168455,322.07785 47.250339,271.15973 37.68599,206.68639 L 30.529930999999998,206.68639 C 18.350868,206.68639 8.511286599999998,196.84680999999998 8.511286599999998,184.66773999999998 C 8.511286599999998,172.48868 18.350868,162.64909999999998 30.529930999999998,162.64909999999998 L 37.68599,162.64909999999998 C 47.250339,98.175761 98.168455,47.257643 162.6418,37.693294 L 162.6418,30.537234 C 162.6418,18.358172000000003 172.48138,8.518589500000001 184.66044,8.518589500000001 L 184.66044,8.5185895 M 82.411363,206.68639 C 91.012396,246.80160999999998 122.59539,278.31579 162.6418,286.91682 L 162.6418,272.74231999999995 C 162.6418,260.56325999999996 172.48138,250.72367999999994 184.66044,250.72367999999994 C 196.83951,250.72367999999994 206.67909,260.56325999999996 206.67909,272.74231999999995 L 206.67909,286.91682 C 246.79431,278.31579 278.30849,246.73279999999997 286.90953,206.68638999999996 L 272.73502,206.68638999999996 C 260.55596,206.68638999999996 250.71638000000002,196.84680999999995 250.71638000000002,184.66773999999995 C 250.71638000000002,172.48867999999996 260.55596,162.64909999999995 272.73502,162.64909999999995 L 286.90953,162.64909999999995 C 278.30849,122.53388 246.79431,91.019701 206.67909,82.418665 L 206.67909,96.593171 C 206.67909,108.77223 196.83951,118.61180999999999 184.66044,118.61180999999999 C 172.48138,118.61180999999999 162.6418,108.77223 162.6418,96.59317099999998 L 162.6418,82.418665 C 122.52658,91.019701 91.012396,122.53388 82.411363,162.6491 L 96.585865,162.6491 C 108.76492999999999,162.6491 118.60451,172.48868000000002 118.60451,184.66774 C 118.60451,196.84681 108.76493,206.68639000000002 96.58586500000001,206.68639000000002 L 82.411363,206.68639 M 184.66044,162.6491 A 22.018645000000003,22.018645000000003 0.0 1,1 184.66044,206.68639000000002 A 22.018645,22.018645 0.0 1,1 184.66044,162.64910000000003 L 184.66044,162.6491 ", + ], + iconName: "olympus-icons-miss-blue" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsMissRed: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 184.66044,8.5185895 C 196.83951,8.5185895 206.67909,18.358172 206.67909,30.537233999999998 L 206.67909,37.693293999999995 C 271.15243,47.257643 322.07055,98.244571 331.6349,162.6491 L 338.79096000000004,162.6491 C 350.97002000000003,162.6491 360.80960000000005,172.48868000000002 360.80960000000005,184.66774 C 360.80960000000005,196.84681 350.97002000000003,206.68639000000002 338.79096000000004,206.68639000000002 L 331.6349,206.68639000000002 C 322.07055,271.15973 271.08362,322.07785 206.67909000000003,331.6422 L 206.67909000000003,338.79826 C 206.67909000000003,350.97732 196.83951000000002,360.81690000000003 184.66044000000002,360.81690000000003 C 172.48138000000003,360.81690000000003 162.64180000000002,350.97732 162.64180000000002,338.79826 L 162.64180000000002,331.6422 C 98.168455,322.07785 47.250339,271.15973 37.68599,206.68639 L 30.529930999999998,206.68639 C 18.350868,206.68639 8.511286599999998,196.84680999999998 8.511286599999998,184.66773999999998 C 8.511286599999998,172.48868 18.350868,162.64909999999998 30.529930999999998,162.64909999999998 L 37.68599,162.64909999999998 C 47.250339,98.175761 98.168455,47.257643 162.6418,37.693294 L 162.6418,30.537234 C 162.6418,18.358172000000003 172.48138,8.518589500000001 184.66044,8.518589500000001 L 184.66044,8.5185895 M 82.411363,206.68639 C 91.012396,246.80160999999998 122.59539,278.31579 162.6418,286.91682 L 162.6418,272.74231999999995 C 162.6418,260.56325999999996 172.48138,250.72367999999994 184.66044,250.72367999999994 C 196.83951,250.72367999999994 206.67909,260.56325999999996 206.67909,272.74231999999995 L 206.67909,286.91682 C 246.79431,278.31579 278.30849,246.73279999999997 286.90953,206.68638999999996 L 272.73502,206.68638999999996 C 260.55596,206.68638999999996 250.71638000000002,196.84680999999995 250.71638000000002,184.66773999999995 C 250.71638000000002,172.48867999999996 260.55596,162.64909999999995 272.73502,162.64909999999995 L 286.90953,162.64909999999995 C 278.30849,122.53388 246.79431,91.019701 206.67909,82.418665 L 206.67909,96.593171 C 206.67909,108.77223 196.83951,118.61180999999999 184.66044,118.61180999999999 C 172.48138,118.61180999999999 162.6418,108.77223 162.6418,96.59317099999998 L 162.6418,82.418665 C 122.52658,91.019701 91.012396,122.53388 82.411363,162.6491 L 96.585865,162.6491 C 108.76492999999999,162.6491 118.60451,172.48868000000002 118.60451,184.66774 C 118.60451,196.84681 108.76493,206.68639000000002 96.58586500000001,206.68639000000002 L 82.411363,206.68639 M 184.66044,162.6491 A 22.018645000000003,22.018645000000003 0.0 1,1 184.66044,206.68639000000002 A 22.018645,22.018645 0.0 1,1 184.66044,162.64910000000003 L 184.66044,162.6491 ", + ], + iconName: "olympus-icons-miss-red" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsMiss: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 184.66044,8.5185895 C 196.83951,8.5185895 206.67909,18.358172 206.67909,30.537233999999998 L 206.67909,37.693293999999995 C 271.15243,47.257643 322.07055,98.244571 331.6349,162.6491 L 338.79096000000004,162.6491 C 350.97002000000003,162.6491 360.80960000000005,172.48868000000002 360.80960000000005,184.66774 C 360.80960000000005,196.84681 350.97002000000003,206.68639000000002 338.79096000000004,206.68639000000002 L 331.6349,206.68639000000002 C 322.07055,271.15973 271.08362,322.07785 206.67909000000003,331.6422 L 206.67909000000003,338.79826 C 206.67909000000003,350.97732 196.83951000000002,360.81690000000003 184.66044000000002,360.81690000000003 C 172.48138000000003,360.81690000000003 162.64180000000002,350.97732 162.64180000000002,338.79826 L 162.64180000000002,331.6422 C 98.168455,322.07785 47.250339,271.15973 37.68599,206.68639 L 30.529930999999998,206.68639 C 18.350868,206.68639 8.511286599999998,196.84680999999998 8.511286599999998,184.66773999999998 C 8.511286599999998,172.48868 18.350868,162.64909999999998 30.529930999999998,162.64909999999998 L 37.68599,162.64909999999998 C 47.250339,98.175761 98.168455,47.257643 162.6418,37.693294 L 162.6418,30.537234 C 162.6418,18.358172000000003 172.48138,8.518589500000001 184.66044,8.518589500000001 L 184.66044,8.5185895 M 82.411363,206.68639 C 91.012396,246.80160999999998 122.59539,278.31579 162.6418,286.91682 L 162.6418,272.74231999999995 C 162.6418,260.56325999999996 172.48138,250.72367999999994 184.66044,250.72367999999994 C 196.83951,250.72367999999994 206.67909,260.56325999999996 206.67909,272.74231999999995 L 206.67909,286.91682 C 246.79431,278.31579 278.30849,246.73279999999997 286.90953,206.68638999999996 L 272.73502,206.68638999999996 C 260.55596,206.68638999999996 250.71638000000002,196.84680999999995 250.71638000000002,184.66773999999995 C 250.71638000000002,172.48867999999996 260.55596,162.64909999999995 272.73502,162.64909999999995 L 286.90953,162.64909999999995 C 278.30849,122.53388 246.79431,91.019701 206.67909,82.418665 L 206.67909,96.593171 C 206.67909,108.77223 196.83951,118.61180999999999 184.66044,118.61180999999999 C 172.48138,118.61180999999999 162.6418,108.77223 162.6418,96.59317099999998 L 162.6418,82.418665 C 122.52658,91.019701 91.012396,122.53388 82.411363,162.6491 L 96.585865,162.6491 C 108.76492999999999,162.6491 118.60451,172.48868000000002 118.60451,184.66774 C 118.60451,196.84681 108.76493,206.68639000000002 96.58586500000001,206.68639000000002 L 82.411363,206.68639 M 184.66044,162.6491 A 22.018645000000003,22.018645000000003 0.0 1,1 184.66044,206.68639000000002 A 22.018645,22.018645 0.0 1,1 184.66044,162.64910000000003 L 184.66044,162.6491 ", + ], + iconName: "olympus-icons-miss" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsNapalm: IconDefinition = { + icon: [ + 576.0, + 512.0, + [], + "", + "M 64.0,448.0 L 64.0,448.0 L 512.0,448.0 L 512.0,448.0 L 544.0,448.0 C 561.7,448.0 576.0,462.3 576.0,480.0 C 576.0,497.7 561.7,512.0 544.0,512.0 L 32.0,512.0 C 14.3,512.0 0.0,497.7 0.0,480.0 C 0.0,462.3 14.3,448.0 32.0,448.0 L 64.0,448.0 M 233.26314,56.434762 C 238.82059999999998,51.233549 247.44179,51.304798 252.99925,56.506012 C 272.66411999999997,74.959634 291.11773999999997,94.838244 308.36012,116.35559 C 316.19756,106.09566000000001 325.10375,94.90949400000001 334.72244,85.78955400000001 C 340.35115,80.51709400000001 349.04359,80.51709400000001 354.6723,85.860854 C 379.32463,109.37319000000001 400.20073,140.43798 414.87813,169.93527 C 429.34177999999997,199.00507 438.96046,228.71611000000001 438.96046,249.66347000000002 C 438.96046,340.57784000000004 367.85346000000004,417.38480000000004 279.36157000000003,417.38480000000004 C 189.87219000000005,417.38480000000004 119.76268000000002,340.5065900000001 119.76268000000002,249.59222000000005 C 119.76268000000002,222.23241000000004 132.44509000000002,188.81639000000007 152.10995000000003,155.75662000000005 C 171.98857000000004,122.19810000000005 200.06087000000002,87.21459400000005 233.26314000000002,56.43481200000005 L 233.26314,56.434762 M 280.57281,348.98523 C 298.59894,348.98523 314.55883,343.99776 329.59247,334.02283 C 359.58851,313.07547999999997 367.63971,271.18077 349.61358,238.2635 C 346.40735,231.85103999999998 338.21366,231.42354 333.58244,236.83850999999999 L 315.62757,257.71461 C 310.9251,263.12957 302.44641,262.98708 298.02894,257.35836 C 286.27277,242.39597 265.25417,215.6774 253.28425,200.50126 C 248.79552999999999,194.8013 240.24559,194.73005 235.68561999999997,200.42996 C 211.60328999999996,230.71099999999998 199.49087999999998,249.80587 199.49087999999998,271.25197000000003 C 199.56207999999998,320.05788 235.61437999999998,348.98518 280.57281,348.98518 L 280.57281,348.98523 ", + ], + iconName: "olympus-icons-napalm" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsPersonMilitaryPointingSolid: IconDefinition = { + icon: [ + 576.0, + 512.0, + [], + "", + "M 246.9,14.1 C 234.0,15.2 224.0,26.0 224.0,39.0 C 224.0,52.8 235.2,64.0 249.0,64.0 L 400.0,64.0 C 408.8,64.0 416.0,56.8 416.0,48.0 L 416.0,17.4 C 416.0,8.0 408.0,0.7 398.7,1.4 L 246.9,14.1 M 240.0,112.0 C 240.0,156.2 275.8,192.0 320.0,192.0 C 364.2,192.0 400.0,156.2 400.0,112.0 C 400.0,106.5 399.4,101.2 398.4,96.0 L 241.6,96.0 C 240.6,101.2 240.0,106.5 240.0,112.0 M 72.0,224.0 C 49.9,224.0 32.0,241.9 32.0,264.0 C 32.0,286.1 49.9,304.0 72.0,304.0 L 224.0,304.0 L 224.0,393.4 L 386.8,230.5 C 373.5,226.2 359.5,224.0 345.2,224.0 L 240.0,224.0 L 72.0,224.0 M 417.7,244.9 L 246.6,416.0 L 416.0,416.0 L 416.0,369.7 L 469.6,460.29999999999995 C 480.8,479.29999999999995 505.40000000000003,485.59999999999997 524.4,474.4 C 543.3999999999999,463.2 549.6999999999999,438.59999999999997 538.5,419.59999999999997 L 462.3,290.8 C 451.1,271.90000000000003 435.7,256.3 417.7,244.9 M 224.0,448.0 L 224.0,480.0 C 224.0,497.7 238.3,512.0 256.0,512.0 L 384.0,512.0 C 401.7,512.0 416.0,497.7 416.0,480.0 L 416.0,448.0 L 224.0,448.0 ", + ], + iconName: "olympus-icons-person-military-pointing-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsPin: IconDefinition = { + icon: [ + 35.0, + 35.0, + [], + "", + "M 26.00224,11.876792 C 26.00224,16.251792000000002 22.44754,19.751793 18.12724,19.751793 C 13.75224,19.751793 10.25224,16.251792 10.25224,11.876791999999998 C 10.25224,7.556481999999998 13.75224,4.001791999999998 18.12724,4.001791999999998 C 22.44754,4.001791999999998 26.00224,7.556481999999998 26.00224,11.876791999999998 L 26.00224,11.876792 M 16.37724,30.251793 L 16.37724,21.392393 C 16.92414,21.447093 17.52564,21.501793 18.12724,21.501793 C 18.67414,21.501793 19.27564,21.447093 19.87724,21.392393 L 19.87724,30.251793 C 19.87724,31.236193 19.05694,32.001793 18.12724,32.001793 C 17.14284,32.001793 16.37724,31.236193 16.37724,30.251793 M 26.0,11.875 C 26.0,16.25 22.4453,19.75 18.125,19.75 C 13.75,19.75 10.25,16.25 10.25,11.875 C 10.25,7.55469 13.75,4.0 18.125,4.0 C 22.4453,4.0 26.0,7.55469 26.0,11.875 M 18.125,8.375 C 18.5625,8.375 19.0,7.99219 19.0,7.5 C 19.0,7.0625 18.5625,6.625 18.125,6.625 C 15.2266,6.625 12.875,8.97656 12.875,11.875 C 12.875,12.3672 13.2578,12.75 13.75,12.75 C 14.1875,12.75 14.625,12.3672 14.625,11.875 C 14.625,9.96094 16.1562,8.375 18.125,8.375 M 16.375,30.25 L 16.375,21.3906 C 16.9219,21.4453 17.5234,21.5 18.125,21.5 C 18.6719,21.5 19.2734,21.4453 19.875,21.3906 L 19.875,30.25 C 19.875,31.2344 19.0547,32.0 18.125,32.0 C 17.1406,32.0 16.375,31.2344 16.375,30.25 ", + ], + iconName: "olympus-icons-pin" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsPlane: IconDefinition = { + icon: [ + 35.0, + 35.0, + [], + "", + "M 27.418,14.0 C 29.2109,14.0 32.375,15.5293 32.375,17.375 C 32.375,19.2734 29.2109,20.75 27.418,20.75 L 21.248,20.75 L 15.9746,30.0312 C 15.6582,30.5586 15.0781,30.875 14.498,30.875 L 11.5449,30.875 C 10.9648,30.875 10.543,30.3477 10.7012,29.8203 L 13.2852,20.75 L 7.90625,20.75 L 5.58594,23.8086 C 5.42773,24.0195 5.2168,24.125 4.95312,24.125 L 2.73828,24.125 C 2.31641,24.125 2.0,23.8086 2.0,23.3867 C 2.0,23.334 2.0,23.2812 2.0,23.2285 L 3.6875,17.375 L 2.0,11.5742 C 2.0,11.5215 2.0,11.4688 2.0,11.3633 C 2.0,10.9941 2.31641,10.625 2.73828,10.625 L 4.95312,10.625 C 5.2168,10.625 5.42773,10.7832 5.58594,10.9941 L 7.90625,14.0 L 13.2852,14.0 L 10.7012,4.98242 C 10.543,4.45508 10.9648,3.875 11.5449,3.875 L 14.498,3.875 C 15.0781,3.875 15.6582,4.24414 15.9746,4.77148 L 21.248,14.0 L 27.418,14.0 ", + ], + iconName: "olympus-icons-plane" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsRuler: IconDefinition = { + icon: [ + 640.0, + 512.0, + [], + "", + "M 635.7,167.2 L 556.1,31.7 C 547.3000000000001,16.7 527.8000000000001,11.599999999999998 512.6,20.2 L 443.6,59.3 L 503.3,161.0 C 505.5,164.8 504.2,169.5 500.40000000000003,171.7 L 486.6,179.5 C 482.8,181.7 477.90000000000003,180.4 475.70000000000005,176.6 L 416.0,75.0 L 360.8,106.3 L 388.7,153.7 C 390.9,157.5 389.59999999999997,162.2 385.8,164.39999999999998 L 372.0,172.2 C 368.2,174.39999999999998 363.3,173.1 361.1,169.29999999999998 L 333.2,122.0 L 278.0,153.3 L 337.8,255.0 C 340.0,258.7 338.7,263.5 334.90000000000003,265.7 L 321.1,273.5 C 317.3,275.7 312.40000000000003,274.4 310.20000000000005,270.6 L 250.50000000000006,168.90000000000003 L 195.30000000000007,200.20000000000005 L 223.20000000000007,247.60000000000005 C 225.40000000000006,251.40000000000006 224.10000000000008,256.1 220.30000000000007,258.30000000000007 L 206.50000000000006,266.1000000000001 C 202.70000000000005,268.30000000000007 197.80000000000007,267.00000000000006 195.60000000000005,263.2000000000001 L 167.70000000000005,215.7000000000001 L 112.50000000000004,247.0000000000001 L 172.20000000000005,348.7000000000001 C 174.40000000000003,352.4000000000001 173.10000000000005,357.2000000000001 169.30000000000004,359.4000000000001 L 155.50000000000003,367.2000000000001 C 151.70000000000002,369.4000000000001 146.80000000000004,368.1000000000001 144.60000000000002,364.3000000000001 L 84.9,262.9 L 15.900000000000006,302.0 C 0.7,310.7 -4.6,329.8 4.2,344.8 L 83.8,480.4 C 92.6,495.4 112.1,500.5 127.3,491.9 L 624.1,210.0 C 639.3000000000001,201.4 644.5,182.2 635.7,167.2 ", + ], + iconName: "olympus-icons-ruler" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsScenicBlue: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 90.329008,471.87874 L 294.83388,138.74536 M 37.215553,461.40058 L 33.602384,51.668198 M 61.785043,466.45901 L 134.77088,205.58883 M 97.776883,46.496287 C 95.08636299999999,44.674580000000006 91.499003,45.010895000000005 89.200851,47.281022 C 86.902692,49.551148 86.566377,53.166535 88.416116,55.829029 L 119.80552,101.5959 L 91.89137600000001,110.67642000000001 C 89.116769,111.57326 87.23900700000002,114.15167000000001 87.23900700000002,117.0664 C 87.23900700000002,119.98113000000001 89.11676900000002,122.55955 91.89137600000001,123.45639 L 120.78644000000001,132.81715 L 105.96055000000001,161.01156 C 104.58726000000001,163.61801 105.06371000000001,166.81299 107.16568000000001,168.88694 C 109.26765,170.96088 112.43461,171.46536 115.04106000000002,170.09207 L 143.23548000000002,155.26618000000002 L 152.59624000000002,184.16125000000002 C 153.49308000000002,186.93585000000002 156.07149,188.81361 158.98622000000003,188.81361 C 161.90096000000003,188.81361 164.47938000000002,186.93585000000002 165.37622000000002,184.16125000000002 L 174.73698000000002,155.26618000000002 L 202.93139000000002,170.09207 C 205.53784000000002,171.46536 208.73283000000004,170.98891 210.80678000000003,168.88694 C 212.88071000000002,166.78497000000002 213.38519000000002,163.61801 212.01190000000003,161.01156 L 197.18601000000004,132.81715 L 226.08108000000004,123.45639 C 228.85568000000004,122.55955 230.73344000000003,119.98113 230.73344000000003,117.0664 C 230.73344000000003,114.15167 228.85568000000004,111.57326 226.08108000000004,110.67642000000001 L 196.23311000000004,101.00735 L 203.43587000000005,81.276869 C 204.33271000000005,78.810558 203.71613000000005,76.063986 201.86640000000006,74.214252 C 200.01666000000006,72.36452 197.27009000000007,71.747942 194.80378000000005,72.644782 L 175.07329000000004,79.84753 L 165.37622000000005,49.97154200000001 C 164.47938000000005,47.19694200000001 161.90096000000005,45.31918300000001 158.98622000000006,45.31918300000001 C 156.07149000000007,45.31918300000001 153.49308000000005,47.19694200000001 152.59624000000005,49.97154200000001 L 143.54376000000005,77.885692 L 97.776883,46.496287 ", + ], + iconName: "olympus-icons-scenic-blue" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsScenicRed: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 90.329008,471.87874 L 294.83388,138.74536 M 37.215553,461.40058 L 33.602384,51.668198 M 61.785043,466.45901 L 134.77088,205.58883 M 97.776883,46.496287 C 95.08636299999999,44.674580000000006 91.499003,45.010895000000005 89.200851,47.281022 C 86.902692,49.551148 86.566377,53.166535 88.416116,55.829029 L 119.80552,101.5959 L 91.89137600000001,110.67642000000001 C 89.116769,111.57326 87.23900700000002,114.15167000000001 87.23900700000002,117.0664 C 87.23900700000002,119.98113000000001 89.11676900000002,122.55955 91.89137600000001,123.45639 L 120.78644000000001,132.81715 L 105.96055000000001,161.01156 C 104.58726000000001,163.61801 105.06371000000001,166.81299 107.16568000000001,168.88694 C 109.26765,170.96088 112.43461,171.46536 115.04106000000002,170.09207 L 143.23548000000002,155.26618000000002 L 152.59624000000002,184.16125000000002 C 153.49308000000002,186.93585000000002 156.07149,188.81361 158.98622000000003,188.81361 C 161.90096000000003,188.81361 164.47938000000002,186.93585000000002 165.37622000000002,184.16125000000002 L 174.73698000000002,155.26618000000002 L 202.93139000000002,170.09207 C 205.53784000000002,171.46536 208.73283000000004,170.98891 210.80678000000003,168.88694 C 212.88071000000002,166.78497000000002 213.38519000000002,163.61801 212.01190000000003,161.01156 L 197.18601000000004,132.81715 L 226.08108000000004,123.45639 C 228.85568000000004,122.55955 230.73344000000003,119.98113 230.73344000000003,117.0664 C 230.73344000000003,114.15167 228.85568000000004,111.57326 226.08108000000004,110.67642000000001 L 196.23311000000004,101.00735 L 203.43587000000005,81.276869 C 204.33271000000005,78.810558 203.71613000000005,76.063986 201.86640000000006,74.214252 C 200.01666000000006,72.36452 197.27009000000007,71.747942 194.80378000000005,72.644782 L 175.07329000000004,79.84753 L 165.37622000000005,49.97154200000001 C 164.47938000000005,47.19694200000001 161.90096000000005,45.31918300000001 158.98622000000006,45.31918300000001 C 156.07149000000007,45.31918300000001 153.49308000000005,47.19694200000001 152.59624000000005,49.97154200000001 L 143.54376000000005,77.885692 L 97.776883,46.496287 ", + ], + iconName: "olympus-icons-scenic-red" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsScenic: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 90.329008,471.87874 L 294.83388,138.74536 M 37.215553,461.40058 L 33.602384,51.668198 M 61.785043,466.45901 L 134.77088,205.58883 M 97.776883,46.496287 C 95.08636299999999,44.674580000000006 91.499003,45.010895000000005 89.200851,47.281022 C 86.902692,49.551148 86.566377,53.166535 88.416116,55.829029 L 119.80552,101.5959 L 91.89137600000001,110.67642000000001 C 89.116769,111.57326 87.23900700000002,114.15167000000001 87.23900700000002,117.0664 C 87.23900700000002,119.98113000000001 89.11676900000002,122.55955 91.89137600000001,123.45639 L 120.78644000000001,132.81715 L 105.96055000000001,161.01156 C 104.58726000000001,163.61801 105.06371000000001,166.81299 107.16568000000001,168.88694 C 109.26765,170.96088 112.43461,171.46536 115.04106000000002,170.09207 L 143.23548000000002,155.26618000000002 L 152.59624000000002,184.16125000000002 C 153.49308000000002,186.93585000000002 156.07149,188.81361 158.98622000000003,188.81361 C 161.90096000000003,188.81361 164.47938000000002,186.93585000000002 165.37622000000002,184.16125000000002 L 174.73698000000002,155.26618000000002 L 202.93139000000002,170.09207 C 205.53784000000002,171.46536 208.73283000000004,170.98891 210.80678000000003,168.88694 C 212.88071000000002,166.78497000000002 213.38519000000002,163.61801 212.01190000000003,161.01156 L 197.18601000000004,132.81715 L 226.08108000000004,123.45639 C 228.85568000000004,122.55955 230.73344000000003,119.98113 230.73344000000003,117.0664 C 230.73344000000003,114.15167 228.85568000000004,111.57326 226.08108000000004,110.67642000000001 L 196.23311000000004,101.00735 L 203.43587000000005,81.276869 C 204.33271000000005,78.810558 203.71613000000005,76.063986 201.86640000000006,74.214252 C 200.01666000000006,72.36452 197.27009000000007,71.747942 194.80378000000005,72.644782 L 175.07329000000004,79.84753 L 165.37622000000005,49.97154200000001 C 164.47938000000005,47.19694200000001 161.90096000000005,45.31918300000001 158.98622000000006,45.31918300000001 C 156.07149000000007,45.31918300000001 153.49308000000005,47.19694200000001 152.59624000000005,49.97154200000001 L 143.54376000000005,77.885692 L 97.776883,46.496287 ", + ], + iconName: "olympus-icons-scenic" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsSecondaries: IconDefinition = { + icon: [ + 576.0, + 512.0, + [], + "", + "M 64.0,448.0 L 64.0,448.0 L 512.0,448.0 L 512.0,448.0 L 544.0,448.0 C 561.7,448.0 576.0,462.3 576.0,480.0 C 576.0,497.7 561.7,512.0 544.0,512.0 L 32.0,512.0 C 14.3,512.0 0.0,497.7 0.0,480.0 C 0.0,462.3 14.3,448.0 32.0,448.0 L 64.0,448.0 M 278.72676,199.54168 C 282.45484,193.58788 290.13357,191.47345 296.36559,194.81203000000002 C 302.59761,198.15061000000003 305.15718,205.66241000000002 302.26375,212.06136000000004 L 225.97718000000003,381.66125 C 227.20133000000004,382.94104 228.36983000000004,384.27647 229.48269000000002,385.6119 L 283.5677,355.17518 C 289.41021,351.89224 296.69945,353.45024 300.76139,358.73633 C 304.82333,364.02241000000004 304.2669,371.53422 299.53724,376.26388000000003 L 251.12781999999999,424.67329 L 211.34306999999998,424.67329 C 203.9982,403.91845 184.24492999999998,389.06177 160.98614999999998,389.06177 C 137.72736999999998,389.06177 117.91845999999998,403.91845 110.62922999999998,424.67329 L 66.281757,424.67329 L 24.271276999999998,395.62764 C 18.873907,391.89956 16.982046999999998,384.72161 19.875487,378.76781 C 22.768917,372.81401 29.557367,369.92057 35.845027,371.86808 L 89.930027,388.78355 C 91.599317,386.61348 93.324247,384.49904 95.160467,382.49589 L 60.494876999999995,324.73844999999994 C 57.100657,319.11850999999996 58.324797,311.88491999999997 63.332677,307.65604999999994 C 68.340547,303.42717999999996 75.685417,303.48281999999995 80.637647,307.71164999999996 L 137.61608999999999,356.62185 C 138.45073,356.39928 139.28537999999998,356.17671 140.12001999999998,356.00978 L 147.68747,276.60721 C 148.35519,269.76312 154.08642,264.53268 160.98614999999998,264.53268 C 167.88588,264.53268 173.61710999999997,269.76312 174.28482999999997,276.60721 L 181.79663999999997,355.56464 L 278.72676,199.54168 M 160.98615,193.25402000000003 C 168.38667,193.25402000000003 174.34047,199.20782000000003 174.34047,206.60834000000003 L 174.34047,233.31699000000003 C 174.34047,240.71751000000003 168.38667,246.67131000000003 160.98615,246.67131000000003 C 153.58563,246.67131000000003 147.63183,240.71751000000003 147.63183,233.31699000000003 L 147.63183,206.60834000000003 C 147.63183,199.20782000000003 153.58563,193.25402000000003 160.98615,193.25402000000003 M 505.67595,141.18773 C 508.51592,136.65225999999998 514.36541,135.04153 519.11283,137.58479 C 523.8602500000001,140.12805 525.8100800000001,145.85037 523.6059200000001,150.72496 L 465.49246,279.9225 C 466.42499,280.89741000000004 467.31513,281.91471 468.16288,282.93202 L 509.36366999999996,259.74598000000003 C 513.8143699999999,257.24511 519.36716,258.43196 522.46146,262.45879 C 525.55576,266.48561 525.13188,272.20794 521.52893,275.8109 L 484.65166999999997,312.68814 L 454.34450999999996,312.68814 C 448.74934999999994,296.87755 433.70172999999994,285.56005 415.98368999999997,285.56005 C 398.26565999999997,285.56005 383.17566,296.87755 377.62287999999995,312.68814 L 343.83993,312.68814 L 311.83725,290.56179 C 307.72565,287.72182 306.28447,282.25381 308.48863,277.71833999999996 C 310.69279,273.18285999999995 315.86408,270.97869999999995 320.65389,272.46226999999993 L 361.85467,285.3481099999999 C 363.1263,283.6949999999999 364.44032,282.0842599999999 365.83911,280.5583099999999 L 339.43161,236.5599299999999 C 336.84596999999997,232.2787799999999 337.77849,226.7683899999999 341.59337999999997,223.5469299999999 C 345.40826999999996,220.32546999999988 351.00343999999996,220.3678499999999 354.77594,223.5892299999999 L 398.18088,260.8479699999999 C 398.8167,260.6784199999999 399.45251,260.50886999999994 400.08832,260.38170999999994 L 405.85305,199.89453999999995 C 406.3617,194.68085999999994 410.72763,190.69642999999996 415.98369,190.69642999999996 C 421.23976000000005,190.69642999999996 425.60569000000004,194.68085999999997 426.11434,199.89453999999995 L 431.83668,260.04260999999997 L 505.67595,141.18773 M 415.98369,136.39792999999997 C 421.62125000000003,136.39792999999997 426.15673000000004,140.93340999999998 426.15673000000004,146.57095999999999 L 426.15673000000004,166.91704 C 426.15673000000004,172.55459 421.62125000000003,177.09007 415.98369,177.09007 C 410.34614000000005,177.09007 405.81066000000004,172.55459 405.81066000000004,166.91704 L 405.81066000000004,146.57095999999999 C 405.81066000000004,140.93340999999998 410.34614000000005,136.39792999999997 415.98369,136.39792999999997 M 265.48894,18.393218 C 267.89624000000003,14.548720000000001 272.85456,13.183386000000002 276.87871,15.33918 C 280.90287,17.494974 282.55564000000004,22.345507 280.68729,26.477448000000003 L 231.42739,135.99179 C 232.21785,136.81818 232.97237,137.68049000000002 233.69097,138.54281 L 268.61484,118.88916 C 272.38747,116.76929 277.09430000000003,117.77532000000001 279.71718000000004,121.18867 C 282.34006000000005,124.602 281.98076000000003,129.45254 278.92672000000005,132.50659000000002 L 247.6677,163.7656 L 221.97782,163.7656 C 217.23508,150.36375 204.47996,140.77046 189.46126,140.77046 C 174.44256000000001,140.77046 161.65152,150.36375 156.9447,163.7656 L 128.30857,163.7656 L 101.18149,145.01019 C 97.69629499999999,142.60289 96.47467999999999,137.96793 98.343037,134.12342999999998 C 100.21139,130.27892999999997 104.59483999999999,128.41057999999998 108.65491999999999,129.66812 L 143.57878,140.59080999999998 C 144.65667,139.18954999999997 145.7705,137.82420999999997 146.95619,136.53072999999998 L 124.57186,99.235499 C 122.38014,95.606581 123.17059,90.93569500000001 126.40429,88.205021 C 129.63798,85.474348 134.38072,85.510276 137.57849000000002,88.240921 L 174.37071000000003,119.8233 C 174.90965000000003,119.67958 175.44860000000003,119.53587 175.98755000000003,119.42808000000001 L 180.87401000000003,68.15610900000001 C 181.30518000000004,63.73673100000001 185.00596000000002,60.35932200000001 189.46126000000004,60.35932200000001 C 193.91657000000004,60.35932200000001 197.61735000000004,63.73673100000001 198.04851000000005,68.15610900000001 L 202.89905000000005,119.14064000000002 L 265.48894,18.393218 M 189.46126,14.333139000000001 C 194.23994000000002,14.333139000000001 198.08444,18.177638 198.08444,22.956314 L 198.08444,40.202670999999995 C 198.08444,44.981348 194.23994,48.825846999999996 189.46126,48.825846999999996 C 184.68258,48.825846999999996 180.83809000000002,44.981348 180.83809000000002,40.202670999999995 L 180.83809000000002,22.956314 C 180.83809000000002,18.177637999999998 184.68258000000003,14.333139 189.46126,14.333139 L 189.46126,14.333139000000001 ", + ], + iconName: "olympus-icons-secondaries" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsSmogSolid: IconDefinition = { + icon: [ + 640.0, + 512.0, + [], + "", + "M 32.0,144.0 C 32.0,223.5 96.5,288.0 176.0,288.0 L 299.3,288.0 C 321.90000000000003,307.9 351.5,320.0 384.0,320.0 C 416.5,320.0 446.1,307.9 468.7,288.0 L 496.0,288.0 C 557.9,288.0 608.0,237.9 608.0,176.0 C 608.0,114.1 557.9,64.0 496.0,64.0 C 485.3,64.0 475.0,65.5 465.2,68.3 C 443.8,27.7 401.1,0.0 352.0,0.0 C 319.4,0.0 289.6,12.2 266.9,32.3 C 242.1,12.1 210.5,0.0 176.0,0.0 C 96.5,0.0 32.0,64.5 32.0,144.0 M 616.0,368.0 L 280.0,368.0 C 266.7,368.0 256.0,378.7 256.0,392.0 C 256.0,405.3 266.7,416.0 280.0,416.0 L 616.0,416.0 C 629.3,416.0 640.0,405.3 640.0,392.0 C 640.0,378.7 629.3,368.0 616.0,368.0 M 552.0,464.0 L 440.0,464.0 C 426.7,464.0 416.0,474.7 416.0,488.0 C 416.0,501.3 426.7,512.0 440.0,512.0 L 552.0,512.0 C 565.3,512.0 576.0,501.3 576.0,488.0 C 576.0,474.7 565.3,464.0 552.0,464.0 M 360.0,464.0 L 24.0,464.0 C 10.7,464.0 0.0,474.7 0.0,488.0 C 0.0,501.3 10.7,512.0 24.0,512.0 L 360.0,512.0 C 373.3,512.0 384.0,501.3 384.0,488.0 C 384.0,474.7 373.3,464.0 360.0,464.0 M 224.0,392.0 C 224.0,378.7 213.3,368.0 200.0,368.0 L 96.0,368.0 C 82.7,368.0 72.0,378.7 72.0,392.0 C 72.0,405.3 82.7,416.0 96.0,416.0 L 200.0,416.0 C 213.3,416.0 224.0,405.3 224.0,392.0 ", + ], + iconName: "olympus-icons-smog-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsSpeedDecrease: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 465.11867,284.79404 A 203.057335,202.96808499780232 0.0 1,0 59.00400000000002,284.79404 A 203.057335,202.96808499780232 0.0 1,0 465.11867,284.79404 M 236.67916,157.939 A 25.382167,25.371011 0.0 1,1 287.44349,157.939 A 25.382167,25.371011 0.0 1,1 236.67916,157.939 M 262.06134,411.64909 C 234.06161999999998,411.64909 211.29698999999997,388.89447 211.29698999999997,360.90707 C 211.29698999999997,347.11159999999995 216.77002999999996,334.66393999999997 225.65378999999996,325.54621 L 174.81014,210.02885 C 170.60620999999998,200.43544 174.9688,189.17704 184.5664,184.97498000000002 C 194.16403,180.77288000000001 205.42737,185.13358000000002 209.63128999999998,194.72697000000002 L 260.55426,310.16505 C 261.03018,310.16505 261.58542,310.16505 262.06134,310.16505 C 290.06102999999996,310.16505 312.82566999999995,332.91969 312.82566999999995,360.90707 C 312.82566999999995,388.89446999999996 290.06102999999996,411.64909 262.06134,411.64909 M 325.51673999999997,195.9955 A 25.38217,25.371013 0.0 1,1 376.28107,195.9955 A 25.38217,25.371013 0.0 1,1 325.51674,195.9955 L 325.51673999999997,195.9955 M 388.97216,310.16505 A 25.382167,25.371011 0.0 1,1 388.97216,259.42304 A 25.382167,25.371011 0.0 1,1 388.97216,310.16505 M 109.76832,284.79404 A 25.38217,25.371013 0.0 1,1 160.53265,284.79404 A 25.38217,25.371013 0.0 1,1 109.76831999999999,284.79404 L 109.76832,284.79404 M -466.05898,139.15662 A 250.99081,250.88049 0.0 0,1 -261.68843,33.606571 A 250.99081,250.88049 0.0 0,1 -57.133877,138.79992 M 51.337,145.14023 L 47.06496,70.716358 ", + ], + iconName: "olympus-icons-speed-decrease" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsSpeedIncrease: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 51.825435,284.79404 A 203.05733250000003,202.96808249890117 0.0 1,1 457.94010000000003,284.79404 A 203.05733249999997,202.96808249890114 0.0 1,1 51.82543500000003,284.79404 L 51.825435,284.79404 M 280.26494,157.939 A 25.382167,25.371011 0.0 1,0 229.50061000000002,157.939 A 25.382167,25.371011 0.0 1,0 280.26494,157.939 M 254.88276000000002,411.64909 C 282.88248000000004,411.64909 305.64711,388.89447 305.64711,360.90707 C 305.64711,347.11159999999995 300.17407,334.66393999999997 291.29031,325.54621 L 342.13396,210.02884999999998 C 346.33789,200.43543999999997 341.9753,189.17703999999998 332.3777,184.97498 C 322.78007,180.77288 311.51673,185.13358 307.31281,194.72697 L 256.38984,310.16505 C 255.91392,310.16505 255.35868,310.16505 254.88276,310.16505 C 226.88306999999998,310.16505 204.11843,332.91969 204.11843,360.90707 C 204.11843,388.89446999999996 226.88306999999998,411.64909 254.88276,411.64909 L 254.88276000000002,411.64909 M 191.42736,195.9955 A 25.38217,25.371013 0.0 1,0 140.66303,195.9955 A 25.38217,25.371013 0.0 1,0 191.42736,195.9955 M 127.97193999999999,310.16505 A 25.382167,25.371011 0.0 1,0 127.97193999999999,259.42304 A 25.382167,25.371011 0.0 1,0 127.97193999999999,310.16505 M 407.17578000000003,284.79404 A 25.38217,25.371013 0.0 1,0 356.41145000000006,284.79404 A 25.38217,25.371013 0.0 1,0 407.17578000000003,284.79404 M 50.885111,139.15662 A 250.99081,250.88049 0.0 0,1 255.25567,33.606571 A 250.99081,250.88049 0.0 0,1 459.81021,138.79992 M 465.6071,145.14023 L 469.87914,70.716358 ", + ], + iconName: "olympus-icons-speed-increase" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsSpeed: IconDefinition = { + icon: [ + 576.0, + 512.0, + [], + "", + "M 288.0,32.0 C 128.94,32.0 0.0,160.94 0.0,320.0 C 0.0,372.8 14.25,422.26 39.06,464.8 C 44.67,474.42 55.36,480.0 66.5,480.0 L 509.5,480.0 C 520.64,480.0 531.33,474.42 536.94,464.8 C 561.75,422.26 576.0,372.8 576.0,320.0 C 576.0,160.94 447.06,32.0 288.0,32.0 M 288.0,96.0 C 302.71,96.0 314.58,106.13 318.32,119.65 C 317.21,121.91000000000001 315.68,123.88000000000001 314.87,126.32000000000001 L 305.65,153.99 C 300.52,157.48000000000002 294.67999999999995,160.0 288.01,160.0 C 270.34,160.0 256.01,145.67 256.01,128.0 C 256.01,110.33000000000001 270.33,96.0 288.0,96.0 M 96.0,384.0 C 78.33,384.0 64.0,369.67 64.0,352.0 C 64.0,334.33 78.33,320.0 96.0,320.0 C 113.67,320.0 128.0,334.33 128.0,352.0 C 128.0,369.67 113.67,384.0 96.0,384.0 M 144.0,224.0 C 126.33,224.0 112.0,209.67 112.0,192.0 C 112.0,174.33 126.33,160.0 144.0,160.0 C 161.67000000000002,160.0 176.0,174.33 176.0,192.0 C 176.0,209.67 161.67,224.0 144.0,224.0 M 390.77,151.59 L 329.44,335.59000000000003 C 343.13,347.33 352.0,364.54 352.0,384.0 C 352.0,395.72 348.62,406.55 343.12,416.0 L 232.88,416.0 C 227.38,406.55 224.0,395.72 224.0,384.0 C 224.0,350.06 250.5,322.57 283.9,320.40999999999997 L 345.24,136.39999999999998 C 349.41,123.83999999999997 362.97,116.94999999999997 375.6,121.22999999999998 C 388.17,125.41999999999997 394.95000000000005,139.01999999999998 390.77000000000004,151.58999999999997 L 390.77,151.59 M 405.43,208.79000000000002 L 420.95,162.24 C 424.42,160.95000000000002 428.08,160.01000000000002 432.0,160.01000000000002 C 449.67,160.01000000000002 464.0,174.34000000000003 464.0,192.01000000000002 C 464.0,209.68 449.67,224.01000000000002 432.0,224.01000000000002 C 420.62,224.00000000000003 411.11,217.73000000000002 405.43,208.79000000000002 M 480.0,384.0 C 462.33,384.0 448.0,369.67 448.0,352.0 C 448.0,334.33 462.33,320.0 480.0,320.0 C 497.67,320.0 512.0,334.33 512.0,352.0 C 512.0,369.67 497.67,384.0 480.0,384.0 ", + ], + iconName: "olympus-icons-speed" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsSquareCheckSolid: IconDefinition = { + icon: [ + 448.0, + 512.0, + [], + "", + "M 64.0,32.0 C 28.7,32.0 0.0,60.7 0.0,96.0 L 0.0,416.0 C 0.0,451.3 28.7,480.0 64.0,480.0 L 384.0,480.0 C 419.3,480.0 448.0,451.3 448.0,416.0 L 448.0,96.0 C 448.0,60.7 419.3,32.0 384.0,32.0 L 64.0,32.0 M 337.0,209.0 L 209.0,337.0 C 199.6,346.4 184.4,346.4 175.1,337.0 L 111.1,273.0 C 101.69999999999999,263.6 101.69999999999999,248.4 111.1,239.1 C 120.5,229.79999999999998 135.7,229.7 145.0,239.1 L 192.0,286.1 L 303.0,175.0 C 312.4,165.6 327.6,165.6 336.9,175.0 C 346.19999999999993,184.4 346.29999999999995,199.6 336.9,208.9 L 337.0,209.0 ", + ], + iconName: "olympus-icons-square-check-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsSquareRegular: IconDefinition = { + icon: [ + 448.0, + 512.0, + [], + "", + "M 384.0,32.0 C 419.3,32.0 448.0,60.65 448.0,96.0 L 448.0,416.0 C 448.0,451.3 419.3,480.0 384.0,480.0 L 64.0,480.0 C 28.65,480.0 0.0,451.3 0.0,416.0 L 0.0,96.0 C 0.0,60.65 28.65,32.0 64.0,32.0 L 384.0,32.0 M 384.0,80.0 L 64.0,80.0 C 55.16,80.0 48.0,87.16 48.0,96.0 L 48.0,416.0 C 48.0,424.8 55.16,432.0 64.0,432.0 L 384.0,432.0 C 392.8,432.0 400.0,424.8 400.0,416.0 L 400.0,96.0 C 400.0,87.16 392.8,80.0 384.0,80.0 ", + ], + iconName: "olympus-icons-square-regular" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsTrail: IconDefinition = { + icon: [ + 16.0, + 16.0, + [], + "", + "M 7.5384925,0.85189343 C 7.5735625,0.76997233 7.6550115000000005,0.71720907 7.7449325,0.71720907 C 7.8347825,0.71720907 7.9162315,0.76997217 7.9513735,0.8518934300000001 L 8.5706265,2.2806175 C 8.6184465,2.3916893999999997 8.6436665,2.5097172 8.6436665,2.6305174 L 8.6436665,3.6996131 L 10.665971,4.8659237 L 10.665971,4.6049348 C 10.665971,4.420246 10.816253000000001,4.2716641 11.002987000000001,4.2716641 C 11.18979,4.2716641 11.340072000000001,4.420246 11.340072000000001,4.6049348 L 11.340072000000001,5.3824522 L 11.340072000000001,5.826768 L 11.340072000000001,6.1599704 C 11.340072000000001,6.3446589 11.18979,6.4932415 11.002987000000001,6.4932415 C 10.816253000000001,6.4932415 10.665971,6.3446589 10.665971,6.1599704 L 10.665971,6.0489257 L 8.6436655,6.0489257 L 8.6436655,6.5029151999999995 L 9.4652245,7.215236999999999 C 9.5143545,7.256863999999999 9.5424645,7.3179701999999995 9.5424645,7.381804399999999 L 9.5424645,7.603961599999999 C 9.5424645,7.726179099999999 9.4413805,7.8261186999999985 9.3177635,7.8261186999999985 L 7.9695645,7.8261186999999985 L 7.9695645,6.9374886 C 7.9695645,6.8153392 7.868479499999999,6.7153986 7.7449325,6.7153986 C 7.6213165,6.7153986 7.5202325,6.815339600000001 7.5202325,6.9374886 L 7.5202325,7.8261187 L 6.1720295,7.8261187 C 6.0484135,7.8261187 5.9473294999999995,7.7261787 5.9473294999999995,7.6039616 L 5.9473294999999995,7.3818044 C 5.9473294999999995,7.3179704 5.975369499999999,7.2568615 6.024499499999999,7.215237 L 6.8461315,6.5029152 L 6.8461315,6.0489257 L 4.823827,6.0489257 L 4.823827,6.1599704 C 4.823827,6.3446589 4.6735443,6.4932415 4.4868108,6.4932415 C 4.3000080999999994,6.4932415 4.1497253999999995,6.3446589 4.1497253999999995,6.1599704 L 4.1497253999999995,5.826768 L 4.1497253999999995,5.3824522 L 4.1497253999999995,4.6049348 C 4.1497253999999995,4.420246 4.3000080999999994,4.2716641 4.4868108,4.2716641 C 4.6735443,4.2716641 4.823827,4.420246 4.823827,4.6049348 L 4.823827,4.8659237 L 6.8461315,3.6996131 L 6.8461315,2.6305174 C 6.8461315,2.5097172 6.8714215,2.3916894 6.9191715,2.2806175 L 7.5384925,0.85189343 M 7.5417259,8.4887398 C 7.5767959000000005,8.4068188 7.658244900000001,8.3540555 7.7481669,8.3540555 C 7.8380169,8.3540555 7.9194659000000005,8.4068185 7.9546079,8.4887398 L 8.5738599,9.9174639 C 8.6216799,10.028535999999999 8.646899900000001,10.146564 8.646899900000001,10.267363999999999 L 8.646899900000001,11.336459999999999 L 10.669204,12.502771 L 10.669204,12.241781 C 10.669204,12.057093 10.819486000000001,11.908510999999999 11.00622,11.908510999999999 C 11.193023,11.908510999999999 11.343305,12.057092999999998 11.343305,12.241781 L 11.343305,13.019299 L 11.343305,13.463615 L 11.343305,13.796817 C 11.343305,13.981506000000001 11.193023,14.130088 11.00622,14.130088 C 10.819486000000001,14.130088 10.669204,13.981506000000001 10.669204,13.796817 L 10.669204,13.685773 L 8.6468989,13.685773 L 8.6468989,14.139762 L 9.4684579,14.852084 C 9.5175879,14.893714 9.5456979,14.954817 9.5456979,15.018651 L 9.5456979,15.240808 C 9.5456979,15.363026 9.4446139,15.462966 9.3209979,15.462966 L 7.9727949,15.462966 L 7.9727949,14.574335 C 7.9727949,14.452186 7.8717109,14.352245 7.748163900000001,14.352245 C 7.6245479000000005,14.352245 7.523462900000001,14.452185 7.523462900000001,14.574335 L 7.523462900000001,15.462966 L 6.175260900000001,15.462966 C 6.051644900000001,15.462966 5.950559900000002,15.363026 5.950559900000002,15.240808 L 5.950559900000002,15.018651 C 5.950559900000002,14.954821 5.978599900000002,14.893708 6.0277299000000015,14.852084 L 6.849364900000001,14.139762 L 6.849364900000001,13.685773 L 4.827060900000001,13.685773 L 4.827060900000001,13.796816999999999 C 4.827060900000001,13.981506 4.676777900000001,14.130087999999999 4.490044900000001,14.130087999999999 C 4.303241900000001,14.130087999999999 4.152959900000001,13.981506 4.152959900000001,13.796816999999999 L 4.152959900000001,13.463614999999999 L 4.152959900000001,13.019298999999998 L 4.152959900000001,12.241780999999998 C 4.152959900000001,12.057092999999998 4.303241900000001,11.908510999999997 4.490044900000001,11.908510999999997 C 4.676777900000001,11.908510999999997 4.827060900000001,12.057092999999997 4.827060900000001,12.241780999999998 L 4.827060900000001,12.502770999999997 L 6.849364900000001,11.336459999999997 L 6.849364900000001,10.267363999999997 C 6.849364900000001,10.146563999999998 6.874654900000001,10.028535999999997 6.922404900000001,9.917463899999998 L 7.5417259,8.4887398 ", + ], + iconName: "olympus-icons-trail" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsTrashCanRegular: IconDefinition = { + icon: [ + 448.0, + 512.0, + [], + "", + "M 170.5,51.6 L 151.5,80.0 L 296.5,80.0 L 277.5,51.6 C 276.0,49.4 273.5,48.0 270.8,48.0 L 177.1,48.0 C 174.4,48.0 171.9,49.3 170.4,51.6 L 170.5,51.6 M 317.5,25.0 L 354.2,80.0 L 368.0,80.0 L 416.0,80.0 L 424.0,80.0 C 437.3,80.0 448.0,90.7 448.0,104.0 C 448.0,117.3 437.3,128.0 424.0,128.0 L 416.0,128.0 L 416.0,432.0 C 416.0,476.2 380.2,512.0 336.0,512.0 L 112.0,512.0 C 67.8,512.0 32.0,476.2 32.0,432.0 L 32.0,128.0 L 24.0,128.0 C 10.7,128.0 0.0,117.3 0.0,104.0 C 0.0,90.7 10.7,80.0 24.0,80.0 L 32.0,80.0 L 80.0,80.0 L 93.8,80.0 L 130.5,24.9 C 140.9,9.4 158.4,0.0 177.1,0.0 L 270.8,0.0 C 289.5,0.0 307.0,9.4 317.40000000000003,24.9 L 317.5,25.0 M 80.0,128.0 L 80.0,432.0 C 80.0,449.7 94.3,464.0 112.0,464.0 L 336.0,464.0 C 353.7,464.0 368.0,449.7 368.0,432.0 L 368.0,128.0 L 80.0,128.0 M 160.0,192.0 L 160.0,400.0 C 160.0,408.8 152.8,416.0 144.0,416.0 C 135.2,416.0 128.0,408.8 128.0,400.0 L 128.0,192.0 C 128.0,183.2 135.2,176.0 144.0,176.0 C 152.8,176.0 160.0,183.2 160.0,192.0 M 240.0,192.0 L 240.0,400.0 C 240.0,408.8 232.8,416.0 224.0,416.0 C 215.2,416.0 208.0,408.8 208.0,400.0 L 208.0,192.0 C 208.0,183.2 215.2,176.0 224.0,176.0 C 232.8,176.0 240.0,183.2 240.0,192.0 M 320.0,192.0 L 320.0,400.0 C 320.0,408.8 312.8,416.0 304.0,416.0 C 295.2,416.0 288.0,408.8 288.0,400.0 L 288.0,192.0 C 288.0,183.2 295.2,176.0 304.0,176.0 C 312.8,176.0 320.0,183.2 320.0,192.0 ", + ], + iconName: "olympus-icons-trash-can-regular" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsTriangleExclamationSolid: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 256.0,32.0 C 270.2,32.0 283.3,39.5 290.5,51.8 L 506.5,419.8 C 513.8,432.2 513.8,447.5 506.7,459.90000000000003 C 499.6,472.30000000000007 486.3,480.0 472.0,480.0 L 40.0,480.0 C 25.7,480.0 12.399999999999999,472.3 5.299999999999997,459.9 C -1.8000000000000043,447.49999999999994 -1.7000000000000028,432.09999999999997 5.499999999999997,419.79999999999995 L 221.5,51.799999999999955 C 228.7,39.5 241.8,32.0 256.0,32.0 M 256.0,160.0 C 242.7,160.0 232.0,170.7 232.0,184.0 L 232.0,296.0 C 232.0,309.3 242.7,320.0 256.0,320.0 C 269.3,320.0 280.0,309.3 280.0,296.0 L 280.0,184.0 C 280.0,170.7 269.3,160.0 256.0,160.0 M 288.0,384.0 A 32.0,32.0 0.0 1,0 224.0,384.0 A 32.0,32.0 0.0 1,0 288.0,384.0 ", + ], + iconName: "olympus-icons-triangle-exclamation-solid" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olIconsWhitePhosphorous: IconDefinition = { + icon: [ + 576.0, + 512.0, + [], + "", + "M 499.6,11.3 C 506.3,0.6000000000000014 520.1,-3.1999999999999993 531.3000000000001,2.8000000000000007 C 542.5000000000001,8.8 547.1,22.3 541.9000000000001,33.8 L 404.8,338.6 C 407.0,340.90000000000003 409.1,343.3 411.1,345.70000000000005 L 508.3,291.0 C 518.8,285.1 531.9,287.9 539.2,297.4 C 546.5,306.9 545.5,320.4 537.0,328.9 L 450.0,415.9 L 378.5,415.9 C 365.3,378.59999999999997 329.8,351.9 288.0,351.9 C 246.2,351.9 210.6,378.59999999999997 197.5,415.9 L 117.8,415.9 L 42.3,363.7 C 32.6,357.0 29.2,344.1 34.4,333.4 C 39.6,322.7 51.8,317.5 63.1,321.0 L 160.3,351.4 C 163.3,347.5 166.4,343.7 169.70000000000002,340.09999999999997 L 107.4,236.3 C 101.30000000000001,226.20000000000002 103.5,213.20000000000002 112.5,205.60000000000002 C 121.5,198.00000000000003 134.7,198.10000000000002 143.6,205.70000000000002 L 246.0,293.6 C 247.5,293.20000000000005 249.0,292.8 250.5,292.5 L 264.1,149.8 C 265.3,137.5 275.6,128.10000000000002 288.0,128.10000000000002 C 300.4,128.10000000000002 310.7,137.50000000000003 311.9,149.8 L 325.4,291.70000000000005 L 499.6,11.3 M 288.0,0.0 C 301.3,0.0 312.0,10.7 312.0,24.0 L 312.0,72.0 C 312.0,85.3 301.3,96.0 288.0,96.0 C 274.7,96.0 264.0,85.3 264.0,72.0 L 264.0,24.0 C 264.0,10.7 274.7,0.0 288.0,0.0 M 64.847242,449.52266 L 64.847242,449.52266 L 512.84724,449.52266 L 512.84724,449.52266 L 544.84724,449.52266 C 562.5472400000001,449.52266 576.84724,463.82266 576.84724,481.52266 C 576.84724,499.22265999999996 562.5472400000001,513.52266 544.84724,513.52266 L 32.847242,513.52266 C 15.147242000000002,513.52266 0.847242020000003,499.22265999999996 0.847242020000003,481.52266 C 0.847242020000003,463.82266 15.147242000000004,449.52266 32.847242,449.52266 L 64.847242,449.52266 ", + ], + iconName: "olympus-icons-white-phosphorous" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olMarkersAirbase: IconDefinition = { + icon: [ + 63.0, + 63.0, + [], + "", + "M 31.4998,46.9756 C 40.0468,46.9756 46.9756,40.0468 46.9756,31.4998 C 46.9756,22.9528 40.0468,16.024 31.4998,16.024 C 22.9528,16.024 16.024,22.9528 16.024,31.4998 C 16.024,40.0468 22.9528,46.9756 31.4998,46.9756 M 31.4998,52.734 C 43.2271,52.734 52.734,43.2271 52.734,31.4998 C 52.734,19.7725 43.2271,10.2656 31.4998,10.2656 C 19.7725,10.2656 10.2656,19.7725 10.2656,31.4998 C 10.2656,43.2271 19.7725,52.734 31.4998,52.734 M 25.7895,23.9132 L 36.5242,38.6028 M 38.9357,33.9313 L 25.9313,33.0643 M 16.0507,31.5001 A 15.4494,15.4494 0.0 1,0 46.9495,31.5001 A 15.4494,15.4494 0.0 1,0 16.0507,31.5001 ", + ], + iconName: "olympus-markers-airbase" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olMarkersBullseye: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 448.0,256.0 A 192.0,192.0 0.0 1,0 64.0,256.0 A 192.0,192.0 0.0 1,0 448.0,256.0 M 0.0,256.0 A 256.0,256.0 0.0 1,1 512.0,256.0 A 256.0,256.0 0.0 1,1 0.0,256.0 M 256.0,336.0 A 80.0,80.0 0.0 1,0 256.0,176.0 A 80.0,80.0 0.0 1,0 256.0,336.0 M 256.0,112.0 A 144.0,144.0 0.0 1,1 256.0,400.0 A 144.0,144.0 0.0 1,1 256.0,112.0 M 224.0,256.0 A 32.0,32.0 0.0 1,1 288.0,256.0 A 32.0,32.0 0.0 1,1 224.0,256.0 M 0.0,256.0 A 256.0,256.0 0.0 1,0 512.0,256.0 A 256.0,256.0 0.0 1,0 0.0,256.0 ", + ], + iconName: "olympus-markers-bullseye" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olMarkersDraw: IconDefinition = { + icon: [ + 512.0, + 512.0, + [], + "", + "M 352.44544,42.011059 L 308.68207,85.774429 L 426.22831,203.32067 L 469.99168000000003,159.5573 C 492.59673000000004,136.95226 492.59673000000004,100.33207999999999 469.99168000000003,77.72703299999999 L 434.36613,42.011059 C 411.76108,19.406012000000004 375.1409,19.406012000000004 352.53586,42.011059 L 352.44544,42.011059 M 288.2471,106.20939 L 77.477646,317.06927 C 68.07394599999999,326.47297000000003 61.202011999999996,338.13717 57.404363999999994,350.88642000000004 L 25.395618,459.6619 C 23.135112999999997,467.34762 25.214778,475.57586 30.820829,481.18191 C 36.426881,486.78796 44.655118,488.86763 52.250414,486.69754 L 161.0259,454.68879 C 173.77515,450.89115 185.43935000000002,444.01921 194.84305,434.61551 L 405.79335000000003,223.75563999999997 L 288.2471,106.20939 ", + ], + iconName: "olympus-markers-draw" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olMarkersMove: IconDefinition = { + icon: [ + 52.0, + 52.0, + [], + "", + "M 21.080975,7.4218621 L 19.948473,5.460311900000001 L 18.815971,3.4987617000000006 L 21.080975000000002,3.4987617000000006 L 23.345978000000002,3.498761600000001 L 22.213476000000004,5.460311900000001 L 21.080975,7.4218621 M 21.080975,7.4218621 L 19.948473,5.460311900000001 L 18.815971,3.4987617000000006 L 21.080975000000002,3.4987617000000006 L 23.345978000000002,3.498761600000001 L 22.213476000000004,5.460311900000001 L 21.080975,7.4218621 M 21.080975,7.4218621 L 19.948473,5.460311900000001 L 18.815971,3.4987617000000006 L 21.080975000000002,3.4987617000000006 L 23.345978000000002,3.498761600000001 L 22.213476000000004,5.460311900000001 L 21.080975,7.4218621 M 21.080975,7.4218621 L 19.948473,5.460311900000001 L 18.815971,3.4987617000000006 L 21.080975000000002,3.4987617000000006 L 23.345978000000002,3.498761600000001 L 22.213476000000004,5.460311900000001 L 21.080975,7.4218621 ", + ], + iconName: "olympus-markers-move" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olMarkersSmoke: IconDefinition = { + icon: [ + 52.0, + 52.0, + [], + "", + "M 5.98929839,12.526179 A 0.40000001,0.40000001 0.0 1,0 6.78929841,12.526179 A 0.40000001,0.40000001 0.0 1,0 5.98929839,12.526179 M 5.531793029999999,11.768929 A 0.6366406700000001,0.6366406700000001 0.0 1,0 6.80507437,11.768929 A 0.6366406700000001,0.6366406700000001 0.0 1,0 5.531793029999999,11.768929 M 6.21016268,11.674273 A 0.85750532,0.85750532 0.0 1,0 7.92517332,11.674273 A 0.85750532,0.85750532 0.0 1,0 6.21016268,11.674273 M 6.00507442,10.711934 A 0.84172928,0.84172928 0.0 1,0 7.68853298,10.711934 A 0.84172928,0.84172928 0.0 1,0 6.00507442,10.711934 M 7.2198303,8.3928556 A 1.5516512,1.5516512 0.0 1,0 10.3231327,8.3928556 A 1.5516512,1.5516512 0.0 1,0 7.2198303,8.3928556 M 6.6676682,10.159773 A 1.2361304,1.2361304 0.0 1,0 9.139928999999999,10.159773 A 1.2361304,1.2361304 0.0 1,0 6.667668199999999,10.159773 L 6.6676682,10.159773 M 5.7211055,7.6040535 A 1.5989795000000004,1.5989795000000004 0.0 1,0 8.919064500000001,7.6040535 A 1.5989795,1.5989795 0.0 1,0 5.721105500000001,7.6040535 L 5.7211055,7.6040535 M 5.451200500000001,9.5266676 A 1.5989795,1.5989795 0.0 1,0 8.6491595,9.5266676 A 1.5989795,1.5989795 0.0 1,0 5.4512005,9.5266676 L 5.451200500000001,9.5266676 M 8.229496999999999,6.5155067 A 1.804068,1.804068 0.0 1,0 11.837632999999999,6.5155067 A 1.804068,1.804068 0.0 1,0 8.229496999999999,6.5155067 M 6.2101624,4.9221258 A 1.819844,1.819844 0.0 1,0 9.8498504,4.9221258 A 1.819844,1.819844 0.0 1,0 6.2101624,4.9221258 M 10.1068463,2.3821828 A 1.6936357,1.6936357 0.0 1,0 13.4941177,2.3821828 A 1.6936357,1.6936357 0.0 1,0 10.1068463,2.3821828 M 9.649340299999999,4.7801414 A 1.6778597,1.6778597 0.0 1,0 13.005059699999999,4.7801414 A 1.6778597,1.6778597 0.0 1,0 9.649340299999999,4.7801414 M 7.8193195,2.6345997 A 2.0407088000000004,2.0407088000000004 0.0 1,0 11.9007371,2.6345997 A 2.0407088,2.0407088 0.0 1,0 7.819319500000001,2.6345997 L 7.8193195,2.6345997 ", + ], + iconName: "olympus-markers-smoke" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olMarkersTarget: IconDefinition = { + icon: [ + 52.0, + 52.0, + [], + "", + "M 4.9189471000000005,6.8209338 A 1.9410306,1.948356 0.0 1,0 8.8010083,6.8209338 A 1.9410306,1.948356 0.0 1,0 4.9189471,6.8209338 L 4.9189471000000005,6.8209338 M 4.9202999,6.8167095 A 1.9410306,1.948356 0.0 1,0 8.802361099999999,6.8167095 A 1.9410306,1.948356 0.0 1,0 4.920299899999999,6.8167095 L 4.9202999,6.8167095 M 6.879787210000001,3.3855996 L 6.8388373300000005,3.3855996 A 0.29515001,0.29515001 0.0 0,1 7.133987340000001,3.68074961 L 7.133987340000001,5.71408439 A 0.29515001,0.29515001 0.0 0,1 6.8388373300000005,6.0092344 L 6.879787210000001,6.0092344 A 0.29515001,0.29515001 0.0 0,1 6.5846372,5.71408439 L 6.5846372,3.68074961 A 0.29515001,0.29515001 0.0 0,1 6.879787210000001,3.3855996 M 6.88101451,7.6347723 L 6.840064629999999,7.6347723 A 0.29515001,0.29515001 0.0 0,1 7.135214639999999,7.92992231 L 7.135214639999999,9.963257089999999 A 0.29515001,0.29515001 0.0 0,1 6.840064629999999,10.2584071 L 6.88101451,10.2584071 A 0.29515001,0.29515001 0.0 0,1 6.5858645,9.963257089999999 L 6.5858645,7.92992231 A 0.29515001,0.29515001 0.0 0,1 6.88101451,7.6347723 M 6.8469345100000005,-10.252322 L 6.805984629999999,-10.252322 A 0.29515001,0.29515001 0.0 0,1 7.10113464,-9.957171989999999 L 7.10113464,-7.92383721 A 0.29515001,0.29515001 0.0 0,1 6.805984629999999,-7.6286872 L 6.8469345100000005,-7.6286872 A 0.29515001,0.29515001 0.0 0,1 6.5517845,-7.92383721 L 6.5517845,-9.957171989999999 A 0.29515001,0.29515001 0.0 0,1 6.8469345100000005,-10.252322 M 6.84816191,-6.003149 L 6.807212029999999,-6.003149 A 0.29515001,0.29515001 0.0 0,1 7.102362039999999,-5.707998989999999 L 7.102362039999999,-3.6746642099999995 A 0.29515001,0.29515001 0.0 0,1 6.807212029999999,-3.3795141999999996 L 6.84816191,-3.3795141999999996 A 0.29515001,0.29515001 0.0 0,1 6.5530119,-3.6746642099999995 L 6.5530119,-5.707998989999999 A 0.29515001,0.29515001 0.0 0,1 6.84816191,-6.003149 ", + ], + iconName: "olympus-markers-target" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesAttack: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 3.9375571,11.604826 L 5.4120513,13.142064 L 8.1100626,10.334251 L 10.243372,12.373445 L 9.1610315,11.30679 L 15.074691,5.314696 L 14.525677,2.506882 L 11.81198,1.8794375 L 5.8198901,7.8087875 L 4.6748047,6.7891902 L 6.6826265,8.7499543 L 3.9375571,11.604826 M 3.7087499,11.821755 L 5.1832446,13.358994 L 8.1100626,10.334250999999998 C 9.0686656,11.233557999999999 9.1610315,11.306789999999998 9.1610315,11.306789999999998 L 14.845884,5.5316249 L 14.29687,2.7238111 L 11.583172,2.0963666 L 5.8198909,7.8087874 C 5.8198909,7.8087874 5.7057712,7.7959933999999995 6.6826265,8.7499543 L 3.7087499,11.821755 M 12.8516,4.8268957 C 13.064783,4.6137112 13.064783,4.2939346 12.8516,4.0807502 C 12.638415,3.8675656999999997 12.318639,3.8675656999999997 12.105455,4.0807502 L 8.1881937,7.9980144 C 7.975008999999999,8.2111989 7.975008999999999,8.5309756 8.1881937,8.7441602 C 8.2947861,8.850752199999999 8.4280264,8.9040483 8.5612669,8.9040483 C 8.694507399999999,8.9040483 8.8277469,8.8507523 8.9343392,8.7441602 L 12.8516,4.8268957 M 4.6748047,6.7891902 L 10.243372,12.373445 ", + ], + iconName: "olympus-states-attack" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesAwacs: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 7.9158381,11.840383 A 2.5,2.5 0.0 0,1 11.129776,11.840383 M 7.9158381,11.840383 A 2.5,2.5 0.0 0,1 11.129776,11.840383 M 5.023294,8.3931829 A 7.0,7.0 0.0 0,1 14.02232,8.3931831 M 5.023294,8.3931829 A 7.0,7.0 0.0 0,1 14.02232,8.3931831 M 2.1307496,4.945983 A 11.5,11.5 0.0 0,1 16.914865,4.9459832 M 2.1307496,4.945983 A 11.5,11.5 0.0 0,1 16.914865,4.9459832 ", + ], + iconName: "olympus-states-awacs" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesDcs: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 9.3852027,1.9350755 C 9.743423700000001,1.9350755 10.032833,2.2244854 10.032833,2.5827058 L 10.032833,3.8779676 L 12.461449,3.8779676 C 13.266941,3.8779676 13.91862,4.5296461 13.91862,5.3351371 L 13.91862,10.839998999999999 C 13.91862,11.645489999999999 13.266941000000001,12.297168 12.461449,12.297168 L 6.3089565,12.297168 C 5.5034656,12.297168 4.8517871,11.645489999999999 4.8517871,10.839998999999999 L 4.8517871,5.3351371 C 4.8517871,4.5296461 5.5034656,3.8779676 6.3089565,3.8779676 L 8.7375714,3.8779676 L 8.7375714,2.5827058 C 8.7375714,2.2244854 9.0269825,1.9350755 9.3852027,1.9350755 M 7.1184944,9.7066454 C 6.9403965,9.7066454 6.7946792,9.8523614 6.7946792,10.03046 C 6.7946792,10.208559 6.9403965,10.354277 7.1184944,10.354277 L 7.766124700000001,10.354277 C 7.9442238000000005,10.354277 8.0899411,10.208559 8.0899411,10.03046 C 8.0899411,9.8523614 7.9442238000000005,9.7066454 7.766124700000001,9.7066454 L 7.1184944,9.7066454 M 9.061387700000001,9.7066454 C 8.883288700000001,9.7066454 8.7375714,9.8523614 8.7375714,10.03046 C 8.7375714,10.208559 8.8832887,10.354277 9.061387700000001,10.354277 L 9.7090177,10.354277 C 9.8871167,10.354277 10.032833,10.208559 10.032833,10.03046 C 10.032833,9.8523614 9.8871167,9.7066454 9.7090177,9.7066454 L 9.061387700000001,9.7066454 M 11.004280000000001,9.7066454 C 10.826182000000001,9.7066454 10.680465000000002,9.8523614 10.680465000000002,10.03046 C 10.680465000000002,10.208559 10.826182000000001,10.354277 11.004280000000001,10.354277 L 11.651911000000002,10.354277 C 11.830009000000002,10.354277 11.975727000000003,10.208559 11.975727000000003,10.03046 C 11.975727000000003,9.8523614 11.830009000000002,9.7066454 11.651911000000002,9.7066454 L 11.004280000000001,9.7066454 M 8.2518487,7.1161213 A 0.8095391,0.8095391 0.0 1,0 6.6327705,7.1161213 A 0.8095391,0.8095391 0.0 1,0 8.2518487,7.1161213 M 11.328096,7.9256592999999995 A 0.80953865,0.80953865 0.0 1,0 11.328096,6.306582199999999 A 0.80953865,0.80953865 0.0 1,0 11.328096,7.9256592999999995 M 3.8803405,6.4684911 L 4.2041555,6.4684911 L 4.2041555,10.354277 L 3.8803404999999995,10.354277 C 3.3440209999999997,10.354277 2.9088937999999995,9.9191494 2.9088937999999995,9.3828284 L 2.9088937999999995,7.4399365 C 2.9088937999999995,6.9036183 3.3440209999999997,6.4684911 3.8803404999999995,6.4684911 L 3.8803405,6.4684911 M 14.890066000000001,6.4684911 C 15.426385000000002,6.4684911 15.861512000000001,6.9036183 15.861512000000001,7.4399365 L 15.861512000000001,9.3828284 C 15.861512000000001,9.919149399999998 15.426385000000002,10.354277 14.890066000000001,10.354277 L 14.566249,10.354277 L 14.566249,6.4684911 L 14.890066000000001,6.4684911 M 3.1233985,4.8923955 L 5.138020900000001,4.8923955 A 1.6057953,1.6057953 0.0 0,1 6.7438162,6.4981908 L 6.7438162,10.3745619 A 1.6057953,1.6057953 0.0 0,1 5.138020900000001,11.9803572 L 3.1233985,11.9803572 A 1.6057953,1.6057953 0.0 0,1 1.5176032,10.3745619 L 1.5176032,6.4981908 A 1.6057953,1.6057953 0.0 0,1 3.1233985,4.8923955 M 13.566374699999999,4.9978404 L 15.7211915,4.9978404 A 1.7175397,1.7175397 0.0 0,1 17.4387312,6.7153801 L 17.4387312,10.1864205 A 1.7175397,1.7175397 0.0 0,1 15.7211915,11.9039602 L 13.566374699999999,11.9039602 A 1.7175397,1.7175397 0.0 0,1 11.848835,10.1864205 L 11.848835,6.7153801 A 1.7175397,1.7175397 0.0 0,1 13.566374699999999,4.9978404 M 9.3155314,0.59372008 L 9.4734668,0.59372008 A 1.5281793,1.5281793 0.0 0,1 11.0016461,2.12189938 L 11.0016461,4.94880298 A 1.5281793,1.5281793 0.0 0,1 9.4734668,6.47698228 L 9.3155314,6.47698228 A 1.5281793,1.5281793 0.0 0,1 7.7873521,4.94880298 L 7.7873521,2.12189938 A 1.5281793,1.5281793 0.0 0,1 9.3155314,0.59372008 M 5.6264784,1.9770601 L 13.201927399999999,1.9770601 A 2.5930805,2.5930805 0.0 0,1 15.7950079,4.5701406 L 15.7950079,11.399118600000001 A 2.5930805,2.5930805 0.0 0,1 13.201927399999999,13.9921991 L 5.6264784,13.9921991 A 2.5930805,2.5930805 0.0 0,1 3.0333979,11.399118600000001 L 3.0333979,4.5701406 A 2.5930805,2.5930805 0.0 0,1 5.6264784,1.9770601 ", + ], + iconName: "olympus-states-dcs" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesFollow: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 M 8.7185878,4.0337352 L -2.2072895,0.01601326 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157440999999997 8.7185878,4.033735200000001 L 8.7185878,4.0337352 M 8.7185878,4.0337352 L -2.2072895,0.01601326 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157440999999997 8.7185878,4.033735200000001 L 8.7185878,4.0337352 M 8.7185878,4.0337352 L -2.2072895,0.01601326 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157440999999997 8.7185878,4.033735200000001 L 8.7185878,4.0337352 M 8.7185878,4.0337352 L -2.2072895,0.01601326 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157440999999997 8.7185878,4.033735200000001 L 8.7185878,4.0337352 M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 M 8.7185878,4.0337352 L -2.2072895,0.01601326 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157440999999997 8.7185878,4.033735200000001 L 8.7185878,4.0337352 M 8.7185878,4.0337352 L -2.2072895,0.01601326 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157440999999997 8.7185878,4.033735200000001 L 8.7185878,4.0337352 M 8.7185878,4.0337352 L -2.2072895,0.01601326 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157440999999997 8.7185878,4.033735200000001 L 8.7185878,4.0337352 M 9.7400387,13.368089 L 9.7506927,11.546184 M 4.4447961,10.874958 L 4.4447961,7.976957 M 15.077899,10.949537 L 15.056587,7.9023759 M 5.0092879,8.5461224 L 8.297837000000001,6.6278125999999995 L 8.323002,4.567545299999999 L 9.7593885,1.485836299999999 L 11.1570756,4.461001199999998 L 11.220875600000001,6.627812599999999 L 14.509423600000002,8.546122399999998 M 5.0092879,10.491885 L 8.297837,10.491885 L 8.297837,11.238592 L 6.8100755,12.579662 L 6.7994205,13.34678 L 12.691310999999999,13.378730000000001 L 12.670001,12.473105 L 11.220875999999999,11.238579 L 11.220875999999999,10.491881 L 14.509424999999998,10.491881 M 8.6152043,0.96068491 C 8.544220300000001,0.79488221 8.379378,0.68809291 8.1973831,0.68809291 C 8.0155266,0.68809291 7.8506851,0.79488191 7.7795606,0.9606849099999999 L 6.5262355,3.8523252 C 6.4294515,4.0771272 6.3784085,4.3160075 6.3784085,4.560499 L 6.3784085,6.7242759 L 2.2854009,9.0848093 L 2.2854009,8.5565855 C 2.2854009,8.182788 1.9812398999999998,7.8820684000000005 1.6033029,7.8820684000000005 C 1.2252269,7.8820684000000005 0.92106591,8.182788 0.92106591,8.5565855 L 0.92106591,10.130228 L 0.92106591,11.029493 L 0.92106591,11.703872 C 0.92106591,12.077669 1.2252269,12.37839 1.6033029,12.37839 C 1.9812399,12.37839 2.2854009,12.077669 2.2854009,11.703872 L 2.2854009,11.479125 L 6.3784085,11.479125 L 6.3784085,12.397969 L 4.7156289,13.83966 C 4.616188899999999,13.923910000000001 4.559293899999999,14.047585 4.559293899999999,14.176781 L 4.559293899999999,14.626412 C 4.559293899999999,14.873772 4.7638818999999994,15.076043 5.0140728999999995,15.076043 L 7.7427437,15.076043 L 7.7427437,13.277516 C 7.7427437,13.030294 7.9473316,12.828021 8.1973831,12.828021 C 8.447573,12.828021 8.6521609,13.030294 8.6521609,13.277516 L 8.6521609,15.076043 L 11.380831,15.076043 C 11.631022,15.076043 11.83561,14.873772 11.83561,14.626412 L 11.83561,14.176781 C 11.83561,14.047585 11.77885,13.923905 11.679415,13.83966 L 10.016496,12.397969 L 10.016496,11.479125 L 14.109501999999999,11.479125 L 14.109501999999999,11.703872 C 14.109501999999999,12.077669 14.413663999999999,12.37839 14.791599999999999,12.37839 C 15.169675999999999,12.37839 15.473837999999999,12.077669 15.473837999999999,11.703872 L 15.473837999999999,11.029493 L 15.473837999999999,10.130228 L 15.473837999999999,8.5565855 C 15.473837999999999,8.182788 15.169675999999999,7.8820684000000005 14.791599999999999,7.8820684000000005 C 14.413663999999999,7.8820684000000005 14.109501999999999,8.182788 14.109501999999999,8.5565855 L 14.109501999999999,9.0848093 L 10.016496,6.7242759 L 10.016496,4.560499 C 10.016496,4.3160075 9.965312,4.0771272 9.8686685,3.8523252 L 8.6152043,0.96068491 M 29.19866,80.130951 L 29.19866,80.130951 L 29.19866,80.130951 ", + ], + iconName: "olympus-states-follow" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesHuman: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 4.5129051,12.490473 C 3.7913718,12.480652 3.327463,12.244253 3.2890664,11.649084 C 3.2075443,9.1160904 4.4151773,8.6100056 5.7622404,8.0795609 L 12.377690999999999,8.067314900000001 C 14.827970999999998,8.356385800000002 15.425465999999998,9.913943900000001 15.425465999999998,11.547097 C 15.438165999999999,11.907540000000001 15.094183999999998,12.449054 13.946660999999999,12.490473000000001 L 4.5129051,12.490473 M 9.2659737,7.6041687 C 10.907501,7.6041687 12.239308,6.307249 12.239308,4.7087193 C 12.239308,3.1101895000000006 10.907501,1.8132692000000001 9.2659737,1.8132692000000001 C 7.6244454,1.8132692000000001 6.2926386999999995,3.1101895 6.2926386999999995,4.7087193 C 6.2926386999999995,6.3072490000000005 7.624445399999999,7.604168700000001 9.2659737,7.604168700000001 L 9.2659737,7.6041687 M 11.908937,8.2476034 L 10.771222999999999,8.2476034 C 10.312831999999998,8.452697299999999 9.8028248,8.5693197 9.2659737,8.5693197 C 8.7291226,8.5693197 8.2211772,8.452697299999999 7.7607239,8.2476034 L 6.6230093,8.2476034 C 5.1631842,8.2476034 3.9800440999999998,9.3997514 3.9800440999999998,10.821342 L 3.9800440999999998,11.143058 C 3.9800440999999998,11.675901 4.4239799,12.108207 4.9711561,12.108207 L 13.56079,12.108207 C 14.107967,12.108207 14.551902,11.675901 14.551902,11.143058 L 14.551902,10.821342 C 14.551902,9.3997514 13.368762,8.2476034 11.908937,8.2476034 M 4.2324433,4.9208517 A 5.0100894,4.9463482 0.0 1,0 14.2526221,4.9208517 A 5.0100894,4.9463482 0.0 1,0 4.2324433,4.9208517 ", + ], + iconName: "olympus-states-human" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesIdle: IconDefinition = { + icon: [ + 17.0, + 17.0, + [], + "", + "M 8.5356,0.900581 C 9.69508,-0.282964 11.5945,-0.302474 12.778,0.857004 L 14.5643,2.607 C 15.1403,3.17128 15.4649,3.94367 15.4649,4.75 C 15.4649,4.98835 15.4366,5.22373 15.3817,5.45165 C 15.8245,5.85549 16.151,6.39558 16.2888,7.02558 L 16.4103,7.58115 L 16.4103,7.58116 C 17.2333,11.3434 14.3009,14.75 10.5685,14.75 L 8.64315,14.75 C 8.50267,15.0566 8.30769,15.3446 8.05807,15.5994 C 6.89859,16.783 4.99919,16.8025 3.81565,15.643 L 2.02933,13.893 C 1.45334,13.3287 1.12875,12.5563 1.12875,11.75 C 1.12875,11.5117 1.15711,11.2763 1.21194,11.0484 C 0.769126,10.6445 0.442675,10.1044 0.30487,9.47436 L 0.183357,8.91882 C 0.183355,8.91881 0.183354,8.9188 0.183352,8.9188 C -0.639549,5.15664 2.29279,1.75 6.02519,1.75 L 7.95052,1.75 C 8.09101,1.44337 8.28598,1.15538 8.5356,0.900581 M 7.95052,7.75 L 7.89958,7.75 C 7.93031,7.77715 7.9606,7.80505 7.99045,7.83367 C 7.97668,7.80595 7.96338,7.77805 7.95052,7.75 M 8.60322,8.66633 C 8.61699,8.69406 8.6303,8.72195 8.64315,8.75 L 8.69409,8.75 C 8.66337,8.72285 8.63307,8.69496 8.60322,8.66633 M 10.1426,2.47515 C 10.4325,2.17926 10.9074,2.17438 11.2032,2.46425 L 12.9896,4.21425 C 13.1336,4.35532 13.2147,4.54842 13.2147,4.75 C 13.2147,4.95158 13.1336,5.14468 12.9896,5.28575 L 11.2032,7.03575 C 10.9074,7.32562 10.4325,7.32074 10.1426,7.02486 C 9.85276,6.72897 9.85764,6.25412 10.1535,5.96425 L 10.6274,5.5 L 6.02497,5.5 C 4.5888,5.5 3.55582,6.78851 3.84652,8.11751 L 3.84652,8.11751 L 3.96804,8.67308 C 4.05655,9.07772 3.80027,9.4775 3.39562,9.56601 C 2.99097,9.65452 2.59119,9.39824 2.50268,8.99359 L 2.38117,8.43803 C 2.38117,8.43803 2.38117,8.43803 2.38117,8.43802 C 1.87759,6.13576 3.6703,4.0 6.02497,4.0 L 10.6274,4.0 L 10.1535,3.53575 C 9.85764,3.24588 9.85276,2.77103 10.1426,2.47515 M 13.1976,6.93399 C 13.6022,6.84548 14.002,7.10175 14.0905,7.5064 L 14.2121,8.06196 L 13.5077,8.21604 L 14.2121,8.06196 C 14.7157,10.3642 12.9229,12.5 10.5683,12.5 L 5.96582,12.5 L 6.4397,12.9643 C 6.73559,13.2541 6.74047,13.729 6.4506,14.0249 C 6.16073,14.3207 5.68588,14.3256 5.38999,14.0357 L 3.60367,12.2857 C 3.45967,12.1447 3.37853,11.9516 3.37853,11.75 C 3.37853,11.5484 3.45967,11.3553 3.60367,11.2143 L 5.38999,9.46425 C 5.68588,9.17438 6.16073,9.17926 6.4506,9.47515 C 6.74047,9.77103 6.73559,10.2459 6.4397,10.5357 L 5.96582,11.0 L 10.5683,11.0 C 12.0044,11.0 13.0374,9.71149 12.7467,8.38251 L 12.6252,7.82694 C 12.5367,7.42229 12.7929,7.02251 13.1976,6.93399 ", + ], + iconName: "olympus-states-idle" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesLandAtPoint: IconDefinition = { + icon: [ + 17.0, + 17.0, + [], + "", + "M 4.9812012,10.145404 L 8.4655861,13.629789 L 11.998366,10.09701 M 8.4655861,13.629789 L 8.4655861,3.3702107 M 4.9812012,10.145404 L 8.4655865,13.629789 L 11.998366,10.09701 M 8.4655865,13.629789 L 8.4655865,3.3702106 ", + ], + iconName: "olympus-states-land-at-point" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesMissOnPurpose: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 184.66044,8.5185895 C 196.83951,8.5185895 206.67909,18.358172 206.67909,30.537233999999998 L 206.67909,37.693293999999995 C 271.15243,47.257643 322.07055,98.244571 331.6349,162.6491 L 338.79096000000004,162.6491 C 350.97002000000003,162.6491 360.80960000000005,172.48868000000002 360.80960000000005,184.66774 C 360.80960000000005,196.84681 350.97002000000003,206.68639000000002 338.79096000000004,206.68639000000002 L 331.6349,206.68639000000002 C 322.07055,271.15973 271.08362,322.07785 206.67909000000003,331.6422 L 206.67909000000003,338.79826 C 206.67909000000003,350.97732 196.83951000000002,360.81690000000003 184.66044000000002,360.81690000000003 C 172.48138000000003,360.81690000000003 162.64180000000002,350.97732 162.64180000000002,338.79826 L 162.64180000000002,331.6422 C 98.168455,322.07785 47.250339,271.15973 37.68599,206.68639 L 30.529930999999998,206.68639 C 18.350868,206.68639 8.511286599999998,196.84680999999998 8.511286599999998,184.66773999999998 C 8.511286599999998,172.48868 18.350868,162.64909999999998 30.529930999999998,162.64909999999998 L 37.68599,162.64909999999998 C 47.250339,98.175761 98.168455,47.257643 162.6418,37.693294 L 162.6418,30.537234 C 162.6418,18.358172000000003 172.48138,8.518589500000001 184.66044,8.518589500000001 L 184.66044,8.5185895 M 82.411363,206.68639 C 91.012396,246.80160999999998 122.59539,278.31579 162.6418,286.91682 L 162.6418,272.74231999999995 C 162.6418,260.56325999999996 172.48138,250.72367999999994 184.66044,250.72367999999994 C 196.83951,250.72367999999994 206.67909,260.56325999999996 206.67909,272.74231999999995 L 206.67909,286.91682 C 246.79431,278.31579 278.30849,246.73279999999997 286.90953,206.68638999999996 L 272.73502,206.68638999999996 C 260.55596,206.68638999999996 250.71638000000002,196.84680999999995 250.71638000000002,184.66773999999995 C 250.71638000000002,172.48867999999996 260.55596,162.64909999999995 272.73502,162.64909999999995 L 286.90953,162.64909999999995 C 278.30849,122.53388 246.79431,91.019701 206.67909,82.418665 L 206.67909,96.593171 C 206.67909,108.77223 196.83951,118.61180999999999 184.66044,118.61180999999999 C 172.48138,118.61180999999999 162.6418,108.77223 162.6418,96.59317099999998 L 162.6418,82.418665 C 122.52658,91.019701 91.012396,122.53388 82.411363,162.6491 L 96.585865,162.6491 C 108.76492999999999,162.6491 118.60451,172.48868000000002 118.60451,184.66774 C 118.60451,196.84681 108.76493,206.68639000000002 96.58586500000001,206.68639000000002 L 82.411363,206.68639 M 184.66044,162.6491 A 22.018645000000003,22.018645000000003 0.0 1,1 184.66044,206.68639000000002 A 22.018645,22.018645 0.0 1,1 184.66044,162.64910000000003 L 184.66044,162.6491 M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 184.66044,8.5185895 C 196.83951,8.5185895 206.67909,18.358172 206.67909,30.537233999999998 L 206.67909,37.693293999999995 C 271.15243,47.257643 322.07055,98.244571 331.6349,162.6491 L 338.79096000000004,162.6491 C 350.97002000000003,162.6491 360.80960000000005,172.48868000000002 360.80960000000005,184.66774 C 360.80960000000005,196.84681 350.97002000000003,206.68639000000002 338.79096000000004,206.68639000000002 L 331.6349,206.68639000000002 C 322.07055,271.15973 271.08362,322.07785 206.67909000000003,331.6422 L 206.67909000000003,338.79826 C 206.67909000000003,350.97732 196.83951000000002,360.81690000000003 184.66044000000002,360.81690000000003 C 172.48138000000003,360.81690000000003 162.64180000000002,350.97732 162.64180000000002,338.79826 L 162.64180000000002,331.6422 C 98.168455,322.07785 47.250339,271.15973 37.68599,206.68639 L 30.529930999999998,206.68639 C 18.350868,206.68639 8.511286599999998,196.84680999999998 8.511286599999998,184.66773999999998 C 8.511286599999998,172.48868 18.350868,162.64909999999998 30.529930999999998,162.64909999999998 L 37.68599,162.64909999999998 C 47.250339,98.175761 98.168455,47.257643 162.6418,37.693294 L 162.6418,30.537234 C 162.6418,18.358172000000003 172.48138,8.518589500000001 184.66044,8.518589500000001 L 184.66044,8.5185895 M 82.411363,206.68639 C 91.012396,246.80160999999998 122.59539,278.31579 162.6418,286.91682 L 162.6418,272.74231999999995 C 162.6418,260.56325999999996 172.48138,250.72367999999994 184.66044,250.72367999999994 C 196.83951,250.72367999999994 206.67909,260.56325999999996 206.67909,272.74231999999995 L 206.67909,286.91682 C 246.79431,278.31579 278.30849,246.73279999999997 286.90953,206.68638999999996 L 272.73502,206.68638999999996 C 260.55596,206.68638999999996 250.71638000000002,196.84680999999995 250.71638000000002,184.66773999999995 C 250.71638000000002,172.48867999999996 260.55596,162.64909999999995 272.73502,162.64909999999995 L 286.90953,162.64909999999995 C 278.30849,122.53388 246.79431,91.019701 206.67909,82.418665 L 206.67909,96.593171 C 206.67909,108.77223 196.83951,118.61180999999999 184.66044,118.61180999999999 C 172.48138,118.61180999999999 162.6418,108.77223 162.6418,96.59317099999998 L 162.6418,82.418665 C 122.52658,91.019701 91.012396,122.53388 82.411363,162.6491 L 96.585865,162.6491 C 108.76492999999999,162.6491 118.60451,172.48868000000002 118.60451,184.66774 C 118.60451,196.84681 108.76493,206.68639000000002 96.58586500000001,206.68639000000002 L 82.411363,206.68639 M 184.66044,162.6491 A 22.018645000000003,22.018645000000003 0.0 1,1 184.66044,206.68639000000002 A 22.018645,22.018645 0.0 1,1 184.66044,162.64910000000003 L 184.66044,162.6491 ", + ], + iconName: "olympus-states-miss-on-purpose" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesNoTask: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 9.4628581,2.8509123 C 9.7333376,2.8509123 9.9828659,2.9924623 10.12001,3.2246022 L 14.234371,10.169968 C 14.373420999999999,10.403996000000001 14.373420999999999,10.692757 14.238370999999999,10.926785 C 14.103133,11.160814 13.849791999999999,11.306136 13.577407,11.306136 L 5.3487067,11.306136 C 5.076321,11.306136 4.8229846,11.160814 4.6877426,10.926785 C 4.5525007,10.692757 4.554407,10.402108 4.6917626,10.169968 L 8.8061218,3.2246022 C 8.9432655,2.9924623 9.1927939,2.8509123 9.4632778,2.8509123 L 9.4628581,2.8509123 M 9.4628581,5.2666912 C 9.2095172,5.2666912 9.0057079,5.4686345 9.0057079,5.7196495 L 9.0057079,7.8334533 C 9.0057079,8.084468300000001 9.2095172,8.2864115 9.4628581,8.2864115 C 9.7161946,8.2864115 9.9200084,8.0844683 9.9200084,7.8334532999999995 L 9.9200084,5.7196495 C 9.9200084,5.4686345 9.7161946,5.2666912 9.4628581,5.2666912 M 10.072393,9.4943031 A 0.60953517,0.60394517 0.0 1,0 8.853323,9.4943031 A 0.60953517,0.60394517 0.0 1,0 10.072393,9.4943031 M 9.4628581,2.8509123 C 9.7333376,2.8509123 9.9828659,2.9924623 10.12001,3.2246022 L 14.234371,10.169968 C 14.373420999999999,10.403996000000001 14.373420999999999,10.692757 14.238370999999999,10.926785 C 14.103133,11.160814 13.849791999999999,11.306136 13.577407,11.306136 L 5.3487067,11.306136 C 5.076321,11.306136 4.8229846,11.160814 4.6877426,10.926785 C 4.5525007,10.692757 4.554407,10.402108 4.6917626,10.169968 L 8.8061218,3.2246022 C 8.9432655,2.9924623 9.1927939,2.8509123 9.4632778,2.8509123 L 9.4628581,2.8509123 M 9.4628581,5.2666912 C 9.2095172,5.2666912 9.0057079,5.4686345 9.0057079,5.7196495 L 9.0057079,7.8334533 C 9.0057079,8.084468300000001 9.2095172,8.2864115 9.4628581,8.2864115 C 9.7161946,8.2864115 9.9200084,8.0844683 9.9200084,7.8334532999999995 L 9.9200084,5.7196495 C 9.9200084,5.4686345 9.7161946,5.2666912 9.4628581,5.2666912 M 10.072393,9.4943031 A 0.60953517,0.60394517 0.0 1,0 8.853323,9.4943031 A 0.60953517,0.60394517 0.0 1,0 10.072393,9.4943031 M 8.487753671999998,4.7092009 L 10.484853328,4.7092009 A 0.021248572,0.021248572 0.0 0,1 10.506101899999999,4.730449472 L 10.506101899999999,10.413812928 A 0.021248572,0.021248572 0.0 0,1 10.484853328,10.4350615 L 8.487753671999998,10.4350615 A 0.021248572,0.021248572 0.0 0,1 8.4665051,10.413812928 L 8.4665051,4.730449472 A 0.021248572,0.021248572 0.0 0,1 8.487753671999998,4.7092009 ", + ], + iconName: "olympus-states-no-task" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesOff: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 3.0879876,3.12136 L 6.7329176,3.12136 L 3.0577919,6.6693495 L 6.6950996,6.6693495 M 3.0879876,3.12136 L 6.7329176,3.12136 L 3.0577919,6.6693495 L 6.6950996,6.6693495 M 7.8695831,5.8697467 L 11.514514,5.8697467 L 7.8393874,9.4177362 L 11.476696,9.4177362 M 7.8695831,5.8697467 L 11.514514,5.8697467 L 7.8393874,9.4177362 L 11.476696,9.4177362 M 12.62373,8.6286342 L 16.26866,8.6286342 L 12.593534,12.176623000000001 L 16.230842,12.176623000000001 M 12.62373,8.6286342 L 16.26866,8.6286342 L 12.593534,12.176623000000001 L 16.230842,12.176623000000001 ", + ], + iconName: "olympus-states-off" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesRefuel: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 14.109032,5.6203217 L 14.096876,4.2589893 M 11.2162,7.8446415 C 11.827492000000001,8.0753115 12.595582,8.0259853 12.784163000000001,9.0114979 L 12.796323000000001,9.9231048 L 13.744394000000002,11.029187 C 14.30075,11.035787000000001 14.984886000000001,11.291491 14.923404000000001,10.093271 L 15.032793,5.7783334 C 15.029293,5.1839171 14.968765,4.6085103 14.485828,4.173906 L 13.075877,2.7761093 M 5.5156203,2.6788713 L 5.5156203,12.159579 L 4.54324,12.183889 L 11.665925999999999,12.196049 L 10.596307,12.159589 L 10.596307,2.6302523 L 5.5156203,2.6788713 M 11.606497,11.523453 L 4.6132695,11.523453 C 4.4209559,11.523453 4.2636088,11.680801 4.2636088,11.873115 L 4.2636088,12.572437 C 4.2636088,12.764751 4.4209559,12.922099000000001 4.6132695,12.922099000000001 L 11.606497000000001,12.922099000000001 C 11.798811,12.922099000000001 11.956158,12.764751 11.956158,12.572437 L 11.956158,11.873115 C 11.956158,11.680801 11.798811,11.523453 11.606497000000001,11.523453 L 11.606497,11.523453 M 15.04192,4.0778511 L 13.27176,2.3076902 C 13.136266,2.1721969000000003 12.913356,2.1721969000000003 12.777863,2.3076902 L 12.530915,2.5546387 C 12.395421,2.690133 12.395421,2.9130414 12.530915,3.0485357 L 13.354804,3.8724249 L 13.354804,5.229548 C 13.354804,5.8436414 13.811549,6.3506501 14.403789,6.43588 L 14.403789,9.9499765 C 14.403789,10.238448 14.167767,10.474469 13.879297,10.474469 C 13.590826,10.474469 13.354804,10.238448 13.354804,9.949976499999998 L 13.354804,9.2506542 C 13.354804,8.1885576 12.493763,7.327516699999999 11.431666,7.327516699999999 L 11.256836,7.327516699999999 L 11.256836,3.1315803 C 11.256836,2.3601399 10.629631,1.7329348 9.8581906,1.7329348 L 6.3615766,1.7329348 C 5.5901361000000005,1.7329348 4.9629311000000005,2.3601399 4.9629311000000005,3.1315803 L 4.9629311000000005,10.82413 L 11.256836,10.82413 L 11.256836,8.3765006 L 11.431666,8.3765006 C 11.914636999999999,8.3765006 12.30582,8.7676845 12.30582,9.2506542 L 12.30582,9.8581908 C 12.30582,10.682080999999998 12.895874000000001,11.431667 13.715393,11.516896999999998 C 14.655108,11.610866999999999 15.452773,10.872208999999998 15.452773,9.949976499999998 L 15.452773,5.0678294 C 15.452773,4.696315 15.304167000000001,4.3400975 15.041920000000001,4.0778511 L 15.04192,4.0778511 M 9.8581906,5.9288713 L 6.3615766,5.9288713 L 6.3615766,3.1315803 L 9.8581906,3.1315803 L 9.8581906,5.9288713 M 6.3615766,3.1315804 L 9.8581906,3.1315804 L 9.8581906,5.9288712 L 6.3615766,5.9288712 L 6.3615766,3.1315804 ", + ], + iconName: "olympus-states-refuel" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesRtb: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 8.83594,4.99219 L 4.52344,8.55469 L 4.52344,12.375 C 4.52344,12.5859 4.6875,12.75 4.89844,12.75 L 7.52344,12.75 C 7.71094,12.75 7.875,12.5859 7.875,12.375 L 7.875,10.125 C 7.875,9.9375 8.0625,9.75 8.25,9.75 L 9.75,9.75 C 9.96094,9.75 10.125,9.9375 10.125,10.125 L 10.125,12.375 C 10.125,12.5859 10.3125,12.75 10.5,12.75 L 13.1484,12.75 C 13.3359,12.75 13.5234,12.5859 13.5234,12.375 L 13.5234,8.53125 L 9.1875,4.99219 C 9.14062,4.94531 9.07031,4.92188 9.02344,4.92188 C 8.95312,4.92188 8.88281,4.94531 8.83594,4.99219 M 15.6562,7.40625 L 13.7109,5.78906 L 13.7109,2.55469 C 13.7109,2.39062 13.5703,2.27344 13.4297,2.27344 L 12.1172,2.27344 C 11.9531,2.27344 11.8359,2.39062 11.8359,2.55469 L 11.8359,4.24219 L 9.72656,2.50781 C 9.53906,2.36719 9.28125,2.27344 9.02344,2.27344 C 8.74219,2.27344 8.48438,2.36719 8.29688,2.50781 L 2.36719,7.40625 C 2.29688,7.45312 2.25,7.54688 2.25,7.61719 C 2.25,7.6875 2.29688,7.75781 2.32031,7.80469 L 2.92969,8.53125 C 2.97656,8.60156 3.04688,8.625 3.14062,8.625 C 3.21094,8.625 3.28125,8.60156 3.32812,8.55469 L 8.83594,4.03125 C 8.88281,3.98438 8.95312,3.96094 9.02344,3.96094 C 9.07031,3.96094 9.14062,3.98438 9.1875,4.03125 L 14.6953,8.55469 C 14.7422,8.60156 14.8125,8.625 14.8828,8.625 C 14.9766,8.625 15.0469,8.60156 15.0938,8.53125 L 15.7031,7.80469 C 15.75,7.75781 15.7734,7.6875 15.7734,7.61719 C 15.7734,7.54688 15.7266,7.45312 15.6562,7.40625 M 13.5234,8.53125 L 13.5234,12.375 C 13.5234,12.5859 13.3359,12.75 13.1484,12.75 L 10.5,12.75 C 10.3125,12.75 10.125,12.5859 10.125,12.375 L 10.125,10.125 C 10.125,9.9375 9.96094,9.75 9.75,9.75 L 8.25,9.75 C 8.0625,9.75 7.875,9.9375 7.875,10.125 L 7.875,12.375 C 7.875,12.5859 7.71094,12.75 7.52344,12.75 L 4.89844,12.75 C 4.6875,12.75 4.52344,12.5859 4.52344,12.375 L 4.52344,8.55469 L 8.83594,4.99219 C 8.88281,4.94531 8.95312,4.92188 9.02344,4.92188 C 9.07031,4.92188 9.14062,4.94531 9.1875,4.99219 L 13.5234,8.53125 M 14.6953,8.55469 C 14.6964,8.55582 14.6976,8.55693 14.6987,8.55803 C 14.737,8.5945 14.7898,8.61608 14.8452,8.62275 C 14.8577,8.62425 14.8702,8.625 14.8828,8.625 C 14.9766,8.625 15.0469,8.60156 15.0938,8.53125 L 15.7031,7.80469 C 15.75,7.75781 15.7734,7.6875 15.7734,7.61719 C 15.7734,7.58321 15.7625,7.54375 15.7432,7.50676 C 15.7227,7.46721 15.6926,7.43047 15.6562,7.40625 L 13.7109,5.78906 L 13.7109,2.55469 C 13.7109,2.39062 13.5703,2.27344 13.4297,2.27344 L 12.1172,2.27344 C 11.9531,2.27344 11.8359,2.39062 11.8359,2.55469 L 11.8359,4.24219 L 9.72656,2.50781 C 9.68416,2.47601 9.63816,2.44661 9.58938,2.42014 C 9.42246,2.32958 9.22295,2.27344 9.02344,2.27344 C 8.74219,2.27344 8.48438,2.36719 8.29688,2.50781 L 2.36719,7.40625 C 2.34189,7.42312 2.31962,7.44605 2.30148,7.47178 C 2.29357,7.483 2.28645,7.49475 2.2802,7.50676 C 2.27782,7.51134 2.27556,7.51595 2.27344,7.52059 C 2.25841,7.55343 2.25,7.58741 2.25,7.61719 C 2.25,7.64997 2.26019,7.68274 2.27344,7.71315 C 2.28332,7.73582 2.29491,7.75718 2.30524,7.77623 C 2.31078,7.78642 2.31595,7.79596 2.32031,7.80469 L 2.92969,8.53125 C 2.93534,8.53973 2.94134,8.54753 2.94767,8.55469 C 2.99386,8.60688 3.05818,8.625 3.14062,8.625 C 3.15319,8.625 3.16576,8.62425 3.17819,8.62275 C 3.23202,8.61627 3.28333,8.59576 3.32129,8.56121 C 3.32362,8.55909 3.3259,8.55692 3.32812,8.55469 L 8.83594,4.03125 C 8.88281,3.98438 8.95312,3.96094 9.02344,3.96094 C 9.07031,3.96094 9.14062,3.98438 9.1875,4.03125 L 14.6953,8.55469 M 2.27344,10.7274 C 1.89755,10.5959 1.49315,10.355 1.16162,9.92451 L 0.426251,9.04772 L 0.32017,8.83555 C 0.319597,8.83449 0.319,8.83338 0.318378,8.83223 C 0.304066,8.80565 0.267288,8.73712 0.228043,8.65078 C 0.161627,8.50467 0.0,8.12434 0.0,7.61719 C 0.0,7.12558 0.148836,6.71911 0.301167,6.4362 C 0.439348,6.17958 0.654902,5.88605 0.975475,5.63749 L 6.90462,0.739506 L 6.94688,0.707813 C 7.52384,0.275088 8.25535,0.0234375 9.02344,0.0234375 C 9.62455,0.0234375 10.201,0.186404 10.691,0.458244 C 11.0961,0.183444 11.5866,0.0234375 12.1172,0.0234375 L 13.4297,0.0234375 C 14.6901,0.0234375 15.9609,1.02855 15.9609,2.55469 L 15.9609,4.73359 L 17.0522,5.64079 C 17.3704,5.88864 17.5847,6.18072 17.7223,6.4362 C 17.8746,6.71911 18.0234,7.12558 18.0234,7.61719 C 18.0234,8.10158 17.8785,8.74439 17.3959,9.28773 L 16.8618,9.92451 C 16.5372,10.3461 16.1426,10.5858 15.7734,10.719 L 15.7734,12.375 C 15.7734,13.9179 14.4874,15.0 13.1484,15.0 L 10.5,15.0 C 9.9703,15.0 9.44888,14.8306 9.01208,14.5304 C 8.60011,14.823 8.09287,15.0 7.52344,15.0 L 4.89844,15.0 C 3.44486,15.0 2.27344,13.8286 2.27344,12.375 L 2.27344,10.7274 ", + ], + iconName: "olympus-states-rtb" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesScenicAaa: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 90.329008,471.87874 L 294.83388,138.74536 M 37.215553,461.40058 L 33.602384,51.668198 M 61.785043,466.45901 L 134.77088,205.58883 M 97.776883,46.496287 C 95.08636299999999,44.674580000000006 91.499003,45.010895000000005 89.200851,47.281022 C 86.902692,49.551148 86.566377,53.166535 88.416116,55.829029 L 119.80552,101.5959 L 91.89137600000001,110.67642000000001 C 89.116769,111.57326 87.23900700000002,114.15167000000001 87.23900700000002,117.0664 C 87.23900700000002,119.98113000000001 89.11676900000002,122.55955 91.89137600000001,123.45639 L 120.78644000000001,132.81715 L 105.96055000000001,161.01156 C 104.58726000000001,163.61801 105.06371000000001,166.81299 107.16568000000001,168.88694 C 109.26765,170.96088 112.43461,171.46536 115.04106000000002,170.09207 L 143.23548000000002,155.26618000000002 L 152.59624000000002,184.16125000000002 C 153.49308000000002,186.93585000000002 156.07149,188.81361 158.98622000000003,188.81361 C 161.90096000000003,188.81361 164.47938000000002,186.93585000000002 165.37622000000002,184.16125000000002 L 174.73698000000002,155.26618000000002 L 202.93139000000002,170.09207 C 205.53784000000002,171.46536 208.73283000000004,170.98891 210.80678000000003,168.88694 C 212.88071000000002,166.78497000000002 213.38519000000002,163.61801 212.01190000000003,161.01156 L 197.18601000000004,132.81715 L 226.08108000000004,123.45639 C 228.85568000000004,122.55955 230.73344000000003,119.98113 230.73344000000003,117.0664 C 230.73344000000003,114.15167 228.85568000000004,111.57326 226.08108000000004,110.67642000000001 L 196.23311000000004,101.00735 L 203.43587000000005,81.276869 C 204.33271000000005,78.810558 203.71613000000005,76.063986 201.86640000000006,74.214252 C 200.01666000000006,72.36452 197.27009000000007,71.747942 194.80378000000005,72.644782 L 175.07329000000004,79.84753 L 165.37622000000005,49.97154200000001 C 164.47938000000005,47.19694200000001 161.90096000000005,45.31918300000001 158.98622000000006,45.31918300000001 C 156.07149000000007,45.31918300000001 153.49308000000005,47.19694200000001 152.59624000000005,49.97154200000001 L 143.54376000000005,77.885692 L 97.776883,46.496287 M 376.91839,231.41639 C 375.60600999999997,228.31918000000002 372.56129999999996,226.32437000000002 369.20162,226.32437000000002 C 365.84193999999997,226.32437000000002 362.79723,228.31918000000002 361.48485,231.41639 L 338.33455,285.43376 C 336.54972,289.63336 335.60481,294.09543 335.60481,298.6625 L 335.60481,339.08366 L 260.012,383.17946 L 260.012,373.3104 C 260.012,366.32857 254.39503,360.71160000000003 247.4132,360.71160000000003 C 240.43135999999998,360.71160000000003 234.81439,366.32857 234.81439,373.3104 L 234.81439,402.70761000000005 L 234.81439,419.50601000000006 L 234.81439,432.10481000000004 C 234.81439,439.08665 240.43136,444.70362000000006 247.41320000000002,444.70362000000006 C 254.39503000000002,444.70362000000006 260.012,439.0866500000001 260.012,432.10481000000004 L 260.012,427.90521000000007 L 335.60481,427.90521000000007 L 335.60481,445.07108000000005 L 304.89522999999997,472.00102000000004 C 303.05791,473.57587000000007 302.00800999999996,475.88565000000006 302.00800999999996,478.30042000000003 L 302.00800999999996,486.69962000000004 C 302.00800999999996,491.31918 305.7876499999999,495.09883 310.40720999999996,495.09883 L 360.80242,495.09883 L 360.80242,461.50202 C 360.80242,456.88246000000004 364.58205999999996,453.10282 369.20162,453.10282 C 373.82117999999997,453.10282 377.60082,456.88246 377.60082,461.50202 L 377.60082,495.09883 L 427.99603,495.09883 C 432.61559,495.09883 436.39523,491.31918 436.39523,486.69962000000004 L 436.39523,478.30042000000003 C 436.39523,475.88565000000006 435.34533000000005,473.57587 433.50801,472.00102000000004 L 402.79843,445.07108000000005 L 402.79843,427.90521000000007 L 478.39124,427.90521000000007 L 478.39124,432.10481000000004 C 478.39124,439.08665 484.00820999999996,444.70362000000006 490.99003999999996,444.70362000000006 C 497.97187999999994,444.70362000000006 503.58885,439.0866500000001 503.58885,432.10481000000004 L 503.58885,419.50601000000006 L 503.58885,402.70761000000005 L 503.58885,373.3104000000001 C 503.58885,366.32857000000007 497.97188,360.7116000000001 490.99003999999996,360.7116000000001 C 484.00820999999996,360.7116000000001 478.39124,366.32857000000007 478.39124,373.3104000000001 L 478.39124,383.17946000000006 L 402.79843,339.08366000000007 L 402.79843,298.6625 C 402.79843,294.09543 401.85352,289.63336000000004 400.06869,285.43376 L 376.91839,231.41639 M 90.329008,471.87874 L 294.83388,138.74536 M 37.215553,461.40058 L 33.602384,51.668198 M 61.785043,466.45901 L 134.77088,205.58883 M 97.776883,46.496287 C 95.08636299999999,44.674580000000006 91.499003,45.010895000000005 89.200851,47.281022 C 86.902692,49.551148 86.566377,53.166535 88.416116,55.829029 L 119.80552,101.5959 L 91.89137600000001,110.67642000000001 C 89.116769,111.57326 87.23900700000002,114.15167000000001 87.23900700000002,117.0664 C 87.23900700000002,119.98113000000001 89.11676900000002,122.55955 91.89137600000001,123.45639 L 120.78644000000001,132.81715 L 105.96055000000001,161.01156 C 104.58726000000001,163.61801 105.06371000000001,166.81299 107.16568000000001,168.88694 C 109.26765,170.96088 112.43461,171.46536 115.04106000000002,170.09207 L 143.23548000000002,155.26618000000002 L 152.59624000000002,184.16125000000002 C 153.49308000000002,186.93585000000002 156.07149,188.81361 158.98622000000003,188.81361 C 161.90096000000003,188.81361 164.47938000000002,186.93585000000002 165.37622000000002,184.16125000000002 L 174.73698000000002,155.26618000000002 L 202.93139000000002,170.09207 C 205.53784000000002,171.46536 208.73283000000004,170.98891 210.80678000000003,168.88694 C 212.88071000000002,166.78497000000002 213.38519000000002,163.61801 212.01190000000003,161.01156 L 197.18601000000004,132.81715 L 226.08108000000004,123.45639 C 228.85568000000004,122.55955 230.73344000000003,119.98113 230.73344000000003,117.0664 C 230.73344000000003,114.15167 228.85568000000004,111.57326 226.08108000000004,110.67642000000001 L 196.23311000000004,101.00735 L 203.43587000000005,81.276869 C 204.33271000000005,78.810558 203.71613000000005,76.063986 201.86640000000006,74.214252 C 200.01666000000006,72.36452 197.27009000000007,71.747942 194.80378000000005,72.644782 L 175.07329000000004,79.84753 L 165.37622000000005,49.97154200000001 C 164.47938000000005,47.19694200000001 161.90096000000005,45.31918300000001 158.98622000000006,45.31918300000001 C 156.07149000000007,45.31918300000001 153.49308000000005,47.19694200000001 152.59624000000005,49.97154200000001 L 143.54376000000005,77.885692 L 97.776883,46.496287 ", + ], + iconName: "olympus-states-scenic-aaa" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesSimulateFireFight: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 16.282245,9.6013771 C 16.282245,9.775419000000001 16.139848,9.917817000000001 15.965807,9.917817000000001 L 13.665682,9.917817000000001 C 13.556909000000001,10.107681000000001 13.351219,10.234258 13.117845,10.234258 L 10.956163,10.234258 L 11.060984,10.550697000000001 L 12.168524,10.550697000000001 C 12.342566999999999,10.550697000000001 12.484964999999999,10.693095000000001 12.484964999999999,10.867138 L 12.484964999999999,11.183577000000001 C 12.484964999999999,11.35762 12.342566999999999,11.500019000000002 12.168524,11.500019000000002 L 10.497325,11.500019000000002 C 10.36086,11.500019000000002 10.240218,11.412999000000001 10.196707,11.284443000000001 L 9.8486235,10.234258 L 9.3205639,10.234258 L 9.3205639,11.183577 C 9.3205639,11.357619999999999 9.1781659,11.500019 9.004124,11.500019 L 8.6876841,11.500019 C 8.5136417,11.500019 8.3712437,11.35762 8.3712437,11.183577 L 8.3712437,10.313367 L 6.5497356,10.76825 C 6.349983,10.817694 6.1561633,10.667385 6.1561633,10.461699 L 6.1561633,9.2849368 C 6.1561633,9.1108948 6.2985614000000005,8.9684968 6.4726032,8.9684968 L 8.3712437,8.9684968 L 8.3712437,8.6520569 C 8.3712437,8.3019949 8.6540619,8.0191767 9.004124000000001,8.0191767 L 11.852085,8.0191767 C 12.202146,8.0191767 12.484965,8.301994899999999 12.484965,8.6520569 L 13.117845,8.6520569 C 13.351219,8.6520569 13.556905,8.7786327 13.665682,8.9684968 L 15.649366,8.9684968 C 15.649366,8.794455000000001 15.791764,8.6520569 15.965807,8.6520569 C 16.139848,8.6520569 16.282245,8.794455 16.282245,8.9684968 L 16.282245,9.2849368 L 16.282245,9.6013771 M 7.2231639,6.192428 C 7.725512500000001,6.192428 8.2080836,6.332848299999999 8.6234112,6.586000299999999 L 8.6234112,12.521231 L 4.8261305,12.521231 L 4.8261305,9.0740104 L 3.7660562,10.865854 C 3.5445481,11.241626 3.0580216,11.366224 2.6822489,11.144715 C 2.3064765,10.923208 2.181878,10.436681 2.4033861,10.060908 L 3.9104319,7.5135653 C 4.394981,6.6947765 5.2750798,6.192428 6.2263778,6.192428 L 7.2231639,6.192428 M 5.1425706,3.9773475 C 5.1422011,1.8673785999999999 8.3066017,1.8673785999999999 8.3069711,3.9773475 C 8.3073408,6.0873165 5.142940100000001,6.0873165 5.1425706,3.9773475 M 16.290263,9.5997326 C 16.290263,9.7737746 16.147866999999998,9.9161726 15.973825,9.9161726 L 13.673701,9.9161726 C 13.564926999999999,10.106036999999999 13.359238,10.232612999999999 13.125862999999999,10.232612999999999 L 10.964182,10.232612999999999 L 11.069002999999999,10.549052 L 12.176542999999999,10.549052 C 12.350584999999999,10.549052 12.492982999999999,10.691450999999999 12.492982999999999,10.865495 L 12.492982999999999,11.181934 C 12.492982999999999,11.355977 12.350584999999999,11.498376 12.176542999999999,11.498376 L 10.505344999999998,11.498376 C 10.368878999999998,11.498376 10.248236999999998,11.411356 10.204726999999998,11.2828 L 9.8566424,10.232613 L 9.3285828,10.232613 L 9.3285828,11.181934 C 9.3285828,11.355977 9.1861847,11.498376 9.0121428,11.498376 L 8.6957029,11.498376 C 8.5216606,11.498376 8.379262500000001,11.355977000000001 8.379262500000001,11.181934 L 8.379262500000001,10.311723 L 6.5577545000000015,10.766606000000001 C 6.3580019,10.816049 6.1641822,10.66574 6.1641822,10.460054 L 6.1641822,9.2832924 C 6.1641822,9.1092504 6.3065802,8.9668524 6.480622,8.9668524 L 8.3792625,8.9668524 L 8.3792625,8.6504125 C 8.3792625,8.3003505 8.662080699999999,8.0175323 9.0121428,8.0175323 L 11.860102999999999,8.0175323 C 12.210164999999998,8.0175323 12.492982999999999,8.300350499999999 12.492982999999999,8.6504125 L 13.125862999999999,8.6504125 C 13.359238,8.6504125 13.564924,8.7769882 13.673701,8.9668524 L 15.657385,8.9668524 C 15.657385,8.7928105 15.799783,8.6504125 15.973825,8.6504125 C 16.147866999999998,8.6504125 16.290263,8.7928105 16.290263,8.9668524 L 16.290263,9.2832924 L 16.290263,9.5997326 ", + ], + iconName: "olympus-states-simulate-fire-fight" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olStatesTanker: IconDefinition = { + icon: [ + 19.0, + 15.0, + [], + "", + "M 16.324548,12.175881 L 15.276455,8.4858326 M 13.139727,6.4687226 L 4.9398446,2.7015716 M 16.324547,12.175881 L 15.276454,8.4858326 M 13.139727,6.4687226 L 4.9398446,2.7015716 M 3.1921806,7.8893766 L 1.8457446,11.305481 C 0.7759842399999999,14.347074000000001 5.7429156,14.389045 4.5455056,11.305481 L 3.1921806,7.8893766 M 3.2037126,10.332473 L 2.6437166,11.753263 C 2.1987935999999997,13.018291000000001 4.2645886,13.035747 3.7665736,11.753263 L 3.2037126,10.332473 M 6.858944900000001,12.305709 A 2.7614126,2.7614126 0.0 1,0 12.3817701,12.305709 A 2.7614126,2.7614126 0.0 1,0 6.858944900000001,12.305709 M 6.858944900000001,12.305709 A 2.7614126,2.7614126 0.0 1,0 12.3817701,12.305709 A 2.7614126,2.7614126 0.0 1,0 6.858944900000001,12.305709 ", + ], + iconName: "olympus-states-tanker" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsAircraft: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 40.4002,7.2002 L 9.6002,7.2002 C 8.27471,7.2002 7.2002,8.27472 7.2002,9.6002 L 7.2002,40.4002 C 7.2002,41.7257 8.27472,42.8002 9.6002,42.8002 L 40.4002,42.8002 C 41.7257,42.8002 42.8002,41.7257 42.8002,40.4002 L 42.8002,9.6002 C 42.8002,8.27471 41.7257,7.2002 40.4002,7.2002 M 11.0002,11.0002 L 11.0002,39.0002 L 39.0002,39.0002 L 39.0002,11.0002 L 11.0002,11.0002 M 9.6002,8.2002 C 8.827,8.2002 8.2002,8.827 8.2002,9.6002 L 8.2002,40.4002 C 8.2002,41.1734 8.827,41.8002 9.6002,41.8002 L 40.4002,41.8002 C 41.1734,41.8002 41.8002,41.1734 41.8002,40.4002 L 41.8002,9.6002 C 41.8002,8.827 41.1734,8.2002 40.4002,8.2002 L 9.6002,8.2002 ", + ], + iconName: "olympus-units-aircraft" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsBomb: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 22.86,33.5 C 19.8652,26.0 20.293,15.0 24.9991,12.0 C 29.7052,15.5 29.7052,27.0 27.1382,33.5 C 27.1382,33.5 28.7905,34.0138 29.2774,35.0 C 29.7783,36.0148 29.2774,38.0 29.2774,38.0 L 20.721,38.0 C 20.721,38.0 20.2237,36.0172 20.721,35.0 C 21.2771,33.8627 22.86,33.5 22.86,33.5 ", + ], + iconName: "olympus-units-bomb" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsDeath: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 20.7546,32.9417 L 10.7926,21.4726 C 10.766,21.4422 10.7451,21.4146 10.7294,21.3927 C 10.6864,21.3359 10.6551,21.2862 10.6496,21.2774 C 10.6494,21.277 10.6492,21.2767 10.649,21.2765 C 10.6489,21.2763 10.6488,21.2762 10.6488,21.2761 L 10.6357,21.2566 C 10.6236,21.2383 10.5957,21.1955 10.567,21.1402 L 20.7546,32.9417 L 20.5986,33.0198 L 20.5985,33.0199 C 19.7404,33.4496 19.3015,34.5403 19.9212,35.4506 L 19.9212,35.4507 C 20.2929,35.9965 20.9084,36.241 21.4658,36.241 C 21.5582,36.241 21.6516,36.2344 21.7451,36.221 L 21.7451,36.7369 L 21.7451,39.6546 C 21.7451,40.7392 22.7148,41.3666 23.5755,41.3666 C 24.0881,41.3666 24.6393,41.1441 25.0014,40.7351 C 25.3635,41.1441 25.9147,41.3666 26.4272,41.3666 C 27.288,41.3666 28.2577,40.7392 28.2577,39.6546 L 28.2577,36.737 L 28.2577,36.2389 C 28.2891,36.2404 28.3205,36.2412 28.3517,36.2412 C 28.9092,36.2412 29.5249,35.9965 29.8964,35.4507 C 30.5166,34.5399 30.0765,33.4495 29.2191,33.0201 L 29.2189,33.02 L 29.1921,33.0066 L 39.2121,21.4705 L 39.2121,21.4705 C 39.5428,21.0898 39.6715,20.6073 39.5996,20.1442 C 39.4332,13.5757 32.7259,8.63379 24.9939,8.63379 C 17.168,8.63379 10.3813,13.6997 10.3813,20.3893 C 10.3813,20.4323 10.3841,20.4691 10.387,20.4971 C 10.3925,20.5678 10.4021,20.6255 10.4041,20.6369 L 10.4074,20.6602 C 10.4109,20.684 10.4188,20.7356 10.4349,20.7975 L 10.4353,20.7989 C 10.4513,20.8602 10.4694,20.9092 10.4793,20.9352 C 10.4841,20.9478 10.4886,20.9591 10.4908,20.9645 L 10.4911,20.9652 L 10.4931,20.9703 C 10.4938,20.9721 10.4937,20.9718 10.4935,20.9713 L 10.4937,20.9719 C 10.4937,20.9719 10.4941,20.9729 10.4965,20.9793 L 10.4966,20.9796 C 10.4987,20.9853 10.5031,20.9972 10.5083,21.0105 C 10.5189,21.0373 10.538,21.0843 10.5663,21.1389 L 20.7546,32.9417 M 33.9441,22.1013 L 30.4581,26.1148 L 31.622,22.1013 L 33.9441,22.1013 M 23.8679,27.9387 L 22.1749,22.1013 L 27.8282,22.1013 L 26.1353,27.9387 C 25.7808,27.8045 25.3961,27.7329 25.0016,27.7329 C 24.607,27.7329 24.2223,27.8045 23.8679,27.9387 M 19.545,26.115 L 16.0587,22.1013 L 18.381,22.1013 L 19.545,26.115 M 10.6466,21.2727 L 10.6485,21.2756 L 10.6466,21.2727 L 10.6466,21.2727 ", + ], + iconName: "olympus-units-death" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitAaa: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 45.773,41.342 L 25.948000000000004,7.638999999999996 C 25.522700000000004,6.915969999999996 24.477100000000004,6.915949999999996 24.051800000000004,7.638999999999996 L 4.226800000000004,41.342 C 3.795450000000004,42.0753 4.324180000000005,42.9997 5.174930000000004,42.9997 L 44.82493,42.9997 C 45.675630000000005,42.9997 46.20433,42.0753 45.77303,41.342 L 45.773,41.342 M 6.74842,41.0 L 25.0,9.97231 L 43.2516,41.0 L 6.74842,41.0 ", + ], + iconName: "olympus-units-groundunit-aaa" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitApc: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 31.832,25.029 L 18.93,25.029 C 17.98118,25.029 17.2093,25.8009 17.2093,26.7497 C 17.2093,26.7759 17.210079999999998,26.8019 17.211299999999998,26.8279 C 17.211669999999998,26.836199999999998 17.212149999999998,26.8444 17.2126,26.8527 C 17.2137,26.871 17.2151,26.8892 17.2168,26.9074 C 17.217579999999998,26.9162 17.2183,26.924899999999997 17.2192,26.9336 C 17.221700000000002,26.956799999999998 17.224600000000002,26.979999999999997 17.2281,27.003 C 17.2298,27.0146 17.2319,27.0261 17.233900000000002,27.0377 C 17.2361,27.0502 17.238200000000003,27.0627 17.2406,27.075100000000003 C 17.2432,27.088600000000003 17.2459,27.102000000000004 17.2488,27.1154 C 17.250899999999998,27.1251 17.2532,27.134700000000002 17.255499999999998,27.1444 C 17.262299999999996,27.1733 17.269779999999997,27.201800000000002 17.278019999999998,27.2301 C 17.27942,27.235 17.28072,27.2399 17.28222,27.2448 C 17.28682,27.2602 17.291819999999998,27.2753 17.29676,27.2904 C 17.29926,27.297900000000002 17.301759999999998,27.305400000000002 17.30436,27.312900000000003 C 17.309559999999998,27.327700000000004 17.31479,27.3426 17.320349999999998,27.357300000000002 C 17.32275,27.3638 17.325449999999996,27.3701 17.327949999999998,27.376500000000004 C 17.337749999999996,27.401600000000002 17.34818,27.426400000000005 17.359129999999997,27.450900000000004 C 17.363429999999997,27.460600000000003 17.367729999999998,27.470300000000005 17.372299999999996,27.480000000000004 C 17.377699999999997,27.491300000000003 17.383169999999996,27.502600000000005 17.388779999999997,27.513900000000003 C 17.394779999999997,27.526100000000003 17.401059999999998,27.538100000000004 17.40741,27.550200000000004 C 17.41211,27.559100000000004 17.416809999999998,27.568100000000005 17.42158,27.576900000000006 C 17.43309,27.597900000000006 17.445,27.618600000000004 17.457349999999998,27.639100000000006 C 17.459249999999997,27.642200000000006 17.46125,27.645200000000006 17.46315,27.648300000000006 C 17.47514,27.667800000000007 17.487499999999997,27.687000000000005 17.50023,27.706100000000006 C 17.50253,27.709400000000006 17.50473,27.712700000000005 17.506929999999997,27.716100000000008 C 17.674069999999997,27.962100000000007 17.904779999999995,28.16540000000001 18.182249999999996,28.29940000000001 C 18.185549999999996,28.30100000000001 18.189049999999995,28.30250000000001 18.192379999999996,28.30410000000001 C 18.205589999999997,28.31030000000001 18.218769999999996,28.316700000000008 18.232199999999995,28.322700000000008 L 18.243439999999996,28.32720000000001 C 18.275019999999998,28.341000000000008 18.306899999999995,28.35420000000001 18.339449999999996,28.36610000000001 L 20.958449999999996,29.42690000000001 C 20.962449999999997,29.42870000000001 20.966649999999994,29.43010000000001 20.970649999999996,29.43190000000001 C 20.987749999999995,29.43920000000001 21.005249999999997,29.44590000000001 21.022449999999996,29.45280000000001 C 21.040449999999996,29.45990000000001 21.058249999999994,29.467400000000012 21.076349999999994,29.47410000000001 C 21.094249999999995,29.48070000000001 21.112449999999995,29.48670000000001 21.130649999999996,29.49290000000001 C 21.148849999999996,29.49910000000001 21.166949999999996,29.505700000000008 21.185349999999996,29.51150000000001 C 21.200949999999995,29.516400000000008 21.216949999999997,29.52060000000001 21.232649999999996,29.52510000000001 C 21.253949999999996,29.53130000000001 21.275149999999996,29.537800000000008 21.296549999999996,29.54340000000001 C 21.306849999999997,29.54600000000001 21.317449999999997,29.54820000000001 21.327849999999998,29.55070000000001 C 21.35485,29.55730000000001 21.381849999999996,29.56390000000001 21.409149999999997,29.56950000000001 C 21.41005,29.569700000000008 21.410949999999996,29.569800000000008 21.411749999999998,29.569900000000008 C 21.55595,29.599400000000006 21.703149999999997,29.614500000000007 21.852449999999997,29.615700000000007 C 21.858649999999997,29.615700000000007 21.864749999999997,29.616100000000007 21.870849999999997,29.616100000000007 L 28.893549999999998,29.616100000000007 C 29.221349999999997,29.616100000000007 29.532949999999996,29.546600000000005 29.81525,29.422100000000007 L 32.44975,28.355300000000007 C 32.47055,28.347300000000008 32.491350000000004,28.339100000000006 32.51175,28.33020000000001 L 32.51325,28.32960000000001 L 32.52965,28.322700000000008 C 32.543049999999994,28.316700000000008 32.55625,28.31030000000001 32.569449999999996,28.30410000000001 C 32.572849999999995,28.30250000000001 32.576249999999995,28.30090000000001 32.579649999999994,28.29940000000001 C 32.857049999999994,28.16540000000001 33.087849999999996,27.96210000000001 33.254949999999994,27.716100000000008 C 33.257149999999996,27.71280000000001 33.259449999999994,27.70940000000001 33.261649999999996,27.706100000000006 C 33.27435,27.687000000000005 33.28675,27.667800000000007 33.29875,27.648300000000006 C 33.30065,27.645200000000006 33.30265,27.642100000000006 33.304449999999996,27.639100000000006 C 33.316849999999995,27.618600000000008 33.32874999999999,27.597800000000007 33.340349999999994,27.576900000000006 C 33.34515,27.568000000000005 33.349849999999996,27.559100000000004 33.35444999999999,27.550200000000004 C 33.36084999999999,27.538100000000004 33.36704999999999,27.526100000000003 33.373149999999995,27.513900000000003 C 33.37875,27.502600000000005 33.384249999999994,27.491400000000002 33.38954999999999,27.480000000000004 C 33.39404999999999,27.470300000000005 33.39844999999999,27.460600000000003 33.40274999999999,27.450900000000004 C 33.41374999999999,27.426400000000005 33.42414999999999,27.401600000000006 33.43394999999999,27.376500000000004 C 33.43644999999999,27.370100000000004 33.43914999999999,27.363700000000005 33.441549999999985,27.357300000000002 C 33.447149999999986,27.3426 33.45234999999999,27.327700000000004 33.45754999999998,27.312800000000003 C 33.460149999999985,27.305400000000002 33.46264999999998,27.297900000000002 33.46514999999998,27.2904 C 33.47014999999998,27.2752 33.47514999999998,27.2601 33.47964999999998,27.2448 C 33.48114999999998,27.239900000000002 33.48244999999998,27.234900000000003 33.483849999999975,27.23 C 33.49204999999998,27.201800000000002 33.499649999999974,27.1732 33.50644999999997,27.1444 C 33.50874999999997,27.134700000000002 33.51094999999997,27.1251 33.513149999999975,27.1153 C 33.51604999999997,27.102 33.518749999999976,27.0886 33.52134999999998,27.075100000000003 C 33.52374999999998,27.062600000000003 33.52584999999998,27.050100000000004 33.52804999999998,27.0376 C 33.53004999999998,27.0261 33.53204999999998,27.0146 33.53384999999998,27.003 C 33.53724999999998,26.9799 33.54014999999998,26.9568 33.54274999999998,26.9335 C 33.54364999999998,26.924799999999998 33.54424999999998,26.9161 33.54514999999998,26.9074 C 33.54684999999998,26.8892 33.54814999999998,26.871 33.54924999999998,26.8526 C 33.54974999999998,26.8444 33.55024999999998,26.836199999999998 33.550649999999976,26.8279 C 33.55174999999998,26.8019 33.55264999999998,26.7758 33.55264999999998,26.7497 C 33.55294999999998,25.800900000000002 32.78104999999998,25.029 31.832249999999977,25.029 L 31.832,25.029 M 18.93,27.3947 C 18.84717,27.3947 18.768159999999998,27.3785 18.69535,27.3499 L 18.671190000000003,27.340100000000003 C 18.656240000000004,27.333500000000004 18.641510000000004,27.326500000000003 18.62722,27.318800000000003 C 18.62552,27.318 18.623720000000002,27.317200000000003 18.622020000000003,27.316200000000002 C 18.605210000000003,27.307000000000002 18.588880000000003,27.297 18.573000000000004,27.2864 C 18.569800000000004,27.284200000000002 18.566600000000005,27.282 18.563500000000005,27.279700000000002 C 18.550580000000004,27.2707 18.538000000000004,27.261400000000002 18.525830000000006,27.251500000000004 C 18.522630000000007,27.249000000000002 18.519430000000007,27.246400000000005 18.516330000000007,27.243800000000004 C 18.487270000000006,27.219500000000004 18.460440000000006,27.192600000000002 18.436090000000007,27.163500000000003 C 18.433090000000007,27.159900000000004 18.430190000000007,27.156200000000002 18.427190000000007,27.152500000000003 C 18.418290000000006,27.141500000000004 18.409860000000005,27.130100000000002 18.401690000000006,27.118500000000004 C 18.398490000000006,27.114000000000004 18.395290000000006,27.109400000000004 18.392190000000006,27.104800000000004 C 18.38229000000001,27.089900000000004 18.372900000000005,27.074700000000004 18.364290000000008,27.058900000000005 C 18.36209000000001,27.055000000000003 18.360290000000006,27.050800000000006 18.358190000000008,27.046800000000005 C 18.35179000000001,27.034600000000005 18.345790000000008,27.022200000000005 18.340260000000008,27.009600000000006 C 18.337260000000008,27.002800000000008 18.334460000000007,26.996000000000006 18.331660000000007,26.989100000000008 C 18.327260000000006,26.97790000000001 18.323060000000005,26.966600000000007 18.319190000000006,26.95510000000001 C 18.317090000000007,26.94880000000001 18.314790000000006,26.94260000000001 18.312790000000007,26.93610000000001 C 18.307690000000008,26.91920000000001 18.303290000000008,26.90210000000001 18.299500000000005,26.88460000000001 C 18.298300000000005,26.87890000000001 18.297400000000007,26.873100000000008 18.296300000000006,26.86740000000001 C 18.293700000000005,26.85370000000001 18.291600000000006,26.83990000000001 18.290000000000006,26.82600000000001 C 18.289300000000008,26.82000000000001 18.288600000000006,26.81400000000001 18.288000000000007,26.80810000000001 C 18.286200000000008,26.78890000000001 18.285000000000007,26.76950000000001 18.285000000000007,26.74980000000001 C 18.285000000000007,26.394200000000012 18.574300000000008,26.10480000000001 18.92996000000001,26.10480000000001 C 19.28562000000001,26.10480000000001 19.574880000000007,26.394100000000012 19.574880000000007,26.74980000000001 C 19.574880000000007,27.10550000000001 19.285650000000008,27.39470000000001 18.930000000000007,27.39470000000001 L 18.93,27.3947 M 21.8711,28.540300000000002 C 21.850199999999997,28.540300000000002 21.8292,28.539800000000003 21.8085,28.538800000000002 C 21.747799999999998,28.535700000000002 21.688299999999998,28.528100000000002 21.6303,28.5164 C 21.6288,28.5161 21.6272,28.515800000000002 21.6257,28.5155 C 21.6101,28.5123 21.5947,28.508599999999998 21.579199999999997,28.5048 C 21.574799999999996,28.5037 21.570299999999996,28.5028 21.565899999999996,28.5016 C 21.552699999999994,28.4982 21.539599999999997,28.4943 21.526499999999995,28.4904 C 21.519899999999996,28.488500000000002 21.513299999999994,28.486700000000003 21.506699999999995,28.4846 C 21.495199999999993,28.481 21.483899999999995,28.477 21.472599999999996,28.473 C 21.464599999999997,28.4702 21.456499999999995,28.467599999999997 21.448499999999996,28.464599999999997 C 21.437899999999996,28.460599999999996 21.427399999999995,28.4563 21.416799999999995,28.452099999999998 C 21.408499999999997,28.4487 21.400199999999995,28.4454 21.391899999999996,28.441899999999997 C 20.957999999999995,28.255399999999998 20.653299999999994,27.823999999999998 20.653299999999994,27.322499999999998 C 20.653299999999994,26.650999999999996 21.199599999999993,26.104699999999998 21.871099999999995,26.104699999999998 C 22.542599999999997,26.104699999999998 23.088899999999995,26.650999999999996 23.088899999999995,27.322499999999998 C 23.088899999999995,27.994 22.542599999999997,28.5403 21.871099999999995,28.5403 L 21.8711,28.540300000000002 M 25.3825,28.540300000000002 C 24.711,28.540300000000002 24.1647,27.994000000000003 24.1647,27.3226 C 24.1647,26.6511 24.711,26.1048 25.3825,26.1048 C 26.054000000000002,26.1048 26.6002,26.6511 26.6002,27.3226 C 26.6002,27.994 26.054000000000002,28.540300000000002 25.3825,28.540300000000002 M 29.400100000000002,28.4297 L 29.393400000000003,28.4324 L 29.379300000000004,28.4384 C 29.225300000000004,28.5059 29.061500000000006,28.540100000000002 28.892600000000005,28.540300000000002 C 28.221700000000006,28.539700000000003 27.676100000000005,27.9937 27.676100000000005,27.3226 C 27.676100000000005,26.6511 28.222400000000004,26.1048 28.893900000000006,26.1048 C 29.565400000000007,26.1048 30.111600000000006,26.6511 30.111600000000006,27.3226 C 30.111600000000006,27.8134 29.819400000000005,28.2371 29.400100000000005,28.4297 L 29.400100000000002,28.4297 M 32.4743,26.808 C 32.4738,26.814 32.4731,26.8199 32.4724,26.8259 C 32.4707,26.8398 32.4686,26.8536 32.466,26.8673 C 32.4649,26.873 32.4641,26.8789 32.4628,26.8846 C 32.4591,26.901999999999997 32.4547,26.9191 32.449600000000004,26.936 C 32.4476,26.9425 32.4453,26.9487 32.443200000000004,26.9551 C 32.4393,26.966600000000003 32.4352,26.9779 32.4307,26.989 C 32.428000000000004,26.995900000000002 32.4251,27.0027 32.422200000000004,27.0095 C 32.4166,27.0221 32.410500000000006,27.034599999999998 32.4042,27.046699999999998 C 32.402100000000004,27.0507 32.4003,27.054799999999997 32.3981,27.058899999999998 C 32.3895,27.074599999999997 32.3801,27.089799999999997 32.3703,27.104699999999998 C 32.3672,27.109399999999997 32.3639,27.113899999999997 32.3607,27.118399999999998 C 32.3526,27.1301 32.3442,27.141399999999997 32.335300000000004,27.152399999999997 C 32.332300000000004,27.156099999999995 32.32940000000001,27.159799999999997 32.32640000000001,27.163499999999996 C 32.30200000000001,27.192499999999995 32.27510000000001,27.219299999999997 32.246100000000006,27.243699999999997 C 32.243,27.246399999999998 32.2398,27.248899999999995 32.2366,27.251399999999997 C 32.2244,27.261299999999995 32.211800000000004,27.270699999999998 32.199000000000005,27.279599999999995 C 32.195800000000006,27.281799999999993 32.192600000000006,27.284099999999995 32.189400000000006,27.286299999999994 C 32.173500000000004,27.296899999999994 32.1572,27.306899999999995 32.14040000000001,27.316099999999995 C 32.13870000000001,27.317099999999996 32.136900000000004,27.317899999999995 32.135200000000005,27.318799999999996 C 32.120900000000006,27.326399999999996 32.106100000000005,27.333399999999997 32.09120000000001,27.339999999999996 L 32.06700000000001,27.349799999999995 C 31.994200000000006,27.378399999999996 31.915200000000006,27.394699999999993 31.832400000000007,27.394699999999993 C 31.476800000000008,27.394699999999993 31.187500000000007,27.105299999999993 31.187500000000007,26.749699999999994 C 31.187500000000007,26.393999999999995 31.476800000000008,26.104699999999994 31.832400000000007,26.104699999999994 C 32.188,26.104699999999994 32.47740000000001,26.393999999999995 32.47740000000001,26.749699999999994 C 32.47730000000001,26.769399999999994 32.47600000000001,26.788799999999995 32.47430000000001,26.807999999999993 L 32.4743,26.808 M 31.832,22.877 L 31.5744,22.877 L 29.1167,20.529999999999998 L 27.720100000000002,20.529999999999998 C 25.369100000000003,20.540869999999998 23.1837,20.463759999999997 20.1629,20.529999999999998 L 18.4454,20.529999999999998 L 18.4454,22.907099999999996 C 17.4366,23.032799999999995 16.5205,23.548399999999997 15.880799999999999,24.365099999999995 L 16.72767,25.028499999999994 C 17.26316,24.344799999999992 18.06577,23.952699999999993 18.92967,23.952699999999993 L 31.831670000000003,23.952699999999993 C 32.69567,23.952699999999993 33.49817,24.344799999999992 34.03367,25.028499999999994 L 34.88057,24.365099999999995 C 34.13987,23.419399999999996 33.02857,22.876999999999995 31.83177,22.876999999999995 L 31.832,22.877 M 26.1,2.3724 L 55.9,2.3724 A 1.1,1.1 0.0 0,1 57.0,3.4724 L 57.0,33.2724 A 1.1,1.1 0.0 0,1 55.9,34.3724 L 26.1,34.3724 A 1.1,1.1 0.0 0,1 25.0,33.2724 L 25.0,3.4724 A 1.1,1.1 0.0 0,1 26.1,2.3724 M 25.0,5.2008 L 53.0,5.2008 L 53.0,33.2008 L 25.0,33.2008 L 25.0,5.2008 ", + ], + iconName: "olympus-units-groundunit-apc" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitArtillery: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 25.0,14.598 C 25.71918,14.598 26.3002,15.17904 26.3002,15.898200000000001 L 26.3002,16.32077 C 30.1074,16.88555 33.1142,19.89637 33.6789,23.699469999999998 L 34.10147,23.699469999999998 C 34.82065,23.699469999999998 35.401669999999996,24.28051 35.401669999999996,24.99967 C 35.401669999999996,25.718829999999997 34.820629999999994,26.29987 34.10147,26.29987 L 33.6789,26.29987 C 33.11412,30.10707 30.103299999999997,33.11387 26.300199999999997,33.67857 L 26.300199999999997,34.10114 C 26.300199999999997,34.82032 25.719159999999995,35.40134 24.999999999999996,35.40134 C 24.280839999999998,35.40134 23.699799999999996,34.820299999999996 23.699799999999996,34.10114 L 23.699799999999996,33.67857 C 19.892599999999995,33.11379 16.885799999999996,30.10707 16.321099999999994,26.29987 L 15.898529999999994,26.29987 C 15.179349999999994,26.29987 14.598329999999994,25.718829999999997 14.598329999999994,24.99967 C 14.598329999999994,24.28051 15.179369999999993,23.699469999999998 15.898529999999994,23.699469999999998 L 16.321099999999994,23.699469999999998 C 16.885879999999993,19.892269999999996 19.892599999999995,16.885469999999998 23.699799999999996,16.320769999999996 L 23.699799999999996,15.898199999999996 C 23.699799999999996,15.179019999999996 24.280839999999998,14.597999999999995 24.999999999999996,14.597999999999995 L 25.0,14.598 M 18.9621,26.3 C 19.47,28.6688 21.335,30.5298 23.6998,31.0377 L 23.6998,30.200680000000002 C 23.6998,29.4815 24.28084,28.90048 25.0,28.90048 C 25.71916,28.90048 26.3002,29.481520000000003 26.3002,30.200680000000002 L 26.3002,31.0377 C 28.669,30.5298 30.53,28.6648 31.0379,26.3 L 30.20088,26.3 C 29.4817,26.3 28.90068,25.71896 28.90068,24.9998 C 28.90068,24.280640000000002 29.481720000000003,23.6996 30.20088,23.6996 L 31.0379,23.6996 C 30.53,21.3308 28.6691,19.4698 26.3002,18.9619 L 26.3002,19.79892 C 26.3002,20.5181 25.71916,21.09912 25.0,21.09912 C 24.28084,21.09912 23.6998,20.518079999999998 23.6998,19.79892 L 23.6998,18.9619 C 21.331,19.4698 19.47,21.3307 18.9621,23.6996 L 19.79912,23.6996 C 20.5183,23.6996 21.09932,24.280640000000002 21.09932,24.9998 C 21.09932,25.71896 20.518279999999997,26.3 19.79912,26.3 L 18.9621,26.3 M 25.0,23.6996 A 1.3002000000000002,1.3002000000000002 0.0 1,1 25.0,26.3 A 1.3002000000000002,1.3002000000000002 0.0 1,1 25.0,23.6996 M 26.1,2.3724 L 55.9,2.3724 A 1.1,1.1 0.0 0,1 57.0,3.4724 L 57.0,33.2724 A 1.1,1.1 0.0 0,1 55.9,34.3724 L 26.1,34.3724 A 1.1,1.1 0.0 0,1 25.0,33.2724 L 25.0,3.4724 A 1.1,1.1 0.0 0,1 26.1,2.3724 M 25.0,5.2008 L 53.0,5.2008 L 53.0,33.2008 L 25.0,33.2008 L 25.0,5.2008 ", + ], + iconName: "olympus-units-groundunit-artillery" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitEwr: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 21.956541,27.690987 L 27.851056,24.341957 L 24.004132,22.015368000000002 L 29.763323999999997,18.397157000000004 M 26.663842,17.477657 L 29.956591,18.306367 L 29.215886,21.249443000000003 M 32.035153,31.201799 A 10.069912,10.084956 0.0 0,1 20.42801,29.95437 A 10.069912,10.084956 0.0 0,1 17.797018,18.563941 M 26.1,2.37241 L 55.9,2.37241 A 1.1,1.1 0.0 0,1 57.0,3.47241 L 57.0,33.27241 A 1.1,1.1 0.0 0,1 55.9,34.37241 L 26.1,34.37241 A 1.1,1.1 0.0 0,1 25.0,33.27241 L 25.0,3.47241 A 1.1,1.1 0.0 0,1 26.1,2.37241 M 25.0,5.20083 L 53.0,5.20083 L 53.0,33.200829999999996 L 25.0,33.200829999999996 L 25.0,5.20083 ", + ], + iconName: "olympus-units-groundunit-ewr" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitInfantry: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 24.581,23.186 C 25.30113,23.186 25.9929,23.3873 26.5883,23.75019 L 26.5883,32.25849 L 21.1448,32.25849 L 21.1448,27.31689 L 19.6252,29.88549 C 19.307669999999998,30.42417 18.6102,30.60278 18.0715,30.28525 C 17.53282,29.96771 17.354210000000002,29.27025 17.67175,28.731550000000002 L 19.83215,25.07985 C 20.52676,23.90615 21.788349999999998,23.185950000000002 23.15205,23.185950000000002 L 24.581,23.186 M 21.598399999999998,20.0106 A 2.2681000000000004,2.2681000000000004 0.0 1,1 26.1346,20.0106 A 2.2681000000000004,2.2681000000000004 0.0 1,1 21.598399999999998,20.0106 M 29.763599999999997,17.7425 C 30.01309,17.7425 30.217219999999998,17.94663 30.217219999999998,18.19612 L 30.217219999999998,21.49342 C 30.489399999999996,21.64936 30.67084,21.94421 30.67084,22.27875 L 30.67084,25.37755 L 31.12446,25.22729 L 31.12446,23.63959 C 31.12446,23.390099999999997 31.32859,23.185969999999998 31.57808,23.185969999999998 L 32.0317,23.185969999999998 C 32.28119,23.185969999999998 32.48532,23.390099999999997 32.48532,23.63959 L 32.48532,26.03529 C 32.48532,26.23091 32.36058,26.403859999999998 32.17629,26.46623 L 30.67079,26.96521 L 30.67079,27.722189999999998 L 32.03169,27.722189999999998 C 32.28118,27.722189999999998 32.48531,27.926319999999997 32.48531,28.17581 L 32.48531,28.62943 C 32.48531,28.87892 32.28118,29.08305 32.03169,29.08305 L 30.78419,29.08305 L 31.43627,31.69425 C 31.50715,31.9806 31.29167,32.25844 30.99682,32.25844 L 29.309919999999998,32.25844 C 29.060429999999997,32.25844 28.856299999999997,32.05431 28.856299999999997,31.80482 L 28.856299999999997,29.08312 L 28.402679999999997,29.08312 C 27.900859999999998,29.08312 27.495439999999995,28.6777 27.495439999999995,28.17588 L 27.495439999999995,24.09328 C 27.495439999999995,23.59146 27.900859999999994,23.18604 28.402679999999997,23.18604 L 28.402679999999997,22.278789999999997 C 28.402679999999997,21.944249999999997 28.58413,21.649389999999997 28.856299999999997,21.49346 L 28.856299999999997,18.64986 C 28.606809999999996,18.64986 28.402679999999997,18.44573 28.402679999999997,18.19624 C 28.402679999999997,17.94674 28.606809999999996,17.74262 28.856299999999997,17.74262 L 29.309919999999998,17.74262 L 29.763599999999997,17.7425 M 26.1,2.3724 L 55.9,2.3724 A 1.1,1.1 0.0 0,1 57.0,3.4724 L 57.0,33.2724 A 1.1,1.1 0.0 0,1 55.9,34.3724 L 26.1,34.3724 A 1.1,1.1 0.0 0,1 25.0,33.2724 L 25.0,3.4724 A 1.1,1.1 0.0 0,1 26.1,2.3724 M 25.0,5.2008 L 53.0,5.2008 L 53.0,33.2008 L 25.0,33.2008 L 25.0,5.2008 ", + ], + iconName: "olympus-units-groundunit-infantry" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitSamLauncher: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 45.7733,41.3423 L 25.9481,7.63951 C 25.5228,6.91648 24.4772,6.91646 24.0519,7.63951 L 4.22671,41.3423 C 3.79536,42.0756 4.32409,43.0 5.17484,43.0 L 44.8252,43.0 C 45.6759,43.0 46.2046,42.0756 45.7733,41.3423 M 6.74842,41.0 L 25.0,9.97231 L 43.2516,41.0 L 6.74842,41.0 M 18.968962,38.052789 A 8.2439137,8.2651606 0.0 0,1 25.284166,35.100370999999996 A 8.2439137,8.2651606 0.0 0,1 31.599370999999998,38.052789 M 25.114189,34.887901 L 25.114189,19.887378 M 23.074458,23.244436 L 25.05644,19.811542 L 26.980224,23.143634 ", + ], + iconName: "olympus-units-groundunit-sam-launcher" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitSamRadar: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 45.7733,41.3423 L 25.9481,7.63951 C 25.5228,6.91648 24.4772,6.91646 24.0519,7.63951 L 4.22671,41.3423 C 3.79536,42.0756 4.32409,43.0 5.17484,43.0 L 44.8252,43.0 C 45.6759,43.0 46.2046,42.0756 45.7733,41.3423 M 6.74842,41.0 L 25.0,9.97231 L 43.2516,41.0 L 6.74842,41.0 M 23.148216,33.643859 L 28.340232,30.694653 L 24.951778,28.645823999999998 L 30.024598,25.459573 M 27.294508,24.649847 L 30.194832,25.379622 L 29.542403,27.971339 M 32.025673,36.735535 A 8.8697948,8.8809643 0.0 0,1 21.801853,35.63703 A 8.8697948,8.8809643 0.0 0,1 19.484418,25.606446 ", + ], + iconName: "olympus-units-groundunit-sam-radar" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitSam: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 45.7733,41.3423 L 25.9481,7.63951 C 25.5228,6.91648 24.4772,6.91646 24.0519,7.63951 L 4.22671,41.3423 C 3.79536,42.0756 4.32409,43.0 5.17484,43.0 L 44.8252,43.0 C 45.6759,43.0 46.2046,42.0756 45.7733,41.3423 M 6.74842,41.0 L 25.0,9.97231 L 43.2516,41.0 L 6.74842,41.0 ", + ], + iconName: "olympus-units-groundunit-sam" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitTactical: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 22.431,22.053 L 21.87603,23.639300000000002 L 28.12323,23.639300000000002 L 27.56826,22.053 C 27.472579999999997,21.78083 27.21529,21.59796 26.926099999999998,21.59796 L 23.0732,21.59796 C 22.784019999999998,21.59796 22.52673,21.78083 22.43104,22.053 L 22.431,22.053 M 20.398200000000003,23.741300000000003 L 21.146670000000004,21.604300000000002 C 21.433730000000004,20.785660000000004 22.205570000000005,20.2371 23.073170000000005,20.2371 L 26.926070000000003,20.2371 C 27.79361,20.2371 28.56547,20.785700000000002 28.852570000000004,21.604300000000002 L 29.601040000000005,23.741300000000003 C 30.094350000000006,23.945420000000002 30.443070000000006,24.432360000000003 30.443070000000006,25.000100000000003 L 30.443070000000006,29.082700000000003 C 30.443070000000006,29.45906 30.139000000000006,29.763120000000004 29.762640000000005,29.763120000000004 L 29.082220000000003,29.763120000000004 C 28.705860000000005,29.763120000000004 28.401790000000002,29.459050000000005 28.401790000000002,29.082700000000003 L 28.401790000000002,28.0621 L 21.59749,28.0621 L 21.59749,29.082700000000003 C 21.59749,29.45906 21.29342,29.763120000000004 20.91706,29.763120000000004 L 20.236639999999998,29.763120000000004 C 19.86028,29.763120000000004 19.556209999999997,29.459050000000005 19.556209999999997,29.082700000000003 L 19.556209999999997,25.000100000000003 C 19.556209999999997,24.432370000000002 19.904929999999997,23.945400000000003 20.398239999999998,23.741300000000003 L 20.398200000000003,23.741300000000003 M 22.277900000000002,25.680500000000002 A 0.6804500000000004,0.6804500000000004 0.0 1,0 20.917,25.680500000000002 A 0.6804500000000004,0.6804500000000004 0.0 1,0 22.277900000000002,25.680500000000002 M 28.4018,26.360930000000003 A 0.6804500000000004,0.6804500000000004 0.0 1,0 28.4018,25.000030000000002 A 0.6804500000000004,0.6804500000000004 0.0 1,0 28.4018,26.360930000000003 M 26.1,2.3724 L 55.9,2.3724 A 1.1,1.1 0.0 0,1 57.0,3.4724 L 57.0,33.2724 A 1.1,1.1 0.0 0,1 55.9,34.3724 L 26.1,34.3724 A 1.1,1.1 0.0 0,1 25.0,33.2724 L 25.0,3.4724 A 1.1,1.1 0.0 0,1 26.1,2.3724 M 25.0,5.2008 L 53.0,5.2008 L 53.0,33.2008 L 25.0,33.2008 L 25.0,5.2008 ", + ], + iconName: "olympus-units-groundunit-tactical" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitTank: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 30.757,25.961 L 19.243000000000002,25.961 C 18.39628,25.961 17.707500000000003,26.649839999999998 17.707500000000003,27.496499999999997 C 17.707500000000003,27.519879999999997 17.708196000000004,27.543079999999996 17.709300000000002,27.56628 C 17.709631,27.57368 17.710059,27.581 17.710500000000003,27.58841 C 17.711481000000003,27.60474 17.7127,27.62098 17.7142,27.63722 C 17.714896000000003,27.64512 17.715400000000002,27.652839999999998 17.7163,27.6606 C 17.7185,27.6813 17.7211,27.702009999999998 17.7242,27.72253 C 17.7258,27.732879999999998 17.7276,27.74314 17.7294,27.7535 C 17.731299999999997,27.76466 17.733199999999997,27.77581 17.7354,27.78688 C 17.7377,27.79893 17.740099999999998,27.81088 17.7427,27.82284 C 17.7446,27.83154 17.7466,27.840059999999998 17.7487,27.84872 C 17.7548,27.87451 17.76144,27.89994 17.7688,27.9252 C 17.77,27.9296 17.7712,27.9339 17.772499999999997,27.93832 C 17.7766,27.95206 17.7811,27.96554 17.785469999999997,27.979010000000002 C 17.787669999999995,27.98571 17.790069999999996,27.992390000000004 17.792269999999995,27.999090000000002 C 17.796869999999995,28.012300000000003 17.801569999999995,28.02559 17.806539999999995,28.038710000000002 C 17.808639999999993,28.044510000000002 17.811139999999995,28.050130000000003 17.813339999999993,28.055840000000003 C 17.822039999999994,28.078240000000005 17.831389999999992,28.100370000000005 17.84115999999999,28.122230000000002 C 17.84495999999999,28.130930000000003 17.84885999999999,28.13954 17.85290999999999,28.148200000000003 C 17.85770999999999,28.15828 17.86260999999999,28.168370000000003 17.86761999999999,28.17845 C 17.873019999999993,28.18934 17.878579999999992,28.20005 17.88424999999999,28.21084 C 17.88844999999999,28.21874 17.89254999999999,28.22681 17.896889999999992,28.23467 C 17.90715999999999,28.253410000000002 17.917789999999993,28.271880000000003 17.92880999999999,28.290180000000003 C 17.93050999999999,28.292980000000004 17.93230999999999,28.295580000000005 17.93400999999999,28.29838 C 17.94470999999999,28.31578 17.95573999999999,28.33292 17.96709999999999,28.349960000000003 C 17.96919999999999,28.352860000000003 17.970999999999993,28.355860000000003 17.97309999999999,28.358860000000004 C 18.12224999999999,28.578390000000002 18.32813999999999,28.759810000000005 18.575749999999992,28.879390000000004 C 18.578649999999993,28.880790000000005 18.581849999999992,28.882190000000005 18.584749999999993,28.883590000000005 C 18.596539999999994,28.889090000000007 18.608299999999993,28.894830000000006 18.620279999999994,28.900190000000006 L 18.630309999999994,28.904190000000007 C 18.658489999999993,28.916500000000006 18.686939999999993,28.928280000000008 18.715989999999994,28.938900000000007 L 21.053189999999994,29.88555000000001 C 21.056789999999992,29.88715000000001 21.060489999999994,29.88845000000001 21.064079999999993,29.89005000000001 C 21.079339999999995,29.89655000000001 21.094959999999993,29.90254000000001 21.110309999999995,29.90870000000001 C 21.126369999999994,29.91500000000001 21.142259999999993,29.92173000000001 21.158409999999996,29.927710000000012 C 21.174379999999996,29.933610000000012 21.190619999999996,29.938950000000013 21.206869999999995,29.944490000000012 C 21.223109999999995,29.949990000000014 21.239259999999994,29.955910000000014 21.255679999999995,29.961090000000013 C 21.269599999999993,29.965490000000013 21.283879999999993,29.96919000000001 21.297889999999995,29.97323000000001 C 21.316899999999997,29.978730000000013 21.335819999999995,29.984560000000013 21.354909999999997,29.98956000000001 C 21.364109999999997,29.991860000000013 21.373559999999998,29.993860000000012 21.382839999999998,29.99606000000001 C 21.40694,30.00196000000001 21.43103,30.007840000000012 21.455389999999998,30.01284000000001 C 21.456193,30.01301900000001 21.456989999999998,30.01310800000001 21.45769,30.013197000000012 C 21.58637,30.039527000000014 21.71773,30.052997000000012 21.85097,30.054067000000014 C 21.85647,30.054067000000014 21.86195,30.054424000000015 21.86739,30.054424000000015 L 28.13449,30.054424000000015 C 28.42701,30.054424000000015 28.70508,29.992404000000015 28.95701,29.881304000000014 L 31.30801,28.929304000000016 C 31.32657,28.922204000000015 31.34513,28.914844000000016 31.36334,28.906904000000015 L 31.36464,28.906368000000015 L 31.37927,28.900168000000015 C 31.39123,28.894768000000013 31.403010000000002,28.889098000000015 31.414790000000004,28.883568000000015 C 31.417790000000004,28.882168000000014 31.420890000000004,28.880668000000014 31.423890000000004,28.879368000000014 C 31.671440000000004,28.759788000000015 31.877400000000005,28.578368000000015 32.026520000000005,28.358838000000013 C 32.02852000000001,28.355938000000013 32.03052,28.352838000000013 32.032520000000005,28.349938000000012 C 32.043850000000006,28.33289800000001 32.05492,28.315758000000013 32.065630000000006,28.29835800000001 C 32.067330000000005,28.29555800000001 32.06913000000001,28.29285800000001 32.070730000000005,28.290158000000012 C 32.081790000000005,28.271868000000012 32.09241000000001,28.25330800000001 32.10277000000001,28.23464800000001 C 32.10707000000001,28.22674800000001 32.111270000000005,28.218758000000012 32.11535000000001,28.21081800000001 C 32.121050000000004,28.20001800000001 32.12659000000001,28.18930800000001 32.13204,28.17842800000001 C 32.137040000000006,28.168348000000012 32.141940000000005,28.15834800000001 32.14667,28.148178000000012 C 32.15067,28.13947800000001 32.15457,28.130868000000014 32.15845,28.12220800000001 C 32.16825,28.10034800000001 32.177550000000004,28.07820800000001 32.18629,28.055818000000013 C 32.18849,28.050118000000012 32.19089,28.04439800000001 32.19309,28.03868800000001 C 32.19809,28.02556800000001 32.20269,28.01226800000001 32.20737,27.99897800000001 C 32.209669999999996,27.992378000000013 32.21197,27.98567800000001 32.214169999999996,27.97898800000001 C 32.218669999999996,27.965428000000013 32.22306999999999,27.951948000000012 32.227109999999996,27.93829800000001 C 32.22841,27.93389800000001 32.229609999999994,27.92949800000001 32.23081,27.92508800000001 C 32.23811,27.89991800000001 32.24491,27.87439800000001 32.25098,27.84869800000001 C 32.25308,27.83999800000001 32.254979999999996,27.83147800000001 32.25698,27.82272800000001 C 32.25958,27.81085800000001 32.26198,27.79889800000001 32.26428,27.78685800000001 C 32.26638,27.77570800000001 32.26828,27.76454800000001 32.27028,27.753398000000008 C 32.27208,27.74313800000001 32.27388,27.732878000000007 32.27548,27.722518000000008 C 32.27848,27.701908000000007 32.28108,27.68128800000001 32.28338,27.660498000000008 C 32.284183,27.652698000000008 32.28468,27.64496800000001 32.28548,27.637208000000008 C 32.28698,27.62096800000001 32.28818,27.60472800000001 32.28918,27.58830800000001 C 32.289626,27.581008000000008 32.290073,27.57366800000001 32.29038,27.566268000000008 C 32.291361,27.54306800000001 32.29218,27.51977800000001 32.29218,27.496488000000006 C 32.292448,26.649788000000008 31.603610000000003,25.960988000000008 30.756880000000002,25.960988000000008 L 30.757,25.961 M 19.243000000000002,28.0721 C 19.16908,28.0721 19.098580000000002,28.05764 19.033600000000003,28.03212 L 19.012040000000002,28.023419999999998 C 18.998700000000003,28.017519999999998 18.985550000000003,28.01128 18.972800000000003,28.004409999999996 C 18.971300000000003,28.003696999999995 18.969700000000003,28.003009999999996 18.968200000000003,28.002109999999995 C 18.953200000000002,27.993909999999996 18.938630000000003,27.984979999999993 18.924450000000004,27.975519999999996 C 18.921550000000003,27.973519999999997 18.918750000000003,27.971619999999994 18.915950000000002,27.969519999999996 C 18.904420000000002,27.961519999999997 18.89319,27.953189999999996 18.882330000000003,27.944349999999996 C 18.879430000000003,27.942149999999998 18.876630000000002,27.939749999999997 18.87383,27.937449999999995 C 18.847900000000003,27.915769999999995 18.82395,27.891759999999994 18.802220000000002,27.865789999999993 C 18.79952,27.862589999999994 18.796920000000004,27.859289999999994 18.794320000000003,27.855989999999995 C 18.786420000000003,27.846189999999996 18.77886,27.835999999999995 18.77156,27.825649999999996 C 18.76866,27.821649999999995 18.76586,27.817549999999997 18.76306,27.813419999999997 C 18.75426,27.800119999999996 18.74585,27.786559999999998 18.73816,27.77246 C 18.73616,27.76896 18.734560000000002,27.765259999999998 18.73276,27.76166 C 18.727059999999998,27.75077 18.72169,27.73971 18.71676,27.72846 C 18.71406,27.72236 18.711560000000002,27.71632 18.70906,27.710169999999998 C 18.70506,27.700169999999996 18.70136,27.690089999999998 18.69793,27.67983 C 18.69593,27.674229999999998 18.693929999999998,27.66868 18.69223,27.662869999999998 C 18.68763,27.647789999999997 18.683729999999997,27.63253 18.68037,27.616909999999997 C 18.67927,27.61181 18.67847,27.60665 18.67757,27.601559999999996 C 18.675269999999998,27.589329999999997 18.67337,27.577019999999997 18.67187,27.564619999999994 C 18.671245,27.559219999999993 18.670669999999998,27.553909999999995 18.67007,27.548649999999995 C 18.66847,27.531519999999993 18.66737,27.514199999999995 18.66737,27.496619999999997 C 18.66737,27.179289999999998 18.925539999999998,26.921029999999995 19.242929999999998,26.921029999999995 C 19.560319999999997,26.921029999999995 19.81845,27.179199999999994 19.81845,27.496619999999993 C 19.81845,27.81403999999999 19.56034,28.072119999999995 19.24297,28.072119999999995 L 19.243000000000002,28.0721 M 21.867600000000003,29.0944 C 21.848950000000002,29.0944 21.830210000000005,29.093954 21.811740000000004,29.0931 C 21.757570000000005,29.0903 21.704480000000004,29.0836 21.652720000000002,29.07311 C 21.65142,29.072842 21.64992,29.072575 21.64862,29.072307 C 21.634700000000002,29.069406999999998 21.62096,29.066107 21.607120000000002,29.062807 C 21.60322,29.061826 21.599220000000003,29.061007 21.595250000000004,29.059907 C 21.583470000000002,29.056907 21.571780000000004,29.053407 21.560090000000002,29.049906999999997 C 21.554190000000002,29.048206999999998 21.54831,29.046606999999998 21.542420000000003,29.044707 C 21.532160000000005,29.041507 21.522070000000003,29.037907 21.511990000000004,29.034357 C 21.504890000000003,29.031857 21.497620000000005,29.029557 21.490480000000005,29.026857 C 21.480980000000006,29.023257 21.471650000000004,29.019457 21.462190000000007,29.015707 C 21.454790000000006,29.012707 21.447380000000006,29.009707 21.439970000000006,29.006607 C 21.052760000000006,28.840177 20.780850000000004,28.455197 20.780850000000004,28.007666999999998 C 20.780850000000004,27.408426999999996 21.268360000000005,26.920866999999998 21.867650000000005,26.920866999999998 C 22.466940000000005,26.920866999999998 22.954450000000005,27.408376999999998 22.954450000000005,28.007666999999998 C 22.954450000000005,28.606907 22.466940000000005,29.094466999999998 21.867650000000005,29.094466999999998 L 21.867600000000003,29.0944 M 25.001100000000005,29.0944 C 24.401860000000006,29.0944 23.914300000000004,28.60689 23.914300000000004,28.0077 C 23.914300000000004,27.408459999999998 24.401810000000005,26.9209 25.001100000000005,26.9209 C 25.600340000000003,26.9209 26.087800000000005,27.40841 26.087800000000005,28.0077 C 26.087800000000005,28.60685 25.600380000000005,29.0944 25.001100000000005,29.0944 M 28.586400000000005,28.9957 L 28.580400000000004,28.9981 L 28.567820000000005,29.003500000000003 C 28.430390000000006,29.063740000000003 28.284220000000005,29.094260000000002 28.133490000000005,29.094430000000003 C 27.534780000000005,29.093895000000003 27.047890000000006,28.606650000000002 27.047890000000006,28.007730000000002 C 27.047890000000006,27.40849 27.535400000000006,26.920930000000002 28.134690000000006,26.920930000000002 C 28.733980000000006,26.920930000000002 29.221390000000007,27.408440000000002 29.221390000000007,28.007730000000002 C 29.221390000000007,28.445710000000002 28.960630000000005,28.82382 28.586450000000006,28.995700000000003 L 28.586400000000005,28.9957 M 31.329800000000006,27.5485 C 31.329354000000006,27.553900000000002 31.328700000000005,27.55912 31.328100000000006,27.56447 C 31.326600000000006,27.57687 31.324700000000007,27.58919 31.322400000000005,27.60142 C 31.321419000000006,27.60652 31.320700000000006,27.61177 31.319500000000005,27.616860000000003 C 31.316200000000006,27.63239 31.312300000000004,27.647650000000002 31.307720000000003,27.662730000000003 C 31.305920000000004,27.668530000000004 31.303920000000005,27.674060000000004 31.302020000000002,27.679770000000005 C 31.298520000000003,27.690030000000004 31.29492,27.700120000000005 31.29087,27.710020000000004 C 31.28847,27.716220000000003 31.285870000000003,27.722250000000003 31.28327,27.728310000000004 C 31.278270000000003,27.739550000000005 31.272830000000003,27.750710000000005 31.267210000000002,27.761510000000005 C 31.265310000000003,27.765110000000004 31.263710000000003,27.768710000000006 31.26181,27.772400000000005 C 31.25411,27.786410000000004 31.24575,27.799970000000005 31.237000000000002,27.813270000000006 C 31.2342,27.817470000000007 31.2313,27.821470000000005 31.2284,27.825500000000005 C 31.2212,27.835940000000004 31.21367,27.846020000000006 31.20573,27.855840000000004 C 31.20303,27.859140000000004 31.20043,27.862440000000003 31.19783,27.865740000000002 C 31.17606,27.891620000000003 31.15205,27.915540000000004 31.12617,27.937310000000004 C 31.123369999999998,27.939710000000005 31.120569999999997,27.941910000000004 31.117669999999997,27.944210000000005 C 31.106779999999997,27.953010000000006 31.095539999999996,27.961430000000004 31.084119999999995,27.969380000000005 C 31.081219999999995,27.971380000000003 31.078419999999994,27.973380000000006 31.075519999999994,27.975380000000005 C 31.061329999999995,27.984880000000004 31.046779999999995,27.993760000000005 31.031789999999994,28.001970000000004 C 31.030289999999994,28.002862000000004 31.028689999999994,28.003570000000003 31.027189999999994,28.004370000000005 C 31.014429999999994,28.011170000000003 31.001219999999993,28.017400000000006 30.987919999999995,28.023290000000006 L 30.966319999999996,28.031990000000008 C 30.901349999999997,28.057510000000008 30.830859999999998,28.072060000000008 30.756959999999996,28.072060000000008 C 30.439629999999998,28.072060000000008 30.181459999999994,27.813800000000008 30.181459999999994,27.49647000000001 C 30.181459999999994,27.17905000000001 30.439629999999994,26.92088000000001 30.756959999999996,26.92088000000001 C 31.074299999999997,26.92088000000001 31.332549999999998,27.17905000000001 31.332549999999998,27.49647000000001 C 31.332459999999998,27.514050000000008 31.331249999999997,27.53136000000001 31.329749999999997,27.548500000000008 L 31.329800000000006,27.5485 M 30.757,24.04 L 30.52712,24.04 L 28.33392,21.9456 L 27.087619999999998,21.9456 C 27.036929999999998,21.676099999999998 26.9427,21.42186 26.812139999999996,21.190459999999998 L 31.205039999999997,19.370359999999998 L 31.38762,19.81111 L 32.315979999999996,19.426489999999998 L 32.133309999999994,18.985739999999996 L 33.24150999999999,18.526599999999995 L 32.85688999999999,17.598329999999994 L 31.748689999999993,18.057389999999995 L 31.56610999999999,17.616669999999996 L 30.63784999999999,18.001249999999995 L 30.82042999999999,18.441979999999994 L 26.103629999999992,20.396279999999994 C 25.694909999999993,20.099649999999993 25.192859999999992,19.924119999999995 24.650329999999993,19.924119999999995 L 22.781229999999994,19.924119999999995 C 21.570229999999995,19.924119999999995 20.559929999999994,20.796429999999994 20.343729999999994,21.945519999999995 L 18.811029999999995,21.945519999999995 L 18.811029999999995,24.066819999999996 C 17.910789999999995,24.178989999999995 17.093229999999995,24.639109999999995 16.522429999999996,25.367919999999998 L 17.278169999999996,25.959929999999996 C 17.756039999999995,25.349799999999995 18.472269999999995,24.999889999999997 19.243169999999996,24.999889999999997 L 30.757169999999995,24.999889999999997 C 31.528199999999995,24.999889999999997 32.244369999999996,25.3498 32.72217,25.959929999999996 L 33.47794,25.367919999999998 C 32.81695,24.523979999999998 31.825239999999997,24.03992 30.757239999999996,24.03992 L 30.757,24.04 M 26.1,2.3724 L 55.9,2.3724 A 1.1,1.1 0.0 0,1 57.0,3.4724 L 57.0,33.2724 A 1.1,1.1 0.0 0,1 55.9,34.3724 L 26.1,34.3724 A 1.1,1.1 0.0 0,1 25.0,33.2724 L 25.0,3.4724 A 1.1,1.1 0.0 0,1 26.1,2.3724 M 25.0,5.2008 L 53.0,5.2008 L 53.0,33.2008 L 25.0,33.2008 L 25.0,5.2008 ", + ], + iconName: "olympus-units-groundunit-tank" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunitTruck: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 19.209,19.55 C 18.644849999999998,19.55 18.1871,20.00771 18.1871,20.5719 L 18.1871,27.3843 C 18.1871,27.94845 18.64481,28.4062 19.209,28.4062 L 19.54962,28.4062 C 19.54962,29.534499999999998 20.465030000000002,30.4499 21.593320000000002,30.4499 C 22.72162,30.4499 23.637020000000003,29.534489999999998 23.637020000000003,28.4062 L 26.362020000000005,28.4062 C 26.362020000000005,29.534499999999998 27.277440000000006,30.4499 28.405720000000006,30.4499 C 29.534020000000005,30.4499 30.449420000000007,29.534489999999998 30.449420000000007,28.4062 L 31.130660000000006,28.4062 C 31.507470000000005,28.4062 31.811900000000005,28.10177 31.811900000000005,27.72496 C 31.811900000000005,27.34815 31.507470000000005,27.04372 31.130660000000006,27.04372 L 31.130660000000006,24.60192 C 31.130660000000006,24.240009999999998 30.988020000000006,23.893 30.732560000000007,23.63754 L 29.086960000000005,21.99194 C 28.831500000000005,21.73648 28.484490000000005,21.59384 28.122580000000006,21.59384 L 27.043280000000006,21.59384 L 27.043280000000006,20.57194 C 27.043280000000006,20.00779 26.585570000000008,19.550040000000003 26.021380000000008,19.550040000000003 L 19.209,19.55 M 27.0432,22.956200000000003 L 28.1225,22.956200000000003 L 29.768099999999997,24.601800000000004 L 29.768099999999997,24.999900000000004 L 27.043099999999995,24.999900000000004 L 27.0432,22.956200000000003 M 20.571399999999997,28.406100000000002 A 1.0219,1.0219 0.0 1,1 22.615099999999998,28.406100000000002 A 1.0219,1.0219 0.0 1,1 20.571399999999997,28.406100000000002 M 28.405599999999996,27.384200000000003 A 1.0219,1.0219 0.0 1,1 28.405599999999996,29.427900000000005 A 1.0219,1.0219 0.0 1,1 28.405599999999996,27.384200000000003 M 26.1,2.3724 L 55.9,2.3724 A 1.1,1.1 0.0 0,1 57.0,3.4724 L 57.0,33.2724 A 1.1,1.1 0.0 0,1 55.9,34.3724 L 26.1,34.3724 A 1.1,1.1 0.0 0,1 25.0,33.2724 L 25.0,3.4724 A 1.1,1.1 0.0 0,1 26.1,2.3724 M 25.0,5.2008 L 53.0,5.2008 L 53.0,33.2008 L 25.0,33.2008 L 25.0,5.2008 ", + ], + iconName: "olympus-units-groundunit-truck" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsGroundunit: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 15.7866,24.7866 A 9.0,9.0 0.0 1,0 33.7866,24.7866 A 9.0,9.0 0.0 1,0 15.7866,24.7866 M 26.1,2.37241 L 55.9,2.37241 A 1.1,1.1 0.0 0,1 57.0,3.47241 L 57.0,33.27241 A 1.1,1.1 0.0 0,1 55.9,34.37241 L 26.1,34.37241 A 1.1,1.1 0.0 0,1 25.0,33.27241 L 25.0,3.47241 A 1.1,1.1 0.0 0,1 26.1,2.37241 M 25.0,5.20083 L 53.0,5.20083 L 53.0,33.200829999999996 L 25.0,33.200829999999996 L 25.0,5.20083 ", + ], + iconName: "olympus-units-groundunit" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsHelicopter: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 3.0,25.0 A 22.0,22.0 0.0 1,0 47.0,25.0 A 22.0,22.0 0.0 1,0 3.0,25.0 M 5.0,25.0 A 20.0,20.0 0.0 1,0 45.0,25.0 A 20.0,20.0 0.0 1,0 5.0,25.0 ", + ], + iconName: "olympus-units-helicopter" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsMissile: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 24.9348,9.40703 C 26.097,9.40703 27.0422,10.3496 27.0422,11.507 L 27.0422,40.5929 L 22.8274,40.5929 L 22.8274,11.507 C 22.8274,10.3496 23.7726,9.40703 24.9348,9.40703 M 23.2503,30.5137 L 23.2503,36.5758 L 18.0003,33.5448 L 23.2503,30.5137 M 23.2503,30.5137 L 23.2503,36.5758 L 18.0003,33.5448 L 23.2503,30.5137 M 26.7503,30.5137 L 32.0003,33.5448 L 26.7503,36.5758 L 26.7503,30.5137 M 26.7503,30.5137 L 32.0003,33.5448 L 26.7503,36.5758 L 26.7503,30.5137 ", + ], + iconName: "olympus-units-missile" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsNavyunit: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 6.32755,18.2328 L 6.32753,18.2328 C 5.8934,18.8371 5.93517,19.6562 6.4176,20.2133 L 6.41763,20.2133 L 23.8957,40.3947 C 24.5337,41.1314 25.6766,41.1314 26.3146,40.3947 L 43.5823,20.4562 L 43.5824,20.4562 C 44.065,19.8989 44.1066,19.0796 43.6722,18.4752 C 39.7848,13.0674 33.7515,9.0 24.8299,9.0 C 16.0514,9.0 10.1304,12.9391 6.32755,18.2328 M 24.8299,10.5 C 16.5441,10.5 11.0471,14.1999 7.5,19.1719 L 25.1052,39.5 L 42.5,19.4147 C 38.8627,14.3209 33.25,10.5 24.8299,10.5 M 16.5,30.5 C 16.5,30.5 19.2321,25.4999 25.0,25.5 C 30.7679,25.5001 33.5,30.5 33.5,30.5 ", + ], + iconName: "olympus-units-navyunit" as IconName, + prefix: "fas" as IconPrefix, +}; +export const olUnitsStatic: IconDefinition = { + icon: [ + 50.0, + 50.0, + [], + "", + "M 25.6237,37.5 L 45.4,37.5 C 46.2569,37.5 47.0043,36.8097 46.9997,35.8937 C 46.9781,31.5861 45.6287,24.9412 41.3969,19.8087 C 37.9283,15.6018 32.5887,12.5 24.7613,12.5 C 17.0596,12.5 11.8182,15.5038 8.4233,19.6249 C 4.16289,24.7968 2.92903,31.5698 3.00314,35.9289 C 3.01844,36.8304 3.75884,37.5 4.60263,37.5 L 24.3811,37.5 L 25.0024,38.1213 L 25.6237,37.5 M 45.5,36.0 L 25.0024,36.0 L 4.5048,36.0 C 4.41436,31.8747 5.58559,25.4289 9.58105,20.5787 C 12.6882,16.8068 17.5033,14.0 24.7613,14.0 C 32.1369,14.0 37.0534,16.8986 40.2395,20.7629 C 44.2204,25.5911 45.5,31.9268 45.5,36.0 M 25.0024,36.0 L 45.5,36.0 C 45.5,31.9268 44.2204,25.5911 40.2395,20.7629 M 25.0024,36.0 L 4.5048,36.0 C 4.41436,31.8747 5.58559,25.4289 9.58105,20.5787 M 25.0024,36.0 L 9.58105,20.5787 M 25.0024,36.0 L 40.2395,20.7629 M 9.58105,20.5787 C 12.6882,16.8068 17.5033,14.0 24.7613,14.0 C 32.1369,14.0 37.0534,16.8986 40.2395,20.7629 ", + ], + iconName: "olympus-units-static" as IconName, + prefix: "fas" as IconPrefix, +}; diff --git a/frontend/react/src/ui/components/ollabeltoggle.tsx b/frontend/react/src/ui/components/ollabeltoggle.tsx new file mode 100644 index 00000000..84a4c254 --- /dev/null +++ b/frontend/react/src/ui/components/ollabeltoggle.tsx @@ -0,0 +1,53 @@ +import React from "react"; + +export function OlLabelToggle(props: { + toggled: boolean | undefined; + leftLabel: string; + rightLabel: string; + onClick: () => void; +}) { + return ( + + ); +} diff --git a/frontend/react/src/ui/components/olnumberinput.tsx b/frontend/react/src/ui/components/olnumberinput.tsx new file mode 100644 index 00000000..241f355d --- /dev/null +++ b/frontend/react/src/ui/components/olnumberinput.tsx @@ -0,0 +1,90 @@ +import React, { ChangeEvent, useEffect, useId } from "react"; + +export function OlNumberInput(props: { + value: number; + min: number; + max: number; + onDecrease: () => void; + onIncrease: () => void; + onChange: (e: ChangeEvent) => void; +}) { + return ( +
+
+ + + +
+
+ ); +} diff --git a/frontend/react/src/ui/components/olrangeslider.tsx b/frontend/react/src/ui/components/olrangeslider.tsx new file mode 100644 index 00000000..59f80b95 --- /dev/null +++ b/frontend/react/src/ui/components/olrangeslider.tsx @@ -0,0 +1,36 @@ +import React, { ChangeEvent, useEffect, useRef } from "react"; + +export function OlRangeSlider(props: { + value: number | undefined; + min?: number; + max?: number; + step?: number; + onChange: (e: ChangeEvent) => void; +}) { + var elementRef = useRef(null); + + useEffect(() => { + if (elementRef.current) { + const sliderEl = elementRef.current as HTMLInputElement; + const tempSliderValue = Number(sliderEl.value); + const progress = (tempSliderValue / Number(sliderEl.max)) * 100; + sliderEl.style.background = `linear-gradient(to right, #3F83F8 ${progress}%, #4B5563 ${progress}%)`; + } + }); + + return ( + + ); +} diff --git a/frontend/react/src/ui/components/olsearchbar.tsx b/frontend/react/src/ui/components/olsearchbar.tsx new file mode 100644 index 00000000..60eea8d9 --- /dev/null +++ b/frontend/react/src/ui/components/olsearchbar.tsx @@ -0,0 +1,62 @@ +import { faMultiply, faSearch } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { ChangeEvent, useId, useRef } from "react"; + +export function OlSearchBar(props: { + onChange: (e: ChangeEvent) => void; +}) { + const searchId = useId(); + const inputRef = useRef(null); + + function resetSearch() { + inputRef.current && ((inputRef.current as HTMLInputElement).value = ""); + } + + return ( +
+ +
+
+ +
+ + +
+
+ ); +} diff --git a/frontend/react/src/ui/components/olstatebutton.tsx b/frontend/react/src/ui/components/olstatebutton.tsx new file mode 100644 index 00000000..6ef85455 --- /dev/null +++ b/frontend/react/src/ui/components/olstatebutton.tsx @@ -0,0 +1,150 @@ +import { IconProp } from "@fortawesome/fontawesome-svg-core"; +import { + faExternalLink, + faLock, + faLockOpen, + faUnlock, + faUnlockAlt, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { useRef, useState } from "react"; +import { OlTooltip } from "./oltooltip"; + +export function OlStateButton(props: { + className?: string; + checked: boolean; + icon: IconProp; + tooltip: string; + onClick: () => void; +}) { + var [hover, setHover] = useState(false); + var buttonRef = useRef(null); + + const className = + (props.className ?? "") + + ` + h-[40px] w-[40px] flex-none rounded-md text-lg font-medium + dark:bg-olympus-600 dark:text-gray-300 dark:hover:bg-olympus-300 + dark:data-[checked='true']:bg-blue-500 + dark:data-[checked='true']:text-white + `; + + return ( + <> + + {hover && } + + ); +} + +export function OlRoundStateButton(props: { + className?: string; + checked: boolean; + icon: IconProp; + tooltip: string; + onClick: () => void; +}) { + var [hover, setHover] = useState(false); + var buttonRef = useRef(null); + + const className = + (props.className ?? "") + + ` + m-auto h-8 w-8 flex-none rounded-full border-2 border-gray-900 text-sm + font-medium + dark:border-gray-400 dark:bg-[transparent] dark:text-gray-400 + dark:hover:bg-gray-800 dark:data-[checked='true']:border-white + dark:data-[checked='true']:bg-white + dark:data-[checked='true']:text-gray-900 + dark:data-[checked='true']:hover:border-gray-200 + dark:data-[checked='true']:hover:bg-gray-200 + `; + + return ( + <> + + {hover && } + + ); +} + +export function OlLockStateButton(props: { + className?: string; + checked: boolean; + tooltip: string; + onClick: () => void; +}) { + var [hover, setHover] = useState(false); + var buttonRef = useRef(null); + + const className = + (props.className ?? "") + + ` + m-auto h-8 w-8 flex-none rounded-full border-gray-900 text-sm font-medium + dark:bg-red-500 dark:text-olympus-900 dark:hover:bg-red-400 + dark:data-[checked='true']:bg-green-500 + dark:data-[checked='true']:text-green-900 + dark:data-[checked='true']:hover:bg-green-400 + `; + + return ( + <> + + {hover && } + + ); +} diff --git a/frontend/react/src/ui/components/oltoggle.tsx b/frontend/react/src/ui/components/oltoggle.tsx new file mode 100644 index 00000000..1fa0a4da --- /dev/null +++ b/frontend/react/src/ui/components/oltoggle.tsx @@ -0,0 +1,33 @@ +import React from "react"; + +export function OlToggle(props: { + toggled: boolean | undefined; + onClick: () => void; +}) { + return ( +
+
+ ); +} diff --git a/frontend/react/src/ui/components/oltooltip.tsx b/frontend/react/src/ui/components/oltooltip.tsx new file mode 100644 index 00000000..ff255fb5 --- /dev/null +++ b/frontend/react/src/ui/components/oltooltip.tsx @@ -0,0 +1,85 @@ +import React, { useEffect, useRef, useState } from "react"; + +export function OlTooltip(props: { + content: string; + buttonRef: React.MutableRefObject; +}) { + var contentRef = useRef(null); + + function setPosition(content: HTMLDivElement, button: HTMLButtonElement) { + /* Reset the position of the content */ + content.style.left = "0px"; + content.style.top = "0px"; + content.style.height = ""; + + /* Get the position and size of the button and the content elements */ + var [cxl, cyt, cxr, cyb, cw, ch] = [ + content.getBoundingClientRect().x, + content.getBoundingClientRect().y, + content.getBoundingClientRect().x + content.clientWidth, + content.getBoundingClientRect().y + content.clientHeight, + content.clientWidth, + content.clientHeight, + ]; + var [bxl, byt, bxr, byb, bbw, bh] = [ + button.getBoundingClientRect().x, + button.getBoundingClientRect().y, + button.getBoundingClientRect().x + button.clientWidth, + button.getBoundingClientRect().y + button.clientHeight, + button.clientWidth, + button.clientHeight, + ]; + + /* Limit the maximum height */ + if (ch > 400) { + ch = 400; + content.style.height = `${ch}px`; + } + + /* Compute the horizontal position of the center of the button and the content */ + var cxc = (cxl + cxr) / 2; + var bxc = (bxl + bxr) / 2; + + /* Compute the x and y offsets needed to align the button and element horizontally, and to put the content below the button */ + var offsetX = bxc - cxc; + var offsetY = byb - cyt + 8; + + /* Compute the new position of the left and right margins of the content */ + cxl += offsetX; + cxr += offsetX; + cyb += offsetY; + + /* Try and move the content so it is inside the screen */ + if (cxl < 0) offsetX -= cxl; + if (cxr > window.innerWidth) offsetX -= cxr - window.innerWidth; + if (cyb > window.innerHeight) offsetY -= bh + ch + 16; + + /* Apply the offset */ + content.style.left = `${offsetX}px`; + content.style.top = `${offsetY}px`; + } + + useEffect(() => { + if (contentRef.current && props.buttonRef.current) { + const content = contentRef.current as HTMLDivElement; + const button = props.buttonRef.current as HTMLButtonElement; + + setPosition(content, button); + } + }); + + return ( + props.content !== "" && ( +
+ {props.content} +
+ ) + ); +} diff --git a/frontend/react/src/ui/components/olunitlistentry.tsx b/frontend/react/src/ui/components/olunitlistentry.tsx new file mode 100644 index 00000000..fa6c7bfe --- /dev/null +++ b/frontend/react/src/ui/components/olunitlistentry.tsx @@ -0,0 +1,53 @@ +import React from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { IconProp } from "@fortawesome/fontawesome-svg-core"; +import { UnitBlueprint } from "../../interfaces"; +import { + faArrowRightLong, + faCaretRight, + faCircleArrowRight, + faLongArrowAltRight, +} from "@fortawesome/free-solid-svg-icons"; +import { faArrowRight } from "@fortawesome/free-solid-svg-icons/faArrowRight"; + +export function OlUnitEntryList(props: { + icon: IconProp; + blueprint: UnitBlueprint; + onClick: () => void; +}) { + return ( +
+ +
+ {props.blueprint.label} +
+
+ {props.blueprint.era === "WW2" + ? "WW2" + : props.blueprint.era.split(" ").map((word) => { + return word.charAt(0).toLocaleUpperCase(); + })} +
+ +
+ ); +} diff --git a/frontend/react/src/ui/components/olunitsummary.tsx b/frontend/react/src/ui/components/olunitsummary.tsx new file mode 100644 index 00000000..1f037e3e --- /dev/null +++ b/frontend/react/src/ui/components/olunitsummary.tsx @@ -0,0 +1,82 @@ +import React from "react"; +import { UnitBlueprint } from "../../interfaces"; +import { Coalition } from "../../types/types"; + +export function OlUnitSummary(props: { + blueprint: UnitBlueprint; + coalition: Coalition; +}) { + return ( +
+
+ +
+ {props.blueprint.label} +
+
+
+

+ {props.blueprint.description} +

+
+
+ {props.blueprint.abilities?.split(" ").map((tag) => { + return ( +
+ {tag} +
+ ); + })} + +
+ {props.blueprint.era === "WW2" + ? "WW2" + : props.blueprint.era.split(" ").map((word) => { + return word.charAt(0).toLocaleUpperCase(); + })} +
+
+
+ ); +} diff --git a/frontend/react/src/ui/modals/components/card.tsx b/frontend/react/src/ui/modals/components/card.tsx new file mode 100644 index 00000000..e1a62e8d --- /dev/null +++ b/frontend/react/src/ui/modals/components/card.tsx @@ -0,0 +1,43 @@ +import React from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { + faArrowRight, + faCheckCircle, + faExternalLink, + faLink, + faUnlink, +} from "@fortawesome/free-solid-svg-icons"; + +export function Card(props: { + children?: JSX.Element | JSX.Element[]; + className?: string; +}) { + return ( +
+ {props.children} +
+ +
+
+ ); +} diff --git a/frontend/react/src/ui/modals/components/modal.tsx b/frontend/react/src/ui/modals/components/modal.tsx new file mode 100644 index 00000000..d726b038 --- /dev/null +++ b/frontend/react/src/ui/modals/components/modal.tsx @@ -0,0 +1,19 @@ +import React from "react"; + +export function Modal(props: { + grayout?: boolean; + children?: JSX.Element | JSX.Element[]; + className?: string; +}) { + return ( +
+ {props.children} +
+ ); +} diff --git a/frontend/react/src/ui/modals/login.tsx b/frontend/react/src/ui/modals/login.tsx new file mode 100644 index 00000000..940658d7 --- /dev/null +++ b/frontend/react/src/ui/modals/login.tsx @@ -0,0 +1,410 @@ +import React, { useState, version } from "react"; +import { Modal } from "./components/modal"; +import { Card } from "./components/card"; +import { + ErrorCallout, + InfoCallout, + CommandCallout, +} from "../../ui/components/olcallout"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { + faArrowRight, + faCheckCircle, + faDatabase, + faExclamation, + faExclamationCircle, + faExternalLink, + faLink, + faServer, + faSitemap, + faUnlink, + faWindowMaximize, +} from "@fortawesome/free-solid-svg-icons"; +import { VERSION, connectedToServer } from "../../olympusapp"; +import { faFirefoxBrowser } from "@fortawesome/free-brands-svg-icons"; + +export function LoginModal(props: { + checkingPassword: boolean; + loginError: boolean; + commandMode: string | null; + onLogin: (password: string) => void; + onContinue: (username: string) => void; + onBack: () => void; +}) { + const [password, setPassword] = useState(""); + const [displayName, setDisplayName] = useState(""); + + return ( + + +
+
+
+
+
+ {!props.checkingPassword ? ( + <> +
+
+ Connect to +
+
+ {window.location.toString()}{" "} +
+
+
+ + + +
+

+ DCS Olympus +

+
+ + Version {VERSION} +
+
+
+ {!props.loginError ? ( + <> + {props.commandMode === null ? ( + <> +
+ + + setPassword(ev.currentTarget.value) + } + className={` + block w-full max-w-80 rounded-lg border + border-gray-300 bg-gray-50 p-2.5 text-sm + text-gray-900 + dark:border-gray-600 dark:bg-gray-700 + dark:text-white dark:placeholder-gray-400 + dark:focus:border-blue-500 + dark:focus:ring-blue-500 + focus:border-blue-500 focus:ring-blue-500 + `} + placeholder="Enter password" + required + /> +
+
+ + {/* + + */} +
+ + ) : ( + <> +
+ + + setDisplayName(ev.currentTarget.value) + } + className={` + block w-full max-w-80 rounded-lg border + border-gray-300 bg-gray-50 p-2.5 text-sm + text-gray-900 + dark:border-gray-600 dark:bg-gray-700 + dark:text-white dark:placeholder-gray-400 + dark:focus:border-blue-500 + dark:focus:ring-blue-500 + focus:border-blue-500 focus:ring-blue-500 + `} + placeholder="Enter display name" + required + /> +
+
+ + +
+ + )} + + ) : ( + <> + +
+ Still having issues? See our{" "} + + troubleshooting guide here + + . +
+ + )} + + ) : ( +
+ +
+ )} +
+
+ + +
+ YouTube Video Guide{" "} + +
+
+ Check out our official video tutorial on how to get started with + Olympus - so you can immediately start controlling the + battlefield. +
+
+ + +
+ Wiki Guide{" "} + +
+
+ Find out more about Olympus through our online wiki guide. +
+
+
+
+
+ DCS Olympus (the "MATERIAL" or "Software") is provided completely free + to users subject to the terms of the CC BY-NC-SA 4.0 Licence except + where such terms conflict with this disclaimer, in which case, the + terms of this disclaimer shall prevail. Any party making use of the + Software in any manner agrees to be bound by the terms set out in the + disclaimer. THIS MATERIAL IS NOT MADE OR SUPPORTED BY EAGLE DYNAMICS + SA. +
+
+
+ ); +} diff --git a/frontend/react/src/ui/panels/components/menu.tsx b/frontend/react/src/ui/panels/components/menu.tsx new file mode 100644 index 00000000..dd02cf8f --- /dev/null +++ b/frontend/react/src/ui/panels/components/menu.tsx @@ -0,0 +1,86 @@ +import { faArrowLeft, faClose } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { useState } from "react"; +import { FaChevronDown, FaChevronUp } from "react-icons/fa"; + +export function Menu(props: { + title: string; + open: boolean; + onClose: () => void; + canBeHidden?: boolean; + onBack?: () => void; + showBackButton?: boolean; + children?: JSX.Element | JSX.Element[]; +}) { + const [hide, setHide] = useState(true); + + if (!props.open && hide) setHide(false); + + return ( +
+
+
+ {props.showBackButton && ( + {})} + icon={faArrowLeft} + className={` + mr-1 cursor-pointer rounded-md p-2 + dark:text-gray-500 dark:hover:bg-gray-700 dark:hover:text-white + `} + /> + )}{" "} + {props.title} + +
+ {props.children} +
+ {props.canBeHidden == true && ( +
setHide(!hide)}> + {hide ? ( + + ) : ( + + )} +
+ )} +
+ ); +} diff --git a/frontend/react/src/ui/panels/header.tsx b/frontend/react/src/ui/panels/header.tsx new file mode 100644 index 00000000..1a039026 --- /dev/null +++ b/frontend/react/src/ui/panels/header.tsx @@ -0,0 +1,272 @@ +import React, { useState } from "react"; +import { + OlRoundStateButton, + OlStateButton, + OlLockStateButton, +} from "../components/olstatebutton"; +import { + faSkull, + faCamera, + faFlag, + faLink, + faUnlink, + faBars, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { EventsConsumer } from "../../eventscontext"; +import { StateConsumer } from "../../statecontext"; +import { OlDropdownItem, OlDropdown } from "../components/oldropdown"; +import { OlLabelToggle } from "../components/ollabeltoggle"; +import { getApp, IP, connectedToServer } from "../../olympusapp"; +import { + olButtonsVisibilityAirbase, + olButtonsVisibilityAircraft, + olButtonsVisibilityDcs, + olButtonsVisibilityGroundunit, + olButtonsVisibilityGroundunitSam, + olButtonsVisibilityHelicopter, + olButtonsVisibilityHuman, + olButtonsVisibilityNavyunit, + olButtonsVisibilityOlympus, +} from "../components/olicons"; +import { FaChevronLeft, FaChevronRight } from "react-icons/fa6"; + +export function Header() { + const [scrolledLeft, setScrolledLeft] = useState(true); + const [scrolledRight, setScrolledRight] = useState(false); + + function onScroll(ev) { + const sl = ev.target.scrollLeft; + const sr = + ev.target.scrollWidth - ev.target.scrollLeft - ev.target.clientWidth; + + sl < 1 && !scrolledLeft && setScrolledLeft(true); + sl > 1 && scrolledLeft && setScrolledLeft(false); + + sr < 1 && !scrolledRight && setScrolledRight(true); + sr > 1 && scrolledRight && setScrolledRight(false); + } + + return ( + + {(appState) => ( + + {() => ( + + )} + + )} + + ); +} diff --git a/frontend/react/src/ui/panels/mainmenu.tsx b/frontend/react/src/ui/panels/mainmenu.tsx new file mode 100644 index 00000000..73592140 --- /dev/null +++ b/frontend/react/src/ui/panels/mainmenu.tsx @@ -0,0 +1,243 @@ +import React from "react"; +import { Menu } from "./components/menu"; +import { + faArrowRightLong, + faCheckCircle, + faDatabase, + faExternalLink, + faExternalLinkAlt, + faFile, + faFileAlt, + faFileExport, + faFileImport, + faTimesCircle, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { VERSION } from "../../olympusapp"; +import { faGithub } from "@fortawesome/free-brands-svg-icons"; + +export function MainMenu(props: { + open: boolean; + onClose: () => void; + children?: JSX.Element | JSX.Element[]; +}) { + return ( + +
+
+
+ + Olympus Version {VERSION} +
+
+ You can use the Olympus Manager to update port, passwords or other + settings. +
+
+ +
+ {/**/} + View GitHub Repo{" "} + +
+ +
+
+
+ {/**/} + View User Guide{" "} + +
+ +
+
+
+
+ {/**/} + Open Olympus Manager +
+ +
+
+
+ {/**/} + Database Manager +
+ +
+
+
+ {/**/} + Export to file +
+ +
+
+
+ {/**/} + Import from file +
+ +
+
+
+
+ {/**/} + Close Olympus +
+ +
+
+
+
+ ); +} diff --git a/frontend/react/src/ui/panels/minimappanel.tsx b/frontend/react/src/ui/panels/minimappanel.tsx new file mode 100644 index 00000000..e845c909 --- /dev/null +++ b/frontend/react/src/ui/panels/minimappanel.tsx @@ -0,0 +1,127 @@ +import React, { useState, useEffect } from "react"; +import { zeroAppend } from "../../other/utils"; +import { DateAndTime } from "../../interfaces"; +import { getApp } from "../../olympusapp"; +import { FaChevronDown, FaChevronUp } from "react-icons/fa6"; + +export function MiniMapPanel(props: {}) { + var [frameRate, setFrameRate] = useState(0); + var [load, setLoad] = useState(0); + var [elapsedTime, setElapsedTime] = useState(0); + var [missionTime, setMissionTime] = useState({ + h: 0, + m: 0, + s: 0, + } as DateAndTime["time"]); + var [connected, setConnected] = useState(false); + var [paused, setPaused] = useState(false); + var [showMissionTime, setShowMissionTime] = useState(false); + var [showMinimap, setShowMinimap] = useState(false); + + document.addEventListener("serverStatusUpdated", (ev) => { + const detail = (ev as CustomEvent).detail; + setFrameRate(detail.frameRate); + setLoad(detail.load); + setElapsedTime(detail.elapsedTime); + setMissionTime(detail.missionTime); + setConnected(detail.connected); + setPaused(detail.paused); + }); + + // A bit of a hack to set the rounded borders to the minimap + useEffect(() => { + let miniMap = document.querySelector(".leaflet-control-minimap"); + if (miniMap) { + miniMap.classList.add("rounded-t-lg"); + } + }); + + document.addEventListener("mapOptionsChanged", (event) => { + setShowMinimap(getApp().getMap().getOptions().showMinimap); + }); + + // Compute the time string depending on mission or elapsed time + let hours = 0; + let minutes = 0; + let seconds = 0; + + if (showMissionTime) { + hours = missionTime.h; + minutes = missionTime.m; + seconds = missionTime.s; + } else { + hours = Math.floor(elapsedTime / 3600); + minutes = Math.floor(elapsedTime / 60) % 60; + seconds = Math.round(elapsedTime) % 60; + } + + let timeString = `${zeroAppend(hours, 2)}:${zeroAppend(minutes, 2)}:${zeroAppend(seconds, 2)}`; + + // Choose frame rate string color + let frameRateColor = "#8BFF63"; + if (frameRate < 30) frameRateColor = "#F05252"; + else if (frameRate >= 30 && frameRate < 60) frameRateColor = "#FF9900"; + + // Choose load string color + let loadColor = "#8BFF63"; + if (load > 1000) loadColor = "#F05252"; + else if (load >= 100 && load < 1000) loadColor = "#FF9900"; + + return ( +
setShowMissionTime(!showMissionTime)} + className={` + absolute right-[10px] + ${showMinimap ? `top-[232px]` : `top-[70px]`} + w-[288px] z-ui-0 flex items-center justify-between + ${showMinimap ? `rounded-b-lg` : `rounded-lg`} + bg-gray-200 p-3 text-sm backdrop-blur-lg backdrop-grayscale + dark:bg-olympus-800/90 dark:text-gray-200 + `} + > + {!connected ? ( +
+
+ Server disconnected +
+ ) : paused ? ( +
+
+ Server paused +
+ ) : ( + <> +
+ FPS:{" "} + + {frameRate} + {" "} +
+
+ Load:{" "} + + {load} + {" "} +
+
+ {showMissionTime ? "MT" : "ET"}: {timeString}{" "} +
+
+ + )} + {showMinimap ? ( + { + getApp().getMap().setOption("showMinimap", false); + }} + > + ) : ( + { + getApp().getMap().setOption("showMinimap", true); + }} + > + )} +
+ ); +} diff --git a/frontend/react/src/ui/panels/options.tsx b/frontend/react/src/ui/panels/options.tsx new file mode 100644 index 00000000..9dfede6b --- /dev/null +++ b/frontend/react/src/ui/panels/options.tsx @@ -0,0 +1,259 @@ +import React from "react"; +import { Menu } from "./components/menu"; +import { OlCheckbox } from "../components/olcheckbox"; +import { OlRangeSlider } from "../components/olrangeslider"; +import { OlNumberInput } from "../components/olnumberinput"; +import { MapOptions } from "../../types/types"; +import { getApp } from "../../olympusapp"; + +export function Options(props: { + open: boolean; + onClose: () => void; + options: MapOptions; + children?: JSX.Element | JSX.Element[]; +}) { + return ( + +
+
{ + getApp() + .getMap() + .setOption("showUnitLabels", !props.options.showUnitLabels); + }} + > + {}} + > + Show Unit Labels + + L + +
+
{ + getApp() + .getMap() + .setOption( + "showUnitsEngagementRings", + !props.options.showUnitsEngagementRings + ); + }} + > + {}} + > + Show Threat Rings + + Q + +
+
{ + getApp() + .getMap() + .setOption( + "showUnitsAcquisitionRings", + !props.options.showUnitsAcquisitionRings + ); + }} + > + {}} + > + Show Detection rings + + E + +
+
{ + getApp() + .getMap() + .setOption("showUnitTargets", !props.options.showUnitTargets); + }} + > + {}} + > + Show Detection lines + + F + +
+
{ + getApp() + .getMap() + .setOption( + "hideUnitsShortRangeRings", + !props.options.hideUnitsShortRangeRings + ); + }} + > + {}} + > + Hide Short range Rings + + R + +
+
{ + getApp() + .getMap() + .setOption("hideGroupMembers", !props.options.hideGroupMembers); + }} + > + {}} + > + Hide Group members + + G + +
+
{ + getApp() + .getMap() + .setOption("showMinimap", !props.options.showMinimap); + }} + > + {}} + > + Show minimap + + ? + +
+ + {/* +
+
+
+ DCS Camera Zoom Scaling + x5 + +
+ { }} + value={5} + min={1} + max={10} + step={2} + /> +
+
+ DCS Camera Port +
+ { }} + onIncrease={() => { }} + onChange={(ev) => { }} + /> +
+
*/} +
+
+ ); +} diff --git a/frontend/react/src/ui/panels/sidebar.tsx b/frontend/react/src/ui/panels/sidebar.tsx new file mode 100644 index 00000000..0cf62d6f --- /dev/null +++ b/frontend/react/src/ui/panels/sidebar.tsx @@ -0,0 +1,104 @@ +import React, { useState } from "react"; +import { OlStateButton } from "../components/olstatebutton"; +import { + faGamepad, + faRuler, + faPencil, + faEllipsisV, + faCog, + faQuestionCircle, + faPlusSquare +} from "@fortawesome/free-solid-svg-icons"; +import { EventsConsumer } from "../../eventscontext"; +import { StateConsumer } from "../../statecontext"; +import { IDLE, SPAWN_UNIT } from "../../constants/constants"; + +export function SideBar() { + const [mapState, setMapState] = useState(IDLE); + + document.addEventListener("mapStateChanged", (ev) => { + setMapState((ev as CustomEvent).detail); + }); + + return ( + + {(appState) => ( + + {(events) => ( + + )} + + )} + + ); +} diff --git a/frontend/react/src/ui/panels/spawnmenu.tsx b/frontend/react/src/ui/panels/spawnmenu.tsx new file mode 100644 index 00000000..45dcd593 --- /dev/null +++ b/frontend/react/src/ui/panels/spawnmenu.tsx @@ -0,0 +1,198 @@ +import React, { useState } from "react"; +import { Menu } from "./components/menu"; +import { faPlus } from "@fortawesome/free-solid-svg-icons"; +import { library } from "@fortawesome/fontawesome-svg-core"; +import { OlSearchBar } from "../components/olsearchbar"; +import { OlAccordion } from "../components/olaccordion"; +import { getApp } from "../../olympusapp"; +import { OlUnitEntryList } from "../components/olunitlistentry"; +import { UnitSpawnMenu } from "./unitspawnmenu"; +import { UnitBlueprint } from "../../interfaces"; +import { + olButtonsVisibilityAircraft, + olButtonsVisibilityGroundunit, + olButtonsVisibilityGroundunitSam, + olButtonsVisibilityHelicopter, + olButtonsVisibilityNavyunit, +} from "../components/olicons"; +import { IDLE, SPAWN_UNIT } from "../../constants/constants"; + +library.add(faPlus); + +function filterUnits( + blueprints: { [key: string]: UnitBlueprint }, + filterString: string +) { + var filteredUnits = {}; + if (blueprints) { + Object.entries(blueprints).forEach(([key, value]) => { + if ( + value.enabled && + (filterString === "" || value.label.includes(filterString)) + ) + filteredUnits[key] = value; + }); + } + return filteredUnits; +} + +export function SpawnMenu(props: { + open: boolean; + onClose: () => void; + children?: JSX.Element | JSX.Element[]; +}) { + var [blueprint, setBlueprint] = useState(null as null | UnitBlueprint); + var [filterString, setFilterString] = useState(""); + + /* Filter aircrafts, helicopters, and navyunits */ + const filteredAircraft = filterUnits( + getApp()?.getAircraftDatabase()?.blueprints, + filterString + ); + const filteredHelicopters = filterUnits( + getApp()?.getHelicopterDatabase()?.blueprints, + filterString + ); + const filteredNavyUnits = filterUnits( + getApp()?.getNavyUnitDatabase()?.blueprints, + filterString + ); + + /* Split ground units between air defence and all others */ + var filteredAirDefense = {}; + var filteredGroundUnits = {}; + Object.keys(getApp()?.getGroundUnitDatabase()?.blueprints ?? {}).forEach( + (key) => { + var blueprint = getApp()?.getGroundUnitDatabase()?.blueprints[key]; + var type = blueprint.label; + if (/\bAAA|SAM\b/.test(type) || /\bmanpad|stinger\b/i.test(type)) { + filteredAirDefense[key] = blueprint; + } else { + filteredGroundUnits[key] = blueprint; + } + } + ); + filteredAirDefense = filterUnits(filteredAirDefense, filterString); + filteredGroundUnits = filterUnits(filteredGroundUnits, filterString); + + if (!props.open) { + if (getApp()?.getMap()?.getState() === SPAWN_UNIT) + getApp().getMap().setState(IDLE); + if (blueprint !== null) + setBlueprint(null); + } + + return ( + { + getApp().getMap().setState(IDLE); + setBlueprint(null); + }} + > + <> + {blueprint === null && ( +
+ setFilterString(ev.target.value)} /> + +
+ {Object.keys(filteredAircraft).map((key) => { + const blueprint = + getApp().getAircraftDatabase().blueprints[key]; + return ( + setBlueprint(blueprint)} + /> + ); + })} +
+
+ +
+ {Object.keys(filteredHelicopters).map((key) => { + const blueprint = + getApp().getHelicopterDatabase().blueprints[key]; + return ( + setBlueprint(blueprint)} + /> + ); + })} +
+
+ +
+ {Object.keys(filteredAirDefense).map((key) => { + const blueprint = + getApp().getGroundUnitDatabase().blueprints[key]; + return ( + setBlueprint(blueprint)} + /> + ); + })} +
+
+ +
+ {Object.keys(filteredGroundUnits).map((key) => { + const blueprint = + getApp().getGroundUnitDatabase().blueprints[key]; + return ( + setBlueprint(blueprint)} + /> + ); + })} +
+
+ +
+ {Object.keys(filteredNavyUnits).map((key) => { + const blueprint = + getApp().getNavyUnitDatabase().blueprints[key]; + return ( + setBlueprint(blueprint)} + /> + ); + })} +
+
+ +
+ )} + + {!(blueprint === null) && } + +
+ ); +} diff --git a/frontend/react/src/ui/panels/unitcontrolmenu.tsx b/frontend/react/src/ui/panels/unitcontrolmenu.tsx new file mode 100644 index 00000000..7e17a8a7 --- /dev/null +++ b/frontend/react/src/ui/panels/unitcontrolmenu.tsx @@ -0,0 +1,719 @@ +import React, { useState } from "react"; +import { Menu } from "./components/menu"; +import { Unit } from "../../unit/unit"; +import { OlLabelToggle } from "../components/ollabeltoggle"; +import { OlRangeSlider } from "../components/olrangeslider"; +import { getApp } from "../../olympusapp"; +import { OlButtonGroup, OlButtonGroupItem } from "../components/olbuttongroup"; +import { + ROEs, + emissionsCountermeasures, + reactionsToThreat, +} from "../../constants/constants"; +import { OlToggle } from "../components/oltoggle"; +import { OlCoalitionToggle } from "../components/olcoalitiontoggle"; +import { + olButtonsEmissionsAttack, + olButtonsEmissionsDefend, + olButtonsEmissionsFree, + olButtonsEmissionsSilent, + olButtonsIntensity1, + olButtonsIntensity2, + olButtonsIntensity3, + olButtonsRoeDesignated, + olButtonsRoeFree, + olButtonsRoeHold, + olButtonsRoeReturn, + olButtonsScatter1, + olButtonsScatter2, + olButtonsScatter3, + olButtonsThreatEvade, + olButtonsThreatManoeuvre, + olButtonsThreatNone, + olButtonsThreatPassive, +} from "../components/olicons"; +import { Coalition } from "../../types/types"; +import { ftToM, knotsToMs, mToFt, msToKnots } from "../../other/utils"; + +export function UnitControlMenu(props: { + open: boolean; + onClose: () => void; +}) { + var [selectedUnits, setSelectedUnits] = useState([] as Unit[]); + + var [selectedUnitsData, setSelectedUnitsData] = useState({ + desiredAltitude: undefined as undefined | number, + desiredAltitudeType: undefined as undefined | string, + desiredSpeed: undefined as undefined | number, + desiredSpeedType: undefined as undefined | string, + ROE: undefined as undefined | string, + reactionToThreat: undefined as undefined | string, + emissionsCountermeasures: undefined as undefined | string, + shotsScatter: undefined as undefined | number, + shotsIntensity: undefined as undefined | number, + operateAs: undefined as undefined | string, + followRoads: undefined as undefined | boolean, + isActiveAWACS: undefined as undefined | boolean, + isActiveTanker: undefined as undefined | boolean, + onOff: undefined as undefined | boolean, + }); + + /* */ + const minAltitude = 0; + const maxAltitude = getApp() + ?.getUnitsManager() + ?.getSelectedUnitsCategories() + .every((category) => { + return category === "Helicopter"; + }) + ? 20000 + : 60000; + const altitudeStep = getApp() + ?.getUnitsManager() + ?.getSelectedUnitsCategories() + .every((category) => { + return category === "Helicopter"; + }) + ? 100 + : 500; + const minSpeed = 0; + const maxSpeed = getApp() + ?.getUnitsManager() + ?.getSelectedUnitsCategories() + .every((category) => { + return category === "Helicopter"; + }) + ? 200 + : 800; + const speedStep = getApp() + ?.getUnitsManager() + ?.getSelectedUnitsCategories() + .every((category) => { + return category === "Helicopter"; + }) + ? 5 + : 10; + + /* When a unit is selected, open the menu */ + document.addEventListener("unitsSelection", (ev: CustomEventInit) => { + setSelectedUnits(ev.detail as Unit[]); + + updateData(); + }); + + /* When a unit is deselected, refresh the view */ + document.addEventListener("unitDeselection", (ev: CustomEventInit) => { + /* TODO add delay to avoid doing it too many times */ + updateData(); + }); + + /* When all units are deselected clean the view */ + document.addEventListener("clearSelection", () => { + setSelectedUnits([]); + }); + + /* Update the current values of the shown data */ + function updateData() { + const getters = { + desiredAltitude: (unit: Unit) => { + return Math.round(mToFt(unit.getDesiredAltitude())); + }, + desiredAltitudeType: (unit: Unit) => { + return unit.getDesiredAltitudeType(); + }, + desiredSpeed: (unit: Unit) => { + return Math.round(msToKnots(unit.getDesiredSpeed())); + }, + desiredSpeedType: (unit: Unit) => { + return unit.getDesiredSpeedType(); + }, + ROE: (unit: Unit) => { + return unit.getROE(); + }, + reactionToThreat: (unit: Unit) => { + return unit.getReactionToThreat(); + }, + emissionsCountermeasures: (unit: Unit) => { + return unit.getEmissionsCountermeasures(); + }, + shotsScatter: (unit: Unit) => { + return unit.getShotsScatter(); + }, + shotsIntensity: (unit: Unit) => { + return unit.getShotsIntensity(); + }, + operateAs: (unit: Unit) => { + return unit.getOperateAs(); + }, + followRoads: (unit: Unit) => { + return unit.getFollowRoads(); + }, + isActiveAWACS: (unit: Unit) => { + return unit.getIsActiveAWACS(); + }, + isActiveTanker: (unit: Unit) => { + return unit.getIsActiveTanker(); + }, + onOff: (unit: Unit) => { + return unit.getOnOff(); + }, + } as { [key in keyof typeof selectedUnitsData]: (unit: Unit) => void }; + + var updatedData = selectedUnitsData; + Object.entries(getters).forEach(([key, getter]) => { + updatedData[key] = getApp() + ?.getUnitsManager() + ?.getSelectedUnitsVariable(getter); + }); + setSelectedUnitsData(updatedData); + } + + /* Count how many units are selected of each type, divided by coalition */ + var unitOccurences = { + blue: {}, + red: {}, + neutral: {}, + }; + + selectedUnits.forEach((unit) => { + if (!(unit.getName() in unitOccurences[unit.getCoalition()])) + unitOccurences[unit.getCoalition()][unit.getName()] = 1; + else unitOccurences[unit.getCoalition()][unit.getName()]++; + }); + + const selectedCategories = + getApp()?.getUnitsManager()?.getSelectedUnitsCategories() ?? []; + + return ( + + {/* Units list */} +
+
+ { + <> + {["blue", "red", "neutral"].map((coalition) => { + return Object.keys(unitOccurences[coalition]).map((name) => { + return ( +
+ + {name} + + + x{unitOccurences[coalition][name]} + +
+ ); + }); + })} + + } +
+
+
+ { + /* Altitude selector */ + selectedCategories.every((category) => { + return ["Aircraft", "Helicopter"].includes(category); + }) && ( +
+
+
+ + Altitude + + + {selectedUnitsData.desiredAltitude !== undefined + ? Intl.NumberFormat("en-US").format( + selectedUnitsData.desiredAltitude + ) + " FT" + : "Different values"} + +
+ { + selectedUnits.forEach((unit) => { + unit.setAltitudeType( + selectedUnitsData.desiredAltitudeType === "ASL" + ? "AGL" + : "ASL" + ); + setSelectedUnitsData({ + ...selectedUnitsData, + desiredAltitudeType: + selectedUnitsData.desiredAltitudeType === "ASL" + ? "AGL" + : "ASL", + }); + }); + }} + /> +
+ { + selectedUnits.forEach((unit) => { + unit.setAltitude(ftToM(Number(ev.target.value))); + setSelectedUnitsData({ + ...selectedUnitsData, + desiredAltitude: Number(ev.target.value), + }); + }); + }} + value={selectedUnitsData.desiredAltitude} + min={minAltitude} + max={maxAltitude} + step={altitudeStep} + /> +
+ ) + } + {/* Airspeed selector */} +
+
+
+ + Speed + + + {selectedUnitsData.desiredSpeed !== undefined + ? selectedUnitsData.desiredSpeed + " KTS" + : "Different values"} + +
+ { + selectedUnits.forEach((unit) => { + unit.setSpeedType( + selectedUnitsData.desiredSpeedType === "CAS" ? "GS" : "CAS" + ); + setSelectedUnitsData({ + ...selectedUnitsData, + desiredSpeedType: + selectedUnitsData.desiredSpeedType === "CAS" + ? "GS" + : "CAS", + }); + }); + }} + /> +
+ { + selectedUnits.forEach((unit) => { + unit.setSpeed(knotsToMs(Number(ev.target.value))); + setSelectedUnitsData({ + ...selectedUnitsData, + desiredSpeed: Number(ev.target.value), + }); + }); + }} + value={selectedUnitsData.desiredSpeed} + min={minSpeed} + max={maxSpeed} + step={speedStep} + /> +
+
+ + Rules of engagement + + + {[ + olButtonsRoeHold, + olButtonsRoeReturn, + olButtonsRoeDesignated, + olButtonsRoeFree, + ].map((icon, idx) => { + return ( + { + selectedUnits.forEach((unit) => { + unit.setROE(ROEs[idx]); + setSelectedUnitsData({ + ...selectedUnitsData, + ROE: ROEs[idx], + }); + }); + }} + active={selectedUnitsData.ROE === ROEs[idx]} + icon={icon} + /> + ); + })} + +
+ {selectedCategories.every((category) => { + return ["Aircraft", "Helicopter"].includes(category); + }) && ( + <> + {" "} +
+ + Threat reaction + + + {[ + olButtonsThreatNone, + olButtonsThreatPassive, + olButtonsThreatManoeuvre, + olButtonsThreatEvade, + ].map((icon, idx) => { + return ( + { + selectedUnits.forEach((unit) => { + unit.setReactionToThreat(reactionsToThreat[idx]); + setSelectedUnitsData({ + ...selectedUnitsData, + reactionToThreat: reactionsToThreat[idx], + }); + }); + }} + active={ + selectedUnitsData.reactionToThreat === + reactionsToThreat[idx] + } + icon={icon} + /> + ); + })} + +
+
+ + Radar and ECM + + + {[ + olButtonsEmissionsSilent, + olButtonsEmissionsDefend, + olButtonsEmissionsAttack, + olButtonsEmissionsFree, + ].map((icon, idx) => { + return ( + { + selectedUnits.forEach((unit) => { + unit.setEmissionsCountermeasures( + emissionsCountermeasures[idx] + ); + setSelectedUnitsData({ + ...selectedUnitsData, + emissionsCountermeasures: + emissionsCountermeasures[idx], + }); + }); + }} + active={ + selectedUnitsData.emissionsCountermeasures === + emissionsCountermeasures[idx] + } + icon={icon} + /> + ); + })} + +
+ + )} + {getApp() + ?.getUnitsManager() + ?.getSelectedUnitsVariable((unit) => { + return unit.isTanker(); + }) && ( +
+ + {" "} + Act as tanker{" "} + + { + selectedUnits.forEach((unit) => { + unit.setAdvancedOptions( + !selectedUnitsData.isActiveTanker, + unit.getIsActiveAWACS(), + unit.getTACAN(), + unit.getRadio(), + unit.getGeneralSettings() + ); + setSelectedUnitsData({ + ...selectedUnitsData, + isActiveTanker: !selectedUnitsData.isActiveTanker, + }); + }); + }} + /> +
+ )} + {getApp() + ?.getUnitsManager() + ?.getSelectedUnitsVariable((unit) => { + return unit.isAWACS(); + }) && ( +
+ + {" "} + Act as AWACS{" "} + + { + selectedUnits.forEach((unit) => { + unit.setAdvancedOptions( + unit.getIsActiveTanker(), + !selectedUnitsData.isActiveAWACS, + unit.getTACAN(), + unit.getRadio(), + unit.getGeneralSettings() + ); + setSelectedUnitsData({ + ...selectedUnitsData, + isActiveAWACS: !selectedUnitsData.isActiveAWACS, + }); + }); + }} + /> +
+ )} + {selectedCategories.every((category) => { + return ["GroundUnit", "NavyUnit"].includes(category); + }) && ( + <> + {" "} +
+ + Shots scatter + + + {[olButtonsScatter1, olButtonsScatter2, olButtonsScatter3].map( + (icon, idx) => { + return ( + { + selectedUnits.forEach((unit) => { + unit.setShotsScatter(idx + 1); + setSelectedUnitsData({ + ...selectedUnitsData, + shotsScatter: idx + 1, + }); + }); + }} + active={selectedUnitsData.shotsScatter === idx + 1} + icon={icon} + /> + ); + } + )} + +
+
+ + Shots intensity + + + {[ + olButtonsIntensity1, + olButtonsIntensity2, + olButtonsIntensity3, + ].map((icon, idx) => { + return ( + { + selectedUnits.forEach((unit) => { + unit.setShotsIntensity(idx + 1); + setSelectedUnitsData({ + ...selectedUnitsData, + shotsIntensity: idx + 1, + }); + }); + }} + active={selectedUnitsData.shotsIntensity === idx + 1} + icon={icon} + /> + ); + })} + +
+
+ + {" "} + Operate as{" "} + + { + selectedUnits.forEach((unit) => { + unit.setOperateAs( + selectedUnitsData.operateAs === "blue" ? "red" : "blue" + ); + setSelectedUnitsData({ + ...selectedUnitsData, + operateAs: + selectedUnitsData.operateAs === "blue" ? "red" : "blue", + }); + }); + }} + /> +
+
+ + {" "} + Follow roads{" "} + + { + selectedUnits.forEach((unit) => { + unit.setFollowRoads(!selectedUnitsData.followRoads); + setSelectedUnitsData({ + ...selectedUnitsData, + followRoads: !selectedUnitsData.followRoads, + }); + }); + }} + /> +
+
+ + {" "} + Unit active{" "} + + { + selectedUnits.forEach((unit) => { + unit.setOnOff(!selectedUnitsData.onOff); + setSelectedUnitsData({ + ...selectedUnitsData, + onOff: !selectedUnitsData.onOff, + }); + }); + }} + /> +
+ + )} +
+
+ ); +} diff --git a/frontend/react/src/ui/panels/unitmousecontrolbar.tsx b/frontend/react/src/ui/panels/unitmousecontrolbar.tsx new file mode 100644 index 00000000..cf1e56e3 --- /dev/null +++ b/frontend/react/src/ui/panels/unitmousecontrolbar.tsx @@ -0,0 +1,171 @@ +import React, { useState } from "react"; +import { Unit } from "../../unit/unit"; +import { ContextActionSet } from "../../unit/contextactionset"; +import { OlStateButton } from "../components/olstatebutton"; +import { getApp } from "../../olympusapp"; +import { ContextAction } from "../../unit/contextaction"; +import { CONTEXT_ACTION } from "../../constants/constants"; +import { FaInfoCircle } from "react-icons/fa"; +import { FaChevronLeft, FaChevronRight } from "react-icons/fa6"; + +export function UnitMouseControlBar(props: {}) { + var [open, setOpen] = useState(false); + var [selectedUnits, setSelectedUnits] = useState([] as Unit[]); + var [contextActionsSet, setContextActionsSet] = useState( + new ContextActionSet() + ); + var [activeContextAction, setActiveContextAction] = useState( + null as null | ContextAction + ); + const [scrolledLeft, setScrolledLeft] = useState(true); + const [scrolledRight, setScrolledRight] = useState(false); + + /* When a unit is selected, open the menu */ + document.addEventListener("unitsSelection", (ev: CustomEventInit) => { + setOpen(true); + setSelectedUnits(ev.detail as Unit[]); + + updateData(); + }); + + /* When a unit is deselected, refresh the view */ + document.addEventListener("unitDeselection", (ev: CustomEventInit) => { + /* TODO add delay to avoid doing it too many times */ + updateData(); + }); + + /* When all units are deselected clean the view */ + document.addEventListener("clearSelection", () => { + setOpen(false); + setSelectedUnits([]); + updateData(); + }); + + /* Deselect the context action when exiting state */ + document.addEventListener("mapStateChanged", (ev) => { + setOpen((ev as CustomEvent).detail === CONTEXT_ACTION); + }); + + /* Update the current values of the shown data */ + function updateData() { + var newContextActionSet = new ContextActionSet(); + + getApp() + .getUnitsManager() + .getSelectedUnits() + .forEach((unit: Unit) => { + unit.appendContextActions(newContextActionSet); + }); + + setContextActionsSet(newContextActionSet); + setActiveContextAction(null); + } + + function onScroll(ev) { + const sl = ev.target.scrollLeft; + const sr = + ev.target.scrollWidth - ev.target.scrollLeft - ev.target.clientWidth; + + sl < 1 && !scrolledLeft && setScrolledLeft(true); + sl > 1 && scrolledLeft && setScrolledLeft(false); + + sr < 1 && !scrolledRight && setScrolledRight(true); + sr > 1 && scrolledRight && setScrolledRight(false); + } + + return ( + <> + {" "} + {open && ( + <> +
+ {!scrolledLeft && ( + + )} +
onScroll(ev)} + > + {Object.values(contextActionsSet.getContextActions()).map( + (contextAction) => { + return ( + { + if (contextAction.getOptions().executeImmediately) { + setActiveContextAction(null); + contextAction.executeCallback(null, null); + } else { + if (activeContextAction != contextAction) { + setActiveContextAction(contextAction); + getApp().getMap().setState(CONTEXT_ACTION, { + contextAction: contextAction, + }); + } else { + setActiveContextAction(null); + getApp().getMap().setState(CONTEXT_ACTION, { + contextAction: null, + }); + } + } + }} + /> + ); + } + )} +
+ {!scrolledRight && ( + + )} +
+ {activeContextAction && ( +
+
+ )} + + )} + + ); +} diff --git a/frontend/react/src/ui/panels/unitspawnmenu.tsx b/frontend/react/src/ui/panels/unitspawnmenu.tsx new file mode 100644 index 00000000..1a1ca6bb --- /dev/null +++ b/frontend/react/src/ui/panels/unitspawnmenu.tsx @@ -0,0 +1,255 @@ +import React, { useState, useEffect } from "react"; +import { OlUnitSummary } from "../components/olunitsummary"; +import { OlCoalitionToggle } from "../components/olcoalitiontoggle"; +import { OlNumberInput } from "../components/olnumberinput"; +import { OlLabelToggle } from "../components/ollabeltoggle"; +import { OlRangeSlider } from "../components/olrangeslider"; +import { OlDropdownItem, OlDropdown } from "../components/oldropdown"; +import { LoadoutBlueprint, UnitBlueprint } from "../../interfaces"; +import { Coalition } from "../../types/types"; +import { getApp } from "../../olympusapp"; +import { IDLE, SPAWN_UNIT } from "../../constants/constants"; +import { ftToM, getUnitCategoryByBlueprint } from "../../other/utils"; +import { LatLng } from "leaflet"; + +export function UnitSpawnMenu(props: { blueprint: UnitBlueprint }) { + /* Compute the min and max values depending on the unit type */ + const minNumber = 1; + const maxNumber = 4; + const minAltitude = 0; + const maxAltitude = 30000; + const altitudeStep = 500; + + /* State initialization */ + var [spawnCoalition, setSpawnCoalition] = useState("blue" as Coalition); + var [spawnNumber, setSpawnNumber] = useState(1); + var [spawnRole, setSpawnRole] = useState(""); + var [spawnLoadoutName, setSpawnLoadout] = useState(""); + var [spawnAltitude, setSpawnAltitude] = useState( + (maxAltitude - minAltitude) / 2 + ); + var [spawnAltitudeType, setSpawnAltitudeType] = useState(false); + + /* When the menu is opened show the unit preview on the map as a cursor */ + useEffect(() => { + if (props.blueprint !== null) { + getApp() + ?.getMap() + ?.setState(SPAWN_UNIT, { + spawnRequestTable: { + category: getUnitCategoryByBlueprint(props.blueprint), + unit: { + unitType: props.blueprint.name, + location: new LatLng(0, 0), // This will be filled when the user clicks on the map to spawn the unit + skill: "High", + liveryID: "", + altitude: ftToM(spawnAltitude), + loadout: + props.blueprint.loadouts?.find((loadout) => { + return loadout.name === spawnLoadoutName; + })?.code ?? "", + }, + coalition: spawnCoalition, + }, + }); + } else { + if (getApp()?.getMap()?.getState() === SPAWN_UNIT) + getApp().getMap().setState(IDLE); + } + }); + + /* Get a list of all the roles */ + const roles: string[] = []; + (props.blueprint as UnitBlueprint).loadouts?.forEach((loadout) => { + loadout.roles.forEach((role) => { + !roles.includes(role) && roles.push(role); + }); + }); + + /* Initialize the role */ + spawnRole === "" && roles.length > 0 && setSpawnRole(roles[0]); + + /* Get a list of all the loadouts */ + const loadouts: LoadoutBlueprint[] = []; + (props.blueprint as UnitBlueprint).loadouts?.forEach((loadout) => { + loadout.roles.includes(spawnRole) && loadouts.push(loadout); + }); + + /* Initialize the loadout */ + spawnLoadoutName === "" && + loadouts.length > 0 && + setSpawnLoadout(loadouts[0].name); + const spawnLoadout = props.blueprint.loadouts?.find((loadout) => { + return loadout.name === spawnLoadoutName; + }); + + return ( +
+ +
+
+ { + spawnCoalition === "blue" && setSpawnCoalition("neutral"); + spawnCoalition === "neutral" && setSpawnCoalition("red"); + spawnCoalition === "red" && setSpawnCoalition("blue"); + }} + /> + { + setSpawnNumber(Math.max(minNumber, spawnNumber - 1)); + }} + onIncrease={() => { + setSpawnNumber(Math.min(maxNumber, spawnNumber + 1)); + }} + onChange={(ev) => { + !isNaN(Number(ev.target.value)) && + setSpawnNumber( + Math.max( + minNumber, + Math.min(maxNumber, Number(ev.target.value)) + ) + ); + }} + /> +
+
+
+
+ + Altitude + + {`${Intl.NumberFormat("en-US").format(spawnAltitude)} FT`} +
+ setSpawnAltitudeType(!spawnAltitudeType)} + /> +
+ setSpawnAltitude(Number(ev.target.value))} + value={spawnAltitude} + min={minAltitude} + max={maxAltitude} + step={altitudeStep} + /> +
+
+
+ + Role + +
+ + {roles.map((role) => { + return ( + { + setSpawnRole(role); + setSpawnLoadout(""); + }} + className={`w-full`} + > + {role} + + ); + })} + +
+
+
+ + Weapons + +
+ + {loadouts.map((loadout) => { + return ( + { + setSpawnLoadout(loadout.name); + }} + className={`w-full`} + > + + {loadout.name} + + + ); + })} + +
+
+
+ {spawnLoadout && + spawnLoadout.items.map((item) => { + return ( +
+
+ {item.quantity} +
+
+ {item.name} +
+
+ ); + })} +
+
+ ); +} diff --git a/frontend/react/src/ui/ui.css b/frontend/react/src/ui/ui.css new file mode 100644 index 00000000..084c9598 --- /dev/null +++ b/frontend/react/src/ui/ui.css @@ -0,0 +1,102 @@ +/* width */ +::-webkit-scrollbar { + width: 10px; +} + +/* Handle */ +::-webkit-scrollbar-thumb { + background: #ffffffaa; + border-radius: 10px; + cursor: pointer; +} + +/* Hide scrollbar for Chrome, Safari and Opera */ +.tiny-scrollbar::-webkit-scrollbar { + display: none; +} + +/* Hide scrollbar for IE, Edge and Firefox */ +.no-scrollbar { + -ms-overflow-style: none; + /* IE and Edge */ + scrollbar-width: none; + /* Firefox */ +} + +input[type="range"] { + /* removing default appearance */ + -webkit-appearance: none; + appearance: none; + /* creating a custom design */ + width: 100%; + cursor: pointer; + outline: none; + border-radius: 15px; + /* overflow: hidden; remove this line*/ + + /* New additions */ + height: 6px; + background: #4b5563; +} + +/* Thumb: webkit */ +input[type="range"]::-webkit-slider-thumb { + /* removing default appearance */ + -webkit-appearance: none; + appearance: none; + /* creating a custom design */ + height: 22px; + width: 22px; + background-color: #4b5563; + border-radius: 50%; + border: 1px solid #6b7280; + + /* box-shadow: -407px 0 0 400px #4B5563; emove this line */ + transition: 0.2s ease-in-out; +} + +/* Thumb: Firefox */ +input[type="range"]::-moz-range-thumb { + height: 15px; + width: 15px; + background-color: #4b5563; + border-radius: 50%; + border: none; + border: 1px solid #6b7280; + + /* box-shadow: -407px 0 0 400px #4B5563; emove this line */ + transition: 0.2s ease-in-out; +} + +/* Hover, active & focus Thumb: Webkit */ +input[type="range"]::-webkit-slider-thumb:hover { + box-shadow: 0 0 0 5px #3f83f822; +} +input[type="range"]:active::-webkit-slider-thumb { + box-shadow: 0 0 0 7px #3f83f855; +} +input[type="range"]:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 7px #3f83f855; +} + +/* Hover, active & focus Thumb: Firefox */ +input[type="range"]::-moz-range-thumb:hover { + box-shadow: 0 0 0 10px #3f83f822; +} +input[type="range"]:active::-moz-range-thumb { + box-shadow: 0 0 0 13px #3f83f855; +} +input[type="range"]:focus::-moz-range-thumb { + box-shadow: 0 0 0 13px #3f83f855; +} + +/* Hide scrollbar for Chrome, Safari and Opera */ +.no-scrollbar::-webkit-scrollbar { + display: none; +} + +/* Hide scrollbar for IE, Edge and Firefox */ +.no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} \ No newline at end of file diff --git a/frontend/react/src/ui/ui.tsx b/frontend/react/src/ui/ui.tsx new file mode 100644 index 00000000..b9193e92 --- /dev/null +++ b/frontend/react/src/ui/ui.tsx @@ -0,0 +1,249 @@ +import React, { useEffect, useState } from "react"; +import "./ui.css"; + +import { EventsProvider } from "../eventscontext"; +import { StateProvider } from "../statecontext"; + +import { Header } from "./panels/header"; +import { SpawnMenu } from "./panels/spawnmenu"; +import { UnitControlMenu } from "./panels/unitcontrolmenu"; +import { MainMenu } from "./panels/mainmenu"; +import { SideBar } from "./panels/sidebar"; +import { Options } from "./panels/options"; +import { MapHiddenTypes, MapOptions } from "../types/types"; +import { + BLUE_COMMANDER, + GAME_MASTER, + IDLE, + MAP_HIDDEN_TYPES_DEFAULTS, + MAP_OPTIONS_DEFAULTS, + RED_COMMANDER, +} from "../constants/constants"; +import { getApp, setupApp } from "../olympusapp"; +import { LoginModal } from "./modals/login"; +import { sha256 } from "js-sha256"; +import { MiniMapPanel } from "./panels/minimappanel"; +import { UnitMouseControlBar } from "./panels/unitmousecontrolbar"; + +export type OlympusState = { + mainMenuVisible: boolean; + spawnMenuVisible: boolean; + unitControlMenuVisible: boolean; + measureMenuVisible: boolean; + drawingMenuVisible: boolean; + optionsMenuVisible: boolean; + mapHiddenTypes: MapHiddenTypes; + mapOptions: MapOptions; +}; + +export function UI() { + var [loginModalVisible, setLoginModalVisible] = useState(true); + var [mainMenuVisible, setMainMenuVisible] = useState(false); + var [spawnMenuVisible, setSpawnMenuVisible] = useState(false); + var [unitControlMenuVisible, setUnitControlMenuVisible] = useState(false); + var [measureMenuVisible, setMeasureMenuVisible] = useState(false); + var [drawingMenuVisible, setDrawingMenuVisible] = useState(false); + var [optionsMenuVisible, setOptionsMenuVisible] = useState(false); + var [mapHiddenTypes, setMapHiddenTypes] = useState(MAP_HIDDEN_TYPES_DEFAULTS); + var [mapOptions, setMapOptions] = useState(MAP_OPTIONS_DEFAULTS); + var [checkingPassword, setCheckingPassword] = useState(false); + var [loginError, setLoginError] = useState(false); + var [commandMode, setCommandMode] = useState(null as null | string); + var [mapSources, setMapSources] = useState([] as string[]); + var [activeMapSource, setActiveMapSource] = useState(""); + var [mapBoxSelection, setMapBoxSelection] = useState(false); + + document.addEventListener("hiddenTypesChanged", (ev) => { + setMapHiddenTypes({ ...getApp().getMap().getHiddenTypes() }); + }); + + document.addEventListener("mapOptionsChanged", (ev) => { + setMapOptions({ ...getApp().getMap().getOptions() }); + }); + + document.addEventListener("mapStateChanged", (ev) => { + if ((ev as CustomEvent).detail == IDLE) { + hideAllMenus(); + } + }); + + document.addEventListener("mapSourceChanged", (ev) => { + var source = (ev as CustomEvent).detail; + if (source !== activeMapSource) setActiveMapSource(source); + }); + + document.addEventListener("configLoaded", (ev) => { + let config = getApp().getConfig(); + var sources = Object.keys(config.mapMirrors).concat( + Object.keys(config.mapLayers) + ); + setMapSources(sources); + setActiveMapSource(sources[0]); + }); + + document.addEventListener("mapForceBoxSelect", (ev) => { + setMapBoxSelection(true); + }); + + document.addEventListener("mapSelectionEnd", (ev) => { + setMapBoxSelection(false); + }); + + function hideAllMenus() { + setMainMenuVisible(false); + setSpawnMenuVisible(false); + setUnitControlMenuVisible(false); + setMeasureMenuVisible(false); + setDrawingMenuVisible(false); + setOptionsMenuVisible(false); + } + + function checkPassword(password: string) { + setCheckingPassword(true); + var hash = sha256.create(); + getApp().getServerManager().setPassword(hash.update(password).hex()); + getApp() + .getServerManager() + .getMission( + (response) => { + const commandMode = response.mission.commandModeOptions.commandMode; + try { + [GAME_MASTER, BLUE_COMMANDER, RED_COMMANDER].includes(commandMode) + ? setCommandMode(commandMode) + : setLoginError(true); + } catch { + setLoginError(true); + } + setCheckingPassword(false); + }, + () => { + setLoginError(true); + setCheckingPassword(false); + } + ); + } + + function connect(username: string) { + getApp().getServerManager().setUsername(username); + getApp().getServerManager().startUpdate(); + setLoginModalVisible(false); + } + + /* Temporary during devel */ + //useEffect(() => { + // window.setTimeout(() => { + // checkPassword("admin"); + // connect("devel"); + // }, 1000) + //}, []) + + return ( +
+ + { + hideAllMenus(); + setMainMenuVisible(!mainMenuVisible); + }, + toggleSpawnMenuVisible: () => { + hideAllMenus(); + setSpawnMenuVisible(!spawnMenuVisible); + }, + toggleUnitControlMenuVisible: () => { + hideAllMenus(); + setUnitControlMenuVisible(!unitControlMenuVisible); + }, + toggleMeasureMenuVisible: () => { + hideAllMenus(); + setMeasureMenuVisible(!measureMenuVisible); + }, + toggleDrawingMenuVisible: () => { + hideAllMenus(); + setDrawingMenuVisible(!drawingMenuVisible); + }, + toggleOptionsMenuVisible: () => { + hideAllMenus(); + setOptionsMenuVisible(!optionsMenuVisible); + }, + }} + > +
+
+
+ {loginModalVisible && ( + <> +
+ { + checkPassword(password); + }} + onContinue={(username) => { + connect(username); + }} + onBack={() => { + setCommandMode(null); + }} + checkingPassword={checkingPassword} + loginError={loginError} + commandMode={commandMode} + /> + + )} + + setMainMenuVisible(false)} + /> + setSpawnMenuVisible(false)} + /> + setOptionsMenuVisible(false)} + options={mapOptions} + /> + + setUnitControlMenuVisible(false)} + /> +
+ +
+
+ + +
+ ); +} diff --git a/frontend/react/src/unit/contextaction.ts b/frontend/react/src/unit/contextaction.ts new file mode 100644 index 00000000..c94a641c --- /dev/null +++ b/frontend/react/src/unit/contextaction.ts @@ -0,0 +1,74 @@ +import { IconDefinition } from "@fortawesome/fontawesome-svg-core"; +import { Unit } from "./unit"; +import { LatLng } from "leaflet"; + +export interface ContextActionOptions { + executeImmediately?: boolean; +} + +export type ContextActionCallback = ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null +) => void; + +export class ContextAction { + #id: string = ""; + #label: string = ""; + #description: string = ""; + #callback: ContextActionCallback | null = null; + #units: Unit[] = []; + #icon: IconDefinition; + #options: ContextActionOptions; + + constructor( + id: string, + label: string, + description: string, + icon: IconDefinition, + callback: ContextActionCallback, + options: ContextActionOptions + ) { + this.#id = id; + this.#label = label; + this.#description = description; + this.#callback = callback; + this.#icon = icon; + this.#options = { + executeImmediately: false, + ...options, + }; + } + + addUnit(unit: Unit) { + this.#units.push(unit); + } + + getId() { + return this.#id; + } + + getLabel() { + return this.#label; + } + + getOptions() { + return this.#options; + } + + getDescription() { + return this.#description; + } + + getCallback() { + return this.#callback; + } + + getIcon() { + return this.#icon; + } + + executeCallback(targetUnit: Unit | null, targetPosition: LatLng | null) { + if (this.#callback) this.#callback(this.#units, targetUnit, targetPosition); + } +} diff --git a/frontend/react/src/unit/contextactionset.ts b/frontend/react/src/unit/contextactionset.ts new file mode 100644 index 00000000..461cb795 --- /dev/null +++ b/frontend/react/src/unit/contextactionset.ts @@ -0,0 +1,39 @@ +import { + ContextAction, + ContextActionCallback, + ContextActionOptions, +} from "./contextaction"; +import { Unit } from "./unit"; +import { IconDefinition } from "@fortawesome/fontawesome-svg-core"; + +export class ContextActionSet { + #contextActions: { [key: string]: ContextAction } = {}; + + addContextAction( + unit: Unit, + id: string, + label: string, + description: string, + icon: IconDefinition, + callback: ContextActionCallback, + options?: ContextActionOptions + ) { + options = options || {}; + + if (!(id in this.#contextActions)) { + this.#contextActions[id] = new ContextAction( + id, + label, + description, + icon, + callback, + options + ); + } + this.#contextActions[id].addUnit(unit); + } + + getContextActions() { + return this.#contextActions; + } +} diff --git a/frontend/react/src/unit/databases/aircraftdatabase.ts b/frontend/react/src/unit/databases/aircraftdatabase.ts new file mode 100644 index 00000000..f581114b --- /dev/null +++ b/frontend/react/src/unit/databases/aircraftdatabase.ts @@ -0,0 +1,37 @@ +import { getApp } from "../../olympusapp"; +import { GAME_MASTER } from "../../constants/constants"; +import { UnitDatabase } from "./unitdatabase"; + +export class AircraftDatabase extends UnitDatabase { + constructor() { + super( + window.location.href.split("?")[0].replace("vite/", "") + + "api/databases/units/aircraftdatabase" + ); + } + + getCategory() { + return "Aircraft"; + } + + getSpawnPointsByName(name: string) { + if ( + getApp().getMissionManager().getCommandModeOptions().commandMode == + GAME_MASTER || + !getApp().getMissionManager().getCommandModeOptions().restrictSpawns + ) + return 0; + + const blueprint = this.getByName(name); + if (blueprint?.cost != undefined) return blueprint?.cost; + + if (blueprint?.era == "WW2") return 20; + else if (blueprint?.era == "Early Cold War") return 50; + else if (blueprint?.era == "Mid Cold War") return 100; + else if (blueprint?.era == "Late Cold War") return 200; + else if (blueprint?.era == "Modern") return 400; + return 0; + } +} + +export var aircraftDatabase = new AircraftDatabase(); diff --git a/frontend/react/src/unit/databases/citiesdatabase.ts b/frontend/react/src/unit/databases/citiesdatabase.ts new file mode 100644 index 00000000..58105361 --- /dev/null +++ b/frontend/react/src/unit/databases/citiesdatabase.ts @@ -0,0 +1,7137 @@ +export var citiesDatabase: { lat: number; lng: number; pop: number }[] = [ + { + lat: 41.0136, + lng: 28.955, + pop: 16079000, + }, + { + lat: 39.93, + lng: 32.85, + pop: 5503985, + }, + { + lat: 31.9497, + lng: 35.9328, + pop: 4007526, + }, + { + lat: 25.2631, + lng: 55.2972, + pop: 3331420, + }, + { + lat: 29.3697, + lng: 47.9783, + pop: 3000000, + }, + { + lat: 40.1833, + lng: 29.05, + pop: 2901396, + }, + { + lat: 36.8874, + lng: 30.7075, + pop: 2426356, + }, + { + lat: 32.6447, + lng: 51.6675, + pop: 2219343, + }, + { + lat: 36.2333, + lng: -115.2654, + pop: 2150373, + }, + { + lat: 37.0628, + lng: 37.3792, + pop: 2028563, + }, + { + lat: 37.1583, + lng: 38.7917, + pop: 1985753, + }, + { + lat: 36.2, + lng: 37.16, + pop: 1916781, + }, + { + lat: 36.8, + lng: 34.6333, + pop: 1814468, + }, + { + lat: 37, + lng: 35.3213, + pop: 1765981, + }, + { + lat: 33.5131, + lng: 36.2919, + pop: 1754000, + }, + { + lat: 29.61, + lng: 52.5425, + pop: 1565572, + }, + { + lat: 24.4667, + lng: 54.3667, + pop: 1483000, + }, + { + lat: 23.6139, + lng: 58.5922, + pop: 1421409, + }, + { + lat: 32.08, + lng: 34.78, + pop: 1388400, + }, + { + lat: 41.2903, + lng: 36.3336, + pop: 1335716, + }, + { + lat: 30.515, + lng: 47.81, + pop: 1326564, + }, + { + lat: 31.3203, + lng: 48.6692, + pop: 1261042, + }, + { + lat: 25.3575, + lng: 55.3908, + pop: 1247749, + }, + { + lat: 41.0167, + lng: 39.55, + pop: 1215351, + }, + { + lat: 25.2867, + lng: 51.5333, + pop: 1186023, + }, + { + lat: 47.2333, + lng: 39.7, + pop: 1137704, + }, + { + lat: 41.7225, + lng: 44.7925, + pop: 1118035, + }, + { + lat: 40.1814, + lng: 44.5144, + pop: 1075800, + }, + { + lat: 46.4775, + lng: 30.7326, + pop: 1017699, + }, + { + lat: 47.0228, + lng: 28.8353, + pop: 702300, + }, + { + lat: 26.225, + lng: 50.5775, + pop: 436000, + }, + { + lat: 33.8869, + lng: 35.5131, + pop: 361366, + }, + { + lat: 35.1725, + lng: 33.365, + pop: 330000, + }, + { + lat: 15.2137, + lng: 145.7546, + pop: 2500, + }, + { + lat: 13.4745, + lng: 144.7504, + pop: 1051, + }, + { + lat: 45.0333, + lng: 38.9667, + pop: 948827, + }, + { + lat: 39.9244, + lng: 32.8856, + pop: 914501, + }, + { + lat: 41.047, + lng: 28.658, + pop: 891120, + }, + { + lat: 26.4333, + lng: 50.1, + pop: 903312, + }, + { + lat: 39.7767, + lng: 30.5206, + pop: 871187, + }, + { + lat: 36.9831, + lng: 35.3328, + pop: 792536, + }, + { + lat: 41.0344, + lng: 28.8564, + pop: 734369, + }, + { + lat: 34.7333, + lng: 36.7167, + pop: 775404, + }, + { + lat: 41, + lng: 28.8, + pop: 770317, + }, + { + lat: 39.9086, + lng: 41.2769, + pop: 767848, + }, + { + lat: 24.2075, + lng: 55.7447, + pop: 766936, + }, + { + lat: 30.2833, + lng: 57.0833, + pop: 738374, + }, + { + lat: 35.5167, + lng: 35.7833, + pop: 700000, + }, + { + lat: 35.1333, + lng: 36.75, + pop: 696863, + }, + { + lat: 40.8747, + lng: 29.235, + pop: 693599, + }, + { + lat: 25.3833, + lng: 49.5833, + pop: 660788, + }, + { + lat: 40.11, + lng: 29.0821, + pop: 643681, + }, + { + lat: 25.25, + lng: 51.4, + pop: 605712, + }, + { + lat: 32.8192, + lng: 34.9992, + pop: 600000, + }, + { + lat: 42.9833, + lng: 47.4833, + pop: 592976, + }, + { + lat: 35.3529, + lng: -119.0359, + pop: 590845, + }, + { + lat: 29.4964, + lng: 60.8628, + pop: 587730, + }, + { + lat: 32.3399, + lng: 36.2052, + pop: 580000, + }, + { + lat: 32.55, + lng: 35.85, + pop: 569068, + }, + { + lat: 34.4367, + lng: 35.8344, + pop: 530000, + }, + { + lat: 46.35, + lng: 48.035, + pop: 532504, + }, + { + lat: 31.8822, + lng: 54.3397, + pop: 529673, + }, + { + lat: 27.1833, + lng: 56.2667, + pop: 526648, + }, + { + lat: 26.556, + lng: 49.996, + pop: 524182, + }, + { + lat: 44.605, + lng: 33.5225, + pop: 522057, + }, + { + lat: 46.975, + lng: 31.995, + pop: 498748, + }, + { + lat: 32.3436, + lng: 62.1194, + pop: 500000, + }, + { + lat: 25.4136, + lng: 55.4456, + pop: 490035, + }, + { + lat: 32.0833, + lng: 36.1, + pop: 481300, + }, + { + lat: 40.8872, + lng: 29.19, + pop: 461155, + }, + { + lat: 41.0719, + lng: 28.9664, + pop: 437026, + }, + { + lat: 41.0339, + lng: 28.8903, + pop: 444561, + }, + { + lat: 45.05, + lng: 41.9833, + pop: 450680, + }, + { + lat: 47.0958, + lng: 37.5494, + pop: 449498, + }, + { + lat: 40.9792, + lng: 28.7214, + pop: 435625, + }, + { + lat: 37.5833, + lng: 36.9333, + pop: 443575, + }, + { + lat: 41.005, + lng: 39.7225, + pop: 426882, + }, + { + lat: 43.5853, + lng: 39.7203, + pop: 411524, + }, + { + lat: 36.9981, + lng: 35.3439, + pop: 407054, + }, + { + lat: 29.35, + lng: 47.6833, + pop: 393432, + }, + { + lat: 27, + lng: 49.6544, + pop: 392948, + }, + { + lat: 34.5277, + lng: -117.3536, + pop: 389060, + }, + { + lat: 23.5333, + lng: 58.3833, + pop: 383257, + }, + { + lat: 34.6935, + lng: -118.1753, + pop: 381732, + }, + { + lat: 36.2025, + lng: 36.1606, + pop: 377793, + }, + { + lat: 39.75, + lng: 37.0167, + pop: 377561, + }, + { + lat: 40.8, + lng: 29.4333, + pop: 371000, + }, + { + lat: 30.3392, + lng: 48.3042, + pop: 370180, + }, + { + lat: 30.3833, + lng: 47.7, + pop: 370000, + }, + { + lat: 40.7625, + lng: 29.9175, + pop: 363416, + }, + { + lat: 43.2167, + lng: 27.9167, + pop: 348668, + }, + { + lat: 44.9484, + lng: 34.1, + pop: 341799, + }, + { + lat: 41.1669, + lng: 29.0572, + pop: 342503, + }, + { + lat: 36.9165, + lng: 34.8951, + pop: 339676, + }, + { + lat: 40.9683, + lng: 29.2617, + pop: 327798, + }, + { + lat: 41.0011, + lng: 28.6419, + pop: 331525, + }, + { + lat: 40.6828, + lng: 46.3606, + pop: 331400, + }, + { + lat: 39.6333, + lng: 27.8833, + pop: 331788, + }, + { + lat: 41.0225, + lng: 28.8717, + pop: 289331, + }, + { + lat: 36.55, + lng: 32, + pop: 312319, + }, + { + lat: 36.0133, + lng: -115.0381, + pop: 311250, + }, + { + lat: 43.04, + lng: 44.6775, + pop: 306978, + }, + { + lat: 35.95, + lng: 39.01, + pop: 299824, + }, + { + lat: 36.5817, + lng: 36.165, + pop: 297943, + }, + { + lat: 25.4416, + lng: 49.6642, + pop: 298562, + }, + { + lat: 40.5455, + lng: 34.957, + pop: 294807, + }, + { + lat: 43.3125, + lng: 45.6986, + pop: 291687, + }, + { + lat: 46.6425, + lng: 32.625, + pop: 291428, + }, + { + lat: 32.0178, + lng: 36.0464, + pop: 280000, + }, + { + lat: 44.1667, + lng: 28.6333, + pop: 283872, + }, + { + lat: 41.15, + lng: 27.8, + pop: 279251, + }, + { + lat: 31.5831, + lng: 64.3692, + pop: 276831, + }, + { + lat: 34.4175, + lng: -118.4964, + pop: 275230, + }, + { + lat: 44.7167, + lng: 37.75, + pop: 273278, + }, + { + lat: 40.7833, + lng: 30.4, + pop: 271515, + }, + { + lat: 35.3333, + lng: 40.15, + pop: 271800, + }, + { + lat: 41.1856, + lng: 28.7406, + pop: 270549, + }, + { + lat: 43.4833, + lng: 43.6167, + pop: 265162, + }, + { + lat: 40.0806, + lng: 29.5097, + pop: 268155, + }, + { + lat: 32.3825, + lng: 48.4019, + pop: 264709, + }, + { + lat: 37.075, + lng: 36.25, + pop: 264373, + }, + { + lat: 36.2883, + lng: -115.0888, + pop: 259638, + }, + { + lat: 40.8161, + lng: 29.3006, + pop: 255468, + }, + { + lat: 31.95, + lng: 34.8, + pop: 249860, + }, + { + lat: 41.0369, + lng: 29.1786, + pop: 251937, + }, + { + lat: 47.2167, + lng: 38.9167, + pop: 250287, + }, + { + lat: 37.1939, + lng: 40.5861, + pop: 252656, + }, + { + lat: 45.4233, + lng: 28.0425, + pop: 249432, + }, + { + lat: 36.3276, + lng: -119.3269, + pop: 249804, + }, + { + lat: 41.02, + lng: 28.5775, + pop: 247736, + }, + { + lat: 32.7003, + lng: 51.5211, + pop: 247128, + }, + { + lat: 41.1342, + lng: 29.0922, + pop: 246700, + }, + { + lat: 32.0889, + lng: 34.8864, + pop: 236169, + }, + { + lat: 40.8417, + lng: 31.1583, + pop: 240633, + }, + { + lat: 30.4411, + lng: 47.9725, + pop: 240300, + }, + { + lat: 34.6747, + lng: 33.0442, + pop: 235056, + }, + { + lat: 23.6703, + lng: 58.1891, + pop: 237816, + }, + { + lat: 32.6347, + lng: 51.3653, + pop: 235281, + }, + { + lat: 36.7833, + lng: 31.4333, + pop: 230597, + }, + { + lat: 40.9833, + lng: 37.8833, + pop: 229214, + }, + { + lat: 28.9264, + lng: 50.8514, + pop: 223504, + }, + { + lat: 26.2833, + lng: 50.2, + pop: 219679, + }, + { + lat: 36.0091, + lng: -115.2278, + pop: 219566, + }, + { + lat: 32.3286, + lng: 34.8567, + pop: 217244, + }, + { + lat: 36.0952, + lng: -115.2636, + pop: 217441, + }, + { + lat: 23.6167, + lng: 58.5667, + pop: 214901, + }, + { + lat: 33.5606, + lng: 35.3758, + pop: 200000, + }, + { + lat: 33.8936, + lng: 35.5403, + pop: 150000, + }, + { + lat: 32.0833, + lng: 34.8333, + pop: 193774, + }, + { + lat: 40.7347, + lng: 31.6075, + pop: 205525, + }, + { + lat: 32.0167, + lng: 34.7667, + pop: 194300, + }, + { + lat: 32.8667, + lng: 59.2167, + pop: 203636, + }, + { + lat: 25.69, + lng: 51.51, + pop: 202031, + }, + { + lat: 40.3139, + lng: 36.5542, + pop: 201294, + }, + { + lat: 34.4285, + lng: -119.7202, + pop: 198240, + }, + { + lat: 36.1783, + lng: -115.0487, + pop: 196411, + }, + { + lat: 37.2306, + lng: 39.7653, + pop: 195910, + }, + { + lat: 37.1847, + lng: 38.7908, + pop: 195552, + }, + { + lat: 37.1819, + lng: 33.2181, + pop: 194018, + }, + { + lat: 39.8417, + lng: 33.5139, + pop: 193093, + }, + { + lat: 45, + lng: 41.1167, + pop: 190709, + }, + { + lat: 32.3311, + lng: 50.8594, + pop: 190441, + }, + { + lat: 36.0872, + lng: -115.1355, + pop: 189852, + }, + { + lat: 36.5117, + lng: 40.7422, + pop: 188160, + }, + { + lat: 37.05, + lng: 41.22, + pop: 184231, + }, + { + lat: 45.2692, + lng: 27.9575, + pop: 180302, + }, + { + lat: 41.2792, + lng: 31.4208, + pop: 175605, + }, + { + lat: 29.437, + lng: 55.6802, + pop: 175000, + }, + { + lat: 33.2708, + lng: 35.1961, + pop: 160000, + }, + { + lat: 32.8667, + lng: 51.5667, + pop: 173329, + }, + { + lat: 41.6458, + lng: 41.6417, + pop: 169095, + }, + { + lat: 32.07, + lng: 34.8236, + pop: 159200, + }, + { + lat: 23.8494, + lng: 57.4386, + pop: 170000, + }, + { + lat: 31.8667, + lng: 36, + pop: 169434, + }, + { + lat: 34.5944, + lng: -118.1057, + pop: 167987, + }, + { + lat: 41.2833, + lng: 28, + pop: 166789, + }, + { + lat: 40.7833, + lng: 29.7333, + pop: 165503, + }, + { + lat: 35.9333, + lng: 36.6333, + pop: 165000, + }, + { + lat: 29.1322, + lng: 48.1261, + pop: 164212, + }, + { + lat: 40.6667, + lng: 29.8333, + pop: 162584, + }, + { + lat: 30.5589, + lng: 49.1981, + pop: 162797, + }, + { + lat: 30.4067, + lng: 55.9939, + pop: 161909, + }, + { + lat: 25.3722, + lng: 51.2047, + pop: 161240, + }, + { + lat: 30.96, + lng: 61.86, + pop: 160902, + }, + { + lat: 37.0289, + lng: 35.8125, + pop: 160474, + }, + { + lat: 32.2222, + lng: 35.2611, + pop: 156906, + }, + { + lat: 39.7464, + lng: 39.4914, + pop: 157452, + }, + { + lat: 32.5589, + lng: 36.0147, + pop: 155693, + }, + { + lat: 34.447, + lng: 35.8178, + pop: 150000, + }, + { + lat: 29.2694, + lng: 51.22, + pop: 155567, + }, + { + lat: 41.6344, + lng: 32.3375, + pop: 155016, + }, + { + lat: 46.8489, + lng: 35.3675, + pop: 154992, + }, + { + lat: 40.35, + lng: 27.9667, + pop: 154359, + }, + { + lat: 26.65, + lng: 50.1667, + pop: 153933, + }, + { + lat: 24.362, + lng: 56.7344, + pop: 151349, + }, + { + lat: 45.3619, + lng: 36.4711, + pop: 149566, + }, + { + lat: 42.25, + lng: 42.7, + pop: 147900, + }, + { + lat: 39.7186, + lng: 43.0508, + pop: 149188, + }, + { + lat: 32.3325, + lng: 35.7517, + pop: 148870, + }, + { + lat: 40.65, + lng: 35.8331, + pop: 149084, + }, + { + lat: 41.3764, + lng: 33.7764, + pop: 148931, + }, + { + lat: 29.8742, + lng: 52.8025, + pop: 148858, + }, + { + lat: 26.0031, + lng: 63.0544, + pop: 147791, + }, + { + lat: 44.05, + lng: 43.0667, + pop: 145836, + }, + { + lat: 32.6189, + lng: 36.1021, + pop: 146481, + }, + { + lat: 40.6556, + lng: 29.275, + pop: 144407, + }, + { + lat: 37.5167, + lng: 34.05, + pop: 145389, + }, + { + lat: 43.25, + lng: 46.5833, + pop: 141259, + }, + { + lat: 33.4472, + lng: 36.3361, + pop: 136427, + }, + { + lat: 37.332, + lng: 42.187, + pop: 143124, + }, + { + lat: 37.01, + lng: 37.7972, + pop: 142389, + }, + { + lat: 44.6, + lng: 40.0833, + pop: 141970, + }, + { + lat: 41.0247, + lng: 40.5222, + pop: 141143, + }, + { + lat: 28.5, + lng: 53.5606, + pop: 141634, + }, + { + lat: 41.1992, + lng: 36.7275, + pop: 138840, + }, + { + lat: 32.0167, + lng: 34.75, + pop: 128800, + }, + { + lat: 41.0736, + lng: 28.2478, + pop: 137861, + }, + { + lat: 39.9208, + lng: 44.0444, + pop: 137613, + }, + { + lat: 46.8403, + lng: 29.6433, + pop: 133807, + }, + { + lat: 40.9153, + lng: 38.3894, + pop: 135920, + }, + { + lat: 40.0528, + lng: 47.4614, + pop: 136000, + }, + { + lat: 32.46, + lng: 48.3592, + pop: 135116, + }, + { + lat: 32.0089, + lng: 51.8667, + pop: 134952, + }, + { + lat: 31.0286, + lng: 61.5011, + pop: 134950, + }, + { + lat: 33.8, + lng: 35.6, + pop: 130000, + }, + { + lat: 31.8981, + lng: 34.8081, + pop: 132671, + }, + { + lat: 33.4833, + lng: 36.35, + pop: 114363, + }, + { + lat: 30.4397, + lng: 48.1664, + pop: 133097, + }, + { + lat: 41.1986, + lng: 32.6264, + pop: 131989, + }, + { + lat: 41.5472, + lng: 45.0111, + pop: 128680, + }, + { + lat: 43.9167, + lng: 42.7167, + pop: 128779, + }, + { + lat: 37.45, + lng: 35.8, + pop: 130495, + }, + { + lat: 28.6781, + lng: 57.7406, + pop: 130429, + }, + { + lat: 40.8265, + lng: 29.3745, + pop: 129655, + }, + { + lat: 47.1667, + lng: 39.7333, + pop: 126769, + }, + { + lat: 33.464, + lng: 36.3044, + pop: 101827, + }, + { + lat: 37.0758, + lng: -113.5752, + pop: 127890, + }, + { + lat: 42.8803, + lng: 47.6383, + pop: 123988, + }, + { + lat: 29.1061, + lng: 58.3569, + pop: 127396, + }, + { + lat: 41.1333, + lng: 37.2833, + pop: 126702, + }, + { + lat: 33.5711, + lng: 36.4011, + pop: 123494, + }, + { + lat: 40.7894, + lng: 43.8475, + pop: 121976, + }, + { + lat: 36.9167, + lng: 31.1, + pop: 124335, + }, + { + lat: 37.3697, + lng: 36.1, + pop: 124053, + }, + { + lat: 44.2222, + lng: 42.0575, + pop: 122395, + }, + { + lat: 42.05, + lng: 48.3, + pop: 123720, + }, + { + lat: 30.5958, + lng: 50.2417, + pop: 122604, + }, + { + lat: 13.4692, + lng: 144.7332, + pop: 122411, + }, + { + lat: 36.085, + lng: 35.9806, + pop: 121109, + }, + { + lat: 41.4564, + lng: 31.7986, + pop: 120395, + }, + { + lat: 23.3908, + lng: 57.4244, + pop: 120000, + }, + { + lat: 43.2167, + lng: 44.7667, + pop: 117936, + }, + { + lat: 36.3761, + lng: 33.9322, + pop: 119303, + }, + { + lat: 44.6333, + lng: 41.9333, + pop: 117446, + }, + { + lat: 36.8278, + lng: -119.683, + pop: 118488, + }, + { + lat: 40.7333, + lng: 29.9667, + pop: 118066, + }, + { + lat: 41.3333, + lng: 27.9667, + pop: 116882, + }, + { + lat: 33.9697, + lng: 35.6156, + pop: 102221, + }, + { + lat: 41.0333, + lng: 37.5, + pop: 116154, + }, + { + lat: 25.7667, + lng: 55.95, + pop: 115949, + }, + { + lat: 36.7167, + lng: 37.1167, + pop: 116034, + }, + { + lat: 26.475, + lng: 50.0417, + pop: 115000, + }, + { + lat: 40.6078, + lng: 43.0958, + pop: 115891, + }, + { + lat: 46.7556, + lng: 36.7889, + pop: 114205, + }, + { + lat: 44.0333, + lng: 42.85, + pop: 113056, + }, + { + lat: 22.5667, + lng: 58.1167, + pop: 115040, + }, + { + lat: 31.5231, + lng: 49.8861, + pop: 114343, + }, + { + lat: 27.2025, + lng: 60.6847, + pop: 113750, + }, + { + lat: 37.4167, + lng: 41.3697, + pop: 113367, + }, + { + lat: 36.7108, + lng: 38.9478, + pop: 113194, + }, + { + lat: 33.8333, + lng: 35.9167, + pop: 100000, + }, + { + lat: 24.1456, + lng: 49.0653, + pop: 111214, + }, + { + lat: 28.9383, + lng: 53.6483, + pop: 110825, + }, + { + lat: 35.0118, + lng: 37.0525, + pop: 110683, + }, + { + lat: 45.1939, + lng: 33.3681, + pop: 108248, + }, + { + lat: 30.6683, + lng: 51.5881, + pop: 108505, + }, + { + lat: 30.0342, + lng: 47.9294, + pop: 107620, + }, + { + lat: 32.1714, + lng: 34.9083, + pop: 100800, + }, + { + lat: 39.5736, + lng: -119.7161, + pop: 106900, + }, + { + lat: 36.0778, + lng: 37.3733, + pop: 106460, + }, + { + lat: 25.2919, + lng: 60.6431, + pop: 106739, + }, + { + lat: 40.77, + lng: 47.0489, + pop: 106100, + }, + { + lat: 37.075, + lng: 41.2153, + pop: 105856, + }, + { + lat: 39.8208, + lng: 34.8083, + pop: 105167, + }, + { + lat: 29.9758, + lng: 48.4722, + pop: 105080, + }, + { + lat: 36.9764, + lng: 38.4269, + pop: 104302, + }, + { + lat: 46.3167, + lng: 44.2667, + pop: 103535, + }, + { + lat: 32.0456, + lng: 48.8567, + pop: 101878, + }, + { + lat: 23.2325, + lng: 56.4973, + pop: 101640, + }, + { + lat: 31.9364, + lng: 49.3039, + pop: 100497, + }, + { + lat: 32.1653, + lng: 34.8458, + pop: 93989, + }, + { + lat: 40.5986, + lng: 33.6192, + pop: 96025, + }, + { + lat: 40.8128, + lng: 44.4883, + pop: 90525, + }, + { + lat: 25.1223, + lng: 56.3342, + pop: 93673, + }, + { + lat: 46.8333, + lng: 29.4833, + pop: 91882, + }, + { + lat: 43.5667, + lng: 27.8333, + pop: 90419, + }, + { + lat: 34.8833, + lng: 35.8833, + pop: 89457, + }, + { + lat: 32.0333, + lng: 35.7333, + pop: 88900, + }, + { + lat: 33.3833, + lng: 35.45, + pop: 80000, + }, + { + lat: 25.18, + lng: 51.61, + pop: 87970, + }, + { + lat: 33.45, + lng: 36.25, + pop: 84044, + }, + { + lat: 37.3131, + lng: 40.735, + pop: 86948, + }, + { + lat: 34.9167, + lng: 33.6333, + pop: 84900, + }, + { + lat: 35.8367, + lng: 38.5481, + pop: 84000, + }, + { + lat: 32.7019, + lng: 35.3033, + pop: 83400, + }, + { + lat: 40.1431, + lng: 29.9792, + pop: 81723, + }, + { + lat: 32.1833, + lng: 34.8667, + pop: 74000, + }, + { + lat: 26.25, + lng: 50.6167, + pop: 75000, + }, + { + lat: 31.9275, + lng: 34.8625, + pop: 75500, + }, + { + lat: 45.19, + lng: 28.8, + pop: 73707, + }, + { + lat: 39.9323, + lng: 48.9203, + pop: 70684, + }, + { + lat: 22.9333, + lng: 57.5333, + pop: 72076, + }, + { + lat: 32.0714, + lng: 34.81, + pop: 59518, + }, + { + lat: 33.2631, + lng: 35.2389, + pop: 61973, + }, + { + lat: 44.15, + lng: 43.4667, + pop: 67054, + }, + { + lat: 24.2592, + lng: 55.7839, + pop: 67963, + }, + { + lat: 41.2, + lng: 47.1667, + pop: 68360, + }, + { + lat: 42.8167, + lng: 47.1167, + pop: 65080, + }, + { + lat: 40.2597, + lng: 40.2278, + pop: 66633, + }, + { + lat: 34.7667, + lng: 32.4167, + pop: 63600, + }, + { + lat: 32.7125, + lng: 36.5667, + pop: 64730, + }, + { + lat: 43, + lng: 41.0167, + pop: 64441, + }, + { + lat: 46.6383, + lng: 27.7292, + pop: 63035, + }, + { + lat: 46.3017, + lng: 30.6569, + pop: 59800, + }, + { + lat: 26.219, + lng: 50.538, + pop: 44769, + }, + { + lat: 32.15, + lng: 34.8833, + pop: 56659, + }, + { + lat: 40.6172, + lng: 47.15, + pop: 59036, + }, + { + lat: 32.8, + lng: 35.1, + pop: 55464, + }, + { + lat: 32.0956, + lng: 34.9567, + pop: 56300, + }, + { + lat: 46.2167, + lng: 27.6667, + pop: 55837, + }, + { + lat: 33.4728, + lng: 36.3344, + pop: 50880, + }, + { + lat: 39.1511, + lng: -119.7476, + pop: 57957, + }, + { + lat: 32.5194, + lng: 35.1536, + pop: 55300, + }, + { + lat: 40.4597, + lng: 39.4778, + pop: 57269, + }, + { + lat: 26.1128, + lng: 50.5139, + pop: 52700, + }, + { + lat: 32.1903, + lng: 34.9686, + pop: 51683, + }, + { + lat: 31.9333, + lng: 34.8, + pop: 50200, + }, + { + lat: 33.5186, + lng: 35.3661, + pop: 50000, + }, + { + lat: 40.5, + lng: 44.7667, + pop: 52808, + }, + { + lat: 32.0636, + lng: 34.8553, + pop: 41900, + }, + { + lat: 33.5667, + lng: 36.3667, + pop: 45974, + }, + { + lat: 32.2723, + lng: 35.8914, + pop: 50745, + }, + { + lat: 41.9817, + lng: 44.1124, + pop: 48143, + }, + { + lat: 40.2739, + lng: 44.6256, + pop: 44400, + }, + { + lat: 32.0522, + lng: 34.9511, + pop: 46896, + }, + { + lat: 34.1236, + lng: 35.6511, + pop: 40000, + }, + { + lat: 32.15, + lng: 34.8333, + pop: 46700, + }, + { + lat: 26.1736, + lng: 50.5478, + pop: 40000, + }, + { + lat: 32.9136, + lng: 35.2961, + pop: 45300, + }, + { + lat: 31.8558, + lng: 34.73, + pop: 42314, + }, + { + lat: 36.1008, + lng: -115.0379, + pop: 45105, + }, + { + lat: 42.5083, + lng: 41.8667, + pop: 42998, + }, + { + lat: 32.8333, + lng: 35.0833, + pop: 39900, + }, + { + lat: 25.5533, + lng: 55.5475, + pop: 44411, + }, + { + lat: 32.0333, + lng: 34.85, + pop: 36706, + }, + { + lat: 32.8056, + lng: 35.1694, + pop: 41600, + }, + { + lat: 40.15, + lng: 44.04, + pop: 38635, + }, + { + lat: 41.1111, + lng: 42.7022, + pop: 42226, + }, + { + lat: 34.4, + lng: 35.9, + pop: 30000, + }, + { + lat: 35.125, + lng: 33.9417, + pop: 40920, + }, + { + lat: 40.8297, + lng: 46.0189, + pop: 40600, + }, + { + lat: 41.4708, + lng: 48.8097, + pop: 39900, + }, + { + lat: 40.3744, + lng: 47.1267, + pop: 38500, + }, + { + lat: 33.1256, + lng: 35.8239, + pop: 37022, + }, + { + lat: 40.6531, + lng: 47.7406, + pop: 36200, + }, + { + lat: 36.1365, + lng: -115.137, + pop: 36307, + }, + { + lat: 32.0333, + lng: 34.8833, + pop: 29146, + }, + { + lat: 41.0933, + lng: 45.3661, + pop: 35102, + }, + { + lat: 41.1833, + lng: 41.8181, + pop: 35081, + }, + { + lat: 32.0781, + lng: 34.8475, + pop: 25298, + }, + { + lat: 22.6833, + lng: 58.55, + pop: 35000, + }, + { + lat: 33.92, + lng: 35.67, + pop: 28000, + }, + { + lat: 25.2525, + lng: 51.5592, + pop: 29703, + }, + { + lat: 35.3403, + lng: 33.3192, + pop: 33207, + }, + { + lat: 33.1258, + lng: 35.4428, + pop: 30000, + }, + { + lat: 42.1167, + lng: 48.1833, + pop: 29716, + }, + { + lat: 41.6336, + lng: 46.6433, + pop: 31300, + }, + { + lat: 39.8697, + lng: 48.06, + pop: 31310, + }, + { + lat: 40.0128, + lng: 48.4789, + pop: 30918, + }, + { + lat: 47.2167, + lng: 27.8167, + pop: 30804, + }, + { + lat: 32.3171, + lng: 34.9358, + pop: 28025, + }, + { + lat: 33.5, + lng: 36.3667, + pop: 22535, + }, + { + lat: 45.9167, + lng: 28.1836, + pop: 30018, + }, + { + lat: 40.4097, + lng: 44.6431, + pop: 25039, + }, + { + lat: 40.65, + lng: 47.4761, + pop: 29600, + }, + { + lat: 35.3683, + lng: -118.9225, + pop: 29110, + }, + { + lat: 32.2322, + lng: 34.9483, + pop: 26200, + }, + { + lat: 26.12, + lng: 50.65, + pop: 20000, + }, + { + lat: 40.5905, + lng: 46.3239, + pop: 25758, + }, + { + lat: 34.0063, + lng: 36.2073, + pop: 24000, + }, + { + lat: 32.1151, + lng: 34.9751, + pop: 21848, + }, + { + lat: 33.8333, + lng: 35.5333, + pop: 9000, + }, + { + lat: 32.2822, + lng: 34.9833, + pop: 21451, + }, + { + lat: 39.9539, + lng: 44.5506, + pop: 21300, + }, + { + lat: 40.2975, + lng: 44.3617, + pop: 21600, + }, + { + lat: 40.8792, + lng: 45.1472, + pop: 20509, + }, + { + lat: 40.0433, + lng: 48.9356, + pop: 21504, + }, + { + lat: 47.3833, + lng: 28.8167, + pop: 21065, + }, + { + lat: 26.1497, + lng: 50.4653, + pop: 18000, + }, + { + lat: 26.2186, + lng: 50.4756, + pop: 18000, + }, + { + lat: 40.3589, + lng: 45.1267, + pop: 20765, + }, + { + lat: 41.3597, + lng: 48.5125, + pop: 20791, + }, + { + lat: 40.79, + lng: 48.1519, + pop: 20660, + }, + { + lat: 40.5692, + lng: 48.4008, + pop: 20200, + }, + { + lat: 41.1189, + lng: 45.4539, + pop: 20200, + }, + { + lat: 46.3167, + lng: 28.6667, + pop: 20113, + }, + { + lat: 34.2264, + lng: 35.66, + pop: 9613, + }, + { + lat: 33.4292, + lng: 36.3611, + pop: 12330, + }, + { + lat: 33.8219, + lng: 35.5875, + pop: 13000, + }, + { + lat: 41.9167, + lng: 45.4833, + pop: 19629, + }, + { + lat: 41.0761, + lng: 49.1139, + pop: 18655, + }, + { + lat: 34.7024, + lng: 33.0453, + pop: 14477, + }, + { + lat: 47.1333, + lng: 28.6167, + pop: 18376, + }, + { + lat: 39.9311, + lng: 48.3697, + pop: 17900, + }, + { + lat: 26.1008, + lng: 50.4878, + pop: 14800, + }, + { + lat: 26.1833, + lng: 56.25, + pop: 17777, + }, + { + lat: 41.4264, + lng: 48.4356, + pop: 16500, + }, + { + lat: 46.6333, + lng: 29.4, + pop: 15939, + }, + { + lat: 40.3383, + lng: 48.1608, + pop: 15385, + }, + { + lat: 26.2306, + lng: 50.5108, + pop: 12000, + }, + { + lat: 41.9406, + lng: 41.9906, + pop: 14785, + }, + { + lat: 36.6087, + lng: -119.5434, + pop: 14666, + }, + { + lat: 40.5183, + lng: 47.6542, + pop: 14273, + }, + { + lat: 40.3019, + lng: 44.5831, + pop: 10198, + }, + { + lat: 33.4517, + lng: 35.2908, + pop: 10965, + }, + { + lat: 41.6389, + lng: 42.9861, + pop: 14000, + }, + { + lat: 40.9922, + lng: 45.6289, + pop: 13700, + }, + { + lat: 42.0267, + lng: 35.1511, + pop: 13354, + }, + { + lat: 46.95, + lng: 28.7833, + pop: 12515, + }, + { + lat: 33.2814, + lng: 35.3964, + pop: 10000, + }, + { + lat: 46.8167, + lng: 28.5833, + pop: 12491, + }, + { + lat: 40.345, + lng: 46.9289, + pop: 12563, + }, + { + lat: 45.9, + lng: 28.6689, + pop: 12355, + }, + { + lat: 39.7756, + lng: 47.6186, + pop: 12263, + }, + { + lat: 46.5167, + lng: 28.7833, + pop: 11997, + }, + { + lat: 40.3147, + lng: 44.5936, + pop: 9513, + }, + { + lat: 41.4225, + lng: 46.9242, + pop: 11415, + }, + { + lat: 35.379, + lng: -118.9578, + pop: 11443, + }, + { + lat: 43.1667, + lng: 44.8, + pop: 10333, + }, + { + lat: 35.3832, + lng: -118.9743, + pop: 11025, + }, + { + lat: 46.8833, + lng: 29.2167, + pop: 10872, + }, + { + lat: 47.25, + lng: 28.3, + pop: 10808, + }, + { + lat: 40.5244, + lng: 46.1069, + pop: 10700, + }, + { + lat: 35.3636, + lng: -118.965, + pop: 10517, + }, + { + lat: 40.5067, + lng: 46.825, + pop: 10100, + }, + { + lat: 40.77, + lng: 46.4111, + pop: 10228, + }, + { + lat: 47.0833, + lng: 28.1833, + pop: 10063, + }, + { + lat: 36.6211, + lng: -119.3188, + pop: 9680, + }, + { + lat: 40.5656, + lng: 45.8161, + pop: 8657, + }, + { + lat: 35.3972, + lng: -118.9892, + pop: 8726, + }, + { + lat: 46.3336, + lng: 28.9614, + pop: 8471, + }, + { + lat: 40.2183, + lng: 47.7083, + pop: 8450, + }, + { + lat: 41.7258, + lng: 46.4083, + pop: 8134, + }, + { + lat: 41.8464, + lng: 44.7194, + pop: 7940, + }, + { + lat: 39.7611, + lng: 45.3333, + pop: 7633, + }, + { + lat: 46.4833, + lng: 28.25, + pop: 7443, + }, + { + lat: 40.6103, + lng: 46.7897, + pop: 7400, + }, + { + lat: 40.1067, + lng: 46.0383, + pop: 7246, + }, + { + lat: 46.5153, + lng: 29.6631, + pop: 7078, + }, + { + lat: 41.0708, + lng: 47.4583, + pop: 6876, + }, + { + lat: 47.2167, + lng: 29.1667, + pop: 6708, + }, + { + lat: 34.5506, + lng: 36.0781, + pop: 4730, + }, + { + lat: 39.7953, + lng: 47.1131, + pop: 5700, + }, + { + lat: 39.7583, + lng: 46.7483, + pop: 4446, + }, + { + lat: 40.5367, + lng: 48.9328, + pop: 3945, + }, + { + lat: 39.9833, + lng: 46.9167, + pop: 3770, + }, + { + lat: 46.2667, + lng: 28.2167, + pop: 3429, + }, + { + lat: 39.6408, + lng: 46.5469, + pop: 2190, + }, + { + lat: 39.7203, + lng: 44.8531, + pop: 2000, + }, + { + lat: 42.5194, + lng: 43.15, + pop: 2047, + }, + { + lat: 40.9078, + lng: 49.0733, + pop: 1600, + }, + { + lat: 39.9111, + lng: 46.7892, + pop: 1397, + }, + { + lat: 36.2692, + lng: 36.5672, + pop: 98534, + }, + { + lat: 34.598, + lng: -112.3185, + pop: 97901, + }, + { + lat: 41.2719, + lng: 36.3508, + pop: 97564, + }, + { + lat: 32.45, + lng: 34.9167, + pop: 95700, + }, + { + lat: 41.5722, + lng: 35.9147, + pop: 97452, + }, + { + lat: 30.3586, + lng: 50.7981, + pop: 96728, + }, + { + lat: 29.6194, + lng: 51.6542, + pop: 96683, + }, + { + lat: 36.3274, + lng: -119.6549, + pop: 95459, + }, + { + lat: 40.6667, + lng: 36.5667, + pop: 95361, + }, + { + lat: 37.025, + lng: 37.9769, + pop: 95149, + }, + { + lat: 45.1333, + lng: 42.0333, + pop: 93658, + }, + { + lat: 41.4267, + lng: 32.0758, + pop: 91569, + }, + { + lat: 31.9077, + lng: 35.0076, + pop: 90013, + }, + { + lat: 25.1264, + lng: 62.3225, + pop: 90762, + }, + { + lat: 36.4128, + lng: 35.8867, + pop: 90456, + }, + { + lat: 35.6386, + lng: 36.6717, + pop: 90000, + }, + { + lat: 40.6833, + lng: 30.6253, + pop: 89301, + }, + { + lat: 36.3225, + lng: 41.8642, + pop: 88023, + }, + { + lat: 36.8461, + lng: 40.0489, + pop: 87684, + }, + { + lat: 32.6539, + lng: 51.7553, + pop: 86063, + }, + { + lat: 46.7111, + lng: 38.2733, + pop: 85760, + }, + { + lat: 22.968, + lng: 57.298, + pop: 85000, + }, + { + lat: 47.1, + lng: 39.4167, + pop: 80721, + }, + { + lat: 44.8667, + lng: 37.3667, + pop: 81447, + }, + { + lat: 32.2444, + lng: 54.0186, + pop: 80712, + }, + { + lat: 23.3, + lng: 57.9833, + pop: 80538, + }, + { + lat: 40.39, + lng: 36.09, + pop: 79916, + }, + { + lat: 44.4994, + lng: 34.17, + pop: 79458, + }, + { + lat: 39.8144, + lng: 35.1903, + pop: 79314, + }, + { + lat: 32.4797, + lng: 51.7753, + pop: 79023, + }, + { + lat: 30.4356, + lng: 49.1056, + pop: 78353, + }, + { + lat: 36.5275, + lng: 37.9553, + pop: 78255, + }, + { + lat: 45.4333, + lng: 40.5667, + pop: 78149, + }, + { + lat: 44.575, + lng: 38.0725, + pop: 77212, + }, + { + lat: 32.1942, + lng: 48.2436, + pop: 77148, + }, + { + lat: 35.35, + lng: 35.9167, + pop: 75505, + }, + { + lat: 37.341, + lng: 41.894, + pop: 76523, + }, + { + lat: 31.9519, + lng: 34.8881, + pop: 75700, + }, + { + lat: 34.5352, + lng: -117.2109, + pop: 75311, + }, + { + lat: 32.3061, + lng: 54.0081, + pop: 75271, + }, + { + lat: 39.9078, + lng: 30.0367, + pop: 74441, + }, + { + lat: 31.28, + lng: 49.6036, + pop: 74285, + }, + { + lat: 44.2167, + lng: 43.1333, + pop: 74141, + }, + { + lat: 34.3688, + lng: 41.0945, + pop: 74100, + }, + { + lat: 37.3914, + lng: 36.8522, + pop: 73770, + }, + { + lat: 37.6764, + lng: 31.7261, + pop: 73768, + }, + { + lat: 29.5839, + lng: 50.5189, + pop: 73472, + }, + { + lat: 36.85, + lng: 31.05, + pop: 73260, + }, + { + lat: 41.1417, + lng: 28.4631, + pop: 72966, + }, + { + lat: 40.875, + lng: 35.4633, + pop: 71916, + }, + { + lat: 45.3517, + lng: 28.8364, + pop: 71411, + }, + { + lat: 23.5242, + lng: 58.4989, + pop: 70000, + }, + { + lat: 45.0489, + lng: 35.3792, + pop: 69145, + }, + { + lat: 29.0769, + lng: 48.0838, + pop: 68763, + }, + { + lat: 36.1995, + lng: -119.34, + pop: 68395, + }, + { + lat: 36.0643, + lng: -119.0338, + pop: 67887, + }, + { + lat: 37.025, + lng: 36.6345, + pop: 67674, + }, + { + lat: 30.7458, + lng: 49.7086, + pop: 67427, + }, + { + lat: 40.9333, + lng: 38.2333, + pop: 66736, + }, + { + lat: 37.575, + lng: 32.7747, + pop: 66794, + }, + { + lat: 45.25, + lng: 38.1167, + pop: 66285, + }, + { + lat: 36.0243, + lng: 32.8026, + pop: 65920, + }, + { + lat: 28.4167, + lng: 48.5, + pop: 65000, + }, + { + lat: 37.4592, + lng: 30.5953, + pop: 64943, + }, + { + lat: 37.4183, + lng: 31.8506, + pop: 64687, + }, + { + lat: 32.8889, + lng: 36.0431, + pop: 63676, + }, + { + lat: 33.6, + lng: 36.3, + pop: 63554, + }, + { + lat: 40.5833, + lng: 36.9667, + pop: 64119, + }, + { + lat: 30.8128, + lng: 56.5639, + pop: 63744, + }, + { + lat: 44.7833, + lng: 44.1667, + pop: 62495, + }, + { + lat: 23.32, + lng: 58.908, + pop: 63133, + }, + { + lat: 36.6333, + lng: 33.4333, + pop: 62853, + }, + { + lat: 32.3464, + lng: 51.5044, + pop: 62454, + }, + { + lat: 32.3117, + lng: 35.0272, + pop: 61941, + }, + { + lat: 44.1044, + lng: 39.0772, + pop: 62269, + }, + { + lat: 34.9167, + lng: 36.7333, + pop: 61176, + }, + { + lat: 37.3658, + lng: 40.2697, + pop: 61830, + }, + { + lat: 33.0058, + lng: 35.0989, + pop: 60000, + }, + { + lat: 35.0025, + lng: 40.5117, + pop: 60780, + }, + { + lat: 27.8389, + lng: 52.0619, + pop: 60187, + }, + { + lat: 32.6064, + lng: 35.2881, + pop: 60000, + }, + { + lat: 44.6333, + lng: 40.7333, + pop: 60164, + }, + { + lat: 43.1333, + lng: 45.55, + pop: 59954, + }, + { + lat: 27.3708, + lng: 62.3342, + pop: 60114, + }, + { + lat: 43.75, + lng: 44.0333, + pop: 57883, + }, + { + lat: 46.1833, + lng: 30.35, + pop: 57210, + }, + { + lat: 42.5633, + lng: 47.8636, + pop: 58690, + }, + { + lat: 40.1728, + lng: 44.2925, + pop: 57500, + }, + { + lat: 39.9319, + lng: 48.9203, + pop: 58253, + }, + { + lat: 45.8667, + lng: 40.1333, + pop: 57771, + }, + { + lat: 46.4833, + lng: 41.5333, + pop: 57622, + }, + { + lat: 44.9233, + lng: 37.9806, + pop: 57229, + }, + { + lat: 31.9678, + lng: 51.2894, + pop: 57071, + }, + { + lat: 30.795, + lng: 50.5644, + pop: 57036, + }, + { + lat: 29.1489, + lng: 48.1057, + pop: 56554, + }, + { + lat: 28.2211, + lng: 61.2158, + pop: 56584, + }, + { + lat: 34.5006, + lng: -114.3113, + pop: 56510, + }, + { + lat: 36.7994, + lng: 36.5178, + pop: 56409, + }, + { + lat: 31.2414, + lng: 48.6525, + pop: 56252, + }, + { + lat: 43.15, + lng: 45.9, + pop: 56226, + }, + { + lat: 32.3897, + lng: 51.3767, + pop: 55984, + }, + { + lat: 35.4389, + lng: 36.6511, + pop: 55843, + }, + { + lat: 40.3, + lng: 35.8833, + pop: 55673, + }, + { + lat: 41.2667, + lng: 27.9667, + pop: 54268, + }, + { + lat: 25.25, + lng: 51.3732, + pop: 54339, + }, + { + lat: 43.35, + lng: 46.1, + pop: 52908, + }, + { + lat: 27.95, + lng: 57.7, + pop: 52624, + }, + { + lat: 34.0167, + lng: 36.7167, + pop: 52502, + }, + { + lat: 41.2125, + lng: 36.4569, + pop: 52258, + }, + { + lat: 35.7662, + lng: -119.2635, + pop: 52206, + }, + { + lat: 44.7686, + lng: 39.8733, + pop: 52082, + }, + { + lat: 34.4536, + lng: 40.9367, + pop: 52020, + }, + { + lat: 45.6167, + lng: 38.9333, + pop: 51925, + }, + { + lat: 30.1164, + lng: 55.1186, + pop: 51620, + }, + { + lat: 33.7986, + lng: 35.825, + pop: 50000, + }, + { + lat: 31.5608, + lng: 48.1831, + pop: 51431, + }, + { + lat: 34.56, + lng: 38.2672, + pop: 51323, + }, + { + lat: 43.85, + lng: 46.7167, + pop: 49247, + }, + { + lat: 34.1794, + lng: 36.4208, + pop: 50000, + }, + { + lat: 39.8153, + lng: 46.7519, + pop: 49848, + }, + { + lat: 32.9278, + lng: 35.0817, + pop: 48900, + }, + { + lat: 37.7147, + lng: 33.5508, + pop: 49766, + }, + { + lat: 40.9333, + lng: 40.05, + pop: 49496, + }, + { + lat: 41.4411, + lng: 27.9216, + pop: 49106, + }, + { + lat: 40.161, + lng: 34.377, + pop: 49082, + }, + { + lat: 35.0183, + lng: 40.4533, + pop: 48922, + }, + { + lat: 41.4333, + lng: 31.75, + pop: 48381, + }, + { + lat: 30.6497, + lng: 48.6647, + pop: 48642, + }, + { + lat: 44.8667, + lng: 40.6167, + pop: 48439, + }, + { + lat: 34.9833, + lng: 36.0833, + pop: 47982, + }, + { + lat: 40.1703, + lng: 31.9211, + pop: 48274, + }, + { + lat: 36.3, + lng: 30.15, + pop: 48131, + }, + { + lat: 23.3103, + lng: 57.9455, + pop: 47718, + }, + { + lat: 37.1042, + lng: 40.93, + pop: 47580, + }, + { + lat: 33.9667, + lng: 36.6667, + pop: 47136, + }, + { + lat: 34.5119, + lng: 36.5764, + pop: 46772, + }, + { + lat: 40.8333, + lng: 35.65, + pop: 46608, + }, + { + lat: 34.8333, + lng: 36.7333, + pop: 45853, + }, + { + lat: 34.25, + lng: 35.65, + pop: 45000, + }, + { + lat: 31.6033, + lng: 55.4003, + pop: 45453, + }, + { + lat: 47.25, + lng: 39.8667, + pop: 45078, + }, + { + lat: 46.755, + lng: 33.375, + pop: 45069, + }, + { + lat: 34.5849, + lng: -112.4473, + pop: 45063, + }, + { + lat: 32.6153, + lng: 51.5556, + pop: 43183, + }, + { + lat: 36.891, + lng: 38.3536, + pop: 44821, + }, + { + lat: 35.8126, + lng: 36.3176, + pop: 44322, + }, + { + lat: 41.1833, + lng: 31.3833, + pop: 44286, + }, + { + lat: 32.7944, + lng: 35.5333, + pop: 44200, + }, + { + lat: 41.088, + lng: 40.7232, + pop: 44304, + }, + { + lat: 30.8989, + lng: 52.6867, + pop: 44341, + }, + { + lat: 41.4653, + lng: 34.7708, + pop: 44004, + }, + { + lat: 25.935, + lng: 49.6661, + pop: 44000, + }, + { + lat: 32.4711, + lng: 34.9675, + pop: 42100, + }, + { + lat: 32.8333, + lng: 35.0833, + pop: 42000, + }, + { + lat: 35.1822, + lng: 35.9403, + pop: 43151, + }, + { + lat: 33.35, + lng: 36.2333, + pop: 43456, + }, + { + lat: 25.3603, + lng: 60.3994, + pop: 43732, + }, + { + lat: 32.2667, + lng: 35.0103, + pop: 43100, + }, + { + lat: 40.945, + lng: 40.2644, + pop: 43499, + }, + { + lat: 24.75, + lng: 56.4667, + pop: 43312, + }, + { + lat: 36.6, + lng: 30.55, + pop: 43226, + }, + { + lat: 39.6658, + lng: 35.8836, + pop: 42919, + }, + { + lat: 40.3381, + lng: 42.5731, + pop: 42683, + }, + { + lat: 36.2235, + lng: -115.9974, + pop: 42471, + }, + { + lat: 43.7333, + lng: 44.7, + pop: 42155, + }, + { + lat: 42.15, + lng: 41.6667, + pop: 41465, + }, + { + lat: 45.4686, + lng: 39.4519, + pop: 42019, + }, + { + lat: 36.3481, + lng: 37.5308, + pop: 41786, + }, + { + lat: 36.75, + lng: 36.2167, + pop: 41409, + }, + { + lat: 43.3167, + lng: 44.9167, + pop: 41469, + }, + { + lat: 36.9533, + lng: 36.2033, + pop: 41368, + }, + { + lat: 32.8333, + lng: 35.0667, + pop: 39416, + }, + { + lat: 45.2667, + lng: 37.3667, + pop: 41133, + }, + { + lat: 37.2489, + lng: 37.8658, + pop: 41142, + }, + { + lat: 41.19, + lng: 40.9831, + pop: 41084, + }, + { + lat: 35.1205, + lng: -114.5461, + pop: 41064, + }, + { + lat: 32.7997, + lng: 51.6956, + pop: 40945, + }, + { + lat: 33.775, + lng: 35.9, + pop: 40000, + }, + { + lat: 26.9581, + lng: 56.2719, + pop: 40678, + }, + { + lat: 28.6489, + lng: 51.3794, + pop: 40722, + }, + { + lat: 25.3333, + lng: 56.35, + pop: 39515, + }, + { + lat: 31.5081, + lng: 50.8319, + pop: 40528, + }, + { + lat: 39.9458, + lng: 41.1053, + pop: 40350, + }, + { + lat: 41.0172, + lng: 34.0383, + pop: 40245, + }, + { + lat: 35.8636, + lng: 36.8006, + pop: 39901, + }, + { + lat: 40.9667, + lng: 35.6667, + pop: 40194, + }, + { + lat: 44.2503, + lng: 28.2614, + pop: 39780, + }, + { + lat: 43.6825, + lng: 43.5339, + pop: 38192, + }, + { + lat: 32.4611, + lng: 35.3, + pop: 39004, + }, + { + lat: 33.8067, + lng: 36.7403, + pop: 39903, + }, + { + lat: 26.5578, + lng: 54.0194, + pop: 39853, + }, + { + lat: 44.4667, + lng: 39.7333, + pop: 39762, + }, + { + lat: 40.9667, + lng: 39.9, + pop: 39624, + }, + { + lat: 31.9, + lng: 35.2, + pop: 38998, + }, + { + lat: 40.6603, + lng: 29.3236, + pop: 39110, + }, + { + lat: 44.8667, + lng: 38.15, + pop: 39374, + }, + { + lat: 37.1667, + lng: 42.1333, + pop: 39000, + }, + { + lat: 39.9139, + lng: 28.1603, + pop: 39058, + }, + { + lat: 41.0833, + lng: 31.1167, + pop: 38846, + }, + { + lat: 41.5097, + lng: 34.2142, + pop: 38849, + }, + { + lat: 45.7086, + lng: 34.3933, + pop: 38714, + }, + { + lat: 32.5553, + lng: 51.5097, + pop: 37740, + }, + { + lat: 45.3667, + lng: 41.7167, + pop: 38100, + }, + { + lat: 34.6894, + lng: 40.8308, + pop: 37935, + }, + { + lat: 43.2944, + lng: 45.8839, + pop: 37373, + }, + { + lat: 36, + lng: 36.6667, + pop: 37490, + }, + { + lat: 34.2283, + lng: 37.2406, + pop: 37820, + }, + { + lat: 25.0742, + lng: 56.3553, + pop: 37545, + }, + { + lat: 44.6333, + lng: 39.1333, + pop: 37475, + }, + { + lat: 43.5, + lng: 44.75, + pop: 37442, + }, + { + lat: 37.6942, + lng: 37.8614, + pop: 37323, + }, + { + lat: 35.0653, + lng: 36.3422, + pop: 37109, + }, + { + lat: 43.2167, + lng: 46.8667, + pop: 37171, + }, + { + lat: 34.5814, + lng: -117.4397, + pop: 37229, + }, + { + lat: 43.1833, + lng: 44.55, + pop: 37029, + }, + { + lat: 43.8172, + lng: 28.5828, + pop: 36364, + }, + { + lat: 36.5083, + lng: 36.8692, + pop: 36562, + }, + { + lat: 41.1764, + lng: 29.6128, + pop: 36516, + }, + { + lat: 33.0167, + lng: 35.2708, + pop: 36000, + }, + { + lat: 29.1267, + lng: 54.0422, + pop: 36410, + }, + { + lat: 32.6368, + lng: 35.99, + pop: 34948, + }, + { + lat: 46.8, + lng: 33.4667, + pop: 35900, + }, + { + lat: 36.1569, + lng: 37.7078, + pop: 35409, + }, + { + lat: 34.6683, + lng: 36.2597, + pop: 35445, + }, + { + lat: 32.9658, + lng: 35.4983, + pop: 35700, + }, + { + lat: 32.4583, + lng: 35.8583, + pop: 35085, + }, + { + lat: 45.35, + lng: 42.85, + pop: 35745, + }, + { + lat: 41.4833, + lng: 31.8333, + pop: 35323, + }, + { + lat: 39.6381, + lng: 34.4672, + pop: 35561, + }, + { + lat: 35.9025, + lng: 36.0606, + pop: 35460, + }, + { + lat: 33.5333, + lng: 36.2167, + pop: 33571, + }, + { + lat: 35.2609, + lng: 36.3822, + pop: 35000, + }, + { + lat: 22.9339, + lng: 57.775, + pop: 35173, + }, + { + lat: 32.8536, + lng: 35.1978, + pop: 34000, + }, + { + lat: 40.95, + lng: 39.9333, + pop: 34831, + }, + { + lat: 44.3211, + lng: 28.6133, + pop: 34398, + }, + { + lat: 40.95, + lng: 38.7333, + pop: 34592, + }, + { + lat: 44.4167, + lng: 43.9167, + pop: 34690, + }, + { + lat: 29.2331, + lng: 56.6022, + pop: 34517, + }, + { + lat: 27.6672, + lng: 54.1411, + pop: 34469, + }, + { + lat: 35.4293, + lng: -119.0306, + pop: 34350, + }, + { + lat: 45.3594, + lng: 40.7072, + pop: 34215, + }, + { + lat: 40.6422, + lng: 29.1203, + pop: 34076, + }, + { + lat: 37.6834, + lng: -113.0956, + pop: 34246, + }, + { + lat: 31.5775, + lng: 54.4369, + pop: 34237, + }, + { + lat: 36.4889, + lng: 36.1944, + pop: 33540, + }, + { + lat: 41.0656, + lng: 37.7714, + pop: 33253, + }, + { + lat: 37.5764, + lng: 36.3506, + pop: 33193, + }, + { + lat: 32.7356, + lng: 36.0669, + pop: 32236, + }, + { + lat: 37.4247, + lng: 37.6928, + pop: 32846, + }, + { + lat: 34.8167, + lng: 36.1167, + pop: 32213, + }, + { + lat: 36.965, + lng: 37.5092, + pop: 32653, + }, + { + lat: 29.7742, + lng: 52.7236, + pop: 32261, + }, + { + lat: 26.2667, + lng: 50.15, + pop: 32067, + }, + { + lat: 46.05, + lng: 38.1667, + pop: 32180, + }, + { + lat: 35.217, + lng: -114.0105, + pop: 32204, + }, + { + lat: 32.9667, + lng: 36.0667, + pop: 31683, + }, + { + lat: 46.63, + lng: 31.1, + pop: 32100, + }, + { + lat: 41.0056, + lng: 38.8167, + pop: 32008, + }, + { + lat: 32.8667, + lng: 35.3, + pop: 31100, + }, + { + lat: 36.5866, + lng: 37.0463, + pop: 31534, + }, + { + lat: 32.2714, + lng: 50.9775, + pop: 31739, + }, + { + lat: 29.205, + lng: 52.69, + pop: 31711, + }, + { + lat: 39.8642, + lng: 36.5983, + pop: 31748, + }, + { + lat: 33.9667, + lng: 36.0167, + pop: 30000, + }, + { + lat: 33, + lng: 36.1167, + pop: 31258, + }, + { + lat: 23.5889, + lng: 58.4083, + pop: 31409, + }, + { + lat: 27.8236, + lng: 52.3303, + pop: 31436, + }, + { + lat: 39.8503, + lng: 33.4536, + pop: 31308, + }, + { + lat: 36.4731, + lng: 41.6161, + pop: 31161, + }, + { + lat: 47.2514, + lng: 35.7058, + pop: 31016, + }, + { + lat: 43.55, + lng: 43.85, + pop: 30832, + }, + { + lat: 32.5767, + lng: 51.455, + pop: 30002, + }, + { + lat: 32.2553, + lng: 50.5711, + pop: 30504, + }, + { + lat: 45.1, + lng: 43.45, + pop: 30530, + }, + { + lat: 33.7436, + lng: 36.7012, + pop: 30450, + }, + { + lat: 33.8667, + lng: 35.5667, + pop: 30000, + }, + { + lat: 44.415, + lng: 27.8236, + pop: 30217, + }, + { + lat: 42.2257, + lng: 43.9701, + pop: 30432, + }, + { + lat: 26.5581, + lng: 54.8806, + pop: 30435, + }, + { + lat: 44.0872, + lng: 41.9733, + pop: 30369, + }, + { + lat: 35.6139, + lng: 36.5611, + pop: 30000, + }, + { + lat: 32.5025, + lng: 35.6922, + pop: 29590, + }, + { + lat: 40.75, + lng: 36.3167, + pop: 30123, + }, + { + lat: 27.76, + lng: 54.0072, + pop: 29987, + }, + { + lat: 44.6672, + lng: 34.3978, + pop: 29668, + }, + { + lat: 27.3423, + lng: 53.1768, + pop: 29380, + }, + { + lat: 36.8503, + lng: 40.0706, + pop: 29347, + }, + { + lat: 35.2897, + lng: 36.7433, + pop: 29100, + }, + { + lat: 23.6522, + lng: 53.6536, + pop: 29095, + }, + { + lat: 30.2364, + lng: 49.7119, + pop: 29015, + }, + { + lat: 36.1242, + lng: -115.3324, + pop: 28861, + }, + { + lat: 37.486, + lng: 37.297, + pop: 28582, + }, + { + lat: 47.2667, + lng: 29.1667, + pop: 28500, + }, + { + lat: 40.3748, + lng: 36.9031, + pop: 28413, + }, + { + lat: 32.6417, + lng: 35.9417, + pop: 27902, + }, + { + lat: 33.0381, + lng: 40.2844, + pop: 28400, + }, + { + lat: 40.6975, + lng: 29.5114, + pop: 28232, + }, + { + lat: 41.0475, + lng: 39.2798, + pop: 28209, + }, + { + lat: 23.3833, + lng: 57.8167, + pop: 28088, + }, + { + lat: 40.1836, + lng: 31.3506, + pop: 28091, + }, + { + lat: 41.1158, + lng: 45.4853, + pop: 28000, + }, + { + lat: 35.6308, + lng: -117.6622, + pop: 27989, + }, + { + lat: 37.1303, + lng: -113.4878, + pop: 27689, + }, + { + lat: 41.8111, + lng: 41.7753, + pop: 27546, + }, + { + lat: 31.8889, + lng: 35.1675, + pop: 26604, + }, + { + lat: 31.1267, + lng: 53.2592, + pop: 27524, + }, + { + lat: 40.9142, + lng: 40.1125, + pop: 27428, + }, + { + lat: 35.5938, + lng: -119.3671, + pop: 27505, + }, + { + lat: 44.7167, + lng: 43, + pop: 27471, + }, + { + lat: 36.4733, + lng: 37.0972, + pop: 27086, + }, + { + lat: 44.7528, + lng: 33.8608, + pop: 27351, + }, + { + lat: 37.5375, + lng: 40.8892, + pop: 27304, + }, + { + lat: 43.65, + lng: 44.0667, + pop: 27074, + }, + { + lat: 29.8519, + lng: 51.5869, + pop: 26918, + }, + { + lat: 30.6131, + lng: 53.1953, + pop: 26933, + }, + { + lat: 33.7389, + lng: 36.6, + pop: 26671, + }, + { + lat: 36.1, + lng: 32.9667, + pop: 26840, + }, + { + lat: 40.8761, + lng: 37.7406, + pop: 26737, + }, + { + lat: 45.5, + lng: 41.2333, + pop: 26761, + }, + { + lat: 46.6742, + lng: 28.0597, + pop: 26266, + }, + { + lat: 33.725, + lng: 36.0972, + pop: 26285, + }, + { + lat: 40.8167, + lng: 39.6167, + pop: 26626, + }, + { + lat: 33.0711, + lng: 36.1842, + pop: 26268, + }, + { + lat: 32.6714, + lng: 35.2406, + pop: 25600, + }, + { + lat: 26.5833, + lng: 49.9833, + pop: 25500, + }, + { + lat: 36.699, + lng: -119.5575, + pop: 26424, + }, + { + lat: 41.4944, + lng: 36.0789, + pop: 26337, + }, + { + lat: 43.2044, + lng: 46.0911, + pop: 25672, + }, + { + lat: 37.1886, + lng: 32.2456, + pop: 26287, + }, + { + lat: 31.4142, + lng: 51.5694, + pop: 26260, + }, + { + lat: 41.9975, + lng: 43.5986, + pop: 26135, + }, + { + lat: 43.95, + lng: 43.6333, + pop: 26106, + }, + { + lat: 39.645, + lng: 41.5083, + pop: 25969, + }, + { + lat: 40.9697, + lng: 27.9553, + pop: 25873, + }, + { + lat: 36.2472, + lng: 29.9828, + pop: 25893, + }, + { + lat: 41.61, + lng: 35.595, + pop: 25854, + }, + { + lat: 45.9675, + lng: 33.8003, + pop: 25769, + }, + { + lat: 36.1167, + lng: 36.1333, + pop: 25118, + }, + { + lat: 30.0542, + lng: 50.1639, + pop: 25730, + }, + { + lat: 32.7711, + lng: 35.0394, + pop: 23700, + }, + { + lat: 32.61, + lng: 35.6081, + pop: 25000, + }, + { + lat: 41.0547, + lng: 30.8503, + pop: 25497, + }, + { + lat: 41.3636, + lng: 41.6792, + pop: 25500, + }, + { + lat: 44.1394, + lng: 43.0169, + pop: 24919, + }, + { + lat: 42.1625, + lng: 42.3417, + pop: 25318, + }, + { + lat: 40.1658, + lng: 38.0942, + pop: 25404, + }, + { + lat: 33.6967, + lng: 36.3739, + pop: 25194, + }, + { + lat: 44.6706, + lng: 41.838, + pop: 25279, + }, + { + lat: 40.7928, + lng: 42.6086, + pop: 25187, + }, + { + lat: 36.5988, + lng: -119.4471, + pop: 25168, + }, + { + lat: 29.9275, + lng: 56.5722, + pop: 25152, + }, + { + lat: 34.8661, + lng: -117.0471, + pop: 25123, + }, + { + lat: 45.1336, + lng: 33.5772, + pop: 24282, + }, + { + lat: 30.8947, + lng: 49.4092, + pop: 25009, + }, + { + lat: 34.2919, + lng: 35.9546, + pop: 25000, + }, + { + lat: 32.4097, + lng: 35.2808, + pop: 24439, + }, + { + lat: 40.6303, + lng: 48.6414, + pop: 24681, + }, + { + lat: 46.6333, + lng: 32.5833, + pop: 24639, + }, + { + lat: 36.5625, + lng: 35.3803, + pop: 24559, + }, + { + lat: 46.85, + lng: 40.3167, + pop: 24561, + }, + { + lat: 40.0494, + lng: 43.6608, + pop: 24560, + }, + { + lat: 36.5715, + lng: -119.6143, + pop: 24545, + }, + { + lat: 40.555, + lng: 44.9536, + pop: 23200, + }, + { + lat: 44.7506, + lng: 44.9797, + pop: 24472, + }, + { + lat: 32.8022, + lng: 51.6211, + pop: 24433, + }, + { + lat: 35.2661, + lng: 36.7114, + pop: 24105, + }, + { + lat: 36.5453, + lng: -119.3987, + pop: 24383, + }, + { + lat: 32.2514, + lng: 48.8161, + pop: 24216, + }, + { + lat: 36.1333, + lng: 36.45, + pop: 23700, + }, + { + lat: 27.8417, + lng: 51.9394, + pop: 24083, + }, + { + lat: 32.5542, + lng: 51.525, + pop: 23203, + }, + { + lat: 34.2511, + lng: 36.0111, + pop: 24000, + }, + { + lat: 41.0096, + lng: 44.3841, + pop: 23782, + }, + { + lat: 41.3903, + lng: 41.4194, + pop: 23846, + }, + { + lat: 33.7075, + lng: 35.9039, + pop: 23000, + }, + { + lat: 41.95, + lng: 34.5833, + pop: 23720, + }, + { + lat: 44.1167, + lng: 42.9833, + pop: 22891, + }, + { + lat: 34.6931, + lng: 32.9992, + pop: 22369, + }, + { + lat: 39.9211, + lng: 40.6947, + pop: 23589, + }, + { + lat: 45.7167, + lng: 42.9, + pop: 23579, + }, + { + lat: 40.8006, + lng: 32.1986, + pop: 23547, + }, + { + lat: 32.7667, + lng: 34.9667, + pop: 22200, + }, + { + lat: 23.55, + lng: 56.25, + pop: 23466, + }, + { + lat: 40.7931, + lng: 37.0164, + pop: 23369, + }, + { + lat: 43.1939, + lng: 45.2833, + pop: 23282, + }, + { + lat: 33.4333, + lng: 36.0833, + pop: 22831, + }, + { + lat: 41.8922, + lng: 33.0044, + pop: 23329, + }, + { + lat: 31.4086, + lng: 48.7942, + pop: 23211, + }, + { + lat: 33.2075, + lng: 35.5697, + pop: 23076, + }, + { + lat: 37.5467, + lng: 34.4844, + pop: 23252, + }, + { + lat: 40.4633, + lng: 42.7858, + pop: 23231, + }, + { + lat: 28.9306, + lng: 51.0689, + pop: 23178, + }, + { + lat: 32.0167, + lng: 35.7667, + pop: 21908, + }, + { + lat: 34.3914, + lng: 36.3958, + pop: 22250, + }, + { + lat: 40.6867, + lng: 37.3992, + pop: 22783, + }, + { + lat: 43.7731, + lng: 41.9169, + pop: 21067, + }, + { + lat: 32.6267, + lng: 51.4392, + pop: 22693, + }, + { + lat: 29.0664, + lng: 58.4047, + pop: 22761, + }, + { + lat: 41.0494, + lng: 39.2353, + pop: 22630, + }, + { + lat: 31.2656, + lng: 56.8056, + pop: 22729, + }, + { + lat: 39.6104, + lng: -119.777, + pop: 22622, + }, + { + lat: 36.0841, + lng: -119.5613, + pop: 22616, + }, + { + lat: 44.4256, + lng: 39.5319, + pop: 22468, + }, + { + lat: 40.0633, + lng: 44.4408, + pop: 21376, + }, + { + lat: 35.95, + lng: 36.7, + pop: 21848, + }, + { + lat: 41.5861, + lng: 32.6406, + pop: 22333, + }, + { + lat: 36.2, + lng: 36.5167, + pop: 21934, + }, + { + lat: 39.5627, + lng: -119.1906, + pop: 22343, + }, + { + lat: 37.2, + lng: 36.5833, + pop: 22242, + }, + { + lat: 40.3756, + lng: 43.4125, + pop: 22282, + }, + { + lat: 31.485, + lng: 48.2686, + pop: 22057, + }, + { + lat: 37.3192, + lng: 37.5686, + pop: 22192, + }, + { + lat: 40.8667, + lng: 35.2167, + pop: 22179, + }, + { + lat: 33.6, + lng: 36.515, + pop: 20559, + }, + { + lat: 32.6594, + lng: 35.11, + pop: 21383, + }, + { + lat: 41.0036, + lng: 36.6319, + pop: 21847, + }, + { + lat: 39.895, + lng: 37.7531, + pop: 21753, + }, + { + lat: 41.3081, + lng: 32.1417, + pop: 21655, + }, + { + lat: 41.0736, + lng: 36.0403, + pop: 21692, + }, + { + lat: 30.4775, + lng: 54.2128, + pop: 21690, + }, + { + lat: 41.2, + lng: 32.3292, + pop: 21625, + }, + { + lat: 42.2689, + lng: 42.0678, + pop: 21596, + }, + { + lat: 36.3756, + lng: 36.9942, + pop: 21039, + }, + { + lat: 33.2539, + lng: 35.2717, + pop: 20000, + }, + { + lat: 32.2269, + lng: 50.7931, + pop: 21352, + }, + { + lat: 39.8728, + lng: 44.5192, + pop: 21311, + }, + { + lat: 36.5667, + lng: 36.1333, + pop: 20459, + }, + { + lat: 40.35, + lng: 30.0167, + pop: 20976, + }, + { + lat: 34.3722, + lng: 41.9875, + pop: 21000, + }, + { + lat: 31.8711, + lng: 35.4442, + pop: 20300, + }, + { + lat: 39.8303, + lng: 44.7025, + pop: 20800, + }, + { + lat: 42.1083, + lng: 43.0417, + pop: 20814, + }, + { + lat: 43.65, + lng: 43.55, + pop: 20718, + }, + { + lat: 28.6689, + lng: 59.0733, + pop: 20720, + }, + { + lat: 37.4278, + lng: 34.8711, + pop: 20683, + }, + { + lat: 41.3333, + lng: 41.3, + pop: 20565, + }, + { + lat: 34.8658, + lng: -118.2155, + pop: 20574, + }, + { + lat: 43.4, + lng: 42.9167, + pop: 20513, + }, + { + lat: 39.6333, + lng: 43.3778, + pop: 20450, + }, + { + lat: 40.7333, + lng: 38.4333, + pop: 20405, + }, + { + lat: 40.9, + lng: 31.05, + pop: 20266, + }, + { + lat: 32.7781, + lng: 51.6461, + pop: 20301, + }, + { + lat: 43.2419, + lng: 46, + pop: 20013, + }, + { + lat: 28.8714, + lng: 52.0917, + pop: 20320, + }, + { + lat: 41.4969, + lng: 44.8108, + pop: 20211, + }, + { + lat: 32.555, + lng: 51.5731, + pop: 19406, + }, + { + lat: 37.0669, + lng: 36.1464, + pop: 20127, + }, + { + lat: 34.2028, + lng: 35.6544, + pop: 20000, + }, + { + lat: 40.1894, + lng: 39.1267, + pop: 20084, + }, + { + lat: 40.6172, + lng: 43.9758, + pop: 19543, + }, + { + lat: 46.7333, + lng: 29.7, + pop: 20000, + }, + { + lat: 43.2242, + lng: 46.1942, + pop: 19727, + }, + { + lat: 43.0333, + lng: 44.2333, + pop: 20043, + }, + { + lat: 36.8032, + lng: -114.133, + pop: 20019, + }, + { + lat: 35.4794, + lng: -119.2013, + pop: 19897, + }, + { + lat: 30.895, + lng: 50.0931, + pop: 19857, + }, + { + lat: 32.5167, + lng: 36.4833, + pop: 19683, + }, + { + lat: 40.0731, + lng: 35.4947, + pop: 19786, + }, + { + lat: 41.4167, + lng: 35.05, + pop: 19650, + }, + { + lat: 34.4686, + lng: 41.9167, + pop: 19629, + }, + { + lat: 35.1944, + lng: -118.8306, + pop: 19568, + }, + { + lat: 43.4833, + lng: 44.1333, + pop: 19494, + }, + { + lat: 34.9478, + lng: 33.5881, + pop: 19199, + }, + { + lat: 40.8106, + lng: 41.5269, + pop: 19510, + }, + { + lat: 37.1487, + lng: -113.3517, + pop: 19501, + }, + { + lat: 43.1833, + lng: 44.3167, + pop: 19412, + }, + { + lat: 31.4619, + lng: 48.0739, + pop: 19481, + }, + { + lat: 36.7678, + lng: 35.7922, + pop: 18587, + }, + { + lat: 32.8454, + lng: 36.2499, + pop: 19158, + }, + { + lat: 27.8914, + lng: 53.4344, + pop: 19347, + }, + { + lat: 46.1667, + lng: 34.8, + pop: 19253, + }, + { + lat: 40.0186, + lng: 30.1814, + pop: 19244, + }, + { + lat: 27.5014, + lng: 52.5858, + pop: 18837, + }, + { + lat: 26.5992, + lng: 54.9361, + pop: 19213, + }, + { + lat: 32.0006, + lng: 54.2075, + pop: 19123, + }, + { + lat: 46.7, + lng: 41.7333, + pop: 19032, + }, + { + lat: 29.3606, + lng: 51.0683, + pop: 18913, + }, + { + lat: 28.9864, + lng: 51.0375, + pop: 18702, + }, + { + lat: 31.9436, + lng: 34.8392, + pop: 18401, + }, + { + lat: 35.3886, + lng: -119.2058, + pop: 18875, + }, + { + lat: 41.2422, + lng: 33.3283, + pop: 18863, + }, + { + lat: 31.9833, + lng: 35.7667, + pop: 17754, + }, + { + lat: 32.5, + lng: 34.9167, + pop: 17759, + }, + { + lat: 45.45, + lng: 29.2667, + pop: 18745, + }, + { + lat: 43.1642, + lng: 45.6228, + pop: 18534, + }, + { + lat: 40.8139, + lng: 32.8908, + pop: 18694, + }, + { + lat: 39.6731, + lng: 33.6136, + pop: 18139, + }, + { + lat: 34.4398, + lng: -117.5248, + pop: 18599, + }, + { + lat: 36.65, + lng: 36.2167, + pop: 17925, + }, + { + lat: 31.9408, + lng: 54.2736, + pop: 18309, + }, + { + lat: 31.9414, + lng: 54.2828, + pop: 18309, + }, + { + lat: 29.5, + lng: 53.3167, + pop: 18477, + }, + { + lat: 47.3907, + lng: 35.0027, + pop: 18468, + }, + { + lat: 31.7492, + lng: 54.2103, + pop: 18464, + }, + { + lat: 47.0333, + lng: 28.95, + pop: 17210, + }, + { + lat: 43.2081, + lng: 44.8186, + pop: 17734, + }, + { + lat: 32.5, + lng: 35.5, + pop: 18200, + }, + { + lat: 31.5419, + lng: 60.0364, + pop: 18304, + }, + { + lat: 40.5619, + lng: 42.3464, + pop: 18281, + }, + { + lat: 29.2736, + lng: 53.2203, + pop: 18187, + }, + { + lat: 33.6797, + lng: 35.5583, + pop: 17000, + }, + { + lat: 28.4758, + lng: 57.8481, + pop: 18185, + }, + { + lat: 43.1667, + lng: 46, + pop: 17970, + }, + { + lat: 33.6422, + lng: 36.2978, + pop: 17521, + }, + { + lat: 32.3836, + lng: 51.5147, + pop: 17966, + }, + { + lat: 35.25, + lng: 36.5833, + pop: 17578, + }, + { + lat: 36.1231, + lng: 37.3369, + pop: 17767, + }, + { + lat: 36.2583, + lng: 41.9431, + pop: 18000, + }, + { + lat: 34.4818, + lng: -118.6316, + pop: 18017, + }, + { + lat: 35.1, + lng: 33.3667, + pop: 16774, + }, + { + lat: 45.4575, + lng: 28.2711, + pop: 17736, + }, + { + lat: 26.2258, + lng: 60.2142, + pop: 17732, + }, + { + lat: 41.0314, + lng: 36.2683, + pop: 17628, + }, + { + lat: 34.9203, + lng: 40.5594, + pop: 17537, + }, + { + lat: 29.9125, + lng: 53.3086, + pop: 17642, + }, + { + lat: 35.3697, + lng: 36.38, + pop: 17313, + }, + { + lat: 41.2433, + lng: 42.3639, + pop: 17606, + }, + { + lat: 32.3781, + lng: 51.3181, + pop: 17335, + }, + { + lat: 44.1778, + lng: 43.5, + pop: 17451, + }, + { + lat: 46.1167, + lng: 32.9167, + pop: 17344, + }, + { + lat: 45.6855, + lng: 28.6134, + pop: 17400, + }, + { + lat: 35.3736, + lng: 36.6017, + pop: 17052, + }, + { + lat: 40.8483, + lng: 43.3317, + pop: 17373, + }, + { + lat: 30.0775, + lng: 53.1331, + pop: 17131, + }, + { + lat: 46.9753, + lng: 28.8194, + pop: 15934, + }, + { + lat: 40.07, + lng: 47.2047, + pop: 16998, + }, + { + lat: 40.2981, + lng: 41.6325, + pop: 17054, + }, + { + lat: 40.9833, + lng: 39.8, + pop: 15503, + }, + { + lat: 44.3381, + lng: 28.0336, + pop: 17022, + }, + { + lat: 41.1333, + lng: 41.0167, + pop: 16902, + }, + { + lat: 31.94, + lng: 51.6478, + pop: 16899, + }, + { + lat: 32.8542, + lng: 36.6292, + pop: 16745, + }, + { + lat: 40.7408, + lng: 44.8631, + pop: 16600, + }, + { + lat: 25.6439, + lng: 57.7744, + pop: 16860, + }, + { + lat: 46.0833, + lng: 40.8583, + pop: 16838, + }, + { + lat: 36.4575, + lng: 41.7061, + pop: 16798, + }, + { + lat: 44.8514, + lng: 34.9725, + pop: 16784, + }, + { + lat: 40.9, + lng: 38.4167, + pop: 16758, + }, + { + lat: 46.05, + lng: 28.8333, + pop: 16605, + }, + { + lat: 32.4725, + lng: 35.7928, + pop: 16000, + }, + { + lat: 32.7333, + lng: 36.2, + pop: 16240, + }, + { + lat: 37.5465, + lng: 35.3987, + pop: 16653, + }, + { + lat: 35.3208, + lng: 36.6225, + pop: 16267, + }, + { + lat: 41.0833, + lng: 39.3833, + pop: 16335, + }, + { + lat: 43.9333, + lng: 42.5167, + pop: 16512, + }, + { + lat: 40.646, + lng: 34.261, + pop: 16525, + }, + { + lat: 45.0544, + lng: 34.6022, + pop: 16428, + }, + { + lat: 32.8353, + lng: 35.9714, + pop: 15985, + }, + { + lat: 36.2333, + lng: 36.2167, + pop: 15692, + }, + { + lat: 32.3936, + lng: 51.3408, + pop: 16086, + }, + { + lat: 40.7475, + lng: 40.2419, + pop: 16213, + }, + { + lat: 39.9756, + lng: 41.8711, + pop: 16178, + }, + { + lat: 43.6003, + lng: 46.7789, + pop: 16165, + }, + { + lat: 34.8868, + lng: 38.8721, + pop: 16173, + }, + { + lat: 39.6568, + lng: -119.6694, + pop: 16131, + }, + { + lat: 40.4425, + lng: 47.6767, + pop: 16018, + }, + { + lat: 33.2692, + lng: 35.7706, + pop: 15973, + }, + { + lat: 41.9486, + lng: 34.3367, + pop: 16004, + }, + { + lat: 46.7006, + lng: 32.5478, + pop: 15984, + }, + { + lat: 27.7975, + lng: 53.685, + pop: 16000, + }, + { + lat: 46.1167, + lng: 48.0833, + pop: 15984, + }, + { + lat: 33.1047, + lng: 50.9589, + pop: 15828, + }, + { + lat: 37.0164, + lng: 41.9544, + pop: 15759, + }, + { + lat: 35.0004, + lng: -114.5748, + pop: 15872, + }, + { + lat: 43.4333, + lng: 28.3333, + pop: 15834, + }, + { + lat: 36.0561, + lng: 40.7303, + pop: 15806, + }, + { + lat: 31.4469, + lng: 49.5294, + pop: 15802, + }, + { + lat: 32.7025, + lng: 51.1536, + pop: 15673, + }, + { + lat: 35.9632, + lng: 38.0356, + pop: 15477, + }, + { + lat: 33.0528, + lng: 51.0825, + pop: 15550, + }, + { + lat: 33.4242, + lng: 36.2244, + pop: 13993, + }, + { + lat: 40.52, + lng: 35.2953, + pop: 15655, + }, + { + lat: 27.4064, + lng: 57.5014, + pop: 15634, + }, + { + lat: 34.7087, + lng: 33.0504, + pop: 14578, + }, + { + lat: 40.9667, + lng: 31.45, + pop: 15573, + }, + { + lat: 32.8019, + lng: 51.6636, + pop: 15524, + }, + { + lat: 30.8733, + lng: 55.2706, + pop: 15532, + }, + { + lat: 40.0172, + lng: 32.3483, + pop: 15540, + }, + { + lat: 36.3667, + lng: 36.2, + pop: 14751, + }, + { + lat: 31.4825, + lng: 48.8747, + pop: 15312, + }, + { + lat: 47.2848, + lng: 39.4823, + pop: 15334, + }, + { + lat: 40.879, + lng: 37.4532, + pop: 14954, + }, + { + lat: 40.8372, + lng: 44.2675, + pop: 15000, + }, + { + lat: 35.0333, + lng: 33.9833, + pop: 14963, + }, + { + lat: 30.7461, + lng: 50.7461, + pop: 15218, + }, + { + lat: 28.8833, + lng: 51.275, + pop: 15198, + }, + { + lat: 39.8033, + lng: 29.6178, + pop: 15181, + }, + { + lat: 46.5167, + lng: 32.5167, + pop: 15163, + }, + { + lat: 41.45, + lng: 45.1, + pop: 15100, + }, + { + lat: 34.2597, + lng: 36.4236, + pop: 15000, + }, + { + lat: 33.6333, + lng: 35.7833, + pop: 14728, + }, + { + lat: 32.4917, + lng: 36.7111, + pop: 15000, + }, + { + lat: 39.2592, + lng: -119.5653, + pop: 15036, + }, + { + lat: 32.5379, + lng: 34.9122, + pop: 13962, + }, + { + lat: 37.544, + lng: 41.72, + pop: 14976, + }, + { + lat: 35.9033, + lng: 36.7258, + pop: 14530, + }, + { + lat: 40.8736, + lng: 30.9508, + pop: 14895, + }, + { + lat: 36.6975, + lng: 38.9567, + pop: 14825, + }, + { + lat: 35.1578, + lng: -117.8721, + pop: 14914, + }, + { + lat: 35.8407, + lng: -114.9257, + pop: 14868, + }, + { + lat: 41.7494, + lng: 32.3864, + pop: 14776, + }, + { + lat: 43.17, + lng: 45.3711, + pop: 14720, + }, + { + lat: 42.4167, + lng: 27.7, + pop: 14789, + }, + { + lat: 45.85, + lng: 41.5167, + pop: 14761, + }, + { + lat: 40.9333, + lng: 38.1333, + pop: 14659, + }, + { + lat: 45.3694, + lng: 44.2281, + pop: 14722, + }, + { + lat: 46.6186, + lng: 31.5392, + pop: 14705, + }, + { + lat: 30.2625, + lng: 51.9833, + pop: 14633, + }, + { + lat: 33.6497, + lng: 35.4433, + pop: 12888, + }, + { + lat: 40.8856, + lng: 39.2922, + pop: 14592, + }, + { + lat: 26.9636, + lng: 56.0622, + pop: 14525, + }, + { + lat: 35.3753, + lng: 36.6872, + pop: 14307, + }, + { + lat: 33.7421, + lng: 36.6435, + pop: 14228, + }, + { + lat: 37.4025, + lng: 40.9561, + pop: 14233, + }, + { + lat: 43.2162, + lng: 46.0381, + pop: 14111, + }, + { + lat: 40.262, + lng: 36.313, + pop: 14335, + }, + { + lat: 39.71, + lng: 39.7017, + pop: 14390, + }, + { + lat: 46.1269, + lng: 30.385, + pop: 14321, + }, + { + lat: 37.4431, + lng: 36.0322, + pop: 14308, + }, + { + lat: 32.4467, + lng: 35.1703, + pop: 13640, + }, + { + lat: 35.2659, + lng: -118.9159, + pop: 14269, + }, + { + lat: 39.6936, + lng: 35.5111, + pop: 14198, + }, + { + lat: 34.7181, + lng: 33.0856, + pop: 13421, + }, + { + lat: 43.2036, + lng: 46.1322, + pop: 13824, + }, + { + lat: 41.05, + lng: 39.1333, + pop: 13955, + }, + { + lat: 42.65, + lng: 27.7333, + pop: 14146, + }, + { + lat: 44.27, + lng: 28.56, + pop: 13968, + }, + { + lat: 40.9, + lng: 30.4833, + pop: 13973, + }, + { + lat: 35.6781, + lng: -119.2413, + pop: 14085, + }, + { + lat: 25.7347, + lng: 51.5475, + pop: 13511, + }, + { + lat: 43.1636, + lng: 45.4725, + pop: 13836, + }, + { + lat: 36.255, + lng: 42.0164, + pop: 14000, + }, + { + lat: 41.0333, + lng: 37.1, + pop: 13922, + }, + { + lat: 27.4744, + lng: 52.6114, + pop: 13557, + }, + { + lat: 39.9106, + lng: 44.7278, + pop: 13600, + }, + { + lat: 46.6791, + lng: 32.7228, + pop: 12812, + }, + { + lat: 28.4061, + lng: 54.1881, + pop: 13809, + }, + { + lat: 36.3947, + lng: 36.6889, + pop: 13661, + }, + { + lat: 36.2828, + lng: 36.8519, + pop: 13525, + }, + { + lat: 40.5572, + lng: 39.2919, + pop: 13771, + }, + { + lat: 43.25, + lng: 46.1333, + pop: 13405, + }, + { + lat: 32.4167, + lng: 35.6833, + pop: 13056, + }, + { + lat: 47.0833, + lng: 39.5667, + pop: 13692, + }, + { + lat: 36.5833, + lng: 31.8833, + pop: 13563, + }, + { + lat: 34.8969, + lng: 36.1346, + pop: 13244, + }, + { + lat: 27.2856, + lng: 61.9964, + pop: 13580, + }, + { + lat: 32.8425, + lng: 36.34, + pop: 13315, + }, + { + lat: 32.9411, + lng: 50.1211, + pop: 13475, + }, + { + lat: 41.925, + lng: 44.4222, + pop: 13423, + }, + { + lat: 30.8939, + lng: 61.6803, + pop: 13357, + }, + { + lat: 33.93, + lng: 35.745, + pop: 12000, + }, + { + lat: 41.4647, + lng: 47.74, + pop: 13405, + }, + { + lat: 32.0078, + lng: 51.2156, + pop: 13317, + }, + { + lat: 35.41, + lng: 36.39, + pop: 12925, + }, + { + lat: 34.7833, + lng: 36.4333, + pop: 13020, + }, + { + lat: 35.1276, + lng: -118.4744, + pop: 13346, + }, + { + lat: 41.6667, + lng: 48.1333, + pop: 13232, + }, + { + lat: 36.5133, + lng: 41.9542, + pop: 13281, + }, + { + lat: 41.3228, + lng: 47.1133, + pop: 13260, + }, + { + lat: 32.7109, + lng: 36.0266, + pop: 12640, + }, + { + lat: 31.19, + lng: 50.4419, + pop: 13269, + }, + { + lat: 29.2911, + lng: 56.9131, + pop: 13263, + }, + { + lat: 40.9814, + lng: 47.8458, + pop: 13190, + }, + { + lat: 41.1333, + lng: 44.65, + pop: 13000, + }, + { + lat: 40.16, + lng: 47.1722, + pop: 13002, + }, + { + lat: 27.5236, + lng: 57.8811, + pop: 13169, + }, + { + lat: 46.3425, + lng: 30.5653, + pop: 13036, + }, + { + lat: 37.4711, + lng: 41.9139, + pop: 13091, + }, + { + lat: 37.4792, + lng: 40.4864, + pop: 13117, + }, + { + lat: 44.8832, + lng: 39.1902, + pop: 12745, + }, + { + lat: 45.3908, + lng: 47.3658, + pop: 13125, + }, + { + lat: 43.5167, + lng: 43.7, + pop: 12813, + }, + { + lat: 32.6428, + lng: 51.5, + pop: 11264, + }, + { + lat: 25.6208, + lng: 51.0819, + pop: 13085, + }, + { + lat: 37.0519, + lng: 31.7842, + pop: 13084, + }, + { + lat: 26.5758, + lng: 59.6397, + pop: 13070, + }, + { + lat: 32.5444, + lng: 50.7461, + pop: 12971, + }, + { + lat: 30.0547, + lng: 54.3717, + pop: 13032, + }, + { + lat: 45.9072, + lng: 43.3558, + pop: 12998, + }, + { + lat: 35.0611, + lng: 36.6972, + pop: 12194, + }, + { + lat: 34.5596, + lng: -117.9558, + pop: 12961, + }, + { + lat: 34.3436, + lng: 36.4756, + pop: 12000, + }, + { + lat: 32.4197, + lng: 52.6483, + pop: 12714, + }, + { + lat: 43.1878, + lng: 44.9036, + pop: 12734, + }, + { + lat: 42.2903, + lng: 43.2819, + pop: 12803, + }, + { + lat: 35.2645, + lng: -114.0091, + pop: 12858, + }, + { + lat: 34.7594, + lng: -112.412, + pop: 12854, + }, + { + lat: 43.2906, + lng: 45.3014, + pop: 12738, + }, + { + lat: 35.6342, + lng: 36.6322, + pop: 12276, + }, + { + lat: 45.1142, + lng: 34.0142, + pop: 12711, + }, + { + lat: 30.9817, + lng: 50.4233, + pop: 12772, + }, + { + lat: 43.4847, + lng: 44.5881, + pop: 12614, + }, + { + lat: 43.4333, + lng: 43.575, + pop: 10829, + }, + { + lat: 40.1806, + lng: 45.72, + pop: 12363, + }, + { + lat: 40.3053, + lng: 37.8306, + pop: 12637, + }, + { + lat: 36.6964, + lng: 32.6203, + pop: 12601, + }, + { + lat: 40.9667, + lng: 39.7333, + pop: 11077, + }, + { + lat: 44.1128, + lng: 28.5558, + pop: 12333, + }, + { + lat: 34.1542, + lng: 36.7442, + pop: 12508, + }, + { + lat: 44.165, + lng: 28.455, + pop: 12376, + }, + { + lat: 43.3458, + lng: 44.2028, + pop: 12501, + }, + { + lat: 43.2586, + lng: 45.5392, + pop: 12340, + }, + { + lat: 36.2082, + lng: -119.0897, + pop: 12551, + }, + { + lat: 32.3378, + lng: 51.1961, + pop: 12292, + }, + { + lat: 34.6097, + lng: -117.8339, + pop: 12497, + }, + { + lat: 34.2419, + lng: 35.9794, + pop: 12000, + }, + { + lat: 43.4269, + lng: 28.1617, + pop: 12429, + }, + { + lat: 39.9011, + lng: 38.7686, + pop: 12456, + }, + { + lat: 26.5583, + lng: 49.9503, + pop: 11460, + }, + { + lat: 43.2514, + lng: 45.9072, + pop: 12224, + }, + { + lat: 36.5244, + lng: -119.5602, + pop: 12413, + }, + { + lat: 32.3156, + lng: 50.6783, + pop: 12308, + }, + { + lat: 36.2936, + lng: 37.0444, + pop: 11918, + }, + { + lat: 40.14, + lng: 45.3064, + pop: 11987, + }, + { + lat: 43.3117, + lng: 45.1594, + pop: 12221, + }, + { + lat: 32.2854, + lng: 35.8113, + pop: 11586, + }, + { + lat: 43.1126, + lng: 45.7339, + pop: 12092, + }, + { + lat: 40.3167, + lng: 38.7667, + pop: 12250, + }, + { + lat: 42.665, + lng: 46.22, + pop: 12159, + }, + { + lat: 45.6833, + lng: 28.4028, + pop: 12185, + }, + { + lat: 27.1944, + lng: 60.4558, + pop: 12217, + }, + { + lat: 46.5331, + lng: 48.3456, + pop: 12214, + }, + { + lat: 34.5683, + lng: 36.2764, + pop: 12000, + }, + { + lat: 46.8333, + lng: 33.4167, + pop: 12123, + }, + { + lat: 32.6653, + lng: 35.7333, + pop: 11706, + }, + { + lat: 43.6756, + lng: 43.455, + pop: 12001, + }, + { + lat: 30.0042, + lng: 53.0067, + pop: 12000, + }, + { + lat: 41.8833, + lng: 34.9167, + pop: 12049, + }, + { + lat: 47.0708, + lng: 32.7997, + pop: 12045, + }, + { + lat: 31.9383, + lng: 51.0533, + pop: 11980, + }, + { + lat: 33.1839, + lng: 36.2264, + pop: 11802, + }, + { + lat: 40.9131, + lng: 37.5169, + pop: 11851, + }, + { + lat: 36.9883, + lng: 32.4569, + pop: 11970, + }, + { + lat: 36.6667, + lng: 34.4167, + pop: 11923, + }, + { + lat: 47.2717, + lng: 35.2248, + pop: 11949, + }, + { + lat: 40.9422, + lng: 39.1942, + pop: 11934, + }, + { + lat: 31.9911, + lng: 54.2322, + pop: 11691, + }, + { + lat: 42.4333, + lng: 47.3167, + pop: 11862, + }, + { + lat: 47.1708, + lng: 37.6954, + pop: 10350, + }, + { + lat: 46.2667, + lng: 30.4333, + pop: 11741, + }, + { + lat: 47.1333, + lng: 28.8667, + pop: 10669, + }, + { + lat: 33.2092, + lng: 35.2992, + pop: 10000, + }, + { + lat: 33.5581, + lng: 36.2222, + pop: 10045, + }, + { + lat: 43.6119, + lng: 43.3269, + pop: 11717, + }, + { + lat: 36.8175, + lng: 38.0111, + pop: 11570, + }, + { + lat: 38.8957, + lng: -119.7492, + pop: 11761, + }, + { + lat: 46.7353, + lng: 36.3473, + pop: 11679, + }, + { + lat: 32.4689, + lng: 51.5578, + pop: 10851, + }, + { + lat: 43.5667, + lng: 43.5833, + pop: 11575, + }, + { + lat: 26.2483, + lng: 60.7525, + pop: 11605, + }, + { + lat: 43.4911, + lng: 43.5528, + pop: 9669, + }, + { + lat: 46.6977, + lng: 35.1554, + pop: 11481, + }, + { + lat: 36.8833, + lng: 36.2333, + pop: 11187, + }, + { + lat: 46.9122, + lng: 28.8839, + pop: 10175, + }, + { + lat: 42.3264, + lng: 42.6006, + pop: 11281, + }, + { + lat: 36.6389, + lng: 32.8925, + pop: 11332, + }, + { + lat: 29.9789, + lng: 48.5206, + pop: 11173, + }, + { + lat: 30.0617, + lng: 48.4508, + pop: 11173, + }, + { + lat: 39.7667, + lng: 30.95, + pop: 11242, + }, + { + lat: 44.45, + lng: 42.5, + pop: 11215, + }, + { + lat: 46.1083, + lng: 28.5972, + pop: 11123, + }, + { + lat: 36.1417, + lng: 33.3178, + pop: 11088, + }, + { + lat: 34.2425, + lng: 37.0589, + pop: 11064, + }, + { + lat: 46.6833, + lng: 47.85, + pop: 11079, + }, + { + lat: 36.7667, + lng: 31.3889, + pop: 11000, + }, + { + lat: 47.0667, + lng: 28.6833, + pop: 10380, + }, + { + lat: 34.0833, + lng: 36.7667, + pop: 10984, + }, + { + lat: 44.4361, + lng: 34.1106, + pop: 10310, + }, + { + lat: 46.8678, + lng: 28.7689, + pop: 10907, + }, + { + lat: 45.5019, + lng: 32.7025, + pop: 11039, + }, + { + lat: 43.5261, + lng: 43.5594, + pop: 11004, + }, + { + lat: 36.1389, + lng: 36.83, + pop: 10657, + }, + { + lat: 41.6281, + lng: 48.6828, + pop: 10894, + }, + { + lat: 40.7444, + lng: 43.625, + pop: 10985, + }, + { + lat: 36.2167, + lng: 36.1667, + pop: 10354, + }, + { + lat: 33.4861, + lng: 36.6011, + pop: 10548, + }, + { + lat: 33.7333, + lng: 35.45, + pop: 10000, + }, + { + lat: 32.6872, + lng: 34.9383, + pop: 10639, + }, + { + lat: 37.3406, + lng: 40.8258, + pop: 10846, + }, + { + lat: 41.3, + lng: 27.95, + pop: 10601, + }, + { + lat: 44.5528, + lng: 34.2875, + pop: 9117, + }, + { + lat: 36.6667, + lng: 34.3833, + pop: 10907, + }, + { + lat: 32.2983, + lng: 48.4289, + pop: 10858, + }, + { + lat: 40.1428, + lng: 44.1164, + pop: 9870, + }, + { + lat: 41.3833, + lng: 27.9333, + pop: 10072, + }, + { + lat: 41.7333, + lng: 45.3333, + pop: 10871, + }, + { + lat: 40.9368, + lng: 45.8258, + pop: 10797, + }, + { + lat: 34.3, + lng: 35.8, + pop: 10000, + }, + { + lat: 36.7167, + lng: 36.2333, + pop: 10574, + }, + { + lat: 40.3217, + lng: 44.4814, + pop: 10656, + }, + { + lat: 35.683, + lng: 36.533, + pop: 10353, + }, + { + lat: 36.2333, + lng: 36.8167, + pop: 10394, + }, + { + lat: 32.6872, + lng: 36.3508, + pop: 10510, + }, + { + lat: 45.4978, + lng: 34.295, + pop: 10766, + }, + { + lat: 35.0211, + lng: 33.42, + pop: 10466, + }, + { + lat: 41.4783, + lng: 46.6175, + pop: 10700, + }, + { + lat: 30.3611, + lng: 51.1572, + pop: 10764, + }, + { + lat: 36.8667, + lng: 36.2, + pop: 10482, + }, + { + lat: 44.6667, + lng: 45.65, + pop: 10641, + }, + { + lat: 33.85, + lng: 35.6667, + pop: 10000, + }, + { + lat: 32.6322, + lng: 36.3386, + pop: 10466, + }, + { + lat: 31.4103, + lng: 56.2825, + pop: 10761, + }, + { + lat: 45.0448, + lng: 42.1104, + pop: 10695, + }, + { + lat: 31.6325, + lng: 49.8897, + pop: 10698, + }, + { + lat: 44.7444, + lng: 44.2031, + pop: 10721, + }, + { + lat: 29.2417, + lng: 57.3253, + pop: 10670, + }, + { + lat: 37.4944, + lng: 30.9817, + pop: 10707, + }, + { + lat: 40.3833, + lng: 35.5167, + pop: 10703, + }, + { + lat: 44.6142, + lng: 33.6083, + pop: 10196, + }, + { + lat: 46.3544, + lng: 34.3361, + pop: 10647, + }, + { + lat: 41.9747, + lng: 33.7608, + pop: 10594, + }, + { + lat: 33.3986, + lng: 36.4531, + pop: 10473, + }, + { + lat: 43.0878, + lng: 46.5631, + pop: 10532, + }, + { + lat: 40.2847, + lng: 30.3172, + pop: 10591, + }, + { + lat: 46.1958, + lng: 41.0778, + pop: 10593, + }, + { + lat: 36.0833, + lng: 36.5, + pop: 10296, + }, + { + lat: 29.5636, + lng: 51.3369, + pop: 10508, + }, + { + lat: 41.8389, + lng: 43.3792, + pop: 10546, + }, + { + lat: 40, + lng: 29.9, + pop: 10527, + }, + { + lat: 46.6167, + lng: 29.9167, + pop: 10436, + }, + { + lat: 32.3772, + lng: 51.1883, + pop: 10279, + }, + { + lat: 40.78, + lng: 43.1353, + pop: 10497, + }, + { + lat: 40.0986, + lng: 44.4681, + pop: 9550, + }, + { + lat: 36.834, + lng: 37.999, + pop: 10436, + }, + { + lat: 23.4675, + lng: 58.1061, + pop: 10396, + }, + { + lat: 36.305, + lng: -119.2083, + pop: 10441, + }, + { + lat: 30.1811, + lng: 56.8019, + pop: 10407, + }, + { + lat: 40.1167, + lng: 35.2667, + pop: 10407, + }, + { + lat: 46.7559, + lng: 33.4247, + pop: 10360, + }, + { + lat: 36.2941, + lng: -119.1459, + pop: 10349, + }, + { + lat: 44.1736, + lng: 28.4083, + pop: 10216, + }, + { + lat: 25.7089, + lng: 55.7972, + pop: 10190, + }, + { + lat: 36.1164, + lng: 36.5147, + pop: 10084, + }, + { + lat: 40.8333, + lng: 33.25, + pop: 10307, + }, + { + lat: 29.5978, + lng: 57.4386, + pop: 10286, + }, + { + lat: 27.4753, + lng: 59.4717, + pop: 10292, + }, + { + lat: 32.6828, + lng: 36.2233, + pop: 9784, + }, + { + lat: 40.9419, + lng: 45.7358, + pop: 10130, + }, + { + lat: 46.5036, + lng: 30.3244, + pop: 10148, + }, + { + lat: 39.7981, + lng: 42.6744, + pop: 10191, + }, + { + lat: 45.6333, + lng: 27.8, + pop: 10126, + }, + { + lat: 28.8678, + lng: 52.7533, + pop: 10120, + }, + { + lat: 46.9139, + lng: 28.9708, + pop: 9966, + }, + { + lat: 31.9989, + lng: 50.6617, + pop: 10113, + }, + { + lat: 26.2361, + lng: 61.3986, + pop: 10115, + }, + { + lat: 37.471, + lng: 42.317, + pop: 10094, + }, + { + lat: 43.1581, + lng: 44.1569, + pop: 10075, + }, + { + lat: 43.071, + lng: 46.6345, + pop: 10014, + }, + { + lat: 34.6527, + lng: -118.2163, + pop: 10079, + }, + { + lat: 46.0903, + lng: 47.7306, + pop: 10036, + }, + { + lat: 40.8808, + lng: 45.3917, + pop: 9864, + }, + { + lat: 39.75, + lng: 28.9167, + pop: 10042, + }, + { + lat: 35.1409, + lng: -118.4968, + pop: 10051, + }, + { + lat: 27.6594, + lng: 52.6575, + pop: 9982, + }, + { + lat: 43.2317, + lng: 45.5722, + pop: 9783, + }, + { + lat: 40.1331, + lng: 45.4367, + pop: 9880, + }, + { + lat: 36.9667, + lng: 35.05, + pop: 8689, + }, + { + lat: 27.1992, + lng: 54.3667, + pop: 9959, + }, + { + lat: 31.9336, + lng: 51.3306, + pop: 9923, + }, + { + lat: 33.0736, + lng: 50.1647, + pop: 9933, + }, + { + lat: 35.6169, + lng: 36.5953, + pop: 9595, + }, + { + lat: 43.1328, + lng: 45.7797, + pop: 9738, + }, + { + lat: 32.7039, + lng: 51.8381, + pop: 9712, + }, + { + lat: 47.2039, + lng: 30.9125, + pop: 9845, + }, + { + lat: 41.1289, + lng: 43.1328, + pop: 9833, + }, + { + lat: 42.3503, + lng: 42.9983, + pop: 9770, + }, + { + lat: 28.745, + lng: 53.8033, + pop: 9719, + }, + { + lat: 40.1333, + lng: 38.7333, + pop: 9759, + }, + { + lat: 47.0189, + lng: 34.9212, + pop: 9719, + }, + { + lat: 32.8658, + lng: 51.5972, + pop: 9690, + }, + { + lat: 36.8708, + lng: 39.025, + pop: 9653, + }, + { + lat: 40.7814, + lng: 43.8964, + pop: 9668, + }, + { + lat: 43.1797, + lng: 45.4081, + pop: 9584, + }, + { + lat: 45.1278, + lng: 39.5725, + pop: 9617, + }, + { + lat: 40.5194, + lng: 28.8281, + pop: 9625, + }, + { + lat: 44.6833, + lng: 27.9519, + pop: 9642, + }, + { + lat: 46.3667, + lng: 28.5167, + pop: 9562, + }, + { + lat: 46.6317, + lng: 32.4452, + pop: 9565, + }, + { + lat: 33.6878, + lng: 36.1008, + pop: 9371, + }, + { + lat: 44.8228, + lng: 44.6592, + pop: 9602, + }, + { + lat: 39.7175, + lng: 44.8764, + pop: 9306, + }, + { + lat: 46.3629, + lng: 33.5302, + pop: 9539, + }, + { + lat: 43.3725, + lng: 46.445, + pop: 9442, + }, + { + lat: 43.2, + lng: 45.7889, + pop: 9300, + }, + { + lat: 45.4464, + lng: 34.7344, + pop: 9460, + }, + { + lat: 43.9625, + lng: 42.9875, + pop: 9427, + }, + { + lat: 47.1503, + lng: 29.2925, + pop: 9381, + }, + { + lat: 40.21, + lng: 39.6511, + pop: 9387, + }, + { + lat: 29.0147, + lng: 61.45, + pop: 9359, + }, + { + lat: 28.0842, + lng: 54.0483, + pop: 9318, + }, + { + lat: 44.5167, + lng: 34.1833, + pop: 8571, + }, + { + lat: 47.0875, + lng: 28.8703, + pop: 8694, + }, + { + lat: 44.8981, + lng: 28.7419, + pop: 9213, + }, + { + lat: 46.2581, + lng: 33.2843, + pop: 9224, + }, + { + lat: 31.8719, + lng: 56.0239, + pop: 9232, + }, + { + lat: 29.885, + lng: 57.7306, + pop: 9205, + }, + { + lat: 47.25, + lng: 28.7667, + pop: 9122, + }, + { + lat: 40, + lng: 36.22, + pop: 9154, + }, + { + lat: 45.85, + lng: 28.6944, + pop: 9138, + }, + { + lat: 27.8722, + lng: 52.0289, + pop: 8753, + }, + { + lat: 35.5464, + lng: 36.6431, + pop: 8817, + }, + { + lat: 29.6, + lng: 55.5369, + pop: 9112, + }, + { + lat: 43.3186, + lng: 45.9878, + pop: 8972, + }, + { + lat: 35.2477, + lng: -116.6834, + pop: 9100, + }, + { + lat: 41.6222, + lng: 35.5314, + pop: 8864, + }, + { + lat: 46.7833, + lng: 29.6167, + pop: 9000, + }, + { + lat: 35.0025, + lng: 40.5117, + pop: 9000, + }, + { + lat: 39.4737, + lng: -118.7779, + pop: 9068, + }, + { + lat: 40.1, + lng: 31.6833, + pop: 9039, + }, + { + lat: 39.8056, + lng: 40.0364, + pop: 9032, + }, + { + lat: 40.75, + lng: 33.7667, + pop: 8981, + }, + { + lat: 42.3244, + lng: 42.4222, + pop: 8987, + }, + { + lat: 41.45, + lng: 44.5333, + pop: 8967, + }, + { + lat: 41.5, + lng: 31.8667, + pop: 8678, + }, + { + lat: 32.3828, + lng: 35.6619, + pop: 8647, + }, + { + lat: 44.2333, + lng: 42.0167, + pop: 8836, + }, + { + lat: 28.3106, + lng: 54.3347, + pop: 8927, + }, + { + lat: 40.1467, + lng: 45.2642, + pop: 8553, + }, + { + lat: 35.9969, + lng: 36.7867, + pop: 8540, + }, + { + lat: 46.1353, + lng: 41.9656, + pop: 8798, + }, + { + lat: 29.4769, + lng: 54.3314, + pop: 8799, + }, + { + lat: 37.1742, + lng: -113.6809, + pop: 8786, + }, + { + lat: 41.1244, + lng: 44.2819, + pop: 8700, + }, + { + lat: 40.283, + lng: 35.267, + pop: 8696, + }, + { + lat: 35.1268, + lng: -119.4243, + pop: 8730, + }, + { + lat: 32.5756, + lng: 59.7983, + pop: 8715, + }, + { + lat: 36.5433, + lng: -119.2914, + pop: 8701, + }, + { + lat: 37.1703, + lng: 34.6083, + pop: 8679, + }, + { + lat: 42.5658, + lng: 47.5631, + pop: 8627, + }, + { + lat: 40.1639, + lng: 39.8925, + pop: 8657, + }, + { + lat: 37.0728, + lng: 40.6519, + pop: 8551, + }, + { + lat: 44.7494, + lng: 43.4386, + pop: 8544, + }, + { + lat: 37.6494, + lng: 30.5339, + pop: 8537, + }, + { + lat: 40.1575, + lng: 33.7175, + pop: 8531, + }, + { + lat: 32.2631, + lng: 51.5622, + pop: 9924, + }, + { + lat: 32.0686, + lng: 61.8058, + pop: 10000, + }, + { + lat: 33.7711, + lng: 35.6858, + pop: 10000, + }, + { + lat: 30.4667, + lng: 53.45, + pop: 9776, + }, + { + lat: 36.5833, + lng: 31.8833, + pop: 9527, + }, + { + lat: 43.2167, + lng: 46.8667, + pop: 9458, + }, + { + lat: 40.9447, + lng: 47.9411, + pop: 9507, + }, + { + lat: 44.2659, + lng: 43.7562, + pop: 9516, + }, + { + lat: 30.4344, + lng: 63.3183, + pop: 9482, + }, + { + lat: 43.0997, + lng: 44.6317, + pop: 9217, + }, + { + lat: 32.1447, + lng: 48.3925, + pop: 9177, + }, + { + lat: 44.0817, + lng: 42.9606, + pop: 9079, + }, + { + lat: 43.42, + lng: 43.92, + pop: 9010, + }, + { + lat: 40.5808, + lng: 46.8503, + pop: 8830, + }, + { + lat: 32.2539, + lng: 50.5975, + pop: 8699, + }, + { + lat: 40.9533, + lng: 45.6792, + pop: 8702, + }, + { + lat: 43.3469, + lng: 44.6975, + pop: 8590, + }, + { + lat: 46.5467, + lng: 30.6306, + pop: 8558, + }, + { + lat: 43.1486, + lng: 44.7069, + pop: 8508, + }, + { + lat: 40.9053, + lng: 45.5564, + pop: 1155, + }, +]; diff --git a/frontend/react/src/unit/databases/groundunitdatabase.ts b/frontend/react/src/unit/databases/groundunitdatabase.ts new file mode 100644 index 00000000..80650b09 --- /dev/null +++ b/frontend/react/src/unit/databases/groundunitdatabase.ts @@ -0,0 +1,37 @@ +import { getApp } from "../../olympusapp"; +import { GAME_MASTER } from "../../constants/constants"; +import { UnitDatabase } from "./unitdatabase"; + +export class GroundUnitDatabase extends UnitDatabase { + constructor() { + super( + window.location.href.split("?")[0].replace("vite/", "") + + "api/databases/units/groundunitdatabase" + ); + } + + getSpawnPointsByName(name: string) { + if ( + getApp().getMissionManager().getCommandModeOptions().commandMode == + GAME_MASTER || + !getApp().getMissionManager().getCommandModeOptions().restrictSpawns + ) + return 0; + + const blueprint = this.getByName(name); + if (blueprint?.cost != undefined) return blueprint?.cost; + + if (blueprint?.era == "WW2") return 20; + else if (blueprint?.era == "Early Cold War") return 50; + else if (blueprint?.era == "Mid Cold War") return 100; + else if (blueprint?.era == "Late Cold War") return 200; + else if (blueprint?.era == "Modern") return 400; + return 0; + } + + getCategory() { + return "GroundUnit"; + } +} + +export var groundUnitDatabase = new GroundUnitDatabase(); diff --git a/frontend/react/src/unit/databases/helicopterdatabase.ts b/frontend/react/src/unit/databases/helicopterdatabase.ts new file mode 100644 index 00000000..d04b8f78 --- /dev/null +++ b/frontend/react/src/unit/databases/helicopterdatabase.ts @@ -0,0 +1,37 @@ +import { getApp } from "../../olympusapp"; +import { GAME_MASTER } from "../../constants/constants"; +import { UnitDatabase } from "./unitdatabase"; + +export class HelicopterDatabase extends UnitDatabase { + constructor() { + super( + window.location.href.split("?")[0].replace("vite/", "") + + "api/databases/units/helicopterdatabase" + ); + } + + getSpawnPointsByName(name: string) { + if ( + getApp().getMissionManager().getCommandModeOptions().commandMode == + GAME_MASTER || + !getApp().getMissionManager().getCommandModeOptions().restrictSpawns + ) + return 0; + + const blueprint = this.getByName(name); + if (blueprint?.cost != undefined) return blueprint?.cost; + + if (blueprint?.era == "WW2") return 20; + else if (blueprint?.era == "Early Cold War") return 50; + else if (blueprint?.era == "Mid Cold War") return 100; + else if (blueprint?.era == "Late Cold War") return 200; + else if (blueprint?.era == "Modern") return 400; + return 0; + } + + getCategory() { + return "Helicopter"; + } +} + +export var helicopterDatabase = new HelicopterDatabase(); diff --git a/frontend/react/src/unit/databases/navyunitdatabase.ts b/frontend/react/src/unit/databases/navyunitdatabase.ts new file mode 100644 index 00000000..b1fdcfb1 --- /dev/null +++ b/frontend/react/src/unit/databases/navyunitdatabase.ts @@ -0,0 +1,37 @@ +import { getApp } from "../../olympusapp"; +import { GAME_MASTER } from "../../constants/constants"; +import { UnitDatabase } from "./unitdatabase"; + +export class NavyUnitDatabase extends UnitDatabase { + constructor() { + super( + window.location.href.split("?")[0].replace("vite/", "") + + "api/databases/units/navyunitdatabase" + ); + } + + getSpawnPointsByName(name: string) { + if ( + getApp().getMissionManager().getCommandModeOptions().commandMode == + GAME_MASTER || + !getApp().getMissionManager().getCommandModeOptions().restrictSpawns + ) + return 0; + + const blueprint = this.getByName(name); + if (blueprint?.cost != undefined) return blueprint?.cost; + + if (blueprint?.era == "WW2") return 20; + else if (blueprint?.era == "Early Cold War") return 50; + else if (blueprint?.era == "Mid Cold War") return 100; + else if (blueprint?.era == "Late Cold War") return 200; + else if (blueprint?.era == "Modern") return 400; + return 0; + } + + getCategory() { + return "NavyUnit"; + } +} + +export var navyUnitDatabase = new NavyUnitDatabase(); diff --git a/frontend/react/src/unit/databases/unitdatabase.ts b/frontend/react/src/unit/databases/unitdatabase.ts new file mode 100644 index 00000000..46ad2bd2 --- /dev/null +++ b/frontend/react/src/unit/databases/unitdatabase.ts @@ -0,0 +1,247 @@ +import { LatLng } from "leaflet"; +import { getApp } from "../../olympusapp"; +import { GAME_MASTER } from "../../constants/constants"; +import { UnitBlueprint } from "../../interfaces"; + +export abstract class UnitDatabase { + blueprints: { [key: string]: UnitBlueprint } = {}; + #url: string; + + constructor(url: string = "") { + this.#url = url; + this.load(() => {}); + } + + load(callback: CallableFunction) { + if (this.#url !== "") { + var xhr = new XMLHttpRequest(); + xhr.open("GET", this.#url, true); + xhr.setRequestHeader("Cache-Control", "no-cache, no-store, max-age=0"); + xhr.responseType = "json"; + xhr.onload = () => { + var status = xhr.status; + if (status === 200) { + this.blueprints = xhr.response; + callback(); + } else { + console.error(`Error retrieving database from ${this.#url}`); + } + }; + xhr.send(); + } + } + + abstract getCategory(): string; + + /* Gets a specific blueprint by name */ + getByName(name: string) { + if (name in this.blueprints) return this.blueprints[name]; + return null; + } + + /* Gets a specific blueprint by label */ + getByLabel(label: string) { + for (let unit in this.blueprints) { + if (this.blueprints[unit].label === label) return this.blueprints[unit]; + } + return null; + } + + getBlueprints(includeDisabled: boolean = false) { + if ( + getApp().getMissionManager().getCommandModeOptions().commandMode == + GAME_MASTER || + !getApp().getMissionManager().getCommandModeOptions().restrictSpawns + ) { + var filteredBlueprints: { [key: string]: UnitBlueprint } = {}; + for (let unit in this.blueprints) { + const blueprint = this.blueprints[unit]; + if (blueprint.enabled || includeDisabled) + filteredBlueprints[unit] = blueprint; + } + return filteredBlueprints; + } else { + var filteredBlueprints: { [key: string]: UnitBlueprint } = {}; + for (let unit in this.blueprints) { + const blueprint = this.blueprints[unit]; + if ( + (blueprint.enabled || includeDisabled) && + this.getSpawnPointsByName(blueprint.name) <= + getApp().getMissionManager().getAvailableSpawnPoints() && + getApp() + .getMissionManager() + .getCommandModeOptions() + .eras.includes(blueprint.era) && + (!getApp().getMissionManager().getCommandModeOptions() + .restrictToCoalition || + blueprint.coalition === + getApp().getMissionManager().getCommandedCoalition() || + blueprint.coalition === undefined) + ) { + filteredBlueprints[unit] = blueprint; + } + } + return filteredBlueprints; + } + } + + /* Returns a list of all possible roles in a database */ + getRoles() { + var roles: string[] = []; + var filteredBlueprints = this.getBlueprints(); + for (let unit in filteredBlueprints) { + var loadouts = filteredBlueprints[unit].loadouts; + if (loadouts) { + for (let loadout of loadouts) { + for (let role of loadout.roles) { + if (role !== "" && !roles.includes(role)) roles.push(role); + } + } + } + } + return roles; + } + + /* Returns a list of all possible types in a database */ + getTypes(unitFilter?: CallableFunction) { + var filteredBlueprints = this.getBlueprints(); + var types: string[] = []; + for (let unit in filteredBlueprints) { + if ( + typeof unitFilter === "function" && + !unitFilter(filteredBlueprints[unit]) + ) + continue; + var type = filteredBlueprints[unit].type; + if (type && type !== "" && !types.includes(type)) types.push(type); + } + return types; + } + + /* Returns a list of all possible periods in a database */ + getEras() { + var filteredBlueprints = this.getBlueprints(); + var eras: string[] = []; + for (let unit in filteredBlueprints) { + var era = filteredBlueprints[unit].era; + if (era && era !== "" && !eras.includes(era)) eras.push(era); + } + return eras; + } + + /* Get all blueprints by range */ + getByRange(range: string) { + var filteredBlueprints = this.getBlueprints(); + var unitswithrange = []; + var minRange = 0; + var maxRange = 0; + + if (range === "Short range") { + minRange = 0; + maxRange = 10000; + } else if (range === "Medium range") { + minRange = 10000; + maxRange = 100000; + } else { + minRange = 100000; + maxRange = 999999; + } + + for (let unit in filteredBlueprints) { + var engagementRange = filteredBlueprints[unit].engagementRange; + if (engagementRange !== undefined) { + if (engagementRange >= minRange && engagementRange < maxRange) { + unitswithrange.push(filteredBlueprints[unit]); + } + } + } + return unitswithrange; + } + + /* Get all blueprints by type */ + getByType(type: string) { + var filteredBlueprints = this.getBlueprints(); + var units = []; + for (let unit in filteredBlueprints) { + if (filteredBlueprints[unit].type === type) { + units.push(filteredBlueprints[unit]); + } + } + return units; + } + + /* Get all blueprints by role */ + getByRole(role: string) { + var filteredBlueprints = this.getBlueprints(); + var units = []; + for (let unit in filteredBlueprints) { + var loadouts = filteredBlueprints[unit].loadouts; + if (loadouts) { + for (let loadout of loadouts) { + if ( + loadout.roles.includes(role) || + loadout.roles.includes(role.toLowerCase()) + ) { + units.push(filteredBlueprints[unit]); + break; + } + } + } + } + return units; + } + + /* Get the names of all the loadouts for a specific unit and for a specific role */ + getLoadoutNamesByRole(name: string, role: string) { + var filteredBlueprints = this.getBlueprints(); + var loadoutsByRole = []; + var loadouts = filteredBlueprints[name].loadouts; + if (loadouts) { + for (let loadout of loadouts) { + if (loadout.roles.includes(role) || loadout.roles.includes("")) { + loadoutsByRole.push(loadout.name); + } + } + } + return loadoutsByRole; + } + + /* Get the livery names for a specific unit */ + getLiveryNamesByName(name: string) { + var liveries = this.blueprints[name].liveries; + if (liveries !== undefined) return Object.values(liveries); + else return []; + } + + /* Get the loadout content from the unit name and loadout name */ + getLoadoutByName(name: string, loadoutName: string) { + var loadouts = this.blueprints[name].loadouts; + if (loadouts) { + for (let loadout of loadouts) { + if (loadout.name === loadoutName) return loadout; + } + } + return null; + } + + getSpawnPointsByLabel(label: string) { + var blueprint = this.getByLabel(label); + if (blueprint) return this.getSpawnPointsByName(blueprint.name); + else return Infinity; + } + + getSpawnPointsByName(name: string) { + return Infinity; + } + + getUnkownUnit(name: string): UnitBlueprint { + return { + name: name, + enabled: true, + coalition: "neutral", + era: "N/A", + label: name, + shortLabel: "", + }; + } +} diff --git a/frontend/react/src/unit/group.ts b/frontend/react/src/unit/group.ts new file mode 100644 index 00000000..f8d25daa --- /dev/null +++ b/frontend/react/src/unit/group.ts @@ -0,0 +1,47 @@ +import { Unit } from "./unit"; + +export class Group { + #members: Unit[] = []; + #name: string; + + constructor(name: string) { + this.#name = name; + + document.addEventListener("unitDeath", (e: any) => { + if (this.#members.includes(e.detail)) + this.getLeader()?.onGroupChanged(e.detail); + }); + } + + getName() { + return this.#name; + } + + addMember(member: Unit) { + if (!this.#members.includes(member)) { + this.#members.push(member); + member.setGroup(this); + + this.getLeader()?.onGroupChanged(member); + } + } + + removeMember(member: Unit) { + if (this.#members.includes(member)) { + delete this.#members[this.#members.indexOf(member)]; + member.setGroup(null); + + this.getLeader()?.onGroupChanged(member); + } + } + + getMembers() { + return this.#members; + } + + getLeader() { + return this.#members.find((unit: Unit) => { + return unit.getIsLeader() && unit.getAlive(); + }); + } +} diff --git a/frontend/react/src/unit/importexport/unitdatafile.ts b/frontend/react/src/unit/importexport/unitdatafile.ts new file mode 100644 index 00000000..e53e0f4e --- /dev/null +++ b/frontend/react/src/unit/importexport/unitdatafile.ts @@ -0,0 +1,63 @@ +//import { Dialog } from "../../dialog/dialog"; +//import { createCheckboxOption } from "../../other/utils"; + +var categoryMap = { + Aircraft: "Aircraft", + Helicopter: "Helicopter", + GroundUnit: "Ground units", + NavyUnit: "Naval units", +}; + +export abstract class UnitDataFile { + protected data: any; + //protected dialog!: Dialog; + + constructor() {} + + buildCategoryCoalitionTable() { + const categories = this.#getCategoriesFromData(); + const coalitions = ["blue", "neutral", "red"]; + + let headersHTML: string = ``; + let matrixHTML: string = ``; + + //categories.forEach((category: string, index) => { + // matrixHTML += `${categoryMap[category as keyof typeof categoryMap]}`; + // + // coalitions.forEach((coalition: string) => { + // if (index === 0) + // headersHTML += `${coalition[0].toUpperCase() + coalition.substring(1)}`; + // + // const optionIsValid = this.data[category].hasOwnProperty(coalition); + // let checkboxHTML = createCheckboxOption(``, category, optionIsValid, () => { }, { + // "disabled": !optionIsValid, + // "name": "category-coalition-selection", + // "readOnly": !optionIsValid, + // "value" : `${category}:${coalition}` + // }).outerHTML; + // + // if (optionIsValid) + // checkboxHTML = checkboxHTML.replace(`"checkbox"`, `"checkbox" checked`); // inner and outerHTML screw default checked up + // + // matrixHTML += `${checkboxHTML}`; + // + // }); + // matrixHTML += ""; + //}); + // + //const table = this.dialog.getElement().querySelector("table.categories-coalitions"); + + //(table.tHead).innerHTML = ` ${headersHTML}`; + //(table.querySelector(`tbody`)).innerHTML = matrixHTML; + } + + #getCategoriesFromData() { + const categories = Object.keys(this.data); + categories.sort(); + return categories; + } + + getData() { + return this.data; + } +} diff --git a/frontend/react/src/unit/importexport/unitdatafileexport.ts b/frontend/react/src/unit/importexport/unitdatafileexport.ts new file mode 100644 index 00000000..1ad74650 --- /dev/null +++ b/frontend/react/src/unit/importexport/unitdatafileexport.ts @@ -0,0 +1,103 @@ +import { getApp } from "../../olympusapp"; +//import { Dialog } from "../../dialog/dialog"; +import { zeroAppend } from "../../other/utils"; +import { Unit } from "../unit"; +import { UnitDataFile } from "./unitdatafile"; + +export class UnitDataFileExport extends UnitDataFile { + protected data!: any; + //protected dialog: Dialog; + #element!: HTMLElement; + #filename: string = "export.json"; + + constructor(elementId: string) { + super(); + //this.dialog = new Dialog(elementId); + //this.#element = this.dialog.getElement(); + + this.#element + .querySelector(".start-transfer") + ?.addEventListener("click", (ev: MouseEventInit) => { + this.#doExport(); + }); + } + + /** + * Show the form to start the export journey + */ + showForm(units: Unit[]) { + //this.dialog.getElement().querySelectorAll("[data-on-error]").forEach((el:Element) => { + // el.classList.toggle("hide", el.getAttribute("data-on-error") === "show"); + //}); + // + //const data: any = {}; + //const unitCanBeExported = (unit: Unit) => !["Aircraft", "Helicopter"].includes(unit.getCategory()); + // + //units.filter((unit: Unit) => unit.getAlive() && unitCanBeExported(unit)).forEach((unit: Unit) => { + // const category = unit.getCategory(); + // const coalition = unit.getCoalition(); + // + // if (!data.hasOwnProperty(category)) { + // data[category] = {}; + // } + // + // if (!data[category].hasOwnProperty(coalition)) + // data[category][coalition] = []; + // + // data[category][coalition].push(unit); + //}); + // + //this.data = data; + //this.buildCategoryCoalitionTable(); + //this.dialog.show(); + // + //const date = new Date(); + //this.#filename = `olympus_${getApp().getMissionManager().getTheatre().replace(/[^\w]/gi, "").toLowerCase()}_${date.getFullYear()}${zeroAppend(date.getMonth() + 1, 2)}${zeroAppend(date.getDate(), 2)}_${zeroAppend(date.getHours(), 2)}${zeroAppend(date.getMinutes(), 2)}${zeroAppend(date.getSeconds(), 2)}.json`; + //var input = this.#element.querySelector("#export-filename") as HTMLInputElement; + //input.onchange = (ev: Event) => { + // this.#filename = (ev.currentTarget as HTMLInputElement).value; + //} + //if (input) + // input.value = this.#filename; + } + + #doExport() { + let selectedUnits: Unit[] = []; + + this.#element + .querySelectorAll( + `input[type="checkbox"][name="category-coalition-selection"]:checked` + ) + .forEach((checkbox: HTMLInputElement) => { + if (checkbox instanceof HTMLInputElement) { + const [category, coalition] = checkbox.value.split(":"); // e.g. "category:coalition" + selectedUnits = selectedUnits.concat(this.data[category][coalition]); + } + }); + + if (selectedUnits.length === 0) { + alert("Please select at least one option for export."); + return; + } + + var unitsToExport: { [key: string]: any } = {}; + selectedUnits.forEach((unit: Unit) => { + var data: any = unit.getData(); + if (unit.getGroupName() in unitsToExport) + unitsToExport[unit.getGroupName()].push(data); + else unitsToExport[unit.getGroupName()] = [data]; + }); + + const a = document.createElement("a"); + const file = new Blob([JSON.stringify(unitsToExport)], { + type: "text/plain", + }); + a.href = URL.createObjectURL(file); + + var filename = this.#filename; + if (!this.#filename.toLowerCase().endsWith(".json")) filename += ".json"; + a.download = filename; + a.click(); + //this.dialog.hide(); + } +} diff --git a/frontend/react/src/unit/importexport/unitdatafileimport.ts b/frontend/react/src/unit/importexport/unitdatafileimport.ts new file mode 100644 index 00000000..b6f74dad --- /dev/null +++ b/frontend/react/src/unit/importexport/unitdatafileimport.ts @@ -0,0 +1,147 @@ +import { getApp } from "../../olympusapp"; +//import { Dialog } from "../../dialog/dialog"; +import { UnitData } from "../../interfaces"; +//import { ImportFileJSONSchemaValidator } from "../../schemas/schema"; +import { UnitDataFile } from "./unitdatafile"; + +export class UnitDataFileImport extends UnitDataFile { + protected data!: any; + //protected dialog: Dialog; + #fileData!: { [key: string]: UnitData[] }; + + constructor(elementId: string) { + super(); + //this.dialog = new Dialog(elementId); + //this.dialog.getElement().querySelector(".start-transfer")?.addEventListener("click", (ev: MouseEventInit) => { + // this.#doImport(); + // this.dialog.hide(); + //}); + } + + #doImport() { + //let selectedCategories: any = {}; + //const unitsManager = getApp().getUnitsManager(); + // + //this.dialog.getElement().querySelectorAll(`input[type="checkbox"][name="category-coalition-selection"]:checked`).forEach((checkbox: HTMLInputElement) => { + // if (checkbox instanceof HTMLInputElement) { + // const [category, coalition] = checkbox.value.split(":"); // e.g. "category:coalition" + // selectedCategories[category] = selectedCategories[category] || {}; + // selectedCategories[category][coalition] = true; + // } + //}); + // + //for (const [groupName, groupData] of Object.entries(this.#fileData)) { + // if (groupName === "" || groupData.length === 0 || !this.#unitGroupDataCanBeImported(groupData)) + // continue; + // + // let { category, coalition } = groupData[0]; + // + // if (!selectedCategories.hasOwnProperty(category) + // || !selectedCategories[category].hasOwnProperty(coalition) + // || selectedCategories[category][coalition] !== true) + // continue; + // + // let unitsToSpawn = groupData.filter((unitData: UnitData) => this.#unitDataCanBeImported(unitData)).map((unitData: UnitData) => { + // return { unitType: unitData.name, location: unitData.position, liveryID: "", skill: "High" } + // }); + // + // unitsManager.spawnUnits(category, unitsToSpawn, coalition, false); + //} + } + + selectFile() { + var input = document.createElement("input"); + input.type = "file"; + input.addEventListener("change", (e: any) => { + var file = e.target.files[0]; + if (!file) { + return; + } + var reader = new FileReader(); + reader.onload = (e: any) => { + try { + this.#fileData = JSON.parse(e.target.result); + + //const validator = new ImportFileJSONSchemaValidator(); + //if (!validator.validate(this.#fileData)) { + // const errors = validator.getErrors().reduce((acc:any, error:any) => { + // let errorString = error.instancePath.substring(1) + ": " + error.message; + // if (error.params) { + // const {allowedValues} = error.params; + // if (allowedValues) + // errorString += ": " + allowedValues.join(', '); + // } + // acc.push(errorString); + // return acc; + // }, [] as string[]); + // this.#showFileDataErrors(errors); + //} else { + // this.#showForm(); + //} + } catch (e: any) { + this.#showFileDataErrors([e]); + } + }; + reader.readAsText(file); + }); + input.click(); + } + + #showFileDataErrors(reasons: string[]) { + //this.dialog.getElement().querySelectorAll("[data-on-error]").forEach((el:Element) => { + // el.classList.toggle("hide", el.getAttribute("data-on-error") === "hide"); + //}); + // + //const reasonsList = this.dialog.getElement().querySelector(".import-error-reasons"); + //if (reasonsList instanceof HTMLElement) + // reasonsList.innerHTML = `
  • ${reasons.join("
  • ")}
  • `; + // + //this.dialog.show(); + } + + #showForm() { + //this.dialog.getElement().querySelectorAll("[data-on-error]").forEach((el:Element) => { + // el.classList.toggle("hide", el.getAttribute("data-on-error") === "show"); + //}); + // + //const data: any = {}; + // + //for (const [group, units] of Object.entries(this.#fileData)) { + // if (group === "" || units.length === 0) + // continue; + // + // if (units.some((unit: UnitData) => !this.#unitDataCanBeImported(unit))) + // continue; + // + // const category = units[0].category; + // + // if (!data.hasOwnProperty(category)) { + // data[category] = {}; + // } + // + // units.forEach((unit: UnitData) => { + // if (!data[category].hasOwnProperty(unit.coalition)) + // data[category][unit.coalition] = []; + // + // data[category][unit.coalition].push(unit); + // }); + // + //} + // + //this.data = data; + //this.buildCategoryCoalitionTable(); + //this.dialog.show(); + } + + #unitDataCanBeImported(unitData: UnitData) { + return unitData.alive && this.#unitGroupDataCanBeImported([unitData]); + } + + #unitGroupDataCanBeImported(unitGroupData: UnitData[]) { + return ( + unitGroupData.every((unitData: UnitData) => { + return !["Aircraft", "Helicopter"].includes(unitData.category); + }) && unitGroupData.some((unitData: UnitData) => unitData.alive) + ); + } +} diff --git a/frontend/react/src/unit/unit.ts b/frontend/react/src/unit/unit.ts new file mode 100644 index 00000000..61b217e6 --- /dev/null +++ b/frontend/react/src/unit/unit.ts @@ -0,0 +1,2653 @@ +import { + Marker, + LatLng, + Polyline, + Icon, + DivIcon, + CircleMarker, + Map, + Point, +} from "leaflet"; +import { getApp } from "../olympusapp"; +import { + enumToCoalition, + enumToEmissioNCountermeasure, + enumToROE, + enumToReactionToThreat, + enumToState, + getUnitDatabaseByCategory, + mToFt, + msToKnots, + rad2deg, + bearing, + deg2rad, + ftToM, + getGroundElevation, + coalitionToEnum, + nmToFt, + nmToM, + zeroAppend, +} from "../other/utils"; +import { CustomMarker } from "../map/markers/custommarker"; +import { SVGInjector } from "@tanem/svg-injector"; +import { UnitDatabase } from "./databases/unitdatabase"; +import { TargetMarker } from "../map/markers/targetmarker"; +import { + DLINK, + DataIndexes, + GAME_MASTER, + IDLE, + IRST, + OPTIC, + RADAR, + ROEs, + RWR, + VISUAL, + emissionsCountermeasures, + reactionsToThreat, + states, + GROUPING_ZOOM_TRANSITION, + MAX_SHOTS_SCATTER, + SHOTS_SCATTER_DEGREES, + GROUND_UNIT_AIR_DEFENCE_REGEX, + CONTEXT_ACTION, +} from "../constants/constants"; +import { DataExtractor } from "../server/dataextractor"; +import { groundUnitDatabase } from "./databases/groundunitdatabase"; +import { navyUnitDatabase } from "./databases/navyunitdatabase"; +import { Weapon } from "../weapon/weapon"; +import { + Ammo, + Contact, + GeneralSettings, + LoadoutBlueprint, + ObjectIconOptions, + Offset, + Radio, + TACAN, + UnitData, +} from "../interfaces"; +import { RangeCircle } from "../map/rangecircle"; +import { Group } from "./group"; +import { ContextActionSet } from "./contextactionset"; +import * as turf from "@turf/turf"; +import { + olButtonsContextMissOnPurpose, + olButtonsContextScenicAaa, + olButtonsContextSimulateFireFight, + olIconsDiamond, + olIconsEchelonLh, + olIconsEchelonRh, + olIconsFollow, + olIconsFront, + olIconsGroupGround, + olIconsLandAtPoint, + olIconsLineAbreast, + olIconsTrail, + olStatesAttack, + olStatesMissOnPurpose, + olStatesRefuel, +} from "../ui/components/olicons"; +import { + faArrowDown, + faExclamation, + faLocationCrosshairs, + faLocationDot, + faMapLocation, + faPeopleGroup, + faQuestionCircle, + faRoute, + faXmarksLines, +} from "@fortawesome/free-solid-svg-icons"; +import { FaXmarksLines } from "react-icons/fa6"; + +var pathIcon = new Icon({ + iconUrl: "/images/markers/marker-icon.png", + shadowUrl: "/images/markers/marker-shadow.png", + iconAnchor: [13, 41], +}); + +/** + * Unit class which controls unit behaviour + */ +export abstract class Unit extends CustomMarker { + ID: number; + + /* Data controlled directly by the backend. No setters are provided to avoid misalignments */ + #alive: boolean = false; + #human: boolean = false; + #controlled: boolean = false; + #coalition: string = "neutral"; + #country: number = 0; + #name: string = ""; + #unitName: string = ""; + #groupName: string = ""; + #state: string = states[0]; + #task: string = ""; + #hasTask: boolean = false; + #position: LatLng = new LatLng(0, 0, 0); + #speed: number = 0; + #horizontalVelocity: number = 0; + #verticalVelocity: number = 0; + #heading: number = 0; + #track: number = 0; + #isActiveTanker: boolean = false; + #isActiveAWACS: boolean = false; + #onOff: boolean = true; + #followRoads: boolean = false; + #fuel: number = 0; + #desiredSpeed: number = 0; + #desiredSpeedType: string = "CAS"; + #desiredAltitude: number = 0; + #desiredAltitudeType: string = "ASL"; + #leaderID: number = 0; + #formationOffset: Offset = { + x: 0, + y: 0, + z: 0, + }; + #targetID: number = 0; + #targetPosition: LatLng = new LatLng(0, 0); + #ROE: string = ROEs[1]; + #reactionToThreat: string = reactionsToThreat[2]; + #emissionsCountermeasures: string = emissionsCountermeasures[2]; + #TACAN: TACAN = { + isOn: false, + XY: "X", + callsign: "TKR", + channel: 0, + }; + #radio: Radio = { + frequency: 124000000, + callsign: 1, + callsignNumber: 1, + }; + #generalSettings: GeneralSettings = { + prohibitAA: false, + prohibitAfterburner: false, + prohibitAG: false, + prohibitAirWpn: false, + prohibitJettison: false, + }; + #ammo: Ammo[] = []; + #contacts: Contact[] = []; + #activePath: LatLng[] = []; + #isLeader: boolean = false; + #operateAs: string = "blue"; + #shotsScatter: number = 2; + #shotsIntensity: number = 2; + #health: number = 100; + + /* Other members used to draw the unit, mostly ancillary stuff like targets, ranges and so on */ + #group: Group | null = null; + #selected: boolean = false; + #hidden: boolean = false; + #highlighted: boolean = false; + #waitingForDoubleClick: boolean = false; + #pathMarkers: Marker[] = []; + #pathPolyline: Polyline; + #contactsPolylines: Polyline[] = []; + #engagementCircle: RangeCircle; + #acquisitionCircle: RangeCircle; + #miniMapMarker: CircleMarker | null = null; + #targetPositionMarker: TargetMarker; + #targetPositionPolyline: Polyline; + #doubleClickTimer: number = 0; + #hotgroup: number | null = null; + #detectionMethods: number[] = []; + + /* Getters for backend driven data */ + getAlive() { + return this.#alive; + } + getHuman() { + return this.#human; + } + getControlled() { + return this.#controlled; + } + getCoalition() { + return this.#coalition; + } + getCountry() { + return this.#country; + } + getName() { + return this.#name; + } + getUnitName() { + return this.#unitName; + } + getGroupName() { + return this.#groupName; + } + getState() { + return this.#state; + } + getTask() { + return this.#task; + } + getHasTask() { + return this.#hasTask; + } + getPosition() { + return this.#position; + } + getSpeed() { + return this.#speed; + } + getHorizontalVelocity() { + return this.#horizontalVelocity; + } + getVerticalVelocity() { + return this.#verticalVelocity; + } + getHeading() { + return this.#heading; + } + getTrack() { + return this.#track; + } + getIsActiveAWACS() { + return this.#isActiveAWACS; + } + getIsActiveTanker() { + return this.#isActiveTanker; + } + getOnOff() { + return this.#onOff; + } + getFollowRoads() { + return this.#followRoads; + } + getFuel() { + return this.#fuel; + } + getDesiredSpeed() { + return this.#desiredSpeed; + } + getDesiredSpeedType() { + return this.#desiredSpeedType; + } + getDesiredAltitude() { + return this.#desiredAltitude; + } + getDesiredAltitudeType() { + return this.#desiredAltitudeType; + } + getLeaderID() { + return this.#leaderID; + } + getFormationOffset() { + return this.#formationOffset; + } + getTargetID() { + return this.#targetID; + } + getTargetPosition() { + return this.#targetPosition; + } + getROE() { + return this.#ROE; + } + getReactionToThreat() { + return this.#reactionToThreat; + } + getEmissionsCountermeasures() { + return this.#emissionsCountermeasures; + } + getTACAN() { + return this.#TACAN; + } + getRadio() { + return this.#radio; + } + getGeneralSettings() { + return this.#generalSettings; + } + getAmmo() { + return this.#ammo; + } + getContacts() { + return this.#contacts; + } + getActivePath() { + return this.#activePath; + } + getIsLeader() { + return this.#isLeader; + } + getOperateAs() { + return this.#operateAs; + } + getShotsScatter() { + return this.#shotsScatter; + } + getShotsIntensity() { + return this.#shotsIntensity; + } + getHealth() { + return this.#health; + } + + static getConstructor(type: string) { + if (type === "GroundUnit") return GroundUnit; + if (type === "Aircraft") return Aircraft; + if (type === "Helicopter") return Helicopter; + if (type === "NavyUnit") return NavyUnit; + } + + constructor(ID: number) { + super(new LatLng(0, 0), { riseOnHover: true, keyboard: false }); + + this.ID = ID; + + this.#pathPolyline = new Polyline([], { + color: "#2d3e50", + weight: 3, + opacity: 0.5, + smoothFactor: 1, + }); + this.#pathPolyline.addTo(getApp().getMap()); + this.#targetPositionMarker = new TargetMarker(new LatLng(0, 0)); + this.#targetPositionPolyline = new Polyline([], { + color: "#FF0000", + weight: 3, + opacity: 0.5, + smoothFactor: 1, + }); + this.#engagementCircle = new RangeCircle(this.getPosition(), { + radius: 0, + weight: 4, + opacity: 1, + fillOpacity: 0, + dashArray: "4 8", + interactive: false, + bubblingMouseEvents: false, + }); + this.#acquisitionCircle = new RangeCircle(this.getPosition(), { + radius: 0, + weight: 2, + opacity: 1, + fillOpacity: 0, + dashArray: "8 12", + interactive: false, + bubblingMouseEvents: false, + }); + + /* Leaflet events listeners */ + this.on("click", (e) => this.#onClick(e)); + this.on("dblclick", (e) => this.#onDoubleClick(e)); + this.on("mouseover", () => { + if (this.belongsToCommandedCoalition()) { + this.setHighlighted(true); + document.dispatchEvent( + new CustomEvent("unitMouseover", { detail: this }) + ); + } + }); + this.on("mouseout", () => { + this.setHighlighted(false); + document.dispatchEvent(new CustomEvent("unitMouseout", { detail: this })); + }); + getApp() + .getMap() + .on("zoomend", (e: any) => { + this.#onZoom(e); + }); + + /* Deselect units if they are hidden */ + document.addEventListener("hiddenTypesChanged", (ev: CustomEventInit) => { + this.#updateMarker(); + this.setSelected(this.getSelected() && !this.getHidden()); + }); + + /* Update the marker when the options change */ + document.addEventListener("mapOptionChanged", (ev: CustomEventInit) => { + this.#updateMarker(); + + /* Circles don't like to be updated when the map is zooming */ + if (!getApp().getMap().isZooming()) this.#drawRanges(); + else + this.once("zoomend", () => { + this.#drawRanges(); + }); + + if (this.getSelected()) this.drawLines(); + }); + } + + /********************** Abstract methods *************************/ + /** Get the unit category string + * + * @returns string The unit category + */ + abstract getCategory(): string; + + /** Get the icon options + * Used to configure how the marker appears on the map + * + * @returns ObjectIconOptions + */ + abstract getIconOptions(): ObjectIconOptions; + + /** + * + * @returns string containing the marker category + */ + abstract getMarkerCategory(): string; + + /** + * + * @returns string containing the default marker + */ + abstract getDefaultMarker(): string; + + /** Get the category but for display use - for the user. (i.e. has spaces in it) + * + * @returns string + */ + getCategoryLabel() { + return ( + GROUND_UNIT_AIR_DEFENCE_REGEX.test(this.getType()) + ? "Air Defence" + : this.getCategory() + ).replace(/([a-z])([A-Z])/g, "$1 $2"); + } + + /********************** Unit data *************************/ + /** This function is called by the units manager to update all the data coming from the backend. It reads the binary raw data using a DataExtractor + * + * @param dataExtractor The DataExtractor object pointing to the binary buffer which contains the raw data coming from the backend + */ + setData(dataExtractor: DataExtractor) { + /* This variable controls if the marker must be updated. This is not always true since not all variables have an effect on the marker */ + var updateMarker = !getApp().getMap().hasLayer(this); + + var oldIsLeader = this.#isLeader; + var datumIndex = 0; + while (datumIndex != DataIndexes.endOfData) { + datumIndex = dataExtractor.extractUInt8(); + switch (datumIndex) { + case DataIndexes.category: + dataExtractor.extractString(); + break; + case DataIndexes.alive: + this.setAlive(dataExtractor.extractBool()); + updateMarker = true; + break; + case DataIndexes.human: + this.#human = dataExtractor.extractBool(); + break; + case DataIndexes.controlled: + this.#controlled = dataExtractor.extractBool(); + updateMarker = true; + break; + case DataIndexes.coalition: + let newCoalition = enumToCoalition(dataExtractor.extractUInt8()); + updateMarker = true; + if (newCoalition != this.#coalition) this.#clearRanges(); + this.#coalition = newCoalition; + break; // If the coalition has changed, redraw the range circles to update the colour + case DataIndexes.country: + this.#country = dataExtractor.extractUInt8(); + break; + case DataIndexes.name: + this.#name = dataExtractor.extractString(); + break; + case DataIndexes.unitName: + this.#unitName = dataExtractor.extractString(); + break; + case DataIndexes.groupName: + this.#groupName = dataExtractor.extractString(); + updateMarker = true; + break; + case DataIndexes.state: + this.#state = enumToState(dataExtractor.extractUInt8()); + updateMarker = true; + break; + case DataIndexes.task: + this.#task = dataExtractor.extractString(); + break; + case DataIndexes.hasTask: + this.#hasTask = dataExtractor.extractBool(); + break; + case DataIndexes.position: + this.#position = dataExtractor.extractLatLng(); + updateMarker = true; + break; + case DataIndexes.speed: + this.#speed = dataExtractor.extractFloat64(); + updateMarker = true; + break; + case DataIndexes.horizontalVelocity: + this.#horizontalVelocity = dataExtractor.extractFloat64(); + break; + case DataIndexes.verticalVelocity: + this.#verticalVelocity = dataExtractor.extractFloat64(); + break; + case DataIndexes.heading: + this.#heading = dataExtractor.extractFloat64(); + updateMarker = true; + break; + case DataIndexes.track: + this.#track = dataExtractor.extractFloat64(); + updateMarker = true; + break; + case DataIndexes.isActiveTanker: + this.#isActiveTanker = dataExtractor.extractBool(); + break; + case DataIndexes.isActiveAWACS: + this.#isActiveAWACS = dataExtractor.extractBool(); + break; + case DataIndexes.onOff: + this.#onOff = dataExtractor.extractBool(); + break; + case DataIndexes.followRoads: + this.#followRoads = dataExtractor.extractBool(); + break; + case DataIndexes.fuel: + this.#fuel = dataExtractor.extractUInt16(); + break; + case DataIndexes.desiredSpeed: + this.#desiredSpeed = dataExtractor.extractFloat64(); + break; + case DataIndexes.desiredSpeedType: + this.#desiredSpeedType = dataExtractor.extractBool() ? "GS" : "CAS"; + break; + case DataIndexes.desiredAltitude: + this.#desiredAltitude = dataExtractor.extractFloat64(); + break; + case DataIndexes.desiredAltitudeType: + this.#desiredAltitudeType = dataExtractor.extractBool() + ? "AGL" + : "ASL"; + break; + case DataIndexes.leaderID: + this.#leaderID = dataExtractor.extractUInt32(); + break; + case DataIndexes.formationOffset: + this.#formationOffset = dataExtractor.extractOffset(); + break; + case DataIndexes.targetID: + this.#targetID = dataExtractor.extractUInt32(); + break; + case DataIndexes.targetPosition: + this.#targetPosition = dataExtractor.extractLatLng(); + break; + case DataIndexes.ROE: + this.#ROE = enumToROE(dataExtractor.extractUInt8()); + break; + case DataIndexes.reactionToThreat: + this.#reactionToThreat = enumToReactionToThreat( + dataExtractor.extractUInt8() + ); + break; + case DataIndexes.emissionsCountermeasures: + this.#emissionsCountermeasures = enumToEmissioNCountermeasure( + dataExtractor.extractUInt8() + ); + break; + case DataIndexes.TACAN: + this.#TACAN = dataExtractor.extractTACAN(); + break; + case DataIndexes.radio: + this.#radio = dataExtractor.extractRadio(); + break; + case DataIndexes.generalSettings: + this.#generalSettings = dataExtractor.extractGeneralSettings(); + break; + case DataIndexes.ammo: + this.#ammo = dataExtractor.extractAmmo(); + break; + case DataIndexes.contacts: + this.#contacts = dataExtractor.extractContacts(); + document.dispatchEvent( + new CustomEvent("contactsUpdated", { detail: this }) + ); + break; + case DataIndexes.activePath: + this.#activePath = dataExtractor.extractActivePath(); + break; + case DataIndexes.isLeader: + this.#isLeader = dataExtractor.extractBool(); + break; + case DataIndexes.operateAs: + this.#operateAs = enumToCoalition(dataExtractor.extractUInt8()); + break; + case DataIndexes.shotsScatter: + this.#shotsScatter = dataExtractor.extractUInt8(); + break; + case DataIndexes.shotsIntensity: + this.#shotsIntensity = dataExtractor.extractUInt8(); + break; + case DataIndexes.health: + this.#health = dataExtractor.extractUInt8(); + updateMarker = true; + break; + } + } + + /* Dead and hidden units can't be selected */ + this.setSelected(this.getSelected() && this.#alive && !this.getHidden()); + + /* Update the marker if required */ + if (updateMarker) this.#updateMarker(); + + /* Redraw the marker if isLeader has changed. TODO I don't love this approach, observables may be more elegant */ + if (oldIsLeader !== this.#isLeader) { + this.#redrawMarker(); + + /* Reapply selection */ + if (this.getSelected()) { + this.setSelected(false); + this.setSelected(true); + } + } + + /* If the unit is selected or if the view is centered on this unit, sent the update signal so that other elements like the UnitControlPanel can be updated. */ + if (this.getSelected() || getApp().getMap().getCenteredOnUnit() === this) + document.dispatchEvent(new CustomEvent("unitUpdated", { detail: this })); + } + + /** Get unit data collated into an object + * + * @returns object populated by unit information which can also be retrieved using getters + */ + getData(): UnitData { + return { + category: this.getCategory(), + categoryDisplayName: this.getCategoryLabel(), + ID: this.ID, + alive: this.#alive, + human: this.#human, + controlled: this.#controlled, + coalition: this.#coalition, + country: this.#country, + name: this.#name, + unitName: this.#unitName, + groupName: this.#groupName, + state: this.#state, + task: this.#task, + hasTask: this.#hasTask, + position: this.#position, + speed: this.#speed, + horizontalVelocity: this.#horizontalVelocity, + verticalVelocity: this.#verticalVelocity, + heading: this.#heading, + track: this.#track, + isActiveTanker: this.#isActiveTanker, + isActiveAWACS: this.#isActiveAWACS, + onOff: this.#onOff, + followRoads: this.#followRoads, + fuel: this.#fuel, + desiredSpeed: this.#desiredSpeed, + desiredSpeedType: this.#desiredSpeedType, + desiredAltitude: this.#desiredAltitude, + desiredAltitudeType: this.#desiredAltitudeType, + leaderID: this.#leaderID, + formationOffset: this.#formationOffset, + targetID: this.#targetID, + targetPosition: this.#targetPosition, + ROE: this.#ROE, + reactionToThreat: this.#reactionToThreat, + emissionsCountermeasures: this.#emissionsCountermeasures, + TACAN: this.#TACAN, + radio: this.#radio, + generalSettings: this.#generalSettings, + ammo: this.#ammo, + contacts: this.#contacts, + activePath: this.#activePath, + isLeader: this.#isLeader, + operateAs: this.#operateAs, + shotsScatter: this.#shotsScatter, + shotsIntensity: this.#shotsIntensity, + health: this.#health, + }; + } + + /** Get a database of information also in this unit's category + * + * @returns UnitDatabase + */ + getDatabase(): UnitDatabase | null { + return getUnitDatabaseByCategory(this.getMarkerCategory()); + } + + /** Set the unit as alive or dead + * + * @param newAlive (boolean) true = alive, false = dead + */ + setAlive(newAlive: boolean) { + if (newAlive != this.#alive) + document.dispatchEvent(new CustomEvent("unitDeath", { detail: this })); + this.#alive = newAlive; + } + + /** Set the unit as user-selected + * + * @param selected (boolean) + */ + setSelected(selected: boolean) { + /* Only alive units can be selected that belong to the commanded coalition can be selected */ + if ( + (this.#alive || !selected) && + this.belongsToCommandedCoalition() && + this.getSelected() != selected + ) { + this.#selected = selected; + + /* If selected, update the marker to show the selected effects, else clear all the drawings that are only shown for selected units. */ + if (selected) { + this.#updateMarker(); + } else { + this.#clearContacts(); + this.#clearPath(); + this.#clearTargetPosition(); + } + + /* When the group leader is selected, if grouping is active, all the other group members are also selected */ + if ( + this.getCategory() === "GroundUnit" && + getApp().getMap().getZoom() < GROUPING_ZOOM_TRANSITION + ) { + if (this.#isLeader) { + /* Redraw the marker in case the leader unit was replaced by a group marker, like for SAM Sites */ + this.#redrawMarker(); + this.getGroupMembers().forEach((unit: Unit) => + unit.setSelected(selected) + ); + } else { + this.#updateMarker(); + } + } + + /* Activate the selection effects on the marker */ + this.getElement() + ?.querySelector(`.unit`) + ?.toggleAttribute("data-is-selected", selected); + + /* Trigger events after all (de-)selecting has been done */ + if (selected) { + document.dispatchEvent( + new CustomEvent("unitSelection", { detail: this }) + ); + } else { + document.dispatchEvent( + new CustomEvent("unitDeselection", { detail: this }) + ); + } + } + } + + /** Is this unit selected? + * + * @returns boolean + */ + getSelected() { + return this.#selected; + } + + /** Set the number of the hotgroup to which the unit belongss + * + * @param hotgroup (number) + */ + setHotgroup(hotgroup: number | null) { + this.#hotgroup = hotgroup; + this.#updateMarker(); + } + + /** Get the unit's hotgroup number + * + * @returns number + */ + getHotgroup() { + return this.#hotgroup; + } + + /** Set the unit as highlighted + * + * @param highlighted (boolean) + */ + setHighlighted(highlighted: boolean) { + if (this.#highlighted != highlighted) { + this.#highlighted = highlighted; + this.getElement() + ?.querySelector(`[data-object|="unit"]`) + ?.toggleAttribute("data-is-highlighted", highlighted); + this.getGroupMembers().forEach((unit: Unit) => + unit.setHighlighted(highlighted) + ); + } + } + + /** Get whether the unit is highlighted or not + * + * @returns boolean + */ + getHighlighted() { + return this.#highlighted; + } + + /** Get the other members of the group which this unit is in + * + * @returns Unit[] + */ + getGroupMembers() { + if (this.#group !== null) + return this.#group.getMembers().filter((unit: Unit) => { + return unit != this; + }); + return []; + } + + /** Return the leader of the group + * + * @returns Unit The leader of the group + */ + getGroupLeader() { + if (this.#group !== null) return this.#group.getLeader(); + return null; + } + + /** Returns whether the user is allowed to command this unit, based on coalition + * + * @returns boolean + */ + belongsToCommandedCoalition() { + return getApp().getMissionManager().getCommandModeOptions().commandMode !== + GAME_MASTER && + getApp().getMissionManager().getCommandedCoalition() !== this.#coalition + ? false + : true; + } + + getType() { + return ""; + } + + getSpawnPoints() { + return this.getDatabase()?.getSpawnPointsByName(this.getName()); + } + + getDatabaseEntry() { + return ( + this.getDatabase()?.getByName(this.#name) ?? + this.getDatabase()?.getUnkownUnit(this.getName()) + ); + } + + getGroup() { + return this.#group; + } + + setGroup(group: Group | null) { + this.#group = group; + } + + /** Get the actions that this unit can perform + * + */ + appendContextActions(contextActionSet: ContextActionSet) { + contextActionSet.addContextAction( + this, + "move", + "Move", + "Click on the map to move the units there", + faLocationDot, + (units: Unit[], _, targetPosition) => { + getApp().getUnitsManager().clearDestinations(units); + if (targetPosition) + getApp().getUnitsManager().addDestination(targetPosition, false, 0); + } + ); + + contextActionSet.addContextAction( + this, + "path", + "Path", + "Click on the map to add a destination to the path", + faRoute, + (units: Unit[], _, targetPosition) => { + if (targetPosition) + getApp() + .getUnitsManager() + .addDestination(targetPosition, false, 0, units); + } + ); + } + + drawLines() { + /* Leaflet does not like it when you change coordinates when the map is zooming */ + if (!getApp().getMap().isZooming()) { + this.#drawPath(); + this.#drawContacts(); + this.#drawTarget(); + } + } + + checkZoomRedraw() { + return false; + } + + isControlledByDCS() { + return this.getControlled() === false && this.getHuman() === false; + } + + isControlledByOlympus() { + return this.getControlled() === true; + } + + /********************** Icon *************************/ + createIcon(): void { + /* Set the icon */ + var icon = new DivIcon({ + className: "leaflet-unit-icon", + iconAnchor: [25, 25], + iconSize: [50, 50], + }); + this.setIcon(icon); + + /* Create the base element */ + var el = document.createElement("div"); + el.classList.add("unit"); + el.setAttribute("data-object", `unit-${this.getMarkerCategory()}`); + el.setAttribute("data-coalition", this.#coalition); + + var iconOptions = this.getIconOptions(); + + /* Generate and append elements depending on active options */ + /* Velocity vector */ + if (iconOptions.showVvi) { + var vvi = document.createElement("div"); + vvi.classList.add("unit-vvi"); + vvi.toggleAttribute("data-rotate-to-heading"); + el.append(vvi); + } + + /* Hotgroup indicator */ + if (iconOptions.showHotgroup) { + var hotgroup = document.createElement("div"); + hotgroup.classList.add("unit-hotgroup"); + var hotgroupId = document.createElement("div"); + hotgroupId.classList.add("unit-hotgroup-id"); + hotgroup.appendChild(hotgroupId); + el.append(hotgroup); + } + + /* Main icon */ + if (iconOptions.showUnitIcon) { + var unitIcon = document.createElement("div"); + unitIcon.classList.add("unit-icon"); + var img = document.createElement("img"); + + /* If a unit does not belong to the commanded coalition or it is not visually detected, show it with the generic aircraft square */ + var marker; + if ( + this.belongsToCommandedCoalition() || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC].includes(value) + ) + ) + marker = this.getDatabaseEntry()?.markerFile ?? this.getDefaultMarker(); + else marker = "aircraft"; + img.src = `/images/units/${marker}.svg`; + img.onload = () => SVGInjector(img); + unitIcon.appendChild(img); + + unitIcon.toggleAttribute( + "data-rotate-to-heading", + iconOptions.rotateToHeading + ); + el.append(unitIcon); + } + + /* State icon */ + if (iconOptions.showState) { + var state = document.createElement("div"); + state.classList.add("unit-state"); + el.appendChild(state); + } + + /* Short label */ + if (iconOptions.showShortLabel) { + var shortLabel = document.createElement("div"); + shortLabel.classList.add("unit-short-label"); + shortLabel.innerText = this.getDatabaseEntry()?.shortLabel || ""; + el.append(shortLabel); + } + + /* Fuel indicator */ + if (iconOptions.showFuel) { + var fuelIndicator = document.createElement("div"); + fuelIndicator.classList.add("unit-fuel"); + var fuelLevel = document.createElement("div"); + fuelLevel.classList.add("unit-fuel-level"); + fuelIndicator.appendChild(fuelLevel); + el.append(fuelIndicator); + } + + /* Health indicator */ + if (iconOptions.showHealth) { + var healthIndicator = document.createElement("div"); + healthIndicator.classList.add("unit-health"); + var healthLevel = document.createElement("div"); + healthLevel.classList.add("unit-health-level"); + healthIndicator.appendChild(healthLevel); + el.append(healthIndicator); + } + + /* Ammo indicator */ + if (iconOptions.showAmmo) { + var ammoIndicator = document.createElement("div"); + ammoIndicator.classList.add("unit-ammo"); + for (let i = 0; i <= 3; i++) + ammoIndicator.appendChild(document.createElement("div")); + el.append(ammoIndicator); + } + + /* Unit summary */ + if (iconOptions.showSummary) { + var summary = document.createElement("div"); + summary.classList.add("unit-summary"); + var callsign = document.createElement("div"); + callsign.classList.add("unit-callsign"); + callsign.innerText = this.#unitName; + var altitude = document.createElement("div"); + altitude.classList.add("unit-altitude"); + var speed = document.createElement("div"); + speed.classList.add("unit-speed"); + if (iconOptions.showCallsign) summary.appendChild(callsign); + summary.appendChild(altitude); + summary.appendChild(speed); + el.appendChild(summary); + } + + this.getElement()?.appendChild(el); + } + + /********************** Visibility *************************/ + updateVisibility() { + const hiddenTypes = getApp().getMap().getHiddenTypes(); + var hidden = + /* Hide the unit if it is a human and humans are hidden */ + (this.getHuman() && hiddenTypes["human"]) || + /* Hide the unit if it is DCS-controlled and DCS controlled units are hidden */ + (this.isControlledByDCS() && hiddenTypes["dcs"]) || + /* Hide the unit if it is Olympus-controlled and Olympus-controlled units are hidden */ + (this.isControlledByOlympus() && hiddenTypes["olympus"]) || + /* Hide the unit if this specific category is hidden */ + hiddenTypes[this.getMarkerCategory()] || + /* Hide the unit if this coalition is hidden */ + hiddenTypes[this.#coalition] || + /* Hide the unit if it does not belong to the commanded coalition and it is not detected by a method that can pinpoint its location (RWR does not count) */ + (!this.belongsToCommandedCoalition() && + (this.#detectionMethods.length == 0 || + (this.#detectionMethods.length == 1 && + this.#detectionMethods[0] === RWR))) || + /* Hide the unit if grouping is activated, the unit is not the group leader, it is not selected, and the zoom is higher than the grouping threshold */ + (getApp().getMap().getOptions().hideGroupMembers && + !this.#isLeader && + !this.getSelected() && + this.getCategory() == "GroundUnit" && + getApp().getMap().getZoom() < GROUPING_ZOOM_TRANSITION && + (this.belongsToCommandedCoalition() || + (!this.belongsToCommandedCoalition() && + this.#detectionMethods.length == 0))); + + /* Force dead units to be hidden */ + this.setHidden(hidden || !this.getAlive()); + } + + setHidden(hidden: boolean) { + this.#hidden = hidden; + + /* Add the marker if not present */ + if (!getApp().getMap().hasLayer(this) && !this.getHidden()) { + if (getApp().getMap().isZooming()) + this.once("zoomend", () => { + this.addTo(getApp().getMap()); + }); + else this.addTo(getApp().getMap()); + } + + /* Hide the marker if necessary*/ + if (getApp().getMap().hasLayer(this) && this.getHidden()) { + getApp().getMap().removeLayer(this); + } + + /* Draw the range circles if the unit is not hidden */ + if (!this.getHidden()) { + /* Circles don't like to be updated when the map is zooming */ + if (!getApp().getMap().isZooming()) this.#drawRanges(); + else + this.once("zoomend", () => { + this.#drawRanges(); + }); + } else { + this.#clearRanges(); + } + } + + getHidden() { + return this.#hidden; + } + + setDetectionMethods(newDetectionMethods: number[]) { + if (!this.belongsToCommandedCoalition()) { + /* Check if the detection methods of this unit have changed */ + if ( + this.#detectionMethods.length !== newDetectionMethods.length || + this.getDetectionMethods().some( + (value) => !newDetectionMethods.includes(value) + ) + ) { + /* Force a redraw of the unit to reflect the new status of the detection methods */ + this.setHidden(true); + this.#detectionMethods = newDetectionMethods; + this.#updateMarker(); + } + } + } + + getDetectionMethods() { + return this.#detectionMethods; + } + + getLeader() { + return getApp().getUnitsManager().getUnitByID(this.#leaderID); + } + + canFulfillRole(roles: string | string[]) { + if (typeof roles === "string") roles = [roles]; + + var loadouts = this.getDatabaseEntry()?.loadouts; + if (loadouts) { + return loadouts.some((loadout: LoadoutBlueprint) => { + return (roles as string[]).some((role: string) => { + return loadout.roles.includes(role); + }); + }); + } else return false; + } + + isInViewport() { + return getApp().getMap().getBounds().contains(this.getPosition()); + } + + canTargetPoint() { + return this.getDatabaseEntry()?.canTargetPoint === true; + } + + canRearm() { + return this.getDatabaseEntry()?.canRearm === true; + } + + canAAA() { + return this.getDatabaseEntry()?.canAAA === true; + } + + isIndirectFire() { + return this.getDatabaseEntry()?.indirectFire === true; + } + + isTanker() { + return this.canFulfillRole("Tanker"); + } + + isAWACS() { + return this.canFulfillRole("AWACS"); + } + + /********************** Unit commands *************************/ + addDestination(latlng: L.LatLng) { + if (!this.#human) { + var path: any = {}; + if (this.#activePath.length > 0) { + path = this.#activePath; + path[Object.keys(path).length.toString()] = latlng; + } else { + path = [latlng]; + } + getApp().getServerManager().addDestination(this.ID, path); + } + } + + clearDestinations() { + if (!this.#human) this.#activePath = []; + } + + updatePathFromMarkers() { + var path: any = []; + this.#pathMarkers.forEach((marker) => { + path[Object.keys(path).length.toString()] = marker.getLatLng(); + }); + getApp().getServerManager().addDestination(this.ID, path); + } + + attackUnit(targetID: number) { + /* Units can't attack themselves */ + if (!this.#human) + if (this.ID != targetID) + getApp().getServerManager().attackUnit(this.ID, targetID); + } + + followUnit(targetID: number, offset: { x: number; y: number; z: number }) { + /* Units can't follow themselves */ + if (!this.#human) + if (this.ID != targetID) + getApp().getServerManager().followUnit(this.ID, targetID, offset); + } + + landAt(latlng: LatLng) { + if (!this.#human) getApp().getServerManager().landAt(this.ID, latlng); + } + + changeSpeed(speedChange: string) { + if (!this.#human) + getApp().getServerManager().changeSpeed(this.ID, speedChange); + } + + changeAltitude(altitudeChange: string) { + if (!this.#human) + getApp().getServerManager().changeAltitude(this.ID, altitudeChange); + } + + setSpeed(speed: number) { + if (!this.#human) getApp().getServerManager().setSpeed(this.ID, speed); + } + + setSpeedType(speedType: string) { + if (!this.#human) + getApp().getServerManager().setSpeedType(this.ID, speedType); + } + + setAltitude(altitude: number) { + if (!this.#human) + getApp().getServerManager().setAltitude(this.ID, altitude); + } + + setAltitudeType(altitudeType: string) { + if (!this.#human) + getApp().getServerManager().setAltitudeType(this.ID, altitudeType); + } + + setROE(ROE: string) { + if (!this.#human) getApp().getServerManager().setROE(this.ID, ROE); + } + + setReactionToThreat(reactionToThreat: string) { + if (!this.#human) + getApp() + .getServerManager() + .setReactionToThreat(this.ID, reactionToThreat); + } + + setEmissionsCountermeasures(emissionCountermeasure: string) { + if (!this.#human) + getApp() + .getServerManager() + .setEmissionsCountermeasures(this.ID, emissionCountermeasure); + } + + setOnOff(onOff: boolean) { + if (!this.#human) getApp().getServerManager().setOnOff(this.ID, onOff); + } + + setFollowRoads(followRoads: boolean) { + if (!this.#human) + getApp().getServerManager().setFollowRoads(this.ID, followRoads); + } + + setOperateAs(operateAs: string) { + if (!this.#human) + getApp() + .getServerManager() + .setOperateAs(this.ID, coalitionToEnum(operateAs)); + } + + delete(explosion: boolean, explosionType: string, immediate: boolean) { + getApp() + .getServerManager() + .deleteUnit(this.ID, explosion, explosionType, immediate); + } + + refuel() { + if (!this.#human) getApp().getServerManager().refuel(this.ID); + } + + setAdvancedOptions( + isActiveTanker: boolean, + isActiveAWACS: boolean, + TACAN: TACAN, + radio: Radio, + generalSettings: GeneralSettings + ) { + if (!this.#human) + getApp() + .getServerManager() + .setAdvacedOptions( + this.ID, + isActiveTanker, + isActiveAWACS, + TACAN, + radio, + generalSettings + ); + } + + bombPoint(latlng: LatLng) { + getApp().getServerManager().bombPoint(this.ID, latlng); + } + + carpetBomb(latlng: LatLng) { + getApp().getServerManager().carpetBomb(this.ID, latlng); + } + + bombBuilding(latlng: LatLng) { + getApp().getServerManager().bombBuilding(this.ID, latlng); + } + + fireAtArea(latlng: LatLng) { + getApp().getServerManager().fireAtArea(this.ID, latlng); + } + + simulateFireFight(latlng: LatLng, targetGroundElevation: number | null) { + getGroundElevation(this.getPosition(), (response: string) => { + var unitGroundElevation: number | null = null; + try { + unitGroundElevation = parseFloat(response); + } catch { + console.log("Simulate fire fight: could not retrieve ground elevation"); + } + + /* DCS and SRTM altitude data is not exactly the same so to minimize error we use SRTM only to compute relative elevation difference */ + var altitude = this.getPosition().alt; + if ( + altitude !== undefined && + targetGroundElevation !== null && + unitGroundElevation !== null + ) + getApp() + .getServerManager() + .simulateFireFight( + this.ID, + latlng, + altitude + targetGroundElevation - unitGroundElevation + ); + }); + } + + // TODO: Remove coalition + scenicAAA() { + var coalition = "neutral"; + if (this.getCoalition() === "red") coalition = "blue"; + else if (this.getCoalition() == "blue") coalition = "red"; + getApp().getServerManager().scenicAAA(this.ID, coalition); + } + + // TODO: Remove coalition + missOnPurpose() { + var coalition = "neutral"; + if (this.getCoalition() === "red") coalition = "blue"; + else if (this.getCoalition() == "blue") coalition = "red"; + getApp().getServerManager().missOnPurpose(this.ID, coalition); + } + + landAtPoint(latlng: LatLng) { + getApp().getServerManager().landAtPoint(this.ID, latlng); + } + + setShotsScatter(shotsScatter: number) { + if (!this.#human) + getApp().getServerManager().setShotsScatter(this.ID, shotsScatter); + } + + setShotsIntensity(shotsIntensity: number) { + if (!this.#human) + getApp().getServerManager().setShotsIntensity(this.ID, shotsIntensity); + } + + /***********************************************/ + onAdd(map: Map): this { + super.onAdd(map); + return this; + } + + onGroupChanged(member: Unit) { + this.#redrawMarker(); + } + + showFollowOptions(units: Unit[]) { + var contextActionSet = new ContextActionSet(); + + // TODO FIX + contextActionSet.addContextAction( + this, + "trail", + "Trail", + "Follow unit in trail formation", + olIconsTrail, + () => this.applyFollowOptions("trail", units) + ); + contextActionSet.addContextAction( + this, + "echelon-lh", + "Echelon (LH)", + "Follow unit in echelon left formation", + olIconsEchelonLh, + () => this.applyFollowOptions("echelon-lh", units) + ); + contextActionSet.addContextAction( + this, + "echelon-rh", + "Echelon (RH)", + "Follow unit in echelon right formation", + olIconsEchelonRh, + () => this.applyFollowOptions("echelon-rh", units) + ); + contextActionSet.addContextAction( + this, + "line-abreast-lh", + "Line abreast (LH)", + "Follow unit in line abreast left formation", + olIconsLineAbreast, + () => this.applyFollowOptions("line-abreast-lh", units) + ); + contextActionSet.addContextAction( + this, + "line-abreast-rh", + "Line abreast (RH)", + "Follow unit in line abreast right formation", + olIconsLineAbreast, + () => this.applyFollowOptions("line-abreast-rh", units) + ); + contextActionSet.addContextAction( + this, + "front", + "Front", + "Fly in front of unit", + olIconsFront, + () => this.applyFollowOptions("front", units) + ); + contextActionSet.addContextAction( + this, + "diamond", + "Diamond", + "Follow unit in diamond formation", + olIconsDiamond, + () => this.applyFollowOptions("diamond", units) + ); + contextActionSet.addContextAction( + this, + "custom", + "Custom", + "Set a custom formation position", + faExclamation, + () => this.applyFollowOptions("custom", units) + ); + + //getApp().getMap().getUnitContextMenu().setContextActions(contextActionSet); + getApp().getMap().showUnitContextMenu(); + } + + applyFollowOptions(formation: string, units: Unit[]) { + if (formation === "custom") { + document + .getElementById("custom-formation-dialog") + ?.classList.remove("hide"); + document.addEventListener("applyCustomFormation", () => { + var dialog = document.getElementById("custom-formation-dialog"); + if (dialog) { + dialog.classList.add("hide"); + var clock = 1; + while (clock < 8) { + if ( + (dialog.querySelector(`#formation-${clock}`)) + .checked + ) + break; + clock++; + } + var angleDeg = 360 - (clock - 1) * 45; + var angleRad = deg2rad(angleDeg); + var distance = ftToM( + parseInt( + (( + dialog.querySelector(`#distance`)?.querySelector("input") + )).value + ) + ); + var upDown = ftToM( + parseInt( + (( + dialog.querySelector(`#up-down`)?.querySelector("input") + )).value + ) + ); + + // X: front-rear, positive front + // Y: top-bottom, positive top + // Z: left-right, positive right + var x = distance * Math.cos(angleRad); + var y = upDown; + var z = distance * Math.sin(angleRad); + + getApp() + .getUnitsManager() + .followUnit(this.ID, { x: x, y: y, z: z }, undefined, units); + } + }); + } else { + getApp() + .getUnitsManager() + .followUnit(this.ID, undefined, formation, units); + } + } + + /***********************************************/ + #onClick(e: any) { + /* Exit if we were waiting for a doubleclick */ + if (this.#waitingForDoubleClick) { + return; + } + + /* We'll wait for a doubleclick */ + this.#waitingForDoubleClick = true; + this.#doubleClickTimer = window.setTimeout(() => { + /* Still waiting so no doubleclick; do the click action */ + if (this.#waitingForDoubleClick) { + if (getApp().getMap().getState() === IDLE || e.originalEvent.ctrlKey) { + if (!e.originalEvent.ctrlKey) + getApp().getUnitsManager().deselectAllUnits(); + + this.setSelected(!this.getSelected()); + } else if (getApp().getMap().getState() === CONTEXT_ACTION) { + getApp().getMap().executeContextAction(this, null); + } + } + + /* No longer waiting for a doubleclick */ + this.#waitingForDoubleClick = false; + }, 200); + } + + #onDoubleClick(e: any) { + /* Let single clicks work again */ + this.#waitingForDoubleClick = false; + clearTimeout(this.#doubleClickTimer); + + /* Select all matching units in the viewport */ + const unitsManager = getApp().getUnitsManager(); + Object.values(unitsManager.getUnits()).forEach((unit: Unit) => { + if ( + unit.getAlive() === true && + unit.getName() === this.getName() && + unit.isInViewport() + ) + unitsManager.selectUnit(unit.ID, false); + }); + } + + #updateMarker() { + this.updateVisibility(); + + /* Draw the minimap marker */ + var drawMiniMapMarker = + this.belongsToCommandedCoalition() || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, RADAR, IRST, DLINK].includes(value) + ); + if (this.#alive && drawMiniMapMarker) { + if (this.#miniMapMarker == null) { + this.#miniMapMarker = new CircleMarker( + new LatLng(this.#position.lat, this.#position.lng), + { radius: 0.5 } + ); + if (this.#coalition == "neutral") + this.#miniMapMarker.setStyle({ color: "#CFD9E8", radius: 2 }); + else if (this.#coalition == "red") + this.#miniMapMarker.setStyle({ color: "#ff5858", radius: 2 }); + else this.#miniMapMarker.setStyle({ color: "#247be2", radius: 2 }); + this.#miniMapMarker.addTo(getApp().getMap().getMiniMapLayerGroup()); + this.#miniMapMarker.bringToBack(); + } else { + if ( + this.#miniMapMarker.getLatLng().lat !== this.getPosition().lat || + this.#miniMapMarker.getLatLng().lng !== this.getPosition().lng + ) { + this.#miniMapMarker.setLatLng( + new LatLng(this.#position.lat, this.#position.lng) + ); + this.#miniMapMarker.bringToBack(); + } + } + } else { + if ( + this.#miniMapMarker != null && + getApp().getMap().getMiniMapLayerGroup().hasLayer(this.#miniMapMarker) + ) { + getApp() + .getMap() + .getMiniMapLayerGroup() + .removeLayer(this.#miniMapMarker); + this.#miniMapMarker = null; + } + } + + /* Draw the marker */ + if (!this.getHidden()) { + if ( + this.getLatLng().lat !== this.#position.lat || + this.getLatLng().lng !== this.#position.lng + ) { + this.setLatLng(new LatLng(this.#position.lat, this.#position.lng)); + } + + var element = this.getElement(); + if (element != null) { + /* Draw the velocity vector */ + element + .querySelector(".unit-vvi") + ?.setAttribute("style", `height: ${15 + this.#speed / 5}px;`); + + /* Set fuel data */ + element + .querySelector(".unit-fuel-level") + ?.setAttribute("style", `width: ${this.#fuel}%`); + element + .querySelector(".unit") + ?.toggleAttribute("data-has-low-fuel", this.#fuel < 20); + + /* Set health data */ + element + .querySelector(".unit-health-level") + ?.setAttribute("style", `width: ${this.#health}%`); + element + .querySelector(".unit") + ?.toggleAttribute("data-has-low-health", this.#health < 20); + + /* Set dead/alive flag */ + element + .querySelector(".unit") + ?.toggleAttribute("data-is-dead", !this.#alive); + + /* Set current unit state */ + if (this.#human) { + // Unit is human + element.querySelector(".unit")?.setAttribute("data-state", "human"); + } else if (!this.#controlled) { + // Unit is under DCS control (not Olympus) + element.querySelector(".unit")?.setAttribute("data-state", "dcs"); + } else if ( + (this.getCategory() == "Aircraft" || + this.getCategory() == "Helicopter") && + !this.#hasTask + ) { + element.querySelector(".unit")?.setAttribute("data-state", "no-task"); + } else { + // Unit is under Olympus control + if (this.#onOff) { + if (this.#isActiveTanker) + element + .querySelector(".unit") + ?.setAttribute("data-state", "tanker"); + else if (this.#isActiveAWACS) + element + .querySelector(".unit") + ?.setAttribute("data-state", "AWACS"); + else + element + .querySelector(".unit") + ?.setAttribute("data-state", this.#state.toLowerCase()); + } else { + element.querySelector(".unit")?.setAttribute("data-state", "off"); + } + } + + /* Set altitude and speed */ + if (element.querySelector(".unit-altitude")) + (element.querySelector(".unit-altitude")).innerText = + "FL" + + zeroAppend( + Math.floor(mToFt(this.#position.alt as number) / 100), + 3 + ); + if (element.querySelector(".unit-speed")) + (element.querySelector(".unit-speed")).innerText = + String(Math.floor(msToKnots(this.#speed))) + "GS"; + + /* Rotate elements according to heading */ + element.querySelectorAll("[data-rotate-to-heading]").forEach((el) => { + const headingDeg = rad2deg(this.#track); + let currentStyle = el.getAttribute("style") || ""; + el.setAttribute( + "style", + currentStyle + `transform:rotate(${headingDeg}deg);` + ); + }); + + /* Turn on ammo indicators */ + var hasFox1 = element + .querySelector(".unit") + ?.hasAttribute("data-has-fox-1"); + var hasFox2 = element + .querySelector(".unit") + ?.hasAttribute("data-has-fox-2"); + var hasFox3 = element + .querySelector(".unit") + ?.hasAttribute("data-has-fox-3"); + var hasOtherAmmo = element + .querySelector(".unit") + ?.hasAttribute("data-has-other-ammo"); + + var newHasFox1 = false; + var newHasFox2 = false; + var newHasFox3 = false; + var newHasOtherAmmo = false; + Object.values(this.#ammo).forEach((ammo: Ammo) => { + if (ammo.category == 1 && ammo.missileCategory == 1) { + if (ammo.guidance == 4 || ammo.guidance == 5) newHasFox1 = true; + else if (ammo.guidance == 2) newHasFox2 = true; + else if (ammo.guidance == 3) newHasFox3 = true; + } else newHasOtherAmmo = true; + }); + + if (hasFox1 != newHasFox1) + element + .querySelector(".unit") + ?.toggleAttribute("data-has-fox-1", newHasFox1); + if (hasFox2 != newHasFox2) + element + .querySelector(".unit") + ?.toggleAttribute("data-has-fox-2", newHasFox2); + if (hasFox3 != newHasFox3) + element + .querySelector(".unit") + ?.toggleAttribute("data-has-fox-3", newHasFox3); + if (hasOtherAmmo != newHasOtherAmmo) + element + .querySelector(".unit") + ?.toggleAttribute("data-has-other-ammo", newHasOtherAmmo); + + /* Draw the hotgroup element */ + element + .querySelector(".unit") + ?.toggleAttribute("data-is-in-hotgroup", this.#hotgroup != null); + if (this.#hotgroup) { + const hotgroupEl = element.querySelector( + ".unit-hotgroup-id" + ) as HTMLElement; + if (hotgroupEl) hotgroupEl.innerText = String(this.#hotgroup); + } + } + + /* Set vertical offset for altitude stacking */ + var pos = getApp().getMap().latLngToLayerPoint(this.getLatLng()).round(); + this.setZIndexOffset( + 1000 + + Math.floor(this.#position.alt as number) - + pos.y + + (this.#highlighted || this.#selected ? 5000 : 0) + ); + } + } + + #redrawMarker() { + this.removeFrom(getApp().getMap()); + this.#updateMarker(); + + /* Activate the selection effects on the marker */ + this.getElement() + ?.querySelector(`.unit`) + ?.toggleAttribute("data-is-selected", this.getSelected()); + } + + #drawPath() { + if ( + this.#activePath != undefined && + getApp().getMap().getOptions().showUnitPaths + ) { + var points: LatLng[] = []; + points.push(new LatLng(this.#position.lat, this.#position.lng)); + + /* Add markers if missing */ + while (this.#pathMarkers.length < Object.keys(this.#activePath).length) { + var marker = new Marker([0, 0], { + icon: pathIcon, + draggable: true, + }).addTo(getApp().getMap()); + marker.on("dragstart", (event) => { + event.target.options["freeze"] = true; + }) + marker.on("dragend", (event) => { + this.updatePathFromMarkers(); + event.target.options["freeze"] = false; + }); + this.#pathMarkers.push(marker); + } + + /* Remove markers if too many */ + while (this.#pathMarkers.length > Object.keys(this.#activePath).length) { + getApp() + .getMap() + .removeLayer(this.#pathMarkers[this.#pathMarkers.length - 1]); + this.#pathMarkers.splice(this.#pathMarkers.length - 1, 1); + } + + /* Update the position of the existing markers (to avoid creating markers uselessly) */ + for (let WP in this.#activePath) { + var destination = this.#activePath[WP]; + var frozen = this.#pathMarkers[parseInt(WP)].options["freeze"]; + if (!this.#pathMarkers[parseInt(WP)].options["freeze"]) { + this.#pathMarkers[parseInt(WP)].setLatLng([ + destination.lat, + destination.lng, + ]); + } + points.push(new LatLng(destination.lat, destination.lng)); + this.#pathPolyline.setLatLngs(points); + } + + if (points.length == 1) this.#clearPath(); + } else { + this.#clearPath(); + } + } + + #clearPath() { + if (this.#pathPolyline.getLatLngs().length != 0) { + for (let WP in this.#pathMarkers) { + getApp().getMap().removeLayer(this.#pathMarkers[WP]); + } + this.#pathMarkers = []; + this.#pathPolyline.setLatLngs([]); + } + } + + #drawContacts() { + this.#clearContacts(); + if (getApp().getMap().getOptions().showUnitContacts) { + for (let index in this.#contacts) { + var contactData = this.#contacts[index]; + var contact: Unit | Weapon | null; + + if (contactData.ID in getApp().getUnitsManager().getUnits()) + contact = getApp().getUnitsManager().getUnitByID(contactData.ID); + else + contact = getApp().getWeaponsManager().getWeaponByID(contactData.ID); + + if (contact != null && contact.getAlive()) { + var startLatLng = new LatLng(this.#position.lat, this.#position.lng); + var endLatLng: LatLng; + if (contactData.detectionMethod === RWR) { + var bearingToContact = bearing( + this.#position.lat, + this.#position.lng, + contact.getPosition().lat, + contact.getPosition().lng + ); + var startXY = getApp().getMap().latLngToContainerPoint(startLatLng); + var endX = startXY.x + 80 * Math.sin(deg2rad(bearingToContact)); + var endY = startXY.y - 80 * Math.cos(deg2rad(bearingToContact)); + endLatLng = getApp() + .getMap() + .containerPointToLatLng(new Point(endX, endY)); + } else + endLatLng = new LatLng( + contact.getPosition().lat, + contact.getPosition().lng + ); + + var color; + if ( + contactData.detectionMethod === VISUAL || + contactData.detectionMethod === OPTIC + ) + color = "#FF00FF"; + else if ( + contactData.detectionMethod === RADAR || + contactData.detectionMethod === IRST + ) + color = "#FFFF00"; + else if (contactData.detectionMethod === RWR) color = "#00FF00"; + else color = "#FFFFFF"; + var contactPolyline = new Polyline([startLatLng, endLatLng], { + color: color, + weight: 3, + opacity: 1, + smoothFactor: 1, + dashArray: "4, 8", + }); + contactPolyline.addTo(getApp().getMap()); + this.#contactsPolylines.push(contactPolyline); + } + } + } + } + + #clearContacts() { + for (let index in this.#contactsPolylines) { + getApp().getMap().removeLayer(this.#contactsPolylines[index]); + } + } + + #drawRanges() { + var engagementRange = 0; + var acquisitionRange = 0; + + /* Get the acquisition and engagement ranges of the entire group, not for each unit */ + if (this.getIsLeader()) { + var engagementRange = + this.getDatabase()?.getByName(this.getName())?.engagementRange ?? 0; + var acquisitionRange = + this.getDatabase()?.getByName(this.getName())?.acquisitionRange ?? 0; + + this.getGroupMembers().forEach((unit: Unit) => { + if (unit.getAlive()) { + let unitEngagementRange = + unit.getDatabase()?.getByName(unit.getName())?.engagementRange ?? 0; + let unitAcquisitionRange = + unit.getDatabase()?.getByName(unit.getName())?.acquisitionRange ?? + 0; + + if (unitEngagementRange > engagementRange) + engagementRange = unitEngagementRange; + + if (unitAcquisitionRange > acquisitionRange) + acquisitionRange = unitAcquisitionRange; + } + }); + + if (acquisitionRange !== this.#acquisitionCircle.getRadius()) { + this.#acquisitionCircle.setRadius(acquisitionRange); + } + + if (engagementRange !== this.#engagementCircle.getRadius()) + this.#engagementCircle.setRadius(engagementRange); + + this.#engagementCircle.options.fillOpacity = + this.getSelected() && getApp().getMap().getOptions().fillSelectedRing + ? 0.3 + : 0; + + /* Acquisition circles */ + var shortAcquisitionRangeCheck = + acquisitionRange > nmToM(3) || + !getApp().getMap().getOptions().hideUnitsShortRangeRings; + + if ( + getApp().getMap().getOptions().showUnitsAcquisitionRings && + shortAcquisitionRangeCheck && + (this.belongsToCommandedCoalition() || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, IRST, RWR].includes(value) + )) + ) { + if (!getApp().getMap().hasLayer(this.#acquisitionCircle)) { + this.#acquisitionCircle.addTo(getApp().getMap()); + switch (this.getCoalition()) { + case "red": + this.#acquisitionCircle.options.color = "#D42121"; + break; + case "blue": + this.#acquisitionCircle.options.color = "#017DC1"; + break; + default: + this.#acquisitionCircle.options.color = "#111111"; + break; + } + } + if (this.getPosition() != this.#acquisitionCircle.getLatLng()) + this.#acquisitionCircle.setLatLng(this.getPosition()); + } else { + if (getApp().getMap().hasLayer(this.#acquisitionCircle)) + this.#acquisitionCircle.removeFrom(getApp().getMap()); + } + + /* Engagement circles */ + var shortEngagementRangeCheck = + engagementRange > nmToM(3) || + !getApp().getMap().getOptions().hideUnitsShortRangeRings; + if ( + getApp().getMap().getOptions().showUnitsEngagementRings && + shortEngagementRangeCheck && + (this.belongsToCommandedCoalition() || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, IRST, RWR].includes(value) + )) + ) { + if (!getApp().getMap().hasLayer(this.#engagementCircle)) { + this.#engagementCircle.addTo(getApp().getMap()); + switch (this.getCoalition()) { + case "red": + this.#engagementCircle.options.color = "#FF5858"; + break; + case "blue": + this.#engagementCircle.options.color = "#3BB9FF"; + break; + default: + this.#engagementCircle.options.color = "#CFD9E8"; + break; + } + } + if (this.getPosition() != this.#engagementCircle.getLatLng()) + this.#engagementCircle.setLatLng(this.getPosition()); + } else { + if (getApp().getMap().hasLayer(this.#engagementCircle)) + this.#engagementCircle.removeFrom(getApp().getMap()); + } + } + } + + #clearRanges() { + if (getApp().getMap().hasLayer(this.#acquisitionCircle)) + this.#acquisitionCircle.removeFrom(getApp().getMap()); + + if (getApp().getMap().hasLayer(this.#engagementCircle)) + this.#engagementCircle.removeFrom(getApp().getMap()); + } + + #drawTarget() { + if ( + this.#targetPosition.lat != 0 && + this.#targetPosition.lng != 0 && + getApp().getMap().getOptions().showUnitPaths + ) { + this.#drawTargetPosition(this.#targetPosition); + } else if ( + this.#targetID != 0 && + getApp().getMap().getOptions().showUnitTargets + ) { + const target = getApp().getUnitsManager().getUnitByID(this.#targetID); + if ( + target && + (getApp().getMissionManager().getCommandModeOptions().commandMode == + GAME_MASTER || + (this.belongsToCommandedCoalition() && + getApp() + .getUnitsManager() + .getUnitDetectedMethods(target) + .some((value) => + [VISUAL, OPTIC, RADAR, IRST, DLINK].includes(value) + ))) + ) { + this.#drawTargetPosition(target.getPosition()); + } + } else this.#clearTargetPosition(); + } + + #drawTargetPosition(targetPosition: LatLng) { + if (!getApp().getMap().hasLayer(this.#targetPositionMarker)) + this.#targetPositionMarker.addTo(getApp().getMap()); + if (!getApp().getMap().hasLayer(this.#targetPositionPolyline)) + this.#targetPositionPolyline.addTo(getApp().getMap()); + this.#targetPositionMarker.setLatLng( + new LatLng(targetPosition.lat, targetPosition.lng) + ); + + if ( + this.getState() === "simulate-fire-fight" && + this.getShotsScatter() != MAX_SHOTS_SCATTER + ) { + let turfUnitPosition = turf.point([ + this.getPosition().lng, + this.getPosition().lat, + ]); + let turfTargetPosition = turf.point([ + targetPosition.lng, + targetPosition.lat, + ]); + + let bearing = turf.bearing(turfUnitPosition, turfTargetPosition); + let scatterDistance = + turf.distance(turfUnitPosition, turfTargetPosition) * + Math.tan( + (MAX_SHOTS_SCATTER - this.getShotsScatter()) * + deg2rad(SHOTS_SCATTER_DEGREES) + ); + let destination1 = turf.destination( + turfTargetPosition, + scatterDistance, + bearing + 90 + ); + let destination2 = turf.destination( + turfTargetPosition, + scatterDistance, + bearing - 90 + ); + + this.#targetPositionPolyline.setStyle({ dashArray: "4, 8" }); + this.#targetPositionPolyline.setLatLngs([ + new LatLng( + destination1.geometry.coordinates[1], + destination1.geometry.coordinates[0] + ), + new LatLng(this.#position.lat, this.#position.lng), + new LatLng( + destination2.geometry.coordinates[1], + destination2.geometry.coordinates[0] + ), + ]); + } else { + this.#targetPositionPolyline.setStyle({ dashArray: "" }); + this.#targetPositionPolyline.setLatLngs([ + new LatLng(this.#position.lat, this.#position.lng), + new LatLng(targetPosition.lat, targetPosition.lng), + ]); + } + } + + #clearTargetPosition() { + if (getApp().getMap().hasLayer(this.#targetPositionMarker)) + this.#targetPositionMarker.removeFrom(getApp().getMap()); + + if (getApp().getMap().hasLayer(this.#targetPositionPolyline)) + this.#targetPositionPolyline.removeFrom(getApp().getMap()); + } + + #onZoom(e: any) { + if (this.checkZoomRedraw()) this.#redrawMarker(); + this.#updateMarker(); + } +} + +export abstract class AirUnit extends Unit { + getIconOptions() { + var belongsToCommandedCoalition = this.belongsToCommandedCoalition(); + return { + showState: belongsToCommandedCoalition, + showVvi: + belongsToCommandedCoalition || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, RADAR, IRST, DLINK].includes(value) + ), + showHealth: false, + showHotgroup: belongsToCommandedCoalition, + showUnitIcon: + belongsToCommandedCoalition || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, RADAR, IRST, DLINK].includes(value) + ), + showShortLabel: + belongsToCommandedCoalition || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC].includes(value) + ), + showFuel: belongsToCommandedCoalition, + showAmmo: belongsToCommandedCoalition, + showSummary: + belongsToCommandedCoalition || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, RADAR, IRST, DLINK].includes(value) + ), + showCallsign: belongsToCommandedCoalition, + rotateToHeading: false, + }; + } + + appendContextActions(contextActionSet: ContextActionSet) { + super.appendContextActions(contextActionSet); + + /* Context actions to be executed immediately */ + contextActionSet.addContextAction( + this, + "refuel", + "Refuel", + "Refuel units at the nearest AAR Tanker. If no tanker is available the unit will RTB", + olStatesRefuel, + (units: Unit[]) => { + getApp().getUnitsManager().refuel(units); + }, + { executeImmediately: true } + ); + contextActionSet.addContextAction( + this, + "center-map", + "Center map", + "Center the map on the unit and follow it", + faMapLocation, + (units: Unit[]) => { + getApp().getMap().centerOnUnit(units[0]); + }, + { executeImmediately: true } + ); + + /* Context actions with a target unit */ + contextActionSet.addContextAction( + this, + "attack", + "Attack unit", + "Click on a unit to attack it using A/A or A/G weapons", + olStatesAttack, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetUnit) + getApp().getUnitsManager().attackUnit(targetUnit.ID, units); + } + ); + contextActionSet.addContextAction( + this, + "follow", + "Follow unit", + "Click on a unit to follow it in formation", + olIconsFollow, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetUnit) targetUnit.showFollowOptions(units); + } + ); + + /* Context actions with a target position */ + contextActionSet.addContextAction( + this, + "bomb", + "Precision bombing", + "Click on a point to execute a precision bombing attack", + faLocationCrosshairs, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetPosition) + getApp().getUnitsManager().bombPoint(targetPosition, units); + } + ); + contextActionSet.addContextAction( + this, + "carpet-bomb", + "Carpet bombing", + "Click on a point to execute a carpet bombing attack", + faXmarksLines, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetPosition) + getApp().getUnitsManager().carpetBomb(targetPosition, units); + } + ); + } +} + +export class Aircraft extends AirUnit { + constructor(ID: number) { + super(ID); + } + + getCategory() { + return "Aircraft"; + } + + appendContextActions(contextActionSet: ContextActionSet) { + super.appendContextActions(contextActionSet); + } + + getMarkerCategory() { + return "aircraft"; + } + + getDefaultMarker() { + return "aircraft"; + } +} + +export class Helicopter extends AirUnit { + constructor(ID: number) { + super(ID); + } + + getCategory() { + return "Helicopter"; + } + + appendContextActions(contextActionSet: ContextActionSet) { + super.appendContextActions(contextActionSet); + contextActionSet.addContextAction( + this, + "land-at-point", + "Land here", + "Click on a point to land there", + olIconsLandAtPoint, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetPosition) + getApp().getUnitsManager().landAtPoint(targetPosition, units); + } + ); + } + + getMarkerCategory() { + return "helicopter"; + } + + getDefaultMarker() { + return "helicopter"; + } +} + +export class GroundUnit extends Unit { + constructor(ID: number) { + super(ID); + } + + getIconOptions() { + var belongsToCommandedCoalition = this.belongsToCommandedCoalition(); + return { + showState: belongsToCommandedCoalition, + showVvi: false, + showHealth: true, + showHotgroup: belongsToCommandedCoalition, + showUnitIcon: + belongsToCommandedCoalition || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, RADAR, IRST, DLINK].includes(value) + ), + showShortLabel: this.getDatabaseEntry()?.type === "SAM Site", + showFuel: false, + showAmmo: false, + showSummary: false, + showCallsign: belongsToCommandedCoalition, + rotateToHeading: false, + }; + } + + appendContextActions(contextActionSet: ContextActionSet) { + super.appendContextActions(contextActionSet); + + /* Context actions to be executed immediately */ + contextActionSet.addContextAction( + this, + "group-ground", + "Group ground units", + "Create a group of ground units", + faPeopleGroup, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + getApp().getUnitsManager().createGroup(units); + }, + { executeImmediately: true } + ); + contextActionSet.addContextAction( + this, + "center-map", + "Center map", + "Center the map on the unit and follow it", + faMapLocation, + (units: Unit[]) => { + getApp().getMap().centerOnUnit(units[0]); + }, + { executeImmediately: true } + ); + + if (this.canAAA()) { + contextActionSet.addContextAction( + this, + "scenic-aaa", + "Scenic AAA", + "Shoot AAA in the air without aiming at any target, when an enemy unit gets close enough. WARNING: works correctly only on neutral units, blue or red units will aim", + olButtonsContextScenicAaa, + (units: Unit[]) => { + getApp().getUnitsManager().scenicAAA(units); + }, + { executeImmediately: true } + ); + contextActionSet.addContextAction( + this, + "miss-aaa", + "Dynamic accuracy AAA", + "Shoot AAA towards the closest enemy unit, but don't aim precisely. WARNING: works correctly only on neutral units, blue or red units will aim", + olButtonsContextMissOnPurpose, + (units: Unit[]) => { + getApp().getUnitsManager().missOnPurpose(units); + }, + { executeImmediately: true } + ); + } + + /* Context actions that require a target unit */ + contextActionSet.addContextAction( + this, + "attack", + "Attack unit", + "Click on a unit to attack it", + olStatesAttack, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetUnit) + getApp().getUnitsManager().attackUnit(targetUnit.ID, units); + } + ); + + /* Context actions that require a target position */ + if (this.canTargetPoint()) { + contextActionSet.addContextAction( + this, + "fire-at-area", + "Fire at area", + "Click on a point to precisely fire at it (if possible)", + faLocationCrosshairs, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetPosition) + getApp().getUnitsManager().fireAtArea(targetPosition, units); + } + ); + contextActionSet.addContextAction( + this, + "simulate-fire-fight", + "Simulate fire fight", + "Simulate a fire fight by shooting randomly in a certain large area. WARNING: works correctly only on neutral units, blue or red units will aim", + olButtonsContextSimulateFireFight, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetPosition) + getApp().getUnitsManager().simulateFireFight(targetPosition, units); + } + ); + } + } + + getCategory() { + return "GroundUnit"; + } + + getType() { + var blueprint = groundUnitDatabase.getByName(this.getName()); + return blueprint?.type ? blueprint.type : ""; + } + + /* When a unit is a leader of a group, the map is zoomed out and grouping when zoomed out is enabled, check if the unit should be shown as a specific group. This is used to show a SAM battery instead of the group leader */ + getDatabaseEntry() { + let unitWhenGrouped: string | undefined | null = null; + if ( + !this.getSelected() && + this.getIsLeader() && + getApp().getMap().getOptions().hideGroupMembers && + getApp().getMap().getZoom() < GROUPING_ZOOM_TRANSITION + ) { + unitWhenGrouped = + this.getDatabase()?.getByName(this.getName())?.unitWhenGrouped ?? null; + let member = this.getGroupMembers().reduce( + (prev: Unit | null, unit: Unit, index: number) => { + if (unit.getDatabaseEntry()?.unitWhenGrouped != undefined) + return unit; + return prev; + }, + null + ); + unitWhenGrouped = + member !== null + ? member?.getDatabaseEntry()?.unitWhenGrouped + : unitWhenGrouped; + } + if (unitWhenGrouped) + return ( + this.getDatabase()?.getByName(unitWhenGrouped) ?? + this.getDatabase()?.getUnkownUnit(this.getName()) + ); + else + return ( + this.getDatabase()?.getByName(this.getName()) ?? + this.getDatabase()?.getUnkownUnit(this.getName()) + ); + } + + /* When we zoom past the grouping limit, grouping is enabled and the unit is a leader, we redraw the unit to apply any possible grouped marker */ + checkZoomRedraw(): boolean { + return ( + this.getIsLeader() && + (getApp().getMap().getOptions().hideGroupMembers as boolean) && + ((getApp().getMap().getZoom() >= GROUPING_ZOOM_TRANSITION && + getApp().getMap().getPreviousZoom() < GROUPING_ZOOM_TRANSITION) || + (getApp().getMap().getZoom() < GROUPING_ZOOM_TRANSITION && + getApp().getMap().getPreviousZoom() >= GROUPING_ZOOM_TRANSITION)) + ); + } + + getMarkerCategory() { + if ( + /\bAAA|SAM\b/.test(this.getType()) || + /\bmanpad|stinger\b/i.test(this.getType()) + ) + return "groundunit-sam"; + else return "groundunit"; + } + + getDefaultMarker() { + return "groundunit"; + } +} + +export class NavyUnit extends Unit { + constructor(ID: number) { + super(ID); + } + + getIconOptions() { + var belongsToCommandedCoalition = this.belongsToCommandedCoalition(); + return { + showState: belongsToCommandedCoalition, + showVvi: false, + showHealth: true, + showHotgroup: true, + showUnitIcon: + belongsToCommandedCoalition || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, RADAR, IRST, DLINK].includes(value) + ), + showShortLabel: false, + showFuel: false, + showAmmo: false, + showSummary: false, + showCallsign: belongsToCommandedCoalition, + rotateToHeading: false, + }; + } + + appendContextActions(contextActionSet: ContextActionSet) { + super.appendContextActions(contextActionSet); + + /* Context actions to be executed immediately */ + contextActionSet.addContextAction( + this, + "group-navy", + "Group navy units", + "Create a group of navy units", + faQuestionCircle, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + getApp().getUnitsManager().createGroup(units); + }, + { executeImmediately: true } + ); + contextActionSet.addContextAction( + this, + "center-map", + "Center map", + "Center the map on the unit and follow it", + faMapLocation, + (units: Unit[]) => { + getApp().getMap().centerOnUnit(units[0]); + }, + { executeImmediately: true } + ); + + /* Context actions that require a target unit */ + contextActionSet.addContextAction( + this, + "attack", + "Attack unit", + "Click on a unit to attack it", + faQuestionCircle, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetUnit) + getApp().getUnitsManager().attackUnit(targetUnit.ID, units); + } + ); + + /* Context actions that require a target position */ + contextActionSet.addContextAction( + this, + "fire-at-area", + "Fire at area", + "Click on a point to precisely fire at it (if possible)", + faQuestionCircle, + ( + units: Unit[], + targetUnit: Unit | null, + targetPosition: LatLng | null + ) => { + if (targetPosition) + getApp().getUnitsManager().fireAtArea(targetPosition, units); + } + ); + } + + getCategory() { + return "NavyUnit"; + } + + getType() { + var blueprint = navyUnitDatabase.getByName(this.getName()); + return blueprint?.type ? blueprint.type : ""; + } + + getMarkerCategory() { + return "navyunit"; + } + + getDefaultMarker() { + return "navyunit"; + } +} diff --git a/frontend/react/src/unit/unitsmanager.ts b/frontend/react/src/unit/unitsmanager.ts new file mode 100644 index 00000000..729b2642 --- /dev/null +++ b/frontend/react/src/unit/unitsmanager.ts @@ -0,0 +1,2046 @@ +import { LatLng, LatLngBounds } from "leaflet"; +import { getApp } from "../olympusapp"; +import { Unit } from "./unit"; +import { + bearingAndDistanceToLatLng, + deg2rad, + getGroundElevation, + getUnitDatabaseByCategory, + keyEventWasInInput, + latLngToMercator, + mToFt, + mercatorToLatLng, + msToKnots, + polyContains, + polygonArea, + randomPointInPoly, + randomUnitBlueprint, +} from "../other/utils"; +import { CoalitionArea } from "../map/coalitionarea/coalitionarea"; +import { groundUnitDatabase } from "./databases/groundunitdatabase"; +import { + DELETE_CYCLE_TIME, + DELETE_SLOW_THRESHOLD, + DataIndexes, + GAME_MASTER, + IADSDensities, + IDLE +} from "../constants/constants"; +import { DataExtractor } from "../server/dataextractor"; +import { citiesDatabase } from "./databases/citiesdatabase"; +import { aircraftDatabase } from "./databases/aircraftdatabase"; +import { helicopterDatabase } from "./databases/helicopterdatabase"; +import { navyUnitDatabase } from "./databases/navyunitdatabase"; +import { TemporaryUnitMarker } from "../map/markers/temporaryunitmarker"; +//import { Popup } from "../popups/popup"; +//import { HotgroupPanel } from "../panels/hotgrouppanel"; +import { + Contact, + UnitBlueprint, + UnitData, + UnitSpawnTable, +} from "../interfaces"; +//import { Dialog } from "../dialog/dialog"; +import { Group } from "./group"; +import { UnitDataFileExport } from "./importexport/unitdatafileexport"; +import { UnitDataFileImport } from "./importexport/unitdatafileimport"; + +/** The UnitsManager handles the creation, update, and control of units. Data is strictly updated by the server ONLY. This means that any interaction from the user will always and only + * result in a command to the server, executed by means of a REST PUT request. Any subsequent change in data will be reflected only when the new data is sent back by the server. This strategy allows + * to avoid client/server and client/client inconsistencies. + */ +export class UnitsManager { + #copiedUnits: UnitData[]; + #deselectionEventDisabled: boolean = false; + #requestDetectionUpdate: boolean = false; + #selectionEventDisabled: boolean = false; + //#slowDeleteDialog!: Dialog; + #units: { [ID: number]: Unit }; + #groups: { [groupName: string]: Group } = {}; + #unitDataExport!: UnitDataFileExport; + #unitDataImport!: UnitDataFileImport; + + constructor() { + this.#copiedUnits = []; + this.#units = {}; + + document.addEventListener("commandModeOptionsChanged", () => { + Object.values(this.#units).forEach((unit: Unit) => + unit.updateVisibility() + ); + }); + document.addEventListener("contactsUpdated", (e: CustomEvent) => { + this.#requestDetectionUpdate = true; + }); + document.addEventListener("copy", () => this.copy()); + document.addEventListener("deleteSelectedUnits", () => this.delete()); + document.addEventListener("explodeSelectedUnits", (e: any) => + this.delete(true, e.detail.type) + ); + document.addEventListener("exportToFile", () => this.exportToFile()); + document.addEventListener("importFromFile", () => this.importFromFile()); + document.addEventListener("keyup", (event) => this.#onKeyUp(event)); + document.addEventListener("paste", () => this.paste()); + document.addEventListener("selectedUnitsChangeAltitude", (e: any) => { + this.changeAltitude(e.detail.type); + }); + document.addEventListener("selectedUnitsChangeSpeed", (e: any) => { + this.changeSpeed(e.detail.type); + }); + document.addEventListener("unitDeselection", (e: CustomEvent) => + this.#onUnitDeselection(e.detail) + ); + document.addEventListener("unitSelection", (e: CustomEvent) => + this.#onUnitSelection(e.detail) + ); + document.addEventListener( + "toggleMarkerProtection", + (ev: CustomEventInit) => { + this.#showNumberOfSelectedProtectedUnits(); + } + ); + + //this.#slowDeleteDialog = new Dialog("slow-delete-dialog"); + } + + /** + * + * @returns All the existing units, both alive and dead + */ + getUnits() { + return this.#units; + } + + /** Get a specific unit by ID + * + * @param ID ID of the unit. The ID shall be the same as the unit ID in DCS. + * @returns Unit object, or null if no unit with said ID exists. + */ + getUnitByID(ID: number) { + if (ID in this.#units) return this.#units[ID]; + else return null; + } + + /** Returns all the units that belong to a hotgroup + * + * @param hotgroup Hotgroup number + * @returns Array of units that belong to hotgroup + */ + getUnitsByHotgroup(hotgroup: number) { + return Object.values(this.#units).filter((unit: Unit) => { + return unit.getAlive() && unit.getHotgroup() == hotgroup; + }); + } + + /** Add a new unit to the manager + * + * @param ID ID of the new unit + * @param category Either "Aircraft", "Helicopter", "GroundUnit", or "NavyUnit". Determines what class will be used to create the new unit accordingly. + */ + addUnit(ID: number, category: string) { + if (category) { + /* Get the constructor from the unit category */ + var constructor = Unit.getConstructor(category); + if (constructor != undefined) { + this.#units[ID] = new constructor(ID); + } + } + } + + /** Sort units segregated groups based on controlling type and protection, if DCS-controlled + * + * @param units + * @returns Object + */ + segregateUnits(units: Unit[]): { [key: string]: [] } { + const data: any = { + controllable: [], + dcsProtected: [], + dcsUnprotected: [], + human: [], + olympus: [], + }; + const map = getApp().getMap(); + + units.forEach((unit) => { + if (unit.getHuman()) data.human.push(unit); + else if (unit.isControlledByOlympus()) data.olympus.push(unit); + else if (map.getIsUnitProtected(unit)) data.dcsProtected.push(unit); + else data.dcsUnprotected.push(unit); + }); + data.controllable = [].concat( + data.dcsUnprotected, + data.human, + data.olympus + ); + return data; + } + + /** + * + * @param numOfProtectedUnits number + */ + showProtectedUnitsPopup(numOfProtectedUnits: number) { + if (numOfProtectedUnits < 1) return; + const messageText = + numOfProtectedUnits === 1 + ? `Unit is protected` + : `All selected units are protected`; + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText(messageText); + // Cheap way for now until we use more locks + let lock = ( + document.querySelector("#unit-visibility-control button.lock") + ); + lock.classList.add("prompt"); + setTimeout(() => lock.classList.remove("prompt"), 4000); + } + + /** Update the data of all the units. The data is directly decoded from the binary buffer received from the REST Server. This is necessary for performance and bandwidth reasons. + * + * @param buffer The arraybuffer, encoded according to the ICD defined in: TODO Add reference to ICD + * @returns The decoded updateTime of the data update. + */ + update(buffer: ArrayBuffer) { + /* Extract the data from the arraybuffer. Since data is encoded dynamically (not all data is always present, but rather only the data that was actually updated since the last request). + No a prori casting can be performed. On the contrary, the array is decoded incrementally, depending on the DataIndexes of the data. The actual data decoding is performed by the Unit class directly. + Every time a piece of data is decoded the decoder seeker is incremented. */ + var dataExtractor = new DataExtractor(buffer); + + var updateTime = Number(dataExtractor.extractUInt64()); + + /* Run until all data is extracted or an error occurs */ + while (dataExtractor.getSeekPosition() < buffer.byteLength) { + /* Extract the unit ID */ + const ID = dataExtractor.extractUInt32(); + + /* If the ID of the unit does not yet exist, create the unit, if the category is known. If it isn't, some data must have been lost and we need to wait for another update */ + if (!(ID in this.#units)) { + const datumIndex = dataExtractor.extractUInt8(); + if (datumIndex == DataIndexes.category) { + const category = dataExtractor.extractString(); + this.addUnit(ID, category); + } else { + /* Inconsistent data, we need to wait for a refresh */ + return updateTime; + } + } + /* Update the data of the unit */ + this.#units[ID]?.setData(dataExtractor); + } + + /* Update the unit groups */ + for (let ID in this.#units) { + const unit = this.#units[ID]; + const groupName = unit.getGroupName(); + + if (groupName !== "") { + /* If the group does not yet exist, create it */ + if (!(groupName in this.#groups)) + this.#groups[groupName] = new Group(groupName); + + /* If the unit was not assigned to a group yet, assign it */ + if (unit.getGroup() === null) this.#groups[groupName].addMember(unit); + } + } + + /* If we are not in Game Master mode, visibility of units by the user is determined by the detections of the units themselves. This is performed here. + This operation is computationally expensive, therefore it is only performed when #requestDetectionUpdate is true. This happens whenever a change in the detectionUpdates is detected + */ + if ( + this.#requestDetectionUpdate && + getApp().getMissionManager().getCommandModeOptions().commandMode != + GAME_MASTER + ) { + /* Create a dictionary of empty detection methods arrays */ + var detectionMethods: { [key: string]: number[] } = {}; + for (let ID in this.#units) detectionMethods[ID] = []; + for (let ID in getApp().getWeaponsManager().getWeapons()) + detectionMethods[ID] = []; + + /* Fill the array with the detection methods */ + for (let ID in this.#units) { + const unit = this.#units[ID]; + if (unit.getAlive() && unit.belongsToCommandedCoalition()) { + const contacts = unit.getContacts(); + contacts.forEach((contact: Contact) => { + const contactID = contact.ID; + if ( + contactID in detectionMethods && + !detectionMethods[contactID].includes(contact.detectionMethod) + ) + detectionMethods[contactID]?.push(contact.detectionMethod); + }); + } + } + + /* Set the detection methods for every unit */ + for (let ID in this.#units) { + const unit = this.#units[ID]; + unit?.setDetectionMethods(detectionMethods[ID]); + } + + /* Set the detection methods for every weapon (weapons must be detected too) */ + for (let ID in getApp().getWeaponsManager().getWeapons()) { + const weapon = getApp().getWeaponsManager().getWeaponByID(parseInt(ID)); + weapon?.setDetectionMethods(detectionMethods[ID]); + } + + this.#requestDetectionUpdate = false; + } + + /* Update the detection lines of all the units. This code is handled by the UnitsManager since it must be run both when the detected OR the detecting unit is updated */ + for (let ID in this.#units) { + if (this.#units[ID].getSelected()) this.#units[ID].drawLines(); + } + + return updateTime; + } + + /** Set a unit as "selected", which will allow to perform operations on it, like giving it a destination, setting it to attack a target, and so on + * + * @param ID The ID of the unit to select + * @param deselectAllUnits If true, the unit will be the only selected unit + */ + selectUnit(ID: number, deselectAllUnits: boolean = true) { + if (deselectAllUnits) + this.getSelectedUnits() + .filter((unit: Unit) => unit.ID !== ID) + .forEach((unit: Unit) => unit.setSelected(false)); + this.#units[ID]?.setSelected(true); + } + + /** Select all visible units inside a bounding rectangle + * + * @param bounds Leaflet bounds object defining the selection area + */ + selectFromBounds(bounds: LatLngBounds) { + this.deselectAllUnits(); + for (let ID in this.#units) { + if (this.#units[ID].getHidden() == false) { + var latlng = new LatLng( + this.#units[ID].getPosition().lat, + this.#units[ID].getPosition().lng + ); + if (bounds.contains(latlng)) { + this.#units[ID].setSelected(true); + } + } + } + } + + /** Select units by hotgroup. A hotgroup can be created to quickly select multiple units using keyboard bindings + * + * @param hotgroup The hotgroup number + */ + selectUnitsByHotgroup(hotgroup: number, deselectAllUnits: boolean = true) { + if (deselectAllUnits) { + this.deselectAllUnits(); + } + + this.getUnitsByHotgroup(hotgroup).forEach((unit: Unit) => + unit.setSelected(true) + ); + } + + /** Get all the currently selected units + * + * @param options Selection options + * @returns Array of selected units + */ + getSelectedUnits(options?: { + excludeHumans?: boolean; + excludeProtected?: boolean; + onlyOnePerGroup?: boolean; + showProtectionReminder?: boolean; + }) { + let selectedUnits: Unit[] = []; + let numProtectedUnits = 0; + for (const [ID, unit] of Object.entries(this.#units)) { + if (unit.getSelected()) { + if (options) { + if (options.excludeHumans && unit.getHuman()) continue; + + if ( + options.excludeProtected === true && + this.#unitIsProtected(unit) + ) { + numProtectedUnits++; + continue; + } + } + selectedUnits.push(unit); + } + } + if (options) { + if ( + options.showProtectionReminder === true && + numProtectedUnits > selectedUnits.length && + selectedUnits.length === 0 + ) + this.showProtectedUnitsPopup(numProtectedUnits); + + if (options.onlyOnePerGroup) { + var temp: Unit[] = []; + for (let unit of selectedUnits) { + if ( + !temp.some( + (otherUnit: Unit) => + unit.getGroupName() == otherUnit.getGroupName() + ) + ) + temp.push(unit); + } + selectedUnits = temp; + } + } + return selectedUnits; + } + + /** Deselects all currently selected units + * + */ + deselectAllUnits() { + for (let ID in this.#units) { + this.#units[ID].setSelected(false); + } + } + + /** Deselect a specific unit + * + * @param ID ID of the unit to deselect + */ + deselectUnit(ID: number) { + this.#units[ID]?.setSelected(false); + } + + /** This function allows to quickly determine the categories (Aircraft, Helicopter, GroundUnit, NavyUnit) of an array units. This allows to enable/disable specific controls which can only be applied + * to specific categories. + * + * @param units Array of units of which to retrieve the categories + * @returns Array of categories. Each category is present only once. + */ + getUnitsCategories(units: Unit[]) { + if (units.length == 0) return []; + return units + .map((unit: Unit) => { + return unit.getCategory(); + }) + ?.filter((value: any, index: number, array: string[]) => { + return array.indexOf(value) === index; + }); + } + + /** This function returns the value of a variable for each of the units in the input array. If all the units have the same value, returns the value, else returns undefined. This function is useful to + * present units data in the control panel, which will print a specific value only if it is the same for all the units. If the values are different, the control panel will show a "mixed values" value, or similar. + * + * @param variableGetter CallableFunction that returns the requested variable. Example: getUnitsVariable((unit: Unit) => unit.getName(), foo) will return a string value if all the units have the same name, otherwise it will return undefined. + * @param units Array of units of which to retrieve the variable + * @returns The value of the variable if all units have the same value, else undefined + */ + getUnitsVariable(variableGetter: CallableFunction, units: Unit[]) { + if (units.length == 0) return undefined; + + var value: any = variableGetter(units[0]); + units.forEach((unit: Unit) => { + if (variableGetter(unit) !== value) value = undefined; + }); + return value; + } + + /** For a given unit, it returns if and how it is being detected by other units. NOTE: this function will return how a unit is being detected, i.e. how other units are detecting it. It will not return + * what the unit is detecting. + * + * @param unit The unit of which to retrieve the "detected" methods. + * @returns Array of detection methods + */ + getUnitDetectedMethods(unit: Unit) { + var detectionMethods: number[] = []; + for (let idx in this.#units) { + if ( + this.#units[idx].getAlive() && + this.#units[idx].getIsLeader() && + this.#units[idx].getCoalition() !== "neutral" && + this.#units[idx].getCoalition() != unit.getCoalition() + ) { + this.#units[idx].getContacts().forEach((contact: Contact) => { + if ( + contact.ID == unit.ID && + !detectionMethods.includes(contact.detectionMethod) + ) + detectionMethods.push(contact.detectionMethod); + }); + } + } + return detectionMethods; + } + + /*********************** Unit actions on selected units ************************/ + /** Give a new destination to the selected units + * + * @param latlng Position of the new destination + * @param mantainRelativePosition If true, the selected units will mantain their relative positions when reaching the target. This is useful to maintain a formation for groun/navy units + * @param rotation Rotation in radians by which the formation will be rigidly rotated. E.g. a ( V ) formation will look like this ( < ) if rotated pi/4 radians (90 degrees) + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + addDestination( + latlng: L.LatLng, + mantainRelativePosition: boolean, + rotation: number, + units: Unit[] | null = null + ) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + /* Compute the destination for each unit. If mantainRelativePosition is true, compute the destination so to hold the relative positions */ + var unitDestinations: { [key: number]: LatLng } = {}; + if (mantainRelativePosition) + unitDestinations = this.computeGroupDestination(latlng, rotation); + else + units.forEach((unit: Unit) => { + unitDestinations[unit.ID] = latlng; + }); + + units.forEach((unit: Unit) => { + /* If a unit is following another unit, and that unit is also selected, send the command to the followed ("leader") unit */ + if (unit.getState() === "follow") { + const leader = this.getUnitByID(unit.getLeaderID()); + if (leader && leader.getSelected()) leader.addDestination(latlng); + else unit.addDestination(latlng); + } else { + if (unit.ID in unitDestinations) + unit.addDestination(unitDestinations[unit.ID]); + } + }); + this.#showActionMessage(units, " new destination added"); + } + + /** Clear the destinations of all the selected units + * + */ + clearDestinations(units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: false, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + for (let idx in units) { + const unit = units[idx]; + if (unit.getState() === "follow") { + const leader = this.getUnitByID(unit.getLeaderID()); + if (leader && leader.getSelected()) leader.clearDestinations(); + else unit.clearDestinations(); + } else unit.clearDestinations(); + } + } + + /** Instruct all the selected units to land at a specific location + * + * @param latlng Location where to land at + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + landAt(latlng: LatLng, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.landAt(latlng)); + + this.#showActionMessage(units, " landing"); + } + + /** Instruct all the selected units to change their speed + * + * @param speedChange Speed change, either "stop", "slow", or "fast". The specific value depends on the unit category + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + changeSpeed(speedChange: string, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.changeSpeed(speedChange)); + } + + /** Instruct all the selected units to change their altitude + * + * @param altitudeChange Altitude change, either "climb" or "descend". The specific value depends on the unit category + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + changeAltitude(altitudeChange: string, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.changeAltitude(altitudeChange)); + } + + /** Set a specific speed to all the selected units + * + * @param speed Value to set, in m/s + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setSpeed(speed: number, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setSpeed(speed)); + this.#showActionMessage(units, `setting speed to ${msToKnots(speed)} kts`); + } + + /** Set a specific speed type to all the selected units + * + * @param speedType Value to set, either "CAS" or "GS". If "CAS" is selected, the unit will try to maintain the selected Calibrated Air Speed, but DCS will still only maintain a Ground Speed value so errors may arise depending on wind. + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setSpeedType(speedType: string, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setSpeedType(speedType)); + this.#showActionMessage(units, `setting speed type to ${speedType}`); + } + + /** Set a specific altitude to all the selected units + * + * @param altitude Value to set, in m + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setAltitude(altitude: number, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setAltitude(altitude)); + this.#showActionMessage(units, `setting altitude to ${mToFt(altitude)} ft`); + } + + /** Set a specific altitude type to all the selected units + * + * @param altitudeType Value to set, either "ASL" or "AGL". If "AGL" is selected, the unit will try to maintain the selected Above Ground Level altitude. Due to a DCS bug, this will only be true at the final position. + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setAltitudeType(altitudeType: string, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setAltitudeType(altitudeType)); + this.#showActionMessage(units, `setting altitude type to ${altitudeType}`); + } + + /** Set a specific ROE to all the selected units + * + * @param ROE Value to set, see constants for acceptable values + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setROE(ROE: string, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setROE(ROE)); + this.#showActionMessage(units, `ROE set to ${ROE}`); + } + + /** Set a specific reaction to threat to all the selected units + * + * @param reactionToThreat Value to set, see constants for acceptable values + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setReactionToThreat(reactionToThreat: string, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setReactionToThreat(reactionToThreat)); + this.#showActionMessage( + units, + `reaction to threat set to ${reactionToThreat}` + ); + } + + /** Set a specific emissions & countermeasures to all the selected units + * + * @param emissionCountermeasure Value to set, see constants for acceptable values + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setEmissionsCountermeasures( + emissionCountermeasure: string, + units: Unit[] | null = null + ) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => + unit.setEmissionsCountermeasures(emissionCountermeasure) + ); + this.#showActionMessage( + units, + `emissions & countermeasures set to ${emissionCountermeasure}` + ); + } + + /** Turn selected units on or off, only works on ground and navy units + * + * @param onOff If true, the unit will be turned on + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setOnOff(onOff: boolean, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setOnOff(onOff)); + this.#showActionMessage(units, `unit active set to ${onOff}`); + } + + /** Instruct the selected units to follow roads, only works on ground units + * + * @param followRoads If true, units will follow roads + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setFollowRoads(followRoads: boolean, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setFollowRoads(followRoads)); + this.#showActionMessage(units, `follow roads set to ${followRoads}`); + } + + /** Instruct selected units to operate as a certain coalition + * + * @param operateAsBool If true, units will operate as blue + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setOperateAs(operateAsBool: boolean, units: Unit[] | null = null) { + var operateAs = operateAsBool ? "blue" : "red"; + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setOperateAs(operateAs)); + this.#showActionMessage(units, `operate as set to ${operateAs}`); + } + + /** Instruct units to attack a specific unit + * + * @param ID ID of the unit to attack + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + attackUnit(ID: number, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.attackUnit(ID)); + this.#showActionMessage( + units, + `attacking unit ${this.getUnitByID(ID)?.getUnitName()}` + ); + } + + /** Instruct units to refuel at the nearest tanker, if possible. Else units will RTB + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + refuel(units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + segregatedUnits.controllable.forEach((unit: Unit) => unit.refuel()); + this.#showActionMessage( + segregatedUnits.controllable, + `sent to nearest tanker` + ); + } + + /** Instruct the selected units to follow another unit in a formation. Only works for aircrafts and helicopters. + * + * @param ID ID of the unit to follow + * @param offset Optional parameter, defines a static offset. X: front-rear, positive front, Y: top-bottom, positive top, Z: left-right, positive right + * @param formation Optional parameter, defines a predefined formation type. Values are: "trail", "echelon-lh", "echelon-rh", "line-abreast-lh", "line-abreast-rh", "front", "diamond" + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + followUnit( + ID: number, + offset?: { x: number; y: number; z: number }, + formation?: string, + units: Unit[] | null = null + ) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + if (offset == undefined) { + /* Simple formations with fixed offsets */ + offset = { x: 0, y: 0, z: 0 }; + if (formation === "trail") { + offset.x = -50; + offset.y = -30; + offset.z = 0; + } else if (formation === "echelon-lh") { + offset.x = -50; + offset.y = -10; + offset.z = -50; + } else if (formation === "echelon-rh") { + offset.x = -50; + offset.y = -10; + offset.z = 50; + } else if (formation === "line-abreast-lh") { + offset.x = 0; + offset.y = 0; + offset.z = -50; + } else if (formation === "line-abreast-rh") { + offset.x = 0; + offset.y = 0; + offset.z = 50; + } else if (formation === "front") { + offset.x = 100; + offset.y = 0; + offset.z = 0; + } else offset = undefined; + } + + var count = 1; + var xr = 0; + var yr = 1; + var zr = -1; + var layer = 1; + units.forEach((unit: Unit) => { + if (unit.ID !== ID) { + if (offset != undefined) + /* Offset is set, apply it */ + unit.followUnit(ID, { + x: offset.x * count, + y: offset.y * count, + z: offset.z * count, + }); + else { + /* More complex formations with variable offsets */ + if (formation === "diamond") { + var xl = xr * Math.cos(Math.PI / 4) - yr * Math.sin(Math.PI / 4); + var yl = xr * Math.sin(Math.PI / 4) + yr * Math.cos(Math.PI / 4); + unit.followUnit(ID, { x: -yl * 50, y: zr * 10, z: xl * 50 }); + + if (yr == 0) { + layer++; + xr = 0; + yr = layer; + zr = -layer; + } else { + if (xr < layer) { + xr++; + zr--; + } else { + yr--; + zr++; + } + } + } + } + count++; + } + }); + this.#showActionMessage( + units, + `following unit ${this.getUnitByID(ID)?.getUnitName()}` + ); + } + + /** Instruct the selected units to perform precision bombing of specific coordinates + * + * @param latlng Location to bomb + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + bombPoint(latlng: LatLng, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.bombPoint(latlng)); + this.#showActionMessage(units, `unit bombing point`); + } + + /** Instruct the selected units to perform carpet bombing of specific coordinates + * + * @param latlng Location to bomb + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + carpetBomb(latlng: LatLng, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.carpetBomb(latlng)); + this.#showActionMessage(units, `unit carpet bombing point`); + } + + /** Instruct the selected units to fire at specific coordinates + * + * @param latlng Location to fire at + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + fireAtArea(latlng: LatLng, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.fireAtArea(latlng)); + this.#showActionMessage(units, `unit firing at area`); + } + + /** Instruct the selected units to simulate a fire fight at specific coordinates + * + * @param latlng Location to fire at + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + simulateFireFight(latlng: LatLng, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + getGroundElevation(latlng, (response: string) => { + var groundElevation: number | null = null; + try { + groundElevation = parseFloat(response); + } catch { + console.warn( + "Simulate fire fight: could not retrieve ground elevation" + ); + } + units?.forEach((unit: Unit) => + unit.simulateFireFight(latlng, groundElevation) + ); + }); + this.#showActionMessage(units, `unit simulating fire fight`); + } + + /** Instruct units to enter into scenic AAA mode. Units will shoot in the air without aiming + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + scenicAAA(units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.scenicAAA()); + this.#showActionMessage(units, `unit set to perform scenic AAA`); + } + + /** Instruct units to enter into dynamic accuracy/miss on purpose mode. Units will aim to the nearest enemy unit but not precisely. + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + missOnPurpose(units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.missOnPurpose()); + this.#showActionMessage(units, `unit set to perform miss-on-purpose AAA`); + } + + /** Instruct units to land at specific point + * + * @param latlng Point where to land + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + landAtPoint(latlng: LatLng, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.landAtPoint(latlng)); + this.#showActionMessage(units, `unit landing at point`); + } + + /** Set a specific shots scatter to all the selected units + * + * @param shotsScatter Value to set + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setShotsScatter(shotsScatter: number, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + onlyOnePerGroup: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setShotsScatter(shotsScatter)); + this.#showActionMessage(units, `shots scatter set to ${shotsScatter}`); + } + + /** Set a specific shots intensity to all the selected units + * + * @param shotsScatter Value to set + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setShotsIntensity(shotsIntensity: number, units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + onlyOnePerGroup: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + units.forEach((unit: Unit) => unit.setShotsIntensity(shotsIntensity)); + this.#showActionMessage(units, `shots intensity set to ${shotsIntensity}`); + } + + /*********************** Control operations on selected units ************************/ + /** See getUnitsCategories for more info + * + * @returns Category array of the selected units. + */ + getSelectedUnitsCategories() { + return this.getUnitsCategories(this.getSelectedUnits()); + } + + /** See getUnitsVariable for more info + * + * @param variableGetter CallableFunction that returns the requested variable. Example: getUnitsVariable((unit: Unit) => unit.getName(), foo) will return a string value if all the units have the same name, otherwise it will return undefined. + * @returns The value of the variable if all units have the same value, else undefined + */ + getSelectedUnitsVariable(variableGetter: (unit: Unit) => any) { + return this.getUnitsVariable(variableGetter, this.getSelectedUnits()); + } + + /** Groups the selected units in a single (DCS) group, if all the units have the same category + * + */ + createGroup(units: Unit[] | null = null) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: false, + showProtectionReminder: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + if (this.getUnitsCategories(units).length == 1) { + var unitsData: { ID: number; location: LatLng }[] = []; + units.forEach((unit: Unit) => + unitsData.push({ ID: unit.ID, location: unit.getPosition() }) + ); + getApp() + .getServerManager() + .cloneUnits( + unitsData, + true, + 0 /* No spawn points, we delete the original units */ + ); + this.#showActionMessage(units, `created a group`); + } else { + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText(`Groups can only be created from units of the same category`); + } + } + + /** Set the hotgroup for the selected units. It will be the only hotgroup of the unit + * + * @param hotgroup Hotgroup number + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + setHotgroup(hotgroup: number, units: Unit[] | null = null) { + this.getUnitsByHotgroup(hotgroup).forEach((unit: Unit) => + unit.setHotgroup(null) + ); + this.addToHotgroup(hotgroup); + } + + /** Add the selected units to a hotgroup. Units can be in multiple hotgroups at the same type + * + * @param hotgroup Hotgroup number + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + */ + addToHotgroup(hotgroup: number, units: Unit[] | null = null) { + if (units === null) units = this.getSelectedUnits(); + units.forEach((unit: Unit) => unit.setHotgroup(hotgroup)); + this.#showActionMessage(units, `added to hotgroup ${hotgroup}`); + //(getApp().getPanelsManager().get("hotgroup") as HotgroupPanel).refreshHotgroups(); + } + + /** Delete the selected units + * + * @param explosion If true, the unit will be deleted using an explosion + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + * @returns + */ + delete( + explosion: boolean = false, + explosionType: string = "", + units: Unit[] | null = null + ) { + if (units === null) + units = this.getSelectedUnits({ + excludeProtected: true, + showProtectionReminder: true, + }); /* Can be applied to humans too */ + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return; + } + + units = segregatedUnits.controllable; + + const selectionContainsAHuman = units.some((unit: Unit) => { + return unit.getHuman() === true; + }); + + if ( + selectionContainsAHuman && + !confirm( + "Your selection includes a human player. Deleting humans causes their vehicle to crash.\n\nAre you sure you want to do this?" + ) + ) { + return; + } + + const doDelete = ( + explosion = false, + explosionType = "", + immediate = false + ) => { + units?.forEach((unit: Unit) => + unit.delete(explosion, explosionType, immediate) + ); + this.#showActionMessage(units as Unit[], `deleted`); + }; + + //if (units.length >= DELETE_SLOW_THRESHOLD) + // //this.#showSlowDeleteDialog(units).then((action: any) => { + // // if (action === "delete-slow") + // // doDelete(explosion, explosionType, false); + // // else if (action === "delete-immediate") + // // doDelete(explosion, explosionType, true); + // //}) + //else + doDelete(explosion, explosionType); + } + + /** Compute the destinations of every unit in the selected units. This function preserves the relative positions of the units, and rotates the whole formation by rotation. + * + * @param latlng Center of the group after the translation + * @param rotation Rotation of the group, in radians + * @param units (Optional) Array of units to apply the control to. If not provided, the operation will be completed on all selected units. + * @returns Array of positions for each unit, in order + */ + computeGroupDestination( + latlng: LatLng, + rotation: number, + units: Unit[] | null = null + ) { + if (units === null) + units = this.getSelectedUnits({ + excludeHumans: true, + excludeProtected: true, + onlyOnePerGroup: true, + }); + + const segregatedUnits = this.segregateUnits(units); + if (segregatedUnits.controllable.length === 0) { + this.showProtectedUnitsPopup(segregatedUnits.dcsProtected.length); + return {}; + } + + units = segregatedUnits.controllable; + + if (units.length === 0) return {}; + + /* Compute the center of the group */ + var len = units.length; + var center = { x: 0, y: 0 }; + units.forEach((unit: Unit) => { + var mercator = latLngToMercator( + unit.getPosition().lat, + unit.getPosition().lng + ); + center.x += mercator.x / len; + center.y += mercator.y / len; + }); + + /* Compute the distances from the center of the group */ + var unitDestinations: { [key: number]: LatLng } = {}; + units.forEach((unit: Unit) => { + var mercator = latLngToMercator( + unit.getPosition().lat, + unit.getPosition().lng + ); + var distancesFromCenter = { + dx: mercator.x - center.x, + dy: mercator.y - center.y, + }; + + /* Rotate the distance according to the group rotation */ + var rotatedDistancesFromCenter: { dx: number; dy: number } = { + dx: 0, + dy: 0, + }; + rotatedDistancesFromCenter.dx = + distancesFromCenter.dx * Math.cos(deg2rad(rotation)) - + distancesFromCenter.dy * Math.sin(deg2rad(rotation)); + rotatedDistancesFromCenter.dy = + distancesFromCenter.dx * Math.sin(deg2rad(rotation)) + + distancesFromCenter.dy * Math.cos(deg2rad(rotation)); + + /* Compute the final position of the unit */ + var destMercator = latLngToMercator(latlng.lat, latlng.lng); // Convert destination point to mercator + var unitMercator = { + x: destMercator.x + rotatedDistancesFromCenter.dx, + y: destMercator.y + rotatedDistancesFromCenter.dy, + }; // Compute final position of this unit in mercator coordinates + var unitLatLng = mercatorToLatLng(unitMercator.x, unitMercator.y); + unitDestinations[unit.ID] = new LatLng(unitLatLng.lat, unitLatLng.lng); + }); + + return unitDestinations; + } + + /** Copy the selected units and store their properties in memory + * + */ + copy(units: Unit[] | null = null) { + if (units === null) units = this.getSelectedUnits(); + + if (units.length === 0) return; + + /* A JSON is used to deepcopy the units, creating a "snapshot" of their properties at the time of the copy */ + this.#copiedUnits = JSON.parse( + JSON.stringify( + units.map((unit: Unit) => { + return unit.getData(); + }) + ) + ); /* Can be applied to humans too */ + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText(`${this.#copiedUnits.length} units copied`); + } + + /*********************** Unit manipulation functions ************************/ + /** Paste the copied units + * + * @returns True if units were pasted successfully + */ + paste() { + let spawnPoints = 0; + + /* If spawns are restricted, check that the user has the necessary spawn points */ + if ( + getApp().getMissionManager().getCommandModeOptions().commandMode != + GAME_MASTER + ) { + if ( + getApp().getMissionManager().getCommandModeOptions().restrictSpawns && + getApp().getMissionManager().getRemainingSetupTime() < 0 + ) { + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText(`Units can be pasted only during SETUP phase`); + return false; + } + + this.#copiedUnits.forEach((unit: UnitData) => { + let unitSpawnPoints = getUnitDatabaseByCategory( + unit.category + )?.getSpawnPointsByName(unit.name); + if (unitSpawnPoints !== undefined) spawnPoints += unitSpawnPoints; + }); + + if ( + spawnPoints > getApp().getMissionManager().getAvailableSpawnPoints() + ) { + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText("Not enough spawn points available!"); + return false; + } + } + + if (this.#copiedUnits.length > 0) { + /* Compute the position of the center of the copied units */ + var nUnits = this.#copiedUnits.length; + var avgLat = 0; + var avgLng = 0; + for (let idx in this.#copiedUnits) { + var unit = this.#copiedUnits[idx]; + avgLat += unit.position.lat / nUnits; + avgLng += unit.position.lng / nUnits; + } + + /* Organize the copied units in groups */ + var groups: { [key: string]: UnitData[] } = {}; + this.#copiedUnits.forEach((unit: UnitData) => { + if (!(unit.groupName in groups)) groups[unit.groupName] = []; + groups[unit.groupName].push(unit); + }); + + /* Clone the units in groups */ + for (let groupName in groups) { + var units: { ID: number; location: LatLng }[] = []; + let markers: TemporaryUnitMarker[] = []; + groups[groupName].forEach((unit: UnitData) => { + var position = new LatLng( + getApp().getMap().getMouseCoordinates().lat + + unit.position.lat - + avgLat, + getApp().getMap().getMouseCoordinates().lng + + unit.position.lng - + avgLng + ); + markers.push( + getApp() + .getMap() + .addTemporaryMarker(position, unit.name, unit.coalition) + ); + units.push({ ID: unit.ID, location: position }); + }); + + getApp() + .getServerManager() + .cloneUnits(units, false, spawnPoints, (res: any) => { + if (res.commandHash !== undefined) { + markers.forEach((marker: TemporaryUnitMarker) => { + marker.setCommandHash(res.commandHash); + }); + } + }); + } + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText(`${this.#copiedUnits.length} units pasted`); + } else { + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText("No units copied!"); + } + } + + /** Automatically create an Integrated Air Defence System from a CoalitionArea object. The units will be mostly focused around big cities. The bigger the city, the larger the amount of units created next to it. + * If the CoalitionArea does not contain any city, no units will be created + * + * @param coalitionArea Boundaries of the IADS + * @param types Array of unit types to add to the IADS, e.g. AAA, SAM, flak, MANPADS + * @param eras Array of eras to which the units added to the IADS can belong + * @param ranges Array of weapon ranges the units can have + * @param density Value between 0 and 100, controls the amout of units created + * @param distribution Value between 0 and 100, controls how "scattered" the units will be + */ + createIADS( + coalitionArea: CoalitionArea, + types: { [key: string]: boolean }, + eras: { [key: string]: boolean }, + ranges: { [key: string]: boolean }, + density: number, + distribution: number, + forceCoalition: boolean + ) { + const activeTypes = Object.keys(types).filter((key: string) => { + return types[key]; + }); + const activeEras = Object.keys(eras).filter((key: string) => { + return eras[key]; + }); + const activeRanges = Object.keys(ranges).filter((key: string) => { + return ranges[key]; + }); + + var airbases = getApp().getMissionManager().getAirbases(); + Object.keys(airbases).forEach((airbaseName: string) => { + var airbase = airbases[airbaseName]; + /* Check if the city is inside the coalition area */ + if ( + polyContains( + new LatLng(airbase.getLatLng().lat, airbase.getLatLng().lng), + coalitionArea + ) + ) { + /* Arbitrary formula to obtain a number of units */ + var pointsNumber = 2 + (10 * density) / 100; + for (let i = 0; i < pointsNumber; i++) { + /* Place the unit nearby the airbase, depending on the distribution parameter */ + var bearing = Math.random() * 360; + var distance = Math.random() * distribution * 100; + const latlng = bearingAndDistanceToLatLng( + airbase.getLatLng().lat, + airbase.getLatLng().lng, + bearing, + distance + ); + + /* Make sure the unit is still inside the coalition area */ + if (polyContains(latlng, coalitionArea)) { + const type = + activeTypes[Math.floor(Math.random() * activeTypes.length)]; + if (Math.random() < IADSDensities[type]) { + /* Get a random blueprint depending on the selected parameters and spawn the unit */ + let unitBlueprint: UnitBlueprint | null; + if (forceCoalition) + unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { + type: type, + eras: activeEras, + ranges: activeRanges, + coalition: coalitionArea.getCoalition(), + }); + else + unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { + type: type, + eras: activeEras, + ranges: activeRanges, + }); + + if (unitBlueprint) + this.spawnUnits( + "GroundUnit", + [ + { + unitType: unitBlueprint.name, + location: latlng, + liveryID: "", + skill: "High", + }, + ], + coalitionArea.getCoalition(), + false, + "", + "" + ); + } + } + } + } + }); + + citiesDatabase.forEach( + (city: { lat: number; lng: number; pop: number }) => { + /* Check if the city is inside the coalition area */ + if (polyContains(new LatLng(city.lat, city.lng), coalitionArea)) { + /* Arbitrary formula to obtain a number of units depending on the city population */ + var pointsNumber = 2 + (Math.pow(city.pop, 0.15) * density) / 100; + for (let i = 0; i < pointsNumber; i++) { + /* Place the unit nearby the city, depending on the distribution parameter */ + var bearing = Math.random() * 360; + var distance = Math.random() * distribution * 100; + const latlng = bearingAndDistanceToLatLng( + city.lat, + city.lng, + bearing, + distance + ); + + /* Make sure the unit is still inside the coalition area */ + if (polyContains(latlng, coalitionArea)) { + const type = + activeTypes[Math.floor(Math.random() * activeTypes.length)]; + if (Math.random() < IADSDensities[type]) { + /* Get a random blueprint depending on the selected parameters and spawn the unit */ + let unitBlueprint: UnitBlueprint | null; + if (forceCoalition) + unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { + type: type, + eras: activeEras, + ranges: activeRanges, + coalition: coalitionArea.getCoalition(), + }); + else + unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { + type: type, + eras: activeEras, + ranges: activeRanges, + }); + + if (unitBlueprint) + this.spawnUnits( + "GroundUnit", + [ + { + unitType: unitBlueprint.name, + location: latlng, + liveryID: "", + skill: "High", + }, + ], + coalitionArea.getCoalition(), + false, + "", + "" + ); + } + } + } + } + } + ); + } + + /** Export all the ground and navy units to file. Does not work on Aircraft and Helicopter units. + * TODO: Extend to aircraft and helicopters + */ + exportToFile() { + if (!this.#unitDataExport) + this.#unitDataExport = new UnitDataFileExport("unit-export-dialog"); + this.#unitDataExport.showForm(Object.values(this.#units)); + } + + /** Import ground and navy units from file + * TODO: extend to support aircraft and helicopters + */ + importFromFile() { + if (!this.#unitDataImport) + this.#unitDataImport = new UnitDataFileImport("unit-import-dialog"); + this.#unitDataImport.selectFile(); + } + + /** Spawn a new group of units + * + * @param category Category of the new units + * @param units Array of unit tables + * @param coalition Coalition to which the new units will belong + * @param immediate If true the command will be performed immediately, but this may cause lag on the server + * @param airbase If true, the location of the units will be ignored and the units will spawn at the given airbase. Only works for aircrafts and helicopters + * @param country Set the country of the units. If empty string, the country will be assigned automatically + * @param callback CallableFunction called when the command is received by the server + * @returns True if the spawn command was successfully sent + */ + spawnUnits( + category: string, + units: UnitSpawnTable[], + coalition: string = "blue", + immediate: boolean = true, + airbase: string = "", + country: string = "", + callback: CallableFunction = () => {} + ) { + var spawnPoints = 0; + var spawnFunction = () => {}; + var spawnsRestricted = + getApp().getMissionManager().getCommandModeOptions().restrictSpawns && + getApp().getMissionManager().getRemainingSetupTime() < 0 && + getApp().getMissionManager().getCommandModeOptions().commandMode !== + GAME_MASTER; + + if (category === "Aircraft") { + if (airbase == "" && spawnsRestricted) { + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText("Aircrafts can be air spawned during the SETUP phase only"); + return false; + } + spawnPoints = units.reduce((points: number, unit: UnitSpawnTable) => { + return points + aircraftDatabase.getSpawnPointsByName(unit.unitType); + }, 0); + spawnFunction = () => + getApp() + .getServerManager() + .spawnAircrafts( + units, + coalition, + airbase, + country, + immediate, + spawnPoints, + callback + ); + } else if (category === "Helicopter") { + if (airbase == "" && spawnsRestricted) { + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText("Helicopters can be air spawned during the SETUP phase only"); + return false; + } + spawnPoints = units.reduce((points: number, unit: UnitSpawnTable) => { + return points + helicopterDatabase.getSpawnPointsByName(unit.unitType); + }, 0); + spawnFunction = () => + getApp() + .getServerManager() + .spawnHelicopters( + units, + coalition, + airbase, + country, + immediate, + spawnPoints, + callback + ); + } else if (category === "GroundUnit") { + if (spawnsRestricted) { + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText("Ground units can be spawned during the SETUP phase only"); + return false; + } + spawnPoints = units.reduce((points: number, unit: UnitSpawnTable) => { + return points + groundUnitDatabase.getSpawnPointsByName(unit.unitType); + }, 0); + spawnFunction = () => + getApp() + .getServerManager() + .spawnGroundUnits( + units, + coalition, + country, + immediate, + spawnPoints, + callback + ); + } else if (category === "NavyUnit") { + if (spawnsRestricted) { + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText("Navy units can be spawned during the SETUP phase only"); + return false; + } + spawnPoints = units.reduce((points: number, unit: UnitSpawnTable) => { + return points + navyUnitDatabase.getSpawnPointsByName(unit.unitType); + }, 0); + spawnFunction = () => + getApp() + .getServerManager() + .spawnNavyUnits( + units, + coalition, + country, + immediate, + spawnPoints, + callback + ); + } + + if (spawnPoints <= getApp().getMissionManager().getAvailableSpawnPoints()) { + getApp().getMissionManager().setSpentSpawnPoints(spawnPoints); + spawnFunction(); + document.dispatchEvent( + new CustomEvent("unitSpawned", { + detail: { + airbase: airbase, + category: category, + coalition: coalition, + country: country, + immediate: immediate, + unitSpawnTable: units, + }, + }) + ); + return true; + } else { + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText("Not enough spawn points available!"); + return false; + } + } + + /***********************************************/ + #onKeyUp(event: KeyboardEvent) { + if (!keyEventWasInInput(event)) { + if (event.key === "Delete") this.delete(); + else if (event.key === "a" && event.ctrlKey) + Object.values(this.getUnits()) + .filter((unit: Unit) => { + return !unit.getHidden(); + }) + .forEach((unit: Unit) => unit.setSelected(true)); + } + } + + #onUnitSelection(unit: Unit) { + if (this.getSelectedUnits().length > 0) { + /* Disable the firing of the selection event for a certain amount of time. This avoids firing many events if many units are selected */ + if (!this.#selectionEventDisabled) { + window.setTimeout(() => { + document.dispatchEvent( + new CustomEvent("unitsSelection", { + detail: this.getSelectedUnits(), + }) + ); + this.#selectionEventDisabled = false; + this.#showNumberOfSelectedProtectedUnits(); + }, 100); + this.#selectionEventDisabled = true; + } + } else { + getApp().getMap().setState(IDLE); + document.dispatchEvent(new CustomEvent("clearSelection")); + } + } + + #onUnitDeselection(unit: Unit) { + if (this.getSelectedUnits().length == 0) { + getApp().getMap().setState(IDLE); + document.dispatchEvent(new CustomEvent("clearSelection")); + } else { + /* Disable the firing of the selection event for a certain amount of time. This avoids firing many events if many units are selected */ + if (!this.#deselectionEventDisabled) { + window.setTimeout(() => { + document.dispatchEvent( + new CustomEvent("unitsDeselection", { + detail: this.getSelectedUnits(), + }) + ); + this.#deselectionEventDisabled = false; + }, 100); + this.#deselectionEventDisabled = true; + } + } + } + + #showActionMessage(units: Unit[], message: string) { + //if (units.length == 1) + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText(`${units[0].getUnitName()} ${message}`); + //else if (units.length > 1) + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText(`${units[0].getUnitName()} and ${units.length - 1} other units ${message}`); + } + + #showSlowDeleteDialog(units: Unit[]) { + //let button: HTMLButtonElement | null = null; + //const deletionTime = Math.round(units.length * DELETE_CYCLE_TIME).toString(); + ////const dialog = this.#slowDeleteDialog; + //const element = dialog.getElement(); + //const listener = (ev: MouseEvent) => { + // if (ev.target instanceof HTMLButtonElement && ev.target.matches("[data-action]")) + // button = ev.target; + //} + // + //element.querySelectorAll(".deletion-count").forEach(el => el.innerHTML = units.length.toString()); + //element.querySelectorAll(".deletion-time").forEach(el => el.innerHTML = deletionTime); + //dialog.show(); + // + //return new Promise((resolve) => { + // element.addEventListener("click", listener); + // + // const interval = setInterval(() => { + // if (button instanceof HTMLButtonElement) { + // clearInterval(interval); + // dialog.hide(); + // element.removeEventListener("click", listener); + // resolve(button.getAttribute("data-action")); + // } + // }, 250); + //}); + } + + #showNumberOfSelectedProtectedUnits() { + const map = getApp().getMap(); + const units = this.getSelectedUnits(); + const numSelectedUnits = units.length; + const numProtectedUnits = units.filter((unit: Unit) => + map.getIsUnitProtected(unit) + ).length; + + //if (numProtectedUnits === 1 && numSelectedUnits === numProtectedUnits) + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText(`Notice: unit is protected`); + + //if (numProtectedUnits > 1) + //(getApp().getPopupsManager().get("infoPopup") as Popup).setText(`Notice: selection contains ${numProtectedUnits} protected units.`); + } + + #unitIsProtected(unit: Unit) { + return getApp().getMap().getIsUnitProtected(unit); + } +} diff --git a/frontend/react/src/weapon/weapon.ts b/frontend/react/src/weapon/weapon.ts new file mode 100644 index 00000000..f059c204 --- /dev/null +++ b/frontend/react/src/weapon/weapon.ts @@ -0,0 +1,439 @@ +import { LatLng, DivIcon, Map } from "leaflet"; +import { getApp } from "../olympusapp"; +import { + enumToCoalition, + mToFt, + msToKnots, + rad2deg, + zeroAppend, +} from "../other/utils"; +import { CustomMarker } from "../map/markers/custommarker"; +import { SVGInjector } from "@tanem/svg-injector"; +import { + DLINK, + DataIndexes, + GAME_MASTER, + IRST, + OPTIC, + RADAR, + VISUAL, +} from "../constants/constants"; +import { DataExtractor } from "../server/dataextractor"; +import { ObjectIconOptions } from "../interfaces"; + +export class Weapon extends CustomMarker { + ID: number; + + #alive: boolean = false; + #coalition: string = "neutral"; + #name: string = ""; + #position: LatLng = new LatLng(0, 0, 0); + #speed: number = 0; + #heading: number = 0; + + #hidden: boolean = false; + #detectionMethods: number[] = []; + + getAlive() { + return this.#alive; + } + getCoalition() { + return this.#coalition; + } + getName() { + return this.#name; + } + getPosition() { + return this.#position; + } + getSpeed() { + return this.#speed; + } + getHeading() { + return this.#heading; + } + + static getConstructor(type: string) { + if (type === "Missile") return Missile; + if (type === "Bomb") return Bomb; + } + + constructor(ID: number) { + super(new LatLng(0, 0), { riseOnHover: true, keyboard: false }); + + this.ID = ID; + + /* Update the marker when the options change */ + document.addEventListener("mapOptionsChanged", (ev: CustomEventInit) => { + this.#updateMarker(); + }); + } + + getCategory() { + // Overloaded by child classes + return ""; + } + + /********************** Unit data *************************/ + setData(dataExtractor: DataExtractor) { + var updateMarker = !getApp().getMap().hasLayer(this); + + var datumIndex = 0; + while (datumIndex != DataIndexes.endOfData) { + datumIndex = dataExtractor.extractUInt8(); + switch (datumIndex) { + case DataIndexes.category: + dataExtractor.extractString(); + break; + case DataIndexes.alive: + this.setAlive(dataExtractor.extractBool()); + updateMarker = true; + break; + case DataIndexes.coalition: + this.#coalition = enumToCoalition(dataExtractor.extractUInt8()); + break; + case DataIndexes.name: + this.#name = dataExtractor.extractString(); + break; + case DataIndexes.position: + this.#position = dataExtractor.extractLatLng(); + updateMarker = true; + break; + case DataIndexes.speed: + this.#speed = dataExtractor.extractFloat64(); + updateMarker = true; + break; + case DataIndexes.heading: + this.#heading = dataExtractor.extractFloat64(); + updateMarker = true; + break; + } + } + + if (updateMarker) this.#updateMarker(); + } + + getData() { + return { + category: this.getCategory(), + ID: this.ID, + alive: this.#alive, + coalition: this.#coalition, + name: this.#name, + position: this.#position, + speed: this.#speed, + heading: this.#heading, + }; + } + + getMarkerCategory(): string { + return ""; + } + + getIconOptions(): ObjectIconOptions { + // Default values, overloaded by child classes if needed + return { + showState: false, + showVvi: false, + showHealth: false, + showHotgroup: false, + showUnitIcon: true, + showShortLabel: false, + showFuel: false, + showAmmo: false, + showSummary: true, + showCallsign: true, + rotateToHeading: false, + }; + } + + setAlive(newAlive: boolean) { + this.#alive = newAlive; + } + + belongsToCommandedCoalition() { + if ( + getApp().getMissionManager().getCommandModeOptions().commandMode !== + GAME_MASTER && + getApp().getMissionManager().getCommandedCoalition() !== this.#coalition + ) + return false; + return true; + } + + getType() { + return ""; + } + + /********************** Icon *************************/ + createIcon(): void { + /* Set the icon */ + var icon = new DivIcon({ + className: "leaflet-unit-icon", + iconAnchor: [25, 25], + iconSize: [50, 50], + }); + this.setIcon(icon); + + var el = document.createElement("div"); + el.classList.add("unit"); + el.setAttribute("data-object", `unit-${this.getMarkerCategory()}`); + el.setAttribute("data-coalition", this.#coalition); + + // Generate and append elements depending on active options + // Velocity vector + if (this.getIconOptions().showVvi) { + var vvi = document.createElement("div"); + vvi.classList.add("unit-vvi"); + vvi.toggleAttribute("data-rotate-to-heading"); + el.append(vvi); + } + + // Main icon + if (this.getIconOptions().showUnitIcon) { + var unitIcon = document.createElement("div"); + unitIcon.classList.add("unit-icon"); + var img = document.createElement("img"); + img.src = `/images/units/${this.getMarkerCategory()}.svg`; + img.onload = () => SVGInjector(img); + unitIcon.appendChild(img); + unitIcon.toggleAttribute( + "data-rotate-to-heading", + this.getIconOptions().rotateToHeading + ); + el.append(unitIcon); + } + + this.getElement()?.appendChild(el); + } + + /********************** Visibility *************************/ + updateVisibility() { + const hiddenUnits = getApp().getMap().getHiddenTypes(); + var hidden = + hiddenUnits[this.getMarkerCategory()] || + hiddenUnits[this.#coalition] || + (!this.belongsToCommandedCoalition() && + this.#detectionMethods.length == 0); + + this.setHidden(hidden || !this.#alive); + } + + setHidden(hidden: boolean) { + this.#hidden = hidden; + + /* Add the marker if not present */ + if (!getApp().getMap().hasLayer(this) && !this.getHidden()) { + if (getApp().getMap().isZooming()) + this.once("zoomend", () => { + this.addTo(getApp().getMap()); + }); + else this.addTo(getApp().getMap()); + } + + /* Hide the marker if necessary*/ + if (getApp().getMap().hasLayer(this) && this.getHidden()) { + getApp().getMap().removeLayer(this); + } + } + + getHidden() { + return this.#hidden; + } + + setDetectionMethods(newDetectionMethods: number[]) { + if (!this.belongsToCommandedCoalition()) { + /* Check if the detection methods of this unit have changed */ + if ( + this.#detectionMethods.length !== newDetectionMethods.length || + this.getDetectionMethods().some( + (value) => !newDetectionMethods.includes(value) + ) + ) { + /* Force a redraw of the unit to reflect the new status of the detection methods */ + this.setHidden(true); + this.#detectionMethods = newDetectionMethods; + this.#updateMarker(); + } + } + } + + getDetectionMethods() { + return this.#detectionMethods; + } + + /***********************************************/ + onAdd(map: Map): this { + super.onAdd(map); + return this; + } + + #updateMarker() { + this.updateVisibility(); + + /* Draw the marker */ + if (!this.getHidden()) { + if ( + this.getLatLng().lat !== this.#position.lat || + this.getLatLng().lng !== this.#position.lng + ) { + this.setLatLng(new LatLng(this.#position.lat, this.#position.lng)); + } + + var element = this.getElement(); + if (element != null) { + /* Draw the velocity vector */ + element + .querySelector(".unit-vvi") + ?.setAttribute("style", `height: ${15 + this.#speed / 5}px;`); + + /* Set dead/alive flag */ + element + .querySelector(".unit") + ?.toggleAttribute("data-is-dead", !this.#alive); + + /* Set altitude and speed */ + if (element.querySelector(".unit-altitude")) + (element.querySelector(".unit-altitude")).innerText = + "FL" + + zeroAppend( + Math.floor(mToFt(this.#position.alt as number) / 100), + 3 + ); + if (element.querySelector(".unit-speed")) + (element.querySelector(".unit-speed")).innerText = + String(Math.floor(msToKnots(this.#speed))) + "GS"; + + /* Rotate elements according to heading */ + element.querySelectorAll("[data-rotate-to-heading]").forEach((el) => { + const headingDeg = rad2deg(this.#heading); + let currentStyle = el.getAttribute("style") || ""; + el.setAttribute( + "style", + currentStyle + `transform:rotate(${headingDeg}deg);` + ); + }); + } + + /* Set vertical offset for altitude stacking */ + var pos = getApp().getMap().latLngToLayerPoint(this.getLatLng()).round(); + this.setZIndexOffset( + 1000 + Math.floor(this.#position.alt as number) - pos.y + ); + } + } +} + +export class Missile extends Weapon { + constructor(ID: number) { + super(ID); + } + + getCategory() { + return "Missile"; + } + + getMarkerCategory() { + if ( + this.belongsToCommandedCoalition() || + this.getDetectionMethods().includes(VISUAL) || + this.getDetectionMethods().includes(OPTIC) + ) + return "missile"; + else return "aircraft"; + } + + getIconOptions() { + return { + showState: false, + showVvi: + !this.belongsToCommandedCoalition() && + !this.getDetectionMethods().some((value) => + [VISUAL, OPTIC].includes(value) + ) && + this.getDetectionMethods().some((value) => + [RADAR, IRST, DLINK].includes(value) + ), + showHealth: false, + showHotgroup: false, + showUnitIcon: + this.belongsToCommandedCoalition() || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, RADAR, IRST, DLINK].includes(value) + ), + showShortLabel: false, + showFuel: false, + showAmmo: false, + showSummary: + !this.belongsToCommandedCoalition() && + !this.getDetectionMethods().some((value) => + [VISUAL, OPTIC].includes(value) + ) && + this.getDetectionMethods().some((value) => + [RADAR, IRST, DLINK].includes(value) + ), + showCallsign: false, + rotateToHeading: + this.belongsToCommandedCoalition() || + this.getDetectionMethods().includes(VISUAL) || + this.getDetectionMethods().includes(OPTIC), + }; + } +} + +export class Bomb extends Weapon { + constructor(ID: number) { + super(ID); + } + + getCategory() { + return "Bomb"; + } + + getMarkerCategory() { + if ( + this.belongsToCommandedCoalition() || + this.getDetectionMethods().includes(VISUAL) || + this.getDetectionMethods().includes(OPTIC) + ) + return "bomb"; + else return "aircraft"; + } + + getIconOptions() { + return { + showState: false, + showVvi: + !this.belongsToCommandedCoalition() && + !this.getDetectionMethods().some((value) => + [VISUAL, OPTIC].includes(value) + ) && + this.getDetectionMethods().some((value) => + [RADAR, IRST, DLINK].includes(value) + ), + showHealth: false, + showHotgroup: false, + showUnitIcon: + this.belongsToCommandedCoalition() || + this.getDetectionMethods().some((value) => + [VISUAL, OPTIC, RADAR, IRST, DLINK].includes(value) + ), + showShortLabel: false, + showFuel: false, + showAmmo: false, + showSummary: + !this.belongsToCommandedCoalition() && + !this.getDetectionMethods().some((value) => + [VISUAL, OPTIC].includes(value) + ) && + this.getDetectionMethods().some((value) => + [RADAR, IRST, DLINK].includes(value) + ), + showCallsign: false, + rotateToHeading: + this.belongsToCommandedCoalition() || + this.getDetectionMethods().includes(VISUAL) || + this.getDetectionMethods().includes(OPTIC), + }; + } +} diff --git a/frontend/react/src/weapon/weaponsmanager.ts b/frontend/react/src/weapon/weaponsmanager.ts new file mode 100644 index 00000000..86323175 --- /dev/null +++ b/frontend/react/src/weapon/weaponsmanager.ts @@ -0,0 +1,116 @@ +import { getApp } from "../olympusapp"; +import { Weapon } from "./weapon"; +import { DataIndexes } from "../constants/constants"; +import { DataExtractor } from "../server/dataextractor"; +import { Contact } from "../interfaces"; + +/** The WeaponsManager handles the creation and update of weapons. Data is strictly updated by the server ONLY. */ +export class WeaponsManager { + #weapons: { [ID: number]: Weapon }; + + constructor() { + this.#weapons = {}; + + document.addEventListener("commandModeOptionsChanged", () => { + Object.values(this.#weapons).forEach((weapon: Weapon) => + weapon.updateVisibility() + ); + }); + } + + /** + * + * @returns All the existing weapons, both active and destroyed + */ + getWeapons() { + return this.#weapons; + } + + /** Get a weapon by ID + * + * @param ID ID of the weapon + * @returns Weapon object, or null if input ID does not exist + */ + getWeaponByID(ID: number) { + if (ID in this.#weapons) return this.#weapons[ID]; + else return null; + } + + /** Add a new weapon to the manager + * + * @param ID ID of the new weapon + * @param category Either "Missile" or "Bomb". Determines what class will be used to create the new unit accordingly. + */ + addWeapon(ID: number, category: string) { + if (category) { + /* The name of the weapon category is exactly the same as the constructor name */ + var constructor = Weapon.getConstructor(category); + if (constructor != undefined) { + this.#weapons[ID] = new constructor(ID); + } + } + } + + /** Update the data of all the weapons. The data is directly decoded from the binary buffer received from the REST Server. This is necessary for performance and bandwidth reasons. + * + * @param buffer The arraybuffer, encoded according to the ICD defined in: TODO Add reference to ICD + * @returns The decoded updateTime of the data update. + */ + update(buffer: ArrayBuffer) { + /* Extract the data from the arraybuffer. Since data is encoded dynamically (not all data is always present, but rather only the data that was actually updated since the last request). + No a prori casting can be performed. On the contrary, the array is decoded incrementally, depending on the DataIndexes of the data. The actual data decoding is performed by the Weapon class directly. + Every time a piece of data is decoded the decoder seeker is incremented. */ + var dataExtractor = new DataExtractor(buffer); + + var updateTime = Number(dataExtractor.extractUInt64()); + + /* Run until all data is extracted or an error occurs */ + while (dataExtractor.getSeekPosition() < buffer.byteLength) { + /* Extract the weapon ID */ + const ID = dataExtractor.extractUInt32(); + + /* If the ID of the weapon does not yet exist, create the weapon, if the category is known. If it isn't, some data must have been lost and we need to wait for another update */ + if (!(ID in this.#weapons)) { + const datumIndex = dataExtractor.extractUInt8(); + if (datumIndex == DataIndexes.category) { + const category = dataExtractor.extractString(); + this.addWeapon(ID, category); + } else { + /* Inconsistent data, we need to wait for a refresh */ + return updateTime; + } + } + /* Update the data of the weapon */ + this.#weapons[ID]?.setData(dataExtractor); + } + return updateTime; + } + + /** For a given weapon, it returns if and how it is being detected by other units. NOTE: this function will return how a weapon is being detected, i.e. how other units are detecting it. It will not return + * what the weapon is detecting (mostly because weapons can't detect units). + * + * @param weapon The unit of which to retrieve the "detected" methods. + * @returns Array of detection methods + */ + getWeaponDetectedMethods(weapon: Weapon) { + var detectionMethods: number[] = []; + var units = getApp().getUnitsManager().getUnits(); + for (let idx in units) { + if ( + units[idx].getAlive() && + units[idx].getIsLeader() && + units[idx].getCoalition() !== "neutral" && + units[idx].getCoalition() != weapon.getCoalition() + ) { + units[idx].getContacts().forEach((contact: Contact) => { + if ( + contact.ID == weapon.ID && + !detectionMethods.includes(contact.detectionMethod) + ) + detectionMethods.push(contact.detectionMethod); + }); + } + } + return detectionMethods; + } +} diff --git a/frontend/react/tailwind.config.js b/frontend/react/tailwind.config.js new file mode 100644 index 00000000..609e21a8 --- /dev/null +++ b/frontend/react/tailwind.config.js @@ -0,0 +1,32 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: { + colors: { + background: { + darker: "#202831", + dark: "#2D3742", + neutral: "#394552", + }, + interaction: { + blue: "#5CA7FF", + }, + olympus: { + 50: "#516176", + 100: "#4A5A6F", + 200: "#435367", + 300: "#38475A", + 400: "#303F51", + 500: "#2A3949", + 600: "#243141", + 700: "#1C2836", + 800: "#17212D", + 900: "#171C26", + }, + }, + }, + }, + plugins: [], + darkMode: "class", +}; diff --git a/frontend/react/vite.config.js b/frontend/react/vite.config.js new file mode 100644 index 00000000..1bdf5639 --- /dev/null +++ b/frontend/react/vite.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + base: "/vite", +}); diff --git a/frontend/server/.vscode/launch.json b/frontend/server/.vscode/launch.json index c5c4d9ed..11f1e6d8 100644 --- a/frontend/server/.vscode/launch.json +++ b/frontend/server/.vscode/launch.json @@ -12,8 +12,8 @@ "/**" ], "args": ["--config", "${input:enterDir}/Config/olympus.json"], - "program": "./bin/www", - "preLaunchTask": "copy" + "program": "./build/www.js", + "preLaunchTask": "build" }, { "type": "node", @@ -22,8 +22,20 @@ "skipFiles": [ "/**" ], - "args": ["--config", "${input:enterDir}/Config/olympus.json"], - "program": "./bin/www", + "runtimeExecutable": "nodemon", + "runtimeArgs": [ + "--watch", + "src/**/*.ts", + "--exec", + "node", + "--inspect", + "-r", + "ts-node/register", + "src/www.ts", + "-c", + "${input:enterDir}/Config/olympus.json" + ], + "restart": true, "preLaunchTask": "demo-server" } ], diff --git a/frontend/server/.vscode/tasks.json b/frontend/server/.vscode/tasks.json index f71a20f2..aacadfd3 100644 --- a/frontend/server/.vscode/tasks.json +++ b/frontend/server/.vscode/tasks.json @@ -4,19 +4,23 @@ "version": "2.0.0", "tasks": [ { - "label": "check-setup", + "label": "check-setup", "type": "shell", "command": "cd .. ; ./check_setup.bat", "isBackground": false }, { - "label": "demo-server", + "label": "demo-server", "type": "shell", "command": "./scripts/demo-server.bat", - "args": ["${input:enterDir}/Config/olympus.json"], + "args": [ + "${input:enterDir}/Config/olympus.json" + ], "isBackground": true, - "dependsOn": ["check-setup"], - "problemMatcher":{ + "dependsOn": [ + "check-setup" + ], + "problemMatcher": { "owner": "custom", "base": "$tsc-watch", "background": { @@ -25,21 +29,16 @@ "endsPattern": "Waiting for connections..." } } - }, - { - "label": "copy", - "type": "shell", - "command": "./scripts/copy.bat", - "isBackground": false, - "dependsOn": ["check-setup"], } - ], + ], "inputs": [ { - "id": "enterDir", - "type": "command", - "command": "extension.commandvariable.remember", - "args": { "key": "dir" } + "id": "enterDir", + "type": "command", + "command": "extension.commandvariable.promptStringRemember", + "args": { + "key": "dir" + } } ] } \ No newline at end of file diff --git a/frontend/server/app.js b/frontend/server/app.js deleted file mode 100644 index b07fe860..00000000 --- a/frontend/server/app.js +++ /dev/null @@ -1,61 +0,0 @@ -module.exports = function (configLocation) { - /* Requires */ - var express = require('express'); - var path = require('path'); - var logger = require('morgan'); - var fs = require('fs'); - var bodyParser = require('body-parser'); - const { createProxyMiddleware } = require('http-proxy-middleware'); - - /* Default routers */ - var atcRouter = require('./routes/api/atc'); - var airbasesRouter = require('./routes/api/airbases'); - var elevationRouter = require('./routes/api/elevation')(configLocation); - var databasesRouter = require('./routes/api/databases')(path.join(path.dirname(configLocation), "..", "Mods", "Services", "Olympus", "databases")); - var indexRouter = require('./routes/index'); - var uikitRouter = require('./routes/uikit'); - var usersRouter = require('./routes/users'); - var resourcesRouter = require('./routes/resources')(configLocation); - var pluginsRouter = require('./routes/plugins'); - - /* Load the config and create the express app */ - let config = {} - console.log(`Loading configuration file from ${configLocation}`) - if (fs.existsSync(configLocation)){ - let rawdata = fs.readFileSync(configLocation); - config = JSON.parse(rawdata); - } - else { - console.error("Error loading configuration file.") - return undefined; - } - var app = express(); - - var backendAddress = config["backend"]["address"]; - - /* Define middleware */ - app.use(logger('dev')); - app.use('/olympus', createProxyMiddleware({ target: `http://${backendAddress === '*'? 'localhost': backendAddress}:${config["backend"]["port"]}`, changeOrigin: true })); - app.use(bodyParser.json({ limit: '50mb' })); - app.use(bodyParser.urlencoded({ limit: '50mb', extended: true })); - app.use(express.static(path.join(__dirname, 'public'))); - - /* Apply routers */ - app.use('/', indexRouter); - app.use('/api/atc', atcRouter); - app.use('/api/airbases', airbasesRouter); - app.use('/api/elevation', elevationRouter); - app.use('/api/databases', databasesRouter); - app.use('/plugins', pluginsRouter) - app.use('/users', usersRouter); - app.use('/uikit', uikitRouter); - app.use('/resources', resourcesRouter); - - app.set('view engine', 'ejs'); - - return app; -} - - - - diff --git a/frontend/server/bin/demo b/frontend/server/bin/demo deleted file mode 100644 index b9cc8d3e..00000000 --- a/frontend/server/bin/demo +++ /dev/null @@ -1,124 +0,0 @@ -const yargs = require('yargs'); -var fs = require('fs'); - -/* Define configuration parameter */ -yargs.alias('c', 'config').describe('c', 'olympus.json config location').string('rp'); -args = yargs.argv; - -console.log('\x1b[36m%s\x1b[0m', "*********************************************************************"); -console.log('\x1b[36m%s\x1b[0m', "* _____ _____ _____ ____ _ *"); -console.log('\x1b[36m%s\x1b[0m', "* | __ \\ / ____|/ ____| / __ \\| | *"); -console.log('\x1b[36m%s\x1b[0m', "* | | | | | | (___ | | | | |_ _ _ __ ___ _ __ _ _ ___ *"); -console.log('\x1b[36m%s\x1b[0m', "* | | | | | \\___ \\ | | | | | | | | '_ ` _ \\| '_ \\| | | / __| *"); -console.log('\x1b[36m%s\x1b[0m', "* | |__| | |____ ____) | | |__| | | |_| | | | | | | |_) | |_| \\__ \\ *"); -console.log('\x1b[36m%s\x1b[0m', "* |_____/ \\_____|_____/ \\____/|_|\\__, |_| |_| |_| .__/ \\__,_|___/ *"); -console.log('\x1b[36m%s\x1b[0m', "* __/ | | | *"); -console.log('\x1b[36m%s\x1b[0m', "* |___/ |_| *"); -console.log('\x1b[36m%s\x1b[0m', "*********************************************************************"); -console.log('\x1b[36m%s\x1b[0m', ""); -console.log("Please wait while DCS Olympus DEMO Backend Server starts up..."); -console.log(`Config location: ${args["config"]}`) - -var fs = require('fs'); -let rawdata = fs.readFileSync(args["config"]); -let config = JSON.parse(rawdata); - -/** - * Module dependencies. - */ - -var app = require('../demo')(args["config"]); -var debug = require('debug')('client:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var configPort = null; -if (config["backend"] != undefined && config["backend"]["port"] != undefined) { - configPort = config["backend"]["port"]; -} - -var port = normalizePort(configPort || '3001'); -app.set('port', port); -console.log("Express server listening on port: " + port) - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} - -console.log("DCS Olympus DEMO Backend Server {{OLYMPUS_VERSION_NUMBER}}.{{OLYMPUS_COMMIT_HASH}} started correctly!") -console.log("Waiting for connections...") - -process.title = `DCS Olympus DEMO Backend Server {{OLYMPUS_VERSION_NUMBER}} (${port})`; \ No newline at end of file diff --git a/frontend/server/bin/www b/frontend/server/bin/www deleted file mode 100644 index 7be11021..00000000 --- a/frontend/server/bin/www +++ /dev/null @@ -1,117 +0,0 @@ -const yargs = require('yargs'); -var fs = require('fs'); - -/* Define configuration parameter */ -yargs.alias('c', 'config').describe('c', 'olympus.json config location').string('rp'); -args = yargs.argv; - -console.log('\x1b[36m%s\x1b[0m', "*********************************************************************"); -console.log('\x1b[36m%s\x1b[0m', "* _____ _____ _____ ____ _ *"); -console.log('\x1b[36m%s\x1b[0m', "* | __ \\ / ____|/ ____| / __ \\| | *"); -console.log('\x1b[36m%s\x1b[0m', "* | | | | | | (___ | | | | |_ _ _ __ ___ _ __ _ _ ___ *"); -console.log('\x1b[36m%s\x1b[0m', "* | | | | | \\___ \\ | | | | | | | | '_ ` _ \\| '_ \\| | | / __| *"); -console.log('\x1b[36m%s\x1b[0m', "* | |__| | |____ ____) | | |__| | | |_| | | | | | | |_) | |_| \\__ \\ *"); -console.log('\x1b[36m%s\x1b[0m', "* |_____/ \\_____|_____/ \\____/|_|\\__, |_| |_| |_| .__/ \\__,_|___/ *"); -console.log('\x1b[36m%s\x1b[0m', "* __/ | | | *"); -console.log('\x1b[36m%s\x1b[0m', "* |___/ |_| *"); -console.log('\x1b[36m%s\x1b[0m', "*********************************************************************"); -console.log('\x1b[36m%s\x1b[0m', ""); -console.log("Please wait while DCS Olympus Server starts up..."); -console.log(`Config location: ${args["config"]}`) - -/* Load the configuration file */ -var httpPort = 0; -if (fs.existsSync(args["config"])) { - var json = JSON.parse(fs.readFileSync(args["config"], 'utf-8')); - httpPort = json["frontend"]["port"]; -} else { - console.log("Failed to read config, aborting!"); - return; -} - -/* Load the dependencies. The app is loaded providing the configuration file location */ -var app = require('../app')(args["config"]); -var debug = require('debug')('client:server'); -var http = require('http'); - -/* Normalize port */ -var port = normalizePort(httpPort); -app.set('port', port); -console.log("Express server listening on port: " + port) - -/* Create HTTP server */ -var server = http.createServer(app); - -/* Listen on provided port, on all network interfaces. */ -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/* Optional https support */ -var https = null; -var credentials = null; -var httpsServer = null; -if (json["frontend"]["https"] === true){ - https = require('https'); - var privateKey = fs.readFileSync(json["frontend"]["keyPath"] ?? "./cert/default.key", 'utf8'); - var certificate = fs.readFileSync(json["frontend"]["certPath"] ?? "./cert/default.crt", 'utf8'); - var httpsPort = json["frontend"]["httpsPort"] ?? 3433; - credentials = {key: privateKey, cert: certificate}; - httpsServer = https.createServer(credentials, app); - httpsServer.listen(httpsPort); - console.log("Express server listening on SSL port: " + httpsPort) -} - -/* Normalize a port into a number, string, or false. */ -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - return val; - } - - if (port >= 0) { - return port; - } - - return false; -} - -/* Event listener for HTTP server "error" event. */ -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - /* Handle specific listen errors with friendly messages */ - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/* Event listener for HTTP server "listening" event. */ -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} - -/* Final user friendly printing */ -console.log("DCS Olympus server {{OLYMPUS_VERSION_NUMBER}}.{{OLYMPUS_COMMIT_HASH}} started correctly!") -console.log("Waiting for connections...") -process.title = `DCS Olympus server {{OLYMPUS_VERSION_NUMBER}} (${port})`; \ No newline at end of file diff --git a/frontend/server/demo.js b/frontend/server/demo.js deleted file mode 100644 index f817125b..00000000 --- a/frontend/server/demo.js +++ /dev/null @@ -1,528 +0,0 @@ -module.exports = function (configLocation) { - var basicAuth = require('express-basic-auth') - var logger = require('morgan'); - var enc = new TextEncoder(); - const path = require('path'); - - var express = require('express'); - var fs = require('fs'); - - let rawdata = fs.readFileSync(configLocation); - let config = JSON.parse(rawdata); - - var app = express(); - - app.use(logger('dev')); - - const aircraftDatabase = require(path.join(path.dirname(configLocation), '../Mods/Services/Olympus/databases/units/aircraftdatabase.json')); - const helicopterDatabase = require(path.join(path.dirname(configLocation),'../Mods/Services/Olympus/databases/units/helicopterdatabase.json')); - const groundUnitDatabase = require(path.join(path.dirname(configLocation),'../Mods/Services/Olympus/databases/units/groundunitdatabase.json')); - const navyUnitDatabase = require(path.join(path.dirname(configLocation),'../Mods/Services/Olympus/databases/units/navyunitdatabase.json')); - - const DEMO_UNIT_DATA = {} - - const DEMO_WEAPONS_DATA = { - /*["1001"]:{ category: "Missile", alive: true, coalition: 2, name: "", position: { lat: 37.1, lng: -116, alt: 1000 }, speed: 200, heading: 45 * Math.PI / 180 }, */ - } - - class DemoDataGenerator { - constructor(app, config) - { - app.get('/olympus/units', (req, res) => this.units(req, res)); - app.get('/olympus/weapons', (req, res) => this.weapons(req, res)); - app.get('/olympus/logs', (req, res) => this.logs(req, res)); - app.get('/olympus/bullseyes', (req, res) => this.bullseyes(req, res)); - app.get('/olympus/airbases', (req, res) => this.airbases(req, res)); - app.get('/olympus/mission', (req, res) => this.mission(req, res)); - app.get('/olympus/commands', (req, res) => this.command(req, res)); - app.put('/olympus', (req, res) => this.put(req, res)); - - app.use('/olympus', basicAuth({ - users: { - 'admin': config["authentication"]["gameMasterPassword"], - 'blue': config["authentication"]["blueCommanderPassword"], - 'red': config["authentication"]["redCommanderPassword"] - }, - })) - - - let baseData = { alive: true, human: false, controlled: true, coalition: 2, country: 0, unitName: "Cool guy", groupName: "Cool group 1", state: 13, task: "Being cool!", - hasTask: true, position: { lat: 37, lng: -116, alt: 1000 }, speed: 200, horizontalVelocity: 200, verticalVelicity: 0, heading: 45, track: 45, isActiveTanker: false, isActiveAWACS: false, onOff: true, followRoads: false, fuel: 50, - desiredSpeed: 300, desiredSpeedType: 1, desiredAltitude: 1000, desiredAltitudeType: 1, leaderID: 0, - formationOffset: { x: 0, y: 0, z: 0 }, - targetID: 0, - targetPosition: { lat: 0, lng: 0, alt: 0 }, - ROE: 1, - reactionToThreat: 1, - emissionsCountermeasures: 1, - TACAN: { isOn: false, XY: 'Y', callsign: 'TKR', channel: 40 }, - radio: { frequency: 124000000, callsign: 1, callsignNumber: 1 }, - generalSettings: { prohibitAA: false, prohibitAfterburner: false, prohibitAG: false, prohibitAirWpn: false, prohibitJettison: false }, - ammo: [], - contacts: [], - activePath: [], - isLeader: true - } - - - - // UNCOMMENT TO TEST ALL UNITS **************** - /* - var databases = Object.assign({}, aircraftDatabase, helicopterDatabase, groundUnitDatabase, navyUnitDatabase); - var t = Object.keys(databases).length; - var l = Math.floor(Math.sqrt(t)); - let latIdx = 0; - let lngIdx = 0; - let idx = 1; - console.log(l) - for (let name in databases) { - if (databases[name].enabled) { - DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); - DEMO_UNIT_DATA[idx].name = name; - DEMO_UNIT_DATA[idx].groupName = `Group-${idx}`; - DEMO_UNIT_DATA[idx].position.lat += latIdx / 5; - DEMO_UNIT_DATA[idx].position.lng += lngIdx / 5; - DEMO_UNIT_DATA[idx].coalition = Math.floor(Math.random() * 3) - - latIdx += 1; - if (latIdx === l) { - latIdx = 0; - lngIdx += 1; - } - - if (name in aircraftDatabase) - DEMO_UNIT_DATA[idx].category = "Aircraft"; - else if (name in helicopterDatabase) - DEMO_UNIT_DATA[idx].category = "Helicopter"; - else if (name in groundUnitDatabase) - DEMO_UNIT_DATA[idx].category = "GroundUnit"; - else if (name in navyUnitDatabase) - DEMO_UNIT_DATA[idx].category = "NavyUnit"; - - idx += 1; - } - } - - - */ - let idx = 1; - DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); - DEMO_UNIT_DATA[idx].name = "S_75M_Volhov"; - DEMO_UNIT_DATA[idx].groupName = `Group`; - DEMO_UNIT_DATA[idx].position.lat += idx / 100; - DEMO_UNIT_DATA[idx].category = "GroundUnit"; - DEMO_UNIT_DATA[idx].isLeader = true; - - idx += 1; - DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); - DEMO_UNIT_DATA[idx].name = "SNR_75V"; - DEMO_UNIT_DATA[idx].groupName = `Group`; - DEMO_UNIT_DATA[idx].position.lat += idx / 100; - DEMO_UNIT_DATA[idx].category = "GroundUnit"; - DEMO_UNIT_DATA[idx].isLeader = false; - - idx += 1; - DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); - DEMO_UNIT_DATA[idx].name = "Ural-4320 APA-5D"; - DEMO_UNIT_DATA[idx].groupName = `Group`; - DEMO_UNIT_DATA[idx].position.lat += idx / 100; - DEMO_UNIT_DATA[idx].category = "GroundUnit"; - DEMO_UNIT_DATA[idx].isLeader = false; - - - idx += 1; - DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); - DEMO_UNIT_DATA[idx].name = "F-14B"; - DEMO_UNIT_DATA[idx].groupName = `Group-1`; - DEMO_UNIT_DATA[idx].position.lat += idx / 100; - DEMO_UNIT_DATA[idx].category = "Aircraft"; - DEMO_UNIT_DATA[idx].isLeader = false; - - idx += 1; - DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); - DEMO_UNIT_DATA[idx].name = "Infantry AK"; - DEMO_UNIT_DATA[idx].groupName = `Group-2`; - DEMO_UNIT_DATA[idx].position.lat += idx / 100; - DEMO_UNIT_DATA[idx].category = "GroundUnit"; - DEMO_UNIT_DATA[idx].isLeader = true; - DEMO_UNIT_DATA[idx].coalition = 0; - DEMO_UNIT_DATA[idx].operateAs = 2; - - idx += 1; - DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); - DEMO_UNIT_DATA[idx].name = "Infantry AK"; - DEMO_UNIT_DATA[idx].groupName = `Group-3`; - DEMO_UNIT_DATA[idx].position.lat += idx / 100; - DEMO_UNIT_DATA[idx].category = "GroundUnit"; - DEMO_UNIT_DATA[idx].isLeader = true; - DEMO_UNIT_DATA[idx].coalition = 0; - DEMO_UNIT_DATA[idx].operateAs = 1; - - idx += 1; - DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); - DEMO_UNIT_DATA[idx].name = "KC-135"; - DEMO_UNIT_DATA[idx].groupName = `Group-4`; - DEMO_UNIT_DATA[idx].position.lat += idx / 100; - DEMO_UNIT_DATA[idx].category = "Aircraft"; - DEMO_UNIT_DATA[idx].isLeader = true; - - - this.startTime = Date.now(); - } - - units(req, res){ - var array = new Uint8Array(); - var time = Date.now(); - array = this.concat(array, this.uint64ToByteArray(BigInt(time))); - if (req.query["time"] == 0){ - for (let idx in DEMO_UNIT_DATA) { - const unit = DEMO_UNIT_DATA[idx]; - var dataIndex = 1; - array = this.concat(array, this.uint32ToByteArray(idx)); - array = this.appendString(array, unit.category, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.alive, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.human, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.controlled, dataIndex); dataIndex++; - array = this.appendUint16(array, unit.coalition, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.country, dataIndex); dataIndex++; - array = this.appendString(array, unit.name, dataIndex); dataIndex++; - array = this.appendString(array, unit.unitName, dataIndex); dataIndex++; - array = this.appendString(array, unit.groupName, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.state, dataIndex); dataIndex++; - array = this.appendString(array, unit.task, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.hasTask, dataIndex); dataIndex++; - array = this.appendCoordinates(array, unit.position, dataIndex); dataIndex++; - array = this.appendDouble(array, unit.speed, dataIndex); dataIndex++; - array = this.appendDouble(array, unit.horizontalVelocity, dataIndex); dataIndex++; - array = this.appendDouble(array, unit.verticalVelicity, dataIndex); dataIndex++; - array = this.appendDouble(array, unit.heading, dataIndex); dataIndex++; - array = this.appendDouble(array, unit.track, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.isActiveTanker, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.isActiveAWACS, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.onOff, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.followRoads, dataIndex); dataIndex++; - array = this.appendUint16(array, unit.fuel, dataIndex); dataIndex++; - array = this.appendDouble(array, unit.desiredSpeed, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.desiredSpeedType, dataIndex); dataIndex++; - array = this.appendDouble(array, unit.desiredAltitude, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.desiredAltitudeType, dataIndex); dataIndex++; - array = this.appendUint32(array, unit.leaderID, dataIndex); dataIndex++; - array = this.appendOffset(array, unit.formationOffset, dataIndex); dataIndex++; - array = this.appendUint32(array, unit.targetID, dataIndex); dataIndex++; - array = this.appendCoordinates(array, unit.targetPosition, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.ROE, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.reactionToThreat, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.emissionsCountermeasures, dataIndex); dataIndex++; - array = this.appendTACAN(array, unit.TACAN, dataIndex); dataIndex++; - array = this.appendRadio(array, unit.radio, dataIndex); dataIndex++; - array = this.appendRadio(array, unit.generalSettings, dataIndex); dataIndex++; - array = this.appendAmmo(array, unit.ammo, dataIndex); dataIndex++; - array = this.appendContacts(array, unit.contacts, dataIndex); dataIndex++; - array = this.appendActivePath(array, unit.activePath, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.isLeader, dataIndex); dataIndex++; - array = this.appendUint8(array, unit.operateAs, dataIndex); dataIndex++; - array = this.concat(array, this.uint8ToByteArray(255)); - } - } - res.end(Buffer.from(array, 'binary')); - }; - - weapons(req, res){ - var array = new Uint8Array(); - var time = Date.now(); - array = this.concat(array, this.uint64ToByteArray(BigInt(time))); - for (let idx in DEMO_WEAPONS_DATA) { - const weapon = DEMO_WEAPONS_DATA[idx]; - array = this.concat(array, this.uint32ToByteArray(idx)); - array = this.appendString(array, weapon.category, 1); - array = this.appendUint8(array, weapon.alive, 2); - array = this.appendUint16(array, weapon.coalition, 5); - array = this.appendString(array, weapon.name, 7); - array = this.appendCoordinates(array, weapon.position, 13); - array = this.appendDouble(array, weapon.speed, 14); - array = this.appendDouble(array, weapon.heading, 15); - array = this.concat(array, this.uint8ToByteArray(255)); - } - res.end(Buffer.from(array, 'binary')); - }; - - concat(array1, array2) { - var mergedArray = new Uint8Array(array1.length + array2.length); - mergedArray.set(array1); - mergedArray.set(array2, array1.length); - return mergedArray; - } - - uint8ToByteArray(number) { - var buffer = new ArrayBuffer(1); - var longNum = new Uint8Array(buffer); - longNum[0] = number; - return Array.from(new Uint8Array(buffer)); - } - - uint16ToByteArray(number) { - var buffer = new ArrayBuffer(2); - var longNum = new Uint16Array(buffer); - longNum[0] = number; - return Array.from(new Uint8Array(buffer)); - } - - uint32ToByteArray(number) { - var buffer = new ArrayBuffer(4); - var longNum = new Uint32Array(buffer); - longNum[0] = number; - return Array.from(new Uint8Array(buffer)); - } - - uint64ToByteArray(number) { - var buffer = new ArrayBuffer(8); - var longNum = new BigUint64Array(buffer); - longNum[0] = number; - return Array.from(new Uint8Array(buffer)); - } - - doubleToByteArray(number) { - var buffer = new ArrayBuffer(8); - var longNum = new Float64Array(buffer); - longNum[0] = number; - return Array.from(new Uint8Array(buffer)); - } - - appendUint8(array, number, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint8ToByteArray(number)); - return array; - } - - appendUint16(array, number, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint16ToByteArray(number)); - return array; - } - - appendUint32(array, number, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint32ToByteArray(number)); - return array; - } - - appendDouble(array, number, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.doubleToByteArray(number)); - return array; - } - - appendCoordinates(array, coordinates, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.doubleToByteArray(coordinates.lat)); - array = this.concat(array, this.doubleToByteArray(coordinates.lng)); - array = this.concat(array, this.doubleToByteArray(coordinates.alt)); - return array; - } - - appendOffset(array, offset, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.doubleToByteArray(offset.x)); - array = this.concat(array, this.doubleToByteArray(offset.y)); - array = this.concat(array, this.doubleToByteArray(offset.z)); - return array; - } - - appendString(array, string, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint16ToByteArray(string.length)); - array = this.concat(array, enc.encode(string)); - return array; - } - - padString(string, length) { - while (string.length < length) - string += " "; - return string.substring(0, length); - } - - appendTACAN(array, TACAN, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint8ToByteArray(TACAN.isOn)); - array = this.concat(array, this.uint8ToByteArray(TACAN.channel)); - array = this.concat(array, enc.encode(TACAN.XY)); - array = this.concat(array, enc.encode(this.padString(TACAN.callsign, 4))); - return array; - } - - appendRadio(array, radio, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint32ToByteArray(radio.frequency)); - array = this.concat(array, this.uint8ToByteArray(radio.callsign)); - array = this.concat(array, this.uint8ToByteArray(radio.callsignNumber)); - return array; - } - - appendGeneralSettings(array, generalSettings, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint8ToByteArray(generalSettings.prohibitAA)); - array = this.concat(array, this.uint8ToByteArray(generalSettings.prohibitAfterburner)); - array = this.concat(array, this.uint8ToByteArray(generalSettings.prohibitAG)); - array = this.concat(array, this.uint8ToByteArray(generalSettings.prohibitAirWpn)); - array = this.concat(array, this.uint8ToByteArray(generalSettings.prohibitJettison)); - return array; - } - - appendAmmo(array, ammo, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint16ToByteArray(ammo.length)); - ammo.forEach((element) => { - array = this.concat(array, this.uint16ToByteArray(element.quantity)); - array = this.concat(array, enc.encode(this.padString(element.name, 33))); - array = this.concat(array, this.uint8ToByteArray(element.guidance)); - array = this.concat(array, this.uint8ToByteArray(element.category)); - array = this.concat(array, this.uint8ToByteArray(element.missileCategory)); - }) - return array; - } - - appendContacts(array, contacts, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint16ToByteArray(contacts.length)); - contacts.forEach((element) => { - array = this.concat(array, this.uint32ToByteArray(element.ID)); - array = this.concat(array, this.uint8ToByteArray(element.detectionMethod)); - }) - return array; - } - - appendActivePath(array, activePath, datumIndex) { - array = this.concat(array, this.uint8ToByteArray(datumIndex)); - array = this.concat(array, this.uint16ToByteArray(activePath.length)); - activePath.forEach((element) => { - array = this.concat(array, this.doubleToByteArray(element.lat)); - array = this.concat(array, this.doubleToByteArray(element.lng)); - array = this.concat(array, this.doubleToByteArray(element.alt)); - }) - return array; - } - - logs(req, res){ - var ret = {logs: {"1": "I'm a log!", "2": "I'm a different log!"}}; - ret.time = Date.now(); - ret.frameRate = 60; - ret.load = 0; - res.send(JSON.stringify(ret)); - }; - - airbases(req, res){ - var ret = {airbases: { - ["0"]: { - callsign: "Nellis", - latitude: 37.3, - longitude: -115.8, - coalition: "neutral" - }, - ["1"]: { - callsign: "Red", - latitude: 37.3, - longitude: -115.75, - coalition: "red" - }, - ["2"]: { - callsign: "Blue", - latitude: 37.3, - longitude: -115.7, - coalition: "blue" - } - }}; - ret.time = Date.now(); - res.send(JSON.stringify(ret)); - }; - - bullseyes(req, res){ - var ret = {bullseyes: { - "0": { - latitude: 37.25, - longitude: -115.8, - coalition: "neutral" - }, - "1": { - latitude: 37.25, - longitude: -115.75, - coalition: "red" - }, - "2": { - latitude: 37.25, - longitude: -115.7, - coalition: "blue" - } - }}; - ret.time = Date.now(); - res.send(JSON.stringify(ret)); - }; - - mission(req, res){ - var ret = {mission: {theatre: "Caucasus"}}; - ret.time = Date.now(); - - ret.mission.dateAndTime = { - time: { h: 10, m: 15, s: 34 }, - date: "", - elapsedTime: (Date.now() - this.startTime) / 1000, - startTime: 0 - } - - ret.mission.coalitions = { - red: [ - 'RUSSIA', - 'CHINA' - ], - blue: [ - 'UK', - 'USA' - ], - neutral: [ - 'ITALY' - ] - } - - ret.mission.commandModeOptions = { - restrictSpawns: true, - restrictToCoalition: true, - setupTime: 0, - spawnPoints: { - red: 400, - blue: 400 - }, - eras: ["WW2", "Early Cold War", "Late Cold War", "Modern"] - } - - var auth = req.get("Authorization"); - if (auth) { - var username = Buffer.from(auth.replace("Basic ", ""), 'base64').toString('binary').split(":")[0]; - switch (username) { - case "admin": - ret.mission.commandModeOptions.commandMode = "Game master"; - break - case "blue": - ret.mission.commandModeOptions.commandMode = "Blue commander"; - break; - case "red": - ret.mission.commandModeOptions.commandMode = "Red commander"; - break; - } - } - res.send(JSON.stringify(ret)); - } - - command(req, res) { - var ret = {commandExecuted: Math.random() > 0.5}; - res.send(JSON.stringify(ret)); - } - - put(req, res) { - var ret = {commandHash: Math.random().toString(36).slice(2, 19)} - res.send(JSON.stringify(ret)); - } - } - - var demoDataGenerator = new DemoDataGenerator(app, config); - - return app; -} diff --git a/frontend/server/package.json b/frontend/server/package.json index 7acdf8e1..6e2b02f3 100644 --- a/frontend/server/package.json +++ b/frontend/server/package.json @@ -5,7 +5,8 @@ "scripts": { "build-release": "call ./scripts/build-release.bat", "server": "node ./bin/www", - "client": "electron ." + "client": "electron .", + "debug": "nodemon --watch src/**/*.ts --exec ts-node src/www.ts" }, "private": true, "dependencies": { @@ -26,6 +27,12 @@ "srtm-elevation": "^2.1.2", "tcp-ping-port": "^1.0.1", "uuid": "^9.0.1", + "ws": "^8.18.0", "yargs": "^17.7.2" + }, + "devDependencies": { + "cors": "^2.8.5", + "ts-node": "^10.9.2", + "typescript": "^5.5.3" } } diff --git a/frontend/server/public/images/buttons/camera/linked.svg b/frontend/server/public/images/buttons/camera/linked.svg new file mode 100644 index 00000000..bc567896 --- /dev/null +++ b/frontend/server/public/images/buttons/camera/linked.svg @@ -0,0 +1,38 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/context/miss-on-purpose.svg b/frontend/server/public/images/buttons/context/miss-on-purpose.svg new file mode 100644 index 00000000..d3efde8c --- /dev/null +++ b/frontend/server/public/images/buttons/context/miss-on-purpose.svg @@ -0,0 +1,41 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/context/scenic-aaa.svg b/frontend/server/public/images/buttons/context/scenic-aaa.svg new file mode 100644 index 00000000..05d6337e --- /dev/null +++ b/frontend/server/public/images/buttons/context/scenic-aaa.svg @@ -0,0 +1,50 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/context/simulate-fire-fight.svg b/frontend/server/public/images/buttons/context/simulate-fire-fight.svg new file mode 100644 index 00000000..4799e4f5 --- /dev/null +++ b/frontend/server/public/images/buttons/context/simulate-fire-fight.svg @@ -0,0 +1,42 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/emissions/attack.svg b/frontend/server/public/images/buttons/emissions/attack.svg new file mode 100644 index 00000000..563f0848 --- /dev/null +++ b/frontend/server/public/images/buttons/emissions/attack.svg @@ -0,0 +1,45 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/emissions/defend.svg b/frontend/server/public/images/buttons/emissions/defend.svg new file mode 100644 index 00000000..545e2ee0 --- /dev/null +++ b/frontend/server/public/images/buttons/emissions/defend.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/emissions/free.svg b/frontend/server/public/images/buttons/emissions/free.svg new file mode 100644 index 00000000..91bd13bd --- /dev/null +++ b/frontend/server/public/images/buttons/emissions/free.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/emissions/silent.svg b/frontend/server/public/images/buttons/emissions/silent.svg new file mode 100644 index 00000000..9630d390 --- /dev/null +++ b/frontend/server/public/images/buttons/emissions/silent.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/intensity/1.svg b/frontend/server/public/images/buttons/intensity/1.svg new file mode 100644 index 00000000..121ab252 --- /dev/null +++ b/frontend/server/public/images/buttons/intensity/1.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/intensity/2.svg b/frontend/server/public/images/buttons/intensity/2.svg new file mode 100644 index 00000000..edfc90ef --- /dev/null +++ b/frontend/server/public/images/buttons/intensity/2.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/intensity/3.svg b/frontend/server/public/images/buttons/intensity/3.svg new file mode 100644 index 00000000..3a45140e --- /dev/null +++ b/frontend/server/public/images/buttons/intensity/3.svg @@ -0,0 +1,62 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/other/arrow-down-solid.svg b/frontend/server/public/images/buttons/other/arrow-down-solid.svg new file mode 100644 index 00000000..b4a6b513 --- /dev/null +++ b/frontend/server/public/images/buttons/other/arrow-down-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/other/back.svg b/frontend/server/public/images/buttons/other/back.svg new file mode 100644 index 00000000..1e89bfa1 --- /dev/null +++ b/frontend/server/public/images/buttons/other/back.svg @@ -0,0 +1,43 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/other/clock-rotate-left-solid.svg b/frontend/server/public/images/buttons/other/clock-rotate-left-solid.svg new file mode 100644 index 00000000..bc8877d9 --- /dev/null +++ b/frontend/server/public/images/buttons/other/clock-rotate-left-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/other/delete.svg b/frontend/server/public/images/buttons/other/delete.svg new file mode 100644 index 00000000..68f9ace4 --- /dev/null +++ b/frontend/server/public/images/buttons/other/delete.svg @@ -0,0 +1,42 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/other/edit.svg b/frontend/server/public/images/buttons/other/edit.svg new file mode 100644 index 00000000..d99fefbf --- /dev/null +++ b/frontend/server/public/images/buttons/other/edit.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/other/lock-open-solid.svg b/frontend/server/public/images/buttons/other/lock-open-solid.svg new file mode 100644 index 00000000..fbc2ec57 --- /dev/null +++ b/frontend/server/public/images/buttons/other/lock-open-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/other/lock-solid.svg b/frontend/server/public/images/buttons/other/lock-solid.svg new file mode 100644 index 00000000..fb7d1af5 --- /dev/null +++ b/frontend/server/public/images/buttons/other/lock-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/roe/designated.svg b/frontend/server/public/images/buttons/roe/designated.svg new file mode 100644 index 00000000..fd937ce7 --- /dev/null +++ b/frontend/server/public/images/buttons/roe/designated.svg @@ -0,0 +1,45 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/roe/free.svg b/frontend/server/public/images/buttons/roe/free.svg new file mode 100644 index 00000000..91bd13bd --- /dev/null +++ b/frontend/server/public/images/buttons/roe/free.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/roe/hold.svg b/frontend/server/public/images/buttons/roe/hold.svg new file mode 100644 index 00000000..9630d390 --- /dev/null +++ b/frontend/server/public/images/buttons/roe/hold.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/roe/return.svg b/frontend/server/public/images/buttons/roe/return.svg new file mode 100644 index 00000000..545e2ee0 --- /dev/null +++ b/frontend/server/public/images/buttons/roe/return.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/scatter/1.svg b/frontend/server/public/images/buttons/scatter/1.svg new file mode 100644 index 00000000..5b991069 --- /dev/null +++ b/frontend/server/public/images/buttons/scatter/1.svg @@ -0,0 +1,56 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/scatter/2.svg b/frontend/server/public/images/buttons/scatter/2.svg new file mode 100644 index 00000000..fd9dcb4e --- /dev/null +++ b/frontend/server/public/images/buttons/scatter/2.svg @@ -0,0 +1,56 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/scatter/3.svg b/frontend/server/public/images/buttons/scatter/3.svg new file mode 100644 index 00000000..72cc5c38 --- /dev/null +++ b/frontend/server/public/images/buttons/scatter/3.svg @@ -0,0 +1,56 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/spawn/aircraft.svg b/frontend/server/public/images/buttons/spawn/aircraft.svg new file mode 100644 index 00000000..fa679480 --- /dev/null +++ b/frontend/server/public/images/buttons/spawn/aircraft.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/spawn/explosion.svg b/frontend/server/public/images/buttons/spawn/explosion.svg new file mode 100644 index 00000000..4aa5003c --- /dev/null +++ b/frontend/server/public/images/buttons/spawn/explosion.svg @@ -0,0 +1,44 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/spawn/groundunit.svg b/frontend/server/public/images/buttons/spawn/groundunit.svg new file mode 100644 index 00000000..99c5a8a2 --- /dev/null +++ b/frontend/server/public/images/buttons/spawn/groundunit.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/spawn/helicopter.svg b/frontend/server/public/images/buttons/spawn/helicopter.svg new file mode 100644 index 00000000..051fdd91 --- /dev/null +++ b/frontend/server/public/images/buttons/spawn/helicopter.svg @@ -0,0 +1,59 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/spawn/more.svg b/frontend/server/public/images/buttons/spawn/more.svg new file mode 100644 index 00000000..813ddc68 --- /dev/null +++ b/frontend/server/public/images/buttons/spawn/more.svg @@ -0,0 +1,70 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/spawn/navyunit.svg b/frontend/server/public/images/buttons/spawn/navyunit.svg new file mode 100644 index 00000000..7d42bb28 --- /dev/null +++ b/frontend/server/public/images/buttons/spawn/navyunit.svg @@ -0,0 +1,59 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/spawn/sam.svg b/frontend/server/public/images/buttons/spawn/sam.svg new file mode 100644 index 00000000..34d64b48 --- /dev/null +++ b/frontend/server/public/images/buttons/spawn/sam.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/spawn/smoke.svg b/frontend/server/public/images/buttons/spawn/smoke.svg new file mode 100644 index 00000000..4e0c3034 --- /dev/null +++ b/frontend/server/public/images/buttons/spawn/smoke.svg @@ -0,0 +1,69 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/threat/evade.svg b/frontend/server/public/images/buttons/threat/evade.svg new file mode 100644 index 00000000..e617ef46 --- /dev/null +++ b/frontend/server/public/images/buttons/threat/evade.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/threat/manoeuvre.svg b/frontend/server/public/images/buttons/threat/manoeuvre.svg new file mode 100644 index 00000000..ae1ca646 --- /dev/null +++ b/frontend/server/public/images/buttons/threat/manoeuvre.svg @@ -0,0 +1,50 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/threat/none.svg b/frontend/server/public/images/buttons/threat/none.svg new file mode 100644 index 00000000..a8ac63d3 --- /dev/null +++ b/frontend/server/public/images/buttons/threat/none.svg @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/threat/passive.svg b/frontend/server/public/images/buttons/threat/passive.svg new file mode 100644 index 00000000..5d64ab64 --- /dev/null +++ b/frontend/server/public/images/buttons/threat/passive.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/tools/draw-polygon-solid.svg b/frontend/server/public/images/buttons/tools/draw-polygon-solid.svg new file mode 100644 index 00000000..3511f016 --- /dev/null +++ b/frontend/server/public/images/buttons/tools/draw-polygon-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/tools/ground.svg b/frontend/server/public/images/buttons/tools/ground.svg new file mode 100644 index 00000000..a98bb431 --- /dev/null +++ b/frontend/server/public/images/buttons/tools/ground.svg @@ -0,0 +1,46 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/tools/pen-solid.svg b/frontend/server/public/images/buttons/tools/pen-solid.svg new file mode 100644 index 00000000..d99fefbf --- /dev/null +++ b/frontend/server/public/images/buttons/tools/pen-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/tools/tower.svg b/frontend/server/public/images/buttons/tools/tower.svg new file mode 100644 index 00000000..c1daee36 --- /dev/null +++ b/frontend/server/public/images/buttons/tools/tower.svg @@ -0,0 +1,46 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/airbase.svg b/frontend/server/public/images/buttons/visibility/airbase.svg new file mode 100644 index 00000000..831cbde0 --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/airbase.svg @@ -0,0 +1,62 @@ + + + + + + + + image/svg+xml + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/aircraft.svg b/frontend/server/public/images/buttons/visibility/aircraft.svg new file mode 100644 index 00000000..bf319bbd --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/aircraft.svg @@ -0,0 +1,41 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/circle-dot.svg b/frontend/server/public/images/buttons/visibility/circle-dot.svg new file mode 100644 index 00000000..61fc3b00 --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/circle-dot.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/dcs.svg b/frontend/server/public/images/buttons/visibility/dcs.svg new file mode 100644 index 00000000..223ae38f --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/dcs.svg @@ -0,0 +1,32 @@ + + + + + + image/svg+xml + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/flag.svg b/frontend/server/public/images/buttons/visibility/flag.svg new file mode 100644 index 00000000..ca5dc3a7 --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/flag.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/groundunit-sam.svg b/frontend/server/public/images/buttons/visibility/groundunit-sam.svg new file mode 100644 index 00000000..c90869fe --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/groundunit-sam.svg @@ -0,0 +1,50 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/groundunit.svg b/frontend/server/public/images/buttons/visibility/groundunit.svg new file mode 100644 index 00000000..efc87415 --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/groundunit.svg @@ -0,0 +1,47 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/helicopter.svg b/frontend/server/public/images/buttons/visibility/helicopter.svg new file mode 100644 index 00000000..68ee36e7 --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/helicopter.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/human.svg b/frontend/server/public/images/buttons/visibility/human.svg new file mode 100644 index 00000000..fbb611aa --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/human.svg @@ -0,0 +1,62 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/navyunit.svg b/frontend/server/public/images/buttons/visibility/navyunit.svg new file mode 100644 index 00000000..af0538e5 --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/navyunit.svg @@ -0,0 +1,41 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/olympus.svg b/frontend/server/public/images/buttons/visibility/olympus.svg new file mode 100644 index 00000000..34bccdbc --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/olympus.svg @@ -0,0 +1,42 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/buttons/visibility/shield.svg b/frontend/server/public/images/buttons/visibility/shield.svg new file mode 100644 index 00000000..3702a745 --- /dev/null +++ b/frontend/server/public/images/buttons/visibility/shield.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/convertToFontAwesomIcons.py b/frontend/server/public/images/convertToFontAwesomIcons.py new file mode 100644 index 00000000..29b3bea5 --- /dev/null +++ b/frontend/server/public/images/convertToFontAwesomIcons.py @@ -0,0 +1,36 @@ +from svgpathtools import svg2paths2 +import os +from glob import glob +import svgelements + +result = [y for x in os.walk(".") for y in glob(os.path.join(x[0], '*.svg'))] + +with open(os.path.join( "..", "..", "..", "..", "src", "ui", "components", "olicons.tsx"), "w") as fp: + fp.write('import { IconDefinition, IconName, IconPrefix } from "@fortawesome/fontawesome-svg-core";\n') + for filename in result: + try: + iconName = filename.replace(".", "").replace("\\", "_").removesuffix("svg") + iconName = iconName.replace("-", "_") + temp = iconName.split('_') + iconName = temp[0] + ''.join(ele.capitalize() for ele in temp[1:]) + + svg = svgelements.SVG.parse(filename) + paths, attributes, svg_attributes = svg2paths2(filename) + + fp.write(f"export const ol{iconName}: IconDefinition = {{") + fp.write(" icon: [") + fp.write(f" {svg.implicit_width}, {svg.implicit_height}, [], \"\",") + fp.write("\"") + + for path in paths: + fp.write(path.d() + " ") + + fp.write("\"") + fp.write("]") + + name = temp[0] + ''.join(ele.lower() + '-' for ele in temp[1:]).removesuffix('-') + fp.write(f', iconName: "olympus-{name}" as IconName') + fp.write(f', prefix: "fas" as IconPrefix') + fp.write("}\n") + except Exception as e: + print(f"Failed to generate path for {iconName}: {e}") \ No newline at end of file diff --git a/frontend/server/public/images/countries/ac.svg b/frontend/server/public/images/countries/ac.svg index 1a6d5080..a567f201 100644 --- a/frontend/server/public/images/countries/ac.svg +++ b/frontend/server/public/images/countries/ac.svg @@ -1,76 +1,137 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ad.svg b/frontend/server/public/images/countries/ad.svg index 302cb722..29ff8e1b 100644 --- a/frontend/server/public/images/countries/ad.svg +++ b/frontend/server/public/images/countries/ad.svg @@ -1,150 +1,236 @@ - - - - - + + + + + - - - + + + - - + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - + + + - + - - - + + + - - - - - - + + + + + + - - + + - - + + - + - + - - - - - - + + + + + + - + - + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ae.svg b/frontend/server/public/images/countries/ae.svg index b7acdbdb..233128bd 100644 --- a/frontend/server/public/images/countries/ae.svg +++ b/frontend/server/public/images/countries/ae.svg @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/af.svg b/frontend/server/public/images/countries/af.svg index 417dd047..3ab02321 100644 --- a/frontend/server/public/images/countries/af.svg +++ b/frontend/server/public/images/countries/af.svg @@ -1,81 +1,130 @@ - + - - - + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - + + + + + + + + + + + - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ag.svg b/frontend/server/public/images/countries/ag.svg index 250b5012..e682964d 100644 --- a/frontend/server/public/images/countries/ag.svg +++ b/frontend/server/public/images/countries/ag.svg @@ -1,14 +1,15 @@ - + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ai.svg b/frontend/server/public/images/countries/ai.svg index cf91b39b..9782e3f1 100644 --- a/frontend/server/public/images/countries/ai.svg +++ b/frontend/server/public/images/countries/ai.svg @@ -1,758 +1,766 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/al.svg b/frontend/server/public/images/countries/al.svg index b69ae195..a3289181 100644 --- a/frontend/server/public/images/countries/al.svg +++ b/frontend/server/public/images/countries/al.svg @@ -1,5 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/am.svg b/frontend/server/public/images/countries/am.svg index 99fa4dc5..617bde9e 100644 --- a/frontend/server/public/images/countries/am.svg +++ b/frontend/server/public/images/countries/am.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ao.svg b/frontend/server/public/images/countries/ao.svg index 4dc39f6a..c88be71b 100644 --- a/frontend/server/public/images/countries/ao.svg +++ b/frontend/server/public/images/countries/ao.svg @@ -1,13 +1,19 @@ - - + + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/aq.svg b/frontend/server/public/images/countries/aq.svg index 53840ccc..ca909933 100644 --- a/frontend/server/public/images/countries/aq.svg +++ b/frontend/server/public/images/countries/aq.svg @@ -1,5 +1,8 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ar.svg b/frontend/server/public/images/countries/ar.svg index 364fca8f..b0cd2370 100644 --- a/frontend/server/public/images/countries/ar.svg +++ b/frontend/server/public/images/countries/ar.svg @@ -1,32 +1,42 @@ - - - + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/arab.svg b/frontend/server/public/images/countries/arab.svg index c45e3d20..5b726ebc 100644 --- a/frontend/server/public/images/countries/arab.svg +++ b/frontend/server/public/images/countries/arab.svg @@ -1,4 +1,5 @@ - + @@ -106,4 +107,4 @@ - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/as.svg b/frontend/server/public/images/countries/as.svg index b974013a..8a9e37c3 100644 --- a/frontend/server/public/images/countries/as.svg +++ b/frontend/server/public/images/countries/as.svg @@ -1,72 +1,132 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/at.svg b/frontend/server/public/images/countries/at.svg index c2825088..282e73ce 100644 --- a/frontend/server/public/images/countries/at.svg +++ b/frontend/server/public/images/countries/at.svg @@ -1,6 +1,6 @@ - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/au.svg b/frontend/server/public/images/countries/au.svg index 407fef43..b207fce3 100644 --- a/frontend/server/public/images/countries/au.svg +++ b/frontend/server/public/images/countries/au.svg @@ -1,8 +1,11 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/aw.svg b/frontend/server/public/images/countries/aw.svg index 32cabd54..a2a27e9d 100644 --- a/frontend/server/public/images/countries/aw.svg +++ b/frontend/server/public/images/countries/aw.svg @@ -1,186 +1,187 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ax.svg b/frontend/server/public/images/countries/ax.svg index 0584d713..c6e19c9a 100644 --- a/frontend/server/public/images/countries/ax.svg +++ b/frontend/server/public/images/countries/ax.svg @@ -1,18 +1,18 @@ - + - + - - + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/az.svg b/frontend/server/public/images/countries/az.svg index 8e56ef53..d7792417 100644 --- a/frontend/server/public/images/countries/az.svg +++ b/frontend/server/public/images/countries/az.svg @@ -1,8 +1,9 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ba.svg b/frontend/server/public/images/countries/ba.svg index fcd18914..00b5c039 100644 --- a/frontend/server/public/images/countries/ba.svg +++ b/frontend/server/public/images/countries/ba.svg @@ -1,12 +1,13 @@ - + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bb.svg b/frontend/server/public/images/countries/bb.svg index 263bdec0..47b4374b 100644 --- a/frontend/server/public/images/countries/bb.svg +++ b/frontend/server/public/images/countries/bb.svg @@ -1,6 +1,8 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bd.svg b/frontend/server/public/images/countries/bd.svg index 16b794de..f0e04707 100644 --- a/frontend/server/public/images/countries/bd.svg +++ b/frontend/server/public/images/countries/bd.svg @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/be.svg b/frontend/server/public/images/countries/be.svg index 327f28fa..c27a363d 100644 --- a/frontend/server/public/images/countries/be.svg +++ b/frontend/server/public/images/countries/be.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bf.svg b/frontend/server/public/images/countries/bf.svg index 47138225..1b77fd76 100644 --- a/frontend/server/public/images/countries/bf.svg +++ b/frontend/server/public/images/countries/bf.svg @@ -1,7 +1,8 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bg.svg b/frontend/server/public/images/countries/bg.svg index b100dd0d..2a2d1743 100644 --- a/frontend/server/public/images/countries/bg.svg +++ b/frontend/server/public/images/countries/bg.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bh.svg b/frontend/server/public/images/countries/bh.svg index 7a2ea549..0a8aa682 100644 --- a/frontend/server/public/images/countries/bh.svg +++ b/frontend/server/public/images/countries/bh.svg @@ -1,4 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bi.svg b/frontend/server/public/images/countries/bi.svg index 1050838b..41acc0d3 100644 --- a/frontend/server/public/images/countries/bi.svg +++ b/frontend/server/public/images/countries/bi.svg @@ -1,15 +1,16 @@ - + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bj.svg b/frontend/server/public/images/countries/bj.svg index 0846724d..be81b66a 100644 --- a/frontend/server/public/images/countries/bj.svg +++ b/frontend/server/public/images/countries/bj.svg @@ -1,14 +1,14 @@ - + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bl.svg b/frontend/server/public/images/countries/bl.svg index 819afc11..2fc04fe6 100644 --- a/frontend/server/public/images/countries/bl.svg +++ b/frontend/server/public/images/countries/bl.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/blue.svg b/frontend/server/public/images/countries/blue.svg index 2da7b7b3..6b5fec0e 100644 --- a/frontend/server/public/images/countries/blue.svg +++ b/frontend/server/public/images/countries/blue.svg @@ -13,45 +13,45 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - - - image/svg+xml - - - - - - - + + + + + image/svg+xml + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bm.svg b/frontend/server/public/images/countries/bm.svg index a4dbc728..6009c2cb 100644 --- a/frontend/server/public/images/countries/bm.svg +++ b/frontend/server/public/images/countries/bm.svg @@ -1,97 +1,172 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bn.svg b/frontend/server/public/images/countries/bn.svg index f906abfe..b5105d71 100644 --- a/frontend/server/public/images/countries/bn.svg +++ b/frontend/server/public/images/countries/bn.svg @@ -1,36 +1,59 @@ - - - - + + + + - - + + - - - - - - - + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bo.svg b/frontend/server/public/images/countries/bo.svg index 17a0a0c1..237d6c74 100644 --- a/frontend/server/public/images/countries/bo.svg +++ b/frontend/server/public/images/countries/bo.svg @@ -1,676 +1,1149 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bq.svg b/frontend/server/public/images/countries/bq.svg index 0e6bc76e..7f602a14 100644 --- a/frontend/server/public/images/countries/bq.svg +++ b/frontend/server/public/images/countries/bq.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/br.svg b/frontend/server/public/images/countries/br.svg index 354a7013..090e7631 100644 --- a/frontend/server/public/images/countries/br.svg +++ b/frontend/server/public/images/countries/br.svg @@ -1,45 +1,69 @@ - - - - - - - - + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bs.svg b/frontend/server/public/images/countries/bs.svg index 513be43a..03f9b4bf 100644 --- a/frontend/server/public/images/countries/bs.svg +++ b/frontend/server/public/images/countries/bs.svg @@ -1,13 +1,13 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bt.svg b/frontend/server/public/images/countries/bt.svg index cea6006c..3fdf6a99 100644 --- a/frontend/server/public/images/countries/bt.svg +++ b/frontend/server/public/images/countries/bt.svg @@ -1,89 +1,137 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bv.svg b/frontend/server/public/images/countries/bv.svg index 40e16d94..fd4a1541 100644 --- a/frontend/server/public/images/countries/bv.svg +++ b/frontend/server/public/images/countries/bv.svg @@ -1,13 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bw.svg b/frontend/server/public/images/countries/bw.svg index a1c8db0a..b30807cd 100644 --- a/frontend/server/public/images/countries/bw.svg +++ b/frontend/server/public/images/countries/bw.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/by.svg b/frontend/server/public/images/countries/by.svg index 8d25ee3c..fec86eea 100644 --- a/frontend/server/public/images/countries/by.svg +++ b/frontend/server/public/images/countries/by.svg @@ -1,20 +1,26 @@ - + - - - + + + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/bz.svg b/frontend/server/public/images/countries/bz.svg index 08d3579d..49b7fa1f 100644 --- a/frontend/server/public/images/countries/bz.svg +++ b/frontend/server/public/images/countries/bz.svg @@ -1,145 +1,228 @@ - + - - + + - - + + - - - - + + + + - - - - - - + + + + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - - - - - - - - - + + + + + + + + + + + - - + + - - - - + + + + - - + + - + - - - - - - + + + + + + - - - + + + - - - - - - + + + + + + - - + + - + - - - - - - + + + + + + - + - - - - + + + + - - + + - - + + - + - - - - - - - - + + + + + + + + - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ca.svg b/frontend/server/public/images/countries/ca.svg index f1b2c968..d08d00ab 100644 --- a/frontend/server/public/images/countries/ca.svg +++ b/frontend/server/public/images/countries/ca.svg @@ -1,4 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cc.svg b/frontend/server/public/images/countries/cc.svg index 93025bd2..0c18628e 100644 --- a/frontend/server/public/images/countries/cc.svg +++ b/frontend/server/public/images/countries/cc.svg @@ -1,19 +1,24 @@ - + - - + + - - - - - - + + + + + + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cd.svg b/frontend/server/public/images/countries/cd.svg index e106ddd5..d908fc98 100644 --- a/frontend/server/public/images/countries/cd.svg +++ b/frontend/server/public/images/countries/cd.svg @@ -1,5 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cefta.svg b/frontend/server/public/images/countries/cefta.svg index f748d08a..80ce913c 100644 --- a/frontend/server/public/images/countries/cefta.svg +++ b/frontend/server/public/images/countries/cefta.svg @@ -1,13 +1,15 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cf.svg b/frontend/server/public/images/countries/cf.svg index a6cd3670..6379d4fc 100644 --- a/frontend/server/public/images/countries/cf.svg +++ b/frontend/server/public/images/countries/cf.svg @@ -1,15 +1,16 @@ - + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cg.svg b/frontend/server/public/images/countries/cg.svg index 9128715f..3013b8ea 100644 --- a/frontend/server/public/images/countries/cg.svg +++ b/frontend/server/public/images/countries/cg.svg @@ -1,12 +1,12 @@ - + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ch.svg b/frontend/server/public/images/countries/ch.svg index b42d6709..1e986d88 100644 --- a/frontend/server/public/images/countries/ch.svg +++ b/frontend/server/public/images/countries/ch.svg @@ -1,9 +1,9 @@ - + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ci.svg b/frontend/server/public/images/countries/ci.svg index e400f0c1..069cc19d 100644 --- a/frontend/server/public/images/countries/ci.svg +++ b/frontend/server/public/images/countries/ci.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ck.svg b/frontend/server/public/images/countries/ck.svg index 18e547b1..5b266b55 100644 --- a/frontend/server/public/images/countries/ck.svg +++ b/frontend/server/public/images/countries/ck.svg @@ -1,9 +1,12 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cl.svg b/frontend/server/public/images/countries/cl.svg index 01766fef..f8f49442 100644 --- a/frontend/server/public/images/countries/cl.svg +++ b/frontend/server/public/images/countries/cl.svg @@ -1,13 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cm.svg b/frontend/server/public/images/countries/cm.svg index 389b6627..d04b80a9 100644 --- a/frontend/server/public/images/countries/cm.svg +++ b/frontend/server/public/images/countries/cm.svg @@ -1,15 +1,16 @@ - - - - + + + + - - + + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cn.svg b/frontend/server/public/images/countries/cn.svg index 10d3489a..bc36eb8a 100644 --- a/frontend/server/public/images/countries/cn.svg +++ b/frontend/server/public/images/countries/cn.svg @@ -1,11 +1,16 @@ - + - + - - - - - - - + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/co.svg b/frontend/server/public/images/countries/co.svg index ebd0a0fb..433b3706 100644 --- a/frontend/server/public/images/countries/co.svg +++ b/frontend/server/public/images/countries/co.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/codes.json b/frontend/server/public/images/countries/codes.json index 98c54d89..250ad473 100644 --- a/frontend/server/public/images/countries/codes.json +++ b/frontend/server/public/images/countries/codes.json @@ -1,375 +1,251 @@ { "AGGRESSORS": { "flagCode": "RED", - "liveryCodes": [ - "RSO" - ] + "liveryCodes": ["RSO"] }, "INSURGENTS": { "flagCode": "UNK", - "liveryCodes": [ - "INS" - ] + "liveryCodes": ["INS"] }, "ALGERIA": { "flagCode": "DZ", - "liveryCodes": [ - "DZA" - ] + "liveryCodes": ["DZA"] }, "ARGENTINA": { "flagCode": "AR", - "liveryCodes": [ - "ARG" - ] + "liveryCodes": ["ARG"] }, "AUSTRALIA": { "flagCode": "AU", - "liveryCodes": [ - "AUS", - "AUSAF" - ] + "liveryCodes": ["AUS", "AUSAF"] }, "AUSTRIA": { "flagCode": "AT", - "liveryCodes": [ - "AUT" - ] + "liveryCodes": ["AUT"] }, "BAHRAIN": { "flagCode": "BH", - "liveryCodes": [ - "BHR" - ] + "liveryCodes": ["BHR"] }, "BELARUS": { "flagCode": "BY", - "liveryCodes": [ - "BLR" - ] + "liveryCodes": ["BLR"] }, "BELGIUM": { "flagCode": "BE", - "liveryCodes": [ - "BEL" - ] + "liveryCodes": ["BEL"] }, "BOLIVIA": { "flagCode": "BO", - "liveryCodes": [ - "BOL" - ] + "liveryCodes": ["BOL"] }, "BRAZIL": { "flagCode": "BR", - "liveryCodes": [ - "BRA" - ] + "liveryCodes": ["BRA"] }, "BULGARIA": { "flagCode": "BG", - "liveryCodes": [ - "BGR" - ] + "liveryCodes": ["BGR"] }, "CANADA": { "flagCode": "CA", - "liveryCodes": [ - "CAN" - ] + "liveryCodes": ["CAN"] }, "CHILE": { "flagCode": "CL", - "liveryCodes": [ - "CHL" - ] + "liveryCodes": ["CHL"] }, "CHINA": { "flagCode": "CN", - "liveryCodes": [ - "CHN" - ] + "liveryCodes": ["CHN"] }, "CROATIA": { "flagCode": "HR", - "liveryCodes": [ - "HRV" - ] + "liveryCodes": ["HRV"] }, "CUBA": { "flagCode": "CU", - "liveryCodes": [ - "CUB" - ] + "liveryCodes": ["CUB"] }, "CYPRUS": { "flagCode": "CY", - "liveryCodes": [ - "CYP" - ] + "liveryCodes": ["CYP"] }, "CHEZH_REPUBLIC": { "displayName": "Czech Republic", "flagCode": "CZ", - "liveryCodes": [ - "CZE" - ] + "liveryCodes": ["CZE"] }, "DENMARK": { "flagCode": "DK", - "liveryCodes": [ - "DEN" - ] + "liveryCodes": ["DEN"] }, "EGYPT": { "flagCode": "EG", - "liveryCodes": [ - "EGY", - "EGP" - ] + "liveryCodes": ["EGY", "EGP"] }, "ETHIOPIA": { "flagCode": "ET", - "liveryCodes": [ - "ETH" - ] + "liveryCodes": ["ETH"] }, "FINLAND": { "flagCode": "FI", - "liveryCodes": [ - "FIN" - ] + "liveryCodes": ["FIN"] }, "FRANCE": { "flagCode": "FR", - "liveryCodes": [ - "FRA" - ] + "liveryCodes": ["FRA"] }, "GEORGIA": { "flagCode": "GE", - "liveryCodes": [ - "GRG" - ] + "liveryCodes": ["GRG"] }, "GERMANY": { "flagCode": "DE", - "liveryCodes": [ - "GER" - ] + "liveryCodes": ["GER"] }, "GHANA": { "flagCode": "GH", - "liveryCodes": [ - "GHA" - ] + "liveryCodes": ["GHA"] }, "GREECE": { "flagCode": "GR", - "liveryCodes": [ - "GRC" - ] + "liveryCodes": ["GRC"] }, "HONDURAS": { "flagCode": "HN", - "liveryCodes": [ - "HND" - ] + "liveryCodes": ["HND"] }, "HUNGARY": { "flagCode": "HU", - "liveryCodes": [ - "HUN" - ] + "liveryCodes": ["HUN"] }, "INDIA": { "flagCode": "IN", - "liveryCodes": [ - "IND" - ] + "liveryCodes": ["IND"] }, "INDONESIA": { "flagCode": "ID", - "liveryCodes": [ - "IDN" - ] + "liveryCodes": ["IDN"] }, "IRAN": { "flagCode": "IR", - "liveryCodes": [ - "IRN" - ] + "liveryCodes": ["IRN"] }, "IRAQ": { "flagCode": "IQ", - "liveryCodes": [ - "IRQ" - ] + "liveryCodes": ["IRQ"] }, "ISRAEL": { "flagCode": "IL", - "liveryCodes": [ - "ISR" - ] + "liveryCodes": ["ISR"] }, "ITALY": { "flagCode": "IT", - "liveryCodes": [ - "ITA" - ] + "liveryCodes": ["ITA"] }, "JAPAN": { "flagCode": "JP", - "liveryCodes": [ - "JPN" - ] + "liveryCodes": ["JPN"] }, "JORDAN": { "flagCode": "JO", - "liveryCodes": [ - "JOR" - ] + "liveryCodes": ["JOR"] }, "KAZAKHSTAN": { "flagCode": "KZ", - "liveryCodes": [ - "KAZ" - ] + "liveryCodes": ["KAZ"] }, "SOUTH_KOREA": { "displayName": "South Korea", "flagCode": "KR", - "liveryCodes": [ - "KOR" - ] + "liveryCodes": ["KOR"] }, "KUWAIT": { "flagCode": "KW", - "liveryCodes": [ - "KWT" - ] + "liveryCodes": ["KWT"] }, "LEBANON": { "flagCode": "LB", - "liveryCodes": [ - "LBN" - ] + "liveryCodes": ["LBN"] }, "MALAYSIA": { "flagCode": "MY", - "liveryCodes": [ - "MYS" - ] + "liveryCodes": ["MYS"] }, "MEXICO": { "flagCode": "MX", - "liveryCodes": [ - "MEX" - ] + "liveryCodes": ["MEX"] }, "MOROCCO": { "flagCode": "MA", - "liveryCodes": [ - "MAR" - ] + "liveryCodes": ["MAR"] }, "THE_NETHERLANDS": { "displayName": "The Netherlands", "flagCode": "NL", - "liveryCodes": [ - "NETH" - ] + "liveryCodes": ["NETH"] }, "NIGERIA": { "flagCode": "NG", - "liveryCodes": [ - "NGA" - ] + "liveryCodes": ["NGA"] }, "NORWAY": { "flagCode": "NO", - "liveryCodes": [ - "NOR" - ] + "liveryCodes": ["NOR"] }, "OMAN": { "flagCode": "OM", - "liveryCodes": [ - "OMN" - ] + "liveryCodes": ["OMN"] }, "PAKISTAN": { "flagCode": "PK", - "liveryCodes": [ - "PAK" - ] + "liveryCodes": ["PAK"] }, "PERU": { "flagCode": "PE", - "liveryCodes": [ - "PER" - ] + "liveryCodes": ["PER"] }, "PHILIPPINES": { "flagCode": "PH", - "liveryCodes": [ - "PHL" - ] + "liveryCodes": ["PHL"] }, "POLAND": { "flagCode": "PL", - "liveryCodes": [ - "POL" - ] + "liveryCodes": ["POL"] }, "PORTUGAL": { "flagCode": "PT", - "liveryCodes": [ - "PRT" - ] + "liveryCodes": ["PRT"] }, "QATAR": { "flagCode": "QA", - "liveryCodes": [ - "QAT" - ] + "liveryCodes": ["QAT"] }, "ROMANIA": { "flagCode": "RO", - "liveryCodes": [ - "ROU" - ] + "liveryCodes": ["ROU"] }, "RUSSIA": { "flagCode": "RU", - "liveryCodes": [ - "RUS" - ] + "liveryCodes": ["RUS"] }, "SAUDI_ARABIA": { "displayName": "Saudi Arabia", "flagCode": "SA", - "liveryCodes": [ - "SAU" - ] + "liveryCodes": ["SAU"] }, "SERBIA": { "flagCode": "RS", - "liveryCodes": [ - "SRB" - ] + "liveryCodes": ["SRB"] }, "SLOVAKIA": { "flagCode": "SK", - "liveryCodes": [ - "SVK" - ] + "liveryCodes": ["SVK"] }, "SLOVENIA": { "flagCode": "SI", - "liveryCodes": [ - "SVN" - ] + "liveryCodes": ["SVN"] }, "SOUTH_AFRICA": { "displayName": "South Africa", @@ -378,106 +254,71 @@ }, "SPAIN": { "flagCode": "ES", - "liveryCodes": [ - "SPN", - "SPA" - ] + "liveryCodes": ["SPN", "SPA"] }, "SUDAN": { "flagCode": "SD", - "liveryCodes": [ - "SDN", - "SUN" - ] + "liveryCodes": ["SDN", "SUN"] }, "SWEDEN": { "flagCode": "SE", - "liveryCodes": [ - "SWE" - ] + "liveryCodes": ["SWE"] }, "SWITZERLAND": { "flagCode": "CH", - "liveryCodes": [ - "SUI" - ] + "liveryCodes": ["SUI"] }, "SYRIA": { "flagCode": "SY", - "liveryCodes": [ - "SYR" - ] + "liveryCodes": ["SYR"] }, "THAILAND": { "flagCode": "TH", - "liveryCodes": [ - "THA" - ] + "liveryCodes": ["THA"] }, "TUNISIA": { "flagCode": "TN", - "liveryCodes": [ - "TUN" - ] + "liveryCodes": ["TUN"] }, "TURKEY": { "flagCode": "TR", - "liveryCodes": [ - "TUR" - ] + "liveryCodes": ["TUR"] }, "UKRAINE": { "flagCode": "UA", - "liveryCodes": [ - "UKR" - ] + "liveryCodes": ["UKR"] }, "UNITED_ARAB_EMIRATES": { "displayName": "United Arab Emirates", "flagCode": "AE", - "liveryCodes": [ - "ARE" - ] + "liveryCodes": ["ARE"] }, "UK": { "displayName": "United Kingdom", "flagCode": "GB", - "liveryCodes": [ - "UK" - ] + "liveryCodes": ["UK"] }, "USA": { "displayName": "United States of America", "flagCode": "US", - "liveryCodes": [ - "USA", - "USAF" - ] + "liveryCodes": ["USA", "USAF"] }, "VENEZUELA": { "flagCode": "VE", - "liveryCodes": [ - "VEN" - ] + "liveryCodes": ["VEN"] }, "VIETNAM": { "flagCode": "VN", - "liveryCodes": [ - "VNM" - ] + "liveryCodes": ["VNM"] }, "YEMEN": { "flagCode": "YE", - "liveryCodes": [ - "YEM" - ] + "liveryCodes": ["YEM"] }, "CJTF_BLUE": { "displayName": "Combined Joint Task Force Blue", "flagCode": "BLUE", - "liveryCodes": [ - "BLUE" - ] + "liveryCodes": ["BLUE"] }, "SOUTH_OSETIA": { "displayName": "South Ossetia", @@ -487,29 +328,21 @@ "NORTH_KOREA": { "displayName": "Democratic People's Republic of Korea", "flagCode": "KP", - "liveryCodes": [ - "PRK" - ] + "liveryCodes": ["PRK"] }, "CJTF_RED": { "displayName": "Combined Joint Task Force Red", "flagCode": "RED", - "liveryCodes": [ - "RED" - ] + "liveryCodes": ["RED"] }, "ABKHAZIA": { "flagCode": "UNK", - "liveryCodes": [ - "ABH" - ] + "liveryCodes": ["ABH"] }, "ITALIAN_SOCIAL_REPUBLIC": { "displayName": "Italian Social Republic", "flagCode": "SOCIAL", - "liveryCodes": [ - "RSI" - ] + "liveryCodes": ["RSI"] }, "USSR": { "displayName": "USSR", @@ -518,39 +351,28 @@ }, "ECUADOR": { "flagCode": "EC", - "liveryCodes": [ - "ECU" - ] + "liveryCodes": ["ECU"] }, "LIBYA": { "flagCode": "LY", - "liveryCodes": [ - "LBY", - "LIB" - ] + "liveryCodes": ["LBY", "LIB"] }, "UN_PEACEKEEPERS": { "displayName": "United Nations", "flagCode": "UNK", - "liveryCodes": [ - "UN" - ] + "liveryCodes": ["UN"] }, "GDR": { "flagCode": "UNK", - "liveryCodes": [ - "GDR" - ] + "liveryCodes": ["GDR"] }, "YUGOSLAVIA": { "flagCode": "YUG", - "liveryCodes": [ - "YUG" - ] + "liveryCodes": ["YUG"] }, "THIRDREICH": { "displayName": "Third Reich", "flagCode": "THIRD", "liveryCodes": [] } -} \ No newline at end of file +} diff --git a/frontend/server/public/images/countries/cp.svg b/frontend/server/public/images/countries/cp.svg index b3efb074..bb5411c6 100644 --- a/frontend/server/public/images/countries/cp.svg +++ b/frontend/server/public/images/countries/cp.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cr.svg b/frontend/server/public/images/countries/cr.svg index 5a409eeb..d201d1a6 100644 --- a/frontend/server/public/images/countries/cr.svg +++ b/frontend/server/public/images/countries/cr.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cu.svg b/frontend/server/public/images/countries/cu.svg index 6464f8eb..bf7ec060 100644 --- a/frontend/server/public/images/countries/cu.svg +++ b/frontend/server/public/images/countries/cu.svg @@ -1,13 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cv.svg b/frontend/server/public/images/countries/cv.svg index 5c251da2..eb066c00 100644 --- a/frontend/server/public/images/countries/cv.svg +++ b/frontend/server/public/images/countries/cv.svg @@ -1,13 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cw.svg b/frontend/server/public/images/countries/cw.svg index bb0ece22..116f9b9c 100644 --- a/frontend/server/public/images/countries/cw.svg +++ b/frontend/server/public/images/countries/cw.svg @@ -1,14 +1,17 @@ - + - + - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cx.svg b/frontend/server/public/images/countries/cx.svg index 6803b3b6..ef933a50 100644 --- a/frontend/server/public/images/countries/cx.svg +++ b/frontend/server/public/images/countries/cx.svg @@ -1,15 +1,20 @@ - - - - - - - + + + + + + + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cy.svg b/frontend/server/public/images/countries/cy.svg index 2f69bf79..f45acf07 100644 --- a/frontend/server/public/images/countries/cy.svg +++ b/frontend/server/public/images/countries/cy.svg @@ -1,6 +1,9 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/cz.svg b/frontend/server/public/images/countries/cz.svg index 7913de38..e61450dc 100644 --- a/frontend/server/public/images/countries/cz.svg +++ b/frontend/server/public/images/countries/cz.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/de.svg b/frontend/server/public/images/countries/de.svg index b08334b6..baf32437 100644 --- a/frontend/server/public/images/countries/de.svg +++ b/frontend/server/public/images/countries/de.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/dg.svg b/frontend/server/public/images/countries/dg.svg index b9f99a99..bf4ab23b 100644 --- a/frontend/server/public/images/countries/dg.svg +++ b/frontend/server/public/images/countries/dg.svg @@ -1,130 +1,244 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/dj.svg b/frontend/server/public/images/countries/dj.svg index ebf2fc66..4a5ff3f2 100644 --- a/frontend/server/public/images/countries/dj.svg +++ b/frontend/server/public/images/countries/dj.svg @@ -1,13 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/dk.svg b/frontend/server/public/images/countries/dk.svg index 563277f8..3d94f0e1 100644 --- a/frontend/server/public/images/countries/dk.svg +++ b/frontend/server/public/images/countries/dk.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/dm.svg b/frontend/server/public/images/countries/dm.svg index 60457b79..cf3d350d 100644 --- a/frontend/server/public/images/countries/dm.svg +++ b/frontend/server/public/images/countries/dm.svg @@ -1,152 +1,253 @@ - + - - - - - - - - + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - + - - - - - - - - + + + + + + + + - + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/do.svg b/frontend/server/public/images/countries/do.svg index 9c1becc6..9777f6cb 100644 --- a/frontend/server/public/images/countries/do.svg +++ b/frontend/server/public/images/countries/do.svg @@ -1,123 +1,193 @@ - - - - - + + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - + + + + + + + + + + - - - - + + + + - + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - + + + + + - - - - - + + + + + - + - - - - - - + + + + + + - + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - - + + + + + + + - + - - - - - - - + + + + + + + - - - - - + + + + + - + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/dz.svg b/frontend/server/public/images/countries/dz.svg index 5ff29a74..59e7a7ec 100644 --- a/frontend/server/public/images/countries/dz.svg +++ b/frontend/server/public/images/countries/dz.svg @@ -1,5 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/eac.svg b/frontend/server/public/images/countries/eac.svg index 613099cc..fc6516fe 100644 --- a/frontend/server/public/images/countries/eac.svg +++ b/frontend/server/public/images/countries/eac.svg @@ -1,50 +1,140 @@ - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ec.svg b/frontend/server/public/images/countries/ec.svg index 65b78858..da38630c 100644 --- a/frontend/server/public/images/countries/ec.svg +++ b/frontend/server/public/images/countries/ec.svg @@ -1,138 +1,334 @@ - - - + + + - - - + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - + + + - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ee.svg b/frontend/server/public/images/countries/ee.svg index 36ea288c..a1c3dc4e 100644 --- a/frontend/server/public/images/countries/ee.svg +++ b/frontend/server/public/images/countries/ee.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/eg.svg b/frontend/server/public/images/countries/eg.svg index 58c943c2..e860cebe 100644 --- a/frontend/server/public/images/countries/eg.svg +++ b/frontend/server/public/images/countries/eg.svg @@ -1,38 +1,56 @@ - - - - + + + + - - - - + + + + - - - - + + + + - + - - - - + + + + - - + + - - - + + + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/eh.svg b/frontend/server/public/images/countries/eh.svg index 2c9525bd..0831fc1f 100644 --- a/frontend/server/public/images/countries/eh.svg +++ b/frontend/server/public/images/countries/eh.svg @@ -1,16 +1,17 @@ - + - - - - - - - + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/er.svg b/frontend/server/public/images/countries/er.svg index 2705295f..61929685 100644 --- a/frontend/server/public/images/countries/er.svg +++ b/frontend/server/public/images/countries/er.svg @@ -1,8 +1,9 @@ - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/es-ct.svg b/frontend/server/public/images/countries/es-ct.svg index 4d859114..94e41da9 100644 --- a/frontend/server/public/images/countries/es-ct.svg +++ b/frontend/server/public/images/countries/es-ct.svg @@ -1,4 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/es-ga.svg b/frontend/server/public/images/countries/es-ga.svg index a91ffed0..37c6259f 100644 --- a/frontend/server/public/images/countries/es-ga.svg +++ b/frontend/server/public/images/countries/es-ga.svg @@ -1,187 +1,334 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/es-pv.svg b/frontend/server/public/images/countries/es-pv.svg index 21c8759e..c1eb25c7 100644 --- a/frontend/server/public/images/countries/es-pv.svg +++ b/frontend/server/public/images/countries/es-pv.svg @@ -1,5 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/es.svg b/frontend/server/public/images/countries/es.svg index 815e0f84..eae95066 100644 --- a/frontend/server/public/images/countries/es.svg +++ b/frontend/server/public/images/countries/es.svg @@ -1,544 +1,879 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/et.svg b/frontend/server/public/images/countries/et.svg index a3378fd9..bec1ed46 100644 --- a/frontend/server/public/images/countries/et.svg +++ b/frontend/server/public/images/countries/et.svg @@ -1,14 +1,16 @@ - + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/eu.svg b/frontend/server/public/images/countries/eu.svg index bbfefd6b..6753f886 100644 --- a/frontend/server/public/images/countries/eu.svg +++ b/frontend/server/public/images/countries/eu.svg @@ -1,28 +1,29 @@ - + - - + + - - + + - + - + - - + + - - - - - + + + + + - + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/fi.svg b/frontend/server/public/images/countries/fi.svg index 470be2d0..e62c8353 100644 --- a/frontend/server/public/images/countries/fi.svg +++ b/frontend/server/public/images/countries/fi.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/fj.svg b/frontend/server/public/images/countries/fj.svg index 2d7cd980..9ff51434 100644 --- a/frontend/server/public/images/countries/fj.svg +++ b/frontend/server/public/images/countries/fj.svg @@ -1,120 +1,191 @@ - + - - - + + + - - - - + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - - - + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - + + + + + - + - - - - + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/fk.svg b/frontend/server/public/images/countries/fk.svg index b4935a55..cfa6b60f 100644 --- a/frontend/server/public/images/countries/fk.svg +++ b/frontend/server/public/images/countries/fk.svg @@ -1,90 +1,193 @@ - + - - - - - + + + + + - - + + - - - - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/fm.svg b/frontend/server/public/images/countries/fm.svg index 85f4f47e..d521b68d 100644 --- a/frontend/server/public/images/countries/fm.svg +++ b/frontend/server/public/images/countries/fm.svg @@ -1,11 +1,13 @@ - + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/fo.svg b/frontend/server/public/images/countries/fo.svg index 717ee20b..b64e89c0 100644 --- a/frontend/server/public/images/countries/fo.svg +++ b/frontend/server/public/images/countries/fo.svg @@ -1,12 +1,13 @@ - + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/fr.svg b/frontend/server/public/images/countries/fr.svg index 79689fe9..6042436e 100644 --- a/frontend/server/public/images/countries/fr.svg +++ b/frontend/server/public/images/countries/fr.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ga.svg b/frontend/server/public/images/countries/ga.svg index 76edab42..35979cbf 100644 --- a/frontend/server/public/images/countries/ga.svg +++ b/frontend/server/public/images/countries/ga.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gb-eng.svg b/frontend/server/public/images/countries/gb-eng.svg index 12e3b67d..8d57eadf 100644 --- a/frontend/server/public/images/countries/gb-eng.svg +++ b/frontend/server/public/images/countries/gb-eng.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gb-nir.svg b/frontend/server/public/images/countries/gb-nir.svg index c9510f30..f74420ab 100644 --- a/frontend/server/public/images/countries/gb-nir.svg +++ b/frontend/server/public/images/countries/gb-nir.svg @@ -1,132 +1,234 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - + + - - - + + + - - + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gb-sct.svg b/frontend/server/public/images/countries/gb-sct.svg index f50cd322..900318a7 100644 --- a/frontend/server/public/images/countries/gb-sct.svg +++ b/frontend/server/public/images/countries/gb-sct.svg @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gb-wls.svg b/frontend/server/public/images/countries/gb-wls.svg index 6e15fd01..b4769755 100644 --- a/frontend/server/public/images/countries/gb-wls.svg +++ b/frontend/server/public/images/countries/gb-wls.svg @@ -1,9 +1,11 @@ - - + + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gb.svg b/frontend/server/public/images/countries/gb.svg index dbac25ea..47f344f4 100644 --- a/frontend/server/public/images/countries/gb.svg +++ b/frontend/server/public/images/countries/gb.svg @@ -1,7 +1,9 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gd.svg b/frontend/server/public/images/countries/gd.svg index f44e8391..33cb3b34 100644 --- a/frontend/server/public/images/countries/gd.svg +++ b/frontend/server/public/images/countries/gd.svg @@ -1,27 +1,30 @@ - + - - + + - - - - + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ge.svg b/frontend/server/public/images/countries/ge.svg index d8126ec8..a2984c10 100644 --- a/frontend/server/public/images/countries/ge.svg +++ b/frontend/server/public/images/countries/ge.svg @@ -1,6 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gf.svg b/frontend/server/public/images/countries/gf.svg index 73493426..01b9d896 100644 --- a/frontend/server/public/images/countries/gf.svg +++ b/frontend/server/public/images/countries/gf.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gg.svg b/frontend/server/public/images/countries/gg.svg index f8216c8b..6281b69b 100644 --- a/frontend/server/public/images/countries/gg.svg +++ b/frontend/server/public/images/countries/gg.svg @@ -1,9 +1,10 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gh.svg b/frontend/server/public/images/countries/gh.svg index a6497de8..bf4b42a9 100644 --- a/frontend/server/public/images/countries/gh.svg +++ b/frontend/server/public/images/countries/gh.svg @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gi.svg b/frontend/server/public/images/countries/gi.svg index 92496be6..4bfe752b 100644 --- a/frontend/server/public/images/countries/gi.svg +++ b/frontend/server/public/images/countries/gi.svg @@ -1,32 +1,42 @@ - - - + + + - - - - - + + + + + - + - - - - + + + + - - - - + + + + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gl.svg b/frontend/server/public/images/countries/gl.svg index eb5a52e9..59472d84 100644 --- a/frontend/server/public/images/countries/gl.svg +++ b/frontend/server/public/images/countries/gl.svg @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gm.svg b/frontend/server/public/images/countries/gm.svg index 8fe9d669..0456b8d8 100644 --- a/frontend/server/public/images/countries/gm.svg +++ b/frontend/server/public/images/countries/gm.svg @@ -1,14 +1,14 @@ - + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gn.svg b/frontend/server/public/images/countries/gn.svg index 40d6ad4f..c44cf15d 100644 --- a/frontend/server/public/images/countries/gn.svg +++ b/frontend/server/public/images/countries/gn.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gp.svg b/frontend/server/public/images/countries/gp.svg index 528e554f..32c1816b 100644 --- a/frontend/server/public/images/countries/gp.svg +++ b/frontend/server/public/images/countries/gp.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gq.svg b/frontend/server/public/images/countries/gq.svg index ba2acf28..5aa686a9 100644 --- a/frontend/server/public/images/countries/gq.svg +++ b/frontend/server/public/images/countries/gq.svg @@ -1,23 +1,35 @@ - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + - + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gr.svg b/frontend/server/public/images/countries/gr.svg index 599741ee..14ab0974 100644 --- a/frontend/server/public/images/countries/gr.svg +++ b/frontend/server/public/images/countries/gr.svg @@ -1,16 +1,16 @@ - - - - - - - - - + + + + + + + + + - - + + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gs.svg b/frontend/server/public/images/countries/gs.svg index 2e045dfd..0d8aff80 100644 --- a/frontend/server/public/images/countries/gs.svg +++ b/frontend/server/public/images/countries/gs.svg @@ -1,133 +1,215 @@ - + - - + + - - + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gt.svg b/frontend/server/public/images/countries/gt.svg index 9b347124..fa102cb9 100644 --- a/frontend/server/public/images/countries/gt.svg +++ b/frontend/server/public/images/countries/gt.svg @@ -1,204 +1,283 @@ - + - + - - + + - - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - + - + - - - + + + - - - - - + + + + + - - + + - - + + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - + - + - - - - + + + + - - - - + + + + - - - + + + - - - - + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - + - - + + - - - + + + - - - - - - + + + + + + - - + + - + - - + + - - - - - - - - - - - + + + + + + + + + + + - - + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gu.svg b/frontend/server/public/images/countries/gu.svg index a5584ffd..ed27aa6c 100644 --- a/frontend/server/public/images/countries/gu.svg +++ b/frontend/server/public/images/countries/gu.svg @@ -1,23 +1,52 @@ - - - - - - - - - G - U - A - M - - - - - - - - - - + + + + + + + + + + G + + + U + + + A + + + M + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gw.svg b/frontend/server/public/images/countries/gw.svg index b8d566a2..bdc161a1 100644 --- a/frontend/server/public/images/countries/gw.svg +++ b/frontend/server/public/images/countries/gw.svg @@ -1,13 +1,14 @@ - - - - + + + + - - + + - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/gy.svg b/frontend/server/public/images/countries/gy.svg index f4d9b8ab..c4175df0 100644 --- a/frontend/server/public/images/countries/gy.svg +++ b/frontend/server/public/images/countries/gy.svg @@ -1,9 +1,9 @@ - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/hk.svg b/frontend/server/public/images/countries/hk.svg index ec40b5fe..25f1c846 100644 --- a/frontend/server/public/images/countries/hk.svg +++ b/frontend/server/public/images/countries/hk.svg @@ -1,8 +1,10 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/hm.svg b/frontend/server/public/images/countries/hm.svg index c0748d3b..46b0c2d5 100644 --- a/frontend/server/public/images/countries/hm.svg +++ b/frontend/server/public/images/countries/hm.svg @@ -1,8 +1,11 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/hn.svg b/frontend/server/public/images/countries/hn.svg index 1c166dc4..bb07bebe 100644 --- a/frontend/server/public/images/countries/hn.svg +++ b/frontend/server/public/images/countries/hn.svg @@ -1,18 +1,19 @@ - - - + + + - - + + - - - - + + + + - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/hr.svg b/frontend/server/public/images/countries/hr.svg index febbc240..c7fc580e 100644 --- a/frontend/server/public/images/countries/hr.svg +++ b/frontend/server/public/images/countries/hr.svg @@ -1,58 +1,97 @@ - - - - - + + + + + - - + + - - - - - - - + + + + + + + - + - + - - - - + + + + - - + + - - + + - - + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ht.svg b/frontend/server/public/images/countries/ht.svg index 4cd4470f..c624afff 100644 --- a/frontend/server/public/images/countries/ht.svg +++ b/frontend/server/public/images/countries/ht.svg @@ -1,116 +1,163 @@ - - - + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - + + + + - + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/hu.svg b/frontend/server/public/images/countries/hu.svg index baddf7f5..9e154667 100644 --- a/frontend/server/public/images/countries/hu.svg +++ b/frontend/server/public/images/countries/hu.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ic.svg b/frontend/server/public/images/countries/ic.svg index 81e6ee2e..85b65f88 100644 --- a/frontend/server/public/images/countries/ic.svg +++ b/frontend/server/public/images/countries/ic.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/id.svg b/frontend/server/public/images/countries/id.svg index 3b7c8fcf..4f2bde2b 100644 --- a/frontend/server/public/images/countries/id.svg +++ b/frontend/server/public/images/countries/id.svg @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ie.svg b/frontend/server/public/images/countries/ie.svg index 049be14d..89fa0b55 100644 --- a/frontend/server/public/images/countries/ie.svg +++ b/frontend/server/public/images/countries/ie.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/il.svg b/frontend/server/public/images/countries/il.svg index 724cf8bf..96bf69e0 100644 --- a/frontend/server/public/images/countries/il.svg +++ b/frontend/server/public/images/countries/il.svg @@ -1,14 +1,16 @@ - + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/im.svg b/frontend/server/public/images/countries/im.svg index 3d597a14..4a72da98 100644 --- a/frontend/server/public/images/countries/im.svg +++ b/frontend/server/public/images/countries/im.svg @@ -1,36 +1,59 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/in.svg b/frontend/server/public/images/countries/in.svg index c634f68a..5ae3cae0 100644 --- a/frontend/server/public/images/countries/in.svg +++ b/frontend/server/public/images/countries/in.svg @@ -1,25 +1,26 @@ - - - - + + + + - - - + + + - - + + - + - + - + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/io.svg b/frontend/server/public/images/countries/io.svg index b04c46f5..83d72303 100644 --- a/frontend/server/public/images/countries/io.svg +++ b/frontend/server/public/images/countries/io.svg @@ -1,130 +1,244 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/iq.svg b/frontend/server/public/images/countries/iq.svg index 68917853..350b1e4c 100644 --- a/frontend/server/public/images/countries/iq.svg +++ b/frontend/server/public/images/countries/iq.svg @@ -1,10 +1,12 @@ - - - + + + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ir.svg b/frontend/server/public/images/countries/ir.svg index 5c9609ef..c2d71c72 100644 --- a/frontend/server/public/images/countries/ir.svg +++ b/frontend/server/public/images/countries/ir.svg @@ -1,219 +1,283 @@ - + - - + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - + + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/is.svg b/frontend/server/public/images/countries/is.svg index 56cc9778..2dab697b 100644 --- a/frontend/server/public/images/countries/is.svg +++ b/frontend/server/public/images/countries/is.svg @@ -1,12 +1,12 @@ - + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/it.svg b/frontend/server/public/images/countries/it.svg index 20a8bfdc..295787cb 100644 --- a/frontend/server/public/images/countries/it.svg +++ b/frontend/server/public/images/countries/it.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/je.svg b/frontend/server/public/images/countries/je.svg index e69e4f46..9d1206c7 100644 --- a/frontend/server/public/images/countries/je.svg +++ b/frontend/server/public/images/countries/je.svg @@ -1,45 +1,70 @@ - + - - + + - - + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/jm.svg b/frontend/server/public/images/countries/jm.svg index e03a3422..6d8dc00c 100644 --- a/frontend/server/public/images/countries/jm.svg +++ b/frontend/server/public/images/countries/jm.svg @@ -1,8 +1,8 @@ - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/jo.svg b/frontend/server/public/images/countries/jo.svg index 50802915..38d52dde 100644 --- a/frontend/server/public/images/countries/jo.svg +++ b/frontend/server/public/images/countries/jo.svg @@ -1,16 +1,17 @@ - + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/jp.svg b/frontend/server/public/images/countries/jp.svg index cd03a339..ab04bb52 100644 --- a/frontend/server/public/images/countries/jp.svg +++ b/frontend/server/public/images/countries/jp.svg @@ -1,11 +1,12 @@ - + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ke.svg b/frontend/server/public/images/countries/ke.svg index 5b377937..dae1fc36 100644 --- a/frontend/server/public/images/countries/ke.svg +++ b/frontend/server/public/images/countries/ke.svg @@ -1,23 +1,26 @@ - + - + - - - + + + - - + + - - - - + + + + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/kg.svg b/frontend/server/public/images/countries/kg.svg index 626af14d..f57b3922 100644 --- a/frontend/server/public/images/countries/kg.svg +++ b/frontend/server/public/images/countries/kg.svg @@ -1,15 +1,17 @@ - + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/kh.svg b/frontend/server/public/images/countries/kh.svg index c658838f..e029e624 100644 --- a/frontend/server/public/images/countries/kh.svg +++ b/frontend/server/public/images/countries/kh.svg @@ -1,61 +1,88 @@ - - - + + + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - - + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ki.svg b/frontend/server/public/images/countries/ki.svg index 1697ffe8..96967d80 100644 --- a/frontend/server/public/images/countries/ki.svg +++ b/frontend/server/public/images/countries/ki.svg @@ -1,36 +1,62 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/km.svg b/frontend/server/public/images/countries/km.svg index 56d62c32..1a56913b 100644 --- a/frontend/server/public/images/countries/km.svg +++ b/frontend/server/public/images/countries/km.svg @@ -1,16 +1,18 @@ - + - - - - - - - + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/kn.svg b/frontend/server/public/images/countries/kn.svg index 01a3a0a2..273c26a8 100644 --- a/frontend/server/public/images/countries/kn.svg +++ b/frontend/server/public/images/countries/kn.svg @@ -1,14 +1,15 @@ - + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/kp.svg b/frontend/server/public/images/countries/kp.svg index 94bc8e1e..3ad70d3d 100644 --- a/frontend/server/public/images/countries/kp.svg +++ b/frontend/server/public/images/countries/kp.svg @@ -1,15 +1,17 @@ - + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/kr.svg b/frontend/server/public/images/countries/kr.svg index 44b51e25..ec6fa468 100644 --- a/frontend/server/public/images/countries/kr.svg +++ b/frontend/server/public/images/countries/kr.svg @@ -1,24 +1,25 @@ - + - + - + - - + + - - - - + + + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/kw.svg b/frontend/server/public/images/countries/kw.svg index 7ff91a84..5852d36a 100644 --- a/frontend/server/public/images/countries/kw.svg +++ b/frontend/server/public/images/countries/kw.svg @@ -1,13 +1,13 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ky.svg b/frontend/server/public/images/countries/ky.svg index d6e567b5..bf5665e6 100644 --- a/frontend/server/public/images/countries/ky.svg +++ b/frontend/server/public/images/countries/ky.svg @@ -1,103 +1,149 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - + + - + - - - - + + + + - - + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - + + - - + + - - - + + + - + - - - - - - - - - + + + + + + + + + - - + + - - + + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/kz.svg b/frontend/server/public/images/countries/kz.svg index a69ba7a3..e6b5c2b8 100644 --- a/frontend/server/public/images/countries/kz.svg +++ b/frontend/server/public/images/countries/kz.svg @@ -1,36 +1,41 @@ - - + + - + - - - - + + + + - - - + + + - + - - - + + + - - - + + + - + - + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/la.svg b/frontend/server/public/images/countries/la.svg index 9723a781..5983bef5 100644 --- a/frontend/server/public/images/countries/la.svg +++ b/frontend/server/public/images/countries/la.svg @@ -1,12 +1,12 @@ - + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/lb.svg b/frontend/server/public/images/countries/lb.svg index 49650ad8..567005eb 100644 --- a/frontend/server/public/images/countries/lb.svg +++ b/frontend/server/public/images/countries/lb.svg @@ -1,15 +1,18 @@ - + - - + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/lc.svg b/frontend/server/public/images/countries/lc.svg index 46bbc6cc..efdf2dc4 100644 --- a/frontend/server/public/images/countries/lc.svg +++ b/frontend/server/public/images/countries/lc.svg @@ -1,8 +1,8 @@ - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/li.svg b/frontend/server/public/images/countries/li.svg index a08a05ac..adf317f2 100644 --- a/frontend/server/public/images/countries/li.svg +++ b/frontend/server/public/images/countries/li.svg @@ -1,43 +1,56 @@ - - - - + + + + - + - - + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/lk.svg b/frontend/server/public/images/countries/lk.svg index 24c6559b..d2dba3b4 100644 --- a/frontend/server/public/images/countries/lk.svg +++ b/frontend/server/public/images/countries/lk.svg @@ -1,22 +1,31 @@ - - - - - - - - - + + + + + + + + + - + - - - - - - - + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/lr.svg b/frontend/server/public/images/countries/lr.svg index a31377f9..3d6e3679 100644 --- a/frontend/server/public/images/countries/lr.svg +++ b/frontend/server/public/images/countries/lr.svg @@ -1,14 +1,16 @@ - + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ls.svg b/frontend/server/public/images/countries/ls.svg index e7016502..f88130f1 100644 --- a/frontend/server/public/images/countries/ls.svg +++ b/frontend/server/public/images/countries/ls.svg @@ -1,8 +1,11 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/lt.svg b/frontend/server/public/images/countries/lt.svg index 90ec5d24..0348401c 100644 --- a/frontend/server/public/images/countries/lt.svg +++ b/frontend/server/public/images/countries/lt.svg @@ -1,7 +1,8 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/lu.svg b/frontend/server/public/images/countries/lu.svg index c31d2bfa..ed9b8d0e 100644 --- a/frontend/server/public/images/countries/lu.svg +++ b/frontend/server/public/images/countries/lu.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/lv.svg b/frontend/server/public/images/countries/lv.svg index 6a9e75ec..38f5060b 100644 --- a/frontend/server/public/images/countries/lv.svg +++ b/frontend/server/public/images/countries/lv.svg @@ -1,6 +1,6 @@ - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ly.svg b/frontend/server/public/images/countries/ly.svg index 14abcb24..2a97cfa1 100644 --- a/frontend/server/public/images/countries/ly.svg +++ b/frontend/server/public/images/countries/ly.svg @@ -1,13 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ma.svg b/frontend/server/public/images/countries/ma.svg index 7ce56eff..dd1de52d 100644 --- a/frontend/server/public/images/countries/ma.svg +++ b/frontend/server/public/images/countries/ma.svg @@ -1,4 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mc.svg b/frontend/server/public/images/countries/mc.svg index 9cb6c9e8..29148ef0 100644 --- a/frontend/server/public/images/countries/mc.svg +++ b/frontend/server/public/images/countries/mc.svg @@ -1,6 +1,6 @@ - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/md.svg b/frontend/server/public/images/countries/md.svg index a806572c..4396e0cd 100644 --- a/frontend/server/public/images/countries/md.svg +++ b/frontend/server/public/images/countries/md.svg @@ -1,70 +1,140 @@ - - - + + + - - - - + + + + - - + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - - + + + - + - - + + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/me.svg b/frontend/server/public/images/countries/me.svg index b56cce09..bf951bef 100644 --- a/frontend/server/public/images/countries/me.svg +++ b/frontend/server/public/images/countries/me.svg @@ -1,116 +1,188 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mf.svg b/frontend/server/public/images/countries/mf.svg index a53ce501..066af7bd 100644 --- a/frontend/server/public/images/countries/mf.svg +++ b/frontend/server/public/images/countries/mf.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mg.svg b/frontend/server/public/images/countries/mg.svg index 5fa2d244..10b8a56a 100644 --- a/frontend/server/public/images/countries/mg.svg +++ b/frontend/server/public/images/countries/mg.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mh.svg b/frontend/server/public/images/countries/mh.svg index 46351e54..50d710f2 100644 --- a/frontend/server/public/images/countries/mh.svg +++ b/frontend/server/public/images/countries/mh.svg @@ -1,7 +1,8 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mk.svg b/frontend/server/public/images/countries/mk.svg index 4f5cae77..a9f6a4a8 100644 --- a/frontend/server/public/images/countries/mk.svg +++ b/frontend/server/public/images/countries/mk.svg @@ -1,5 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ml.svg b/frontend/server/public/images/countries/ml.svg index 6f6b7169..0ba73c78 100644 --- a/frontend/server/public/images/countries/ml.svg +++ b/frontend/server/public/images/countries/ml.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mm.svg b/frontend/server/public/images/countries/mm.svg index 8ed5e6ac..171868bf 100644 --- a/frontend/server/public/images/countries/mm.svg +++ b/frontend/server/public/images/countries/mm.svg @@ -1,12 +1,13 @@ - - - - + + + + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mn.svg b/frontend/server/public/images/countries/mn.svg index 56cb0729..0715c25e 100644 --- a/frontend/server/public/images/countries/mn.svg +++ b/frontend/server/public/images/countries/mn.svg @@ -1,14 +1,16 @@ - - - - - - - + + + + + + + - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mo.svg b/frontend/server/public/images/countries/mo.svg index 257faed6..d0caf275 100644 --- a/frontend/server/public/images/countries/mo.svg +++ b/frontend/server/public/images/countries/mo.svg @@ -1,9 +1,12 @@ - - - + + + - - + + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mp.svg b/frontend/server/public/images/countries/mp.svg index 6696fdb8..2275ee24 100644 --- a/frontend/server/public/images/countries/mp.svg +++ b/frontend/server/public/images/countries/mp.svg @@ -1,86 +1,196 @@ - + - - - + + + - - - + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mq.svg b/frontend/server/public/images/countries/mq.svg index 9be3452e..d41f85cc 100644 --- a/frontend/server/public/images/countries/mq.svg +++ b/frontend/server/public/images/countries/mq.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mr.svg b/frontend/server/public/images/countries/mr.svg index 3f0a6264..e4b4f993 100644 --- a/frontend/server/public/images/countries/mr.svg +++ b/frontend/server/public/images/countries/mr.svg @@ -1,6 +1,9 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ms.svg b/frontend/server/public/images/countries/ms.svg index 2e6d4c5c..3a2a6666 100644 --- a/frontend/server/public/images/countries/ms.svg +++ b/frontend/server/public/images/countries/ms.svg @@ -1,29 +1,46 @@ - - - - - - - + + + + + + + - - + + - - - + + + - - - - - + + + + + - - - - - - - + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mt.svg b/frontend/server/public/images/countries/mt.svg index 676e801c..5a73758f 100644 --- a/frontend/server/public/images/countries/mt.svg +++ b/frontend/server/public/images/countries/mt.svg @@ -1,49 +1,82 @@ - - + + - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mu.svg b/frontend/server/public/images/countries/mu.svg index 82d7a3be..fd52f939 100644 --- a/frontend/server/public/images/countries/mu.svg +++ b/frontend/server/public/images/countries/mu.svg @@ -1,8 +1,8 @@ - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mv.svg b/frontend/server/public/images/countries/mv.svg index 10450f98..9cc64295 100644 --- a/frontend/server/public/images/countries/mv.svg +++ b/frontend/server/public/images/countries/mv.svg @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mw.svg b/frontend/server/public/images/countries/mw.svg index 113aae54..36efb56a 100644 --- a/frontend/server/public/images/countries/mw.svg +++ b/frontend/server/public/images/countries/mw.svg @@ -1,10 +1,12 @@ - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mx.svg b/frontend/server/public/images/countries/mx.svg index bb305b8d..dcb855a7 100644 --- a/frontend/server/public/images/countries/mx.svg +++ b/frontend/server/public/images/countries/mx.svg @@ -1,382 +1,687 @@ - + - - - + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/my.svg b/frontend/server/public/images/countries/my.svg index 264f48ae..a87e41ed 100644 --- a/frontend/server/public/images/countries/my.svg +++ b/frontend/server/public/images/countries/my.svg @@ -1,26 +1,27 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/mz.svg b/frontend/server/public/images/countries/mz.svg index eb020058..26883233 100644 --- a/frontend/server/public/images/countries/mz.svg +++ b/frontend/server/public/images/countries/mz.svg @@ -1,21 +1,29 @@ - + - - - - - - - - - - - - + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/na.svg b/frontend/server/public/images/countries/na.svg index 799702e8..24c2f074 100644 --- a/frontend/server/public/images/countries/na.svg +++ b/frontend/server/public/images/countries/na.svg @@ -1,16 +1,18 @@ - + - - - - - - - + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/nc.svg b/frontend/server/public/images/countries/nc.svg index 96795408..29940567 100644 --- a/frontend/server/public/images/countries/nc.svg +++ b/frontend/server/public/images/countries/nc.svg @@ -1,13 +1,16 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ne.svg b/frontend/server/public/images/countries/ne.svg index 39a82b82..b85c2ce5 100644 --- a/frontend/server/public/images/countries/ne.svg +++ b/frontend/server/public/images/countries/ne.svg @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/nf.svg b/frontend/server/public/images/countries/nf.svg index ecdb4a3b..ebd09ca8 100644 --- a/frontend/server/public/images/countries/nf.svg +++ b/frontend/server/public/images/countries/nf.svg @@ -1,9 +1,13 @@ - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ng.svg b/frontend/server/public/images/countries/ng.svg index 81eb35f7..9be3939f 100644 --- a/frontend/server/public/images/countries/ng.svg +++ b/frontend/server/public/images/countries/ng.svg @@ -1,6 +1,6 @@ - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ni.svg b/frontend/server/public/images/countries/ni.svg index e16e77ae..ee0f3494 100644 --- a/frontend/server/public/images/countries/ni.svg +++ b/frontend/server/public/images/countries/ni.svg @@ -1,129 +1,185 @@ - + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - - + + + - + - - + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - - - - + + + + - - - - - + + + + + - + - - - - - - - + + + + + + + - - - - - - + + + + + + - + - - + + - - - + + + - - - - + + + + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/nl.svg b/frontend/server/public/images/countries/nl.svg index 4faaf498..b3f1992d 100644 --- a/frontend/server/public/images/countries/nl.svg +++ b/frontend/server/public/images/countries/nl.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/no.svg b/frontend/server/public/images/countries/no.svg index a5f2a152..7ab5f6fd 100644 --- a/frontend/server/public/images/countries/no.svg +++ b/frontend/server/public/images/countries/no.svg @@ -1,7 +1,7 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/np.svg b/frontend/server/public/images/countries/np.svg index fead9402..2797935f 100644 --- a/frontend/server/public/images/countries/np.svg +++ b/frontend/server/public/images/countries/np.svg @@ -1,13 +1,15 @@ - + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/nr.svg b/frontend/server/public/images/countries/nr.svg index e71ddcd8..f8b4faa0 100644 --- a/frontend/server/public/images/countries/nr.svg +++ b/frontend/server/public/images/countries/nr.svg @@ -1,12 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/nu.svg b/frontend/server/public/images/countries/nu.svg index 4067baff..9a569194 100644 --- a/frontend/server/public/images/countries/nu.svg +++ b/frontend/server/public/images/countries/nu.svg @@ -1,10 +1,13 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/nz.svg b/frontend/server/public/images/countries/nz.svg index 04d08dcc..253aea2a 100644 --- a/frontend/server/public/images/countries/nz.svg +++ b/frontend/server/public/images/countries/nz.svg @@ -1,36 +1,47 @@ - + - - + + - - - - + + + + - + - - + + - - + + - - + + - - + + - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/om.svg b/frontend/server/public/images/countries/om.svg index 1c762179..6530d11c 100644 --- a/frontend/server/public/images/countries/om.svg +++ b/frontend/server/public/images/countries/om.svg @@ -1,115 +1,232 @@ - + - - - + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pa.svg b/frontend/server/public/images/countries/pa.svg index 8dc03bc6..71a1dfa3 100644 --- a/frontend/server/public/images/countries/pa.svg +++ b/frontend/server/public/images/countries/pa.svg @@ -1,14 +1,16 @@ - + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pe.svg b/frontend/server/public/images/countries/pe.svg index f0a4b77d..ef2301a1 100644 --- a/frontend/server/public/images/countries/pe.svg +++ b/frontend/server/public/images/countries/pe.svg @@ -1,244 +1,476 @@ - - - + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - + + - - - + + + - - - - - + + + + + - - - + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - - - - - - - + + + + + + + + + - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + - - + + - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - - + + + + - - - + + + - - - - - - + + + + + + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pf.svg b/frontend/server/public/images/countries/pf.svg index 16374f36..8b26bb61 100644 --- a/frontend/server/public/images/countries/pf.svg +++ b/frontend/server/public/images/countries/pf.svg @@ -1,19 +1,26 @@ - + - - - - - - - - - - + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pg.svg b/frontend/server/public/images/countries/pg.svg index 1080add5..4b81deaf 100644 --- a/frontend/server/public/images/countries/pg.svg +++ b/frontend/server/public/images/countries/pg.svg @@ -1,9 +1,14 @@ - - + + - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ph.svg b/frontend/server/public/images/countries/ph.svg index 65489e1c..3d4865fa 100644 --- a/frontend/server/public/images/countries/ph.svg +++ b/frontend/server/public/images/countries/ph.svg @@ -1,6 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pk.svg b/frontend/server/public/images/countries/pk.svg index fa02f6a8..76489a00 100644 --- a/frontend/server/public/images/countries/pk.svg +++ b/frontend/server/public/images/countries/pk.svg @@ -1,15 +1,18 @@ - + - - - + + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pl.svg b/frontend/server/public/images/countries/pl.svg index 0fa51452..3d886abc 100644 --- a/frontend/server/public/images/countries/pl.svg +++ b/frontend/server/public/images/countries/pl.svg @@ -1,6 +1,6 @@ - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pm.svg b/frontend/server/public/images/countries/pm.svg index 401139f7..723acdbf 100644 --- a/frontend/server/public/images/countries/pm.svg +++ b/frontend/server/public/images/countries/pm.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pn.svg b/frontend/server/public/images/countries/pn.svg index 9788c9cc..1ceaffd8 100644 --- a/frontend/server/public/images/countries/pn.svg +++ b/frontend/server/public/images/countries/pn.svg @@ -1,53 +1,100 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pr.svg b/frontend/server/public/images/countries/pr.svg index 3cb403b5..774b1e4c 100644 --- a/frontend/server/public/images/countries/pr.svg +++ b/frontend/server/public/images/countries/pr.svg @@ -1,13 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ps.svg b/frontend/server/public/images/countries/ps.svg index 82031486..d539df99 100644 --- a/frontend/server/public/images/countries/ps.svg +++ b/frontend/server/public/images/countries/ps.svg @@ -1,15 +1,15 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pt.svg b/frontend/server/public/images/countries/pt.svg index 2f36b7ee..6e942ee5 100644 --- a/frontend/server/public/images/countries/pt.svg +++ b/frontend/server/public/images/countries/pt.svg @@ -1,57 +1,80 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - + + + + + + + + + + - - + + - - + + - - - - - - + + + + + + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/pw.svg b/frontend/server/public/images/countries/pw.svg index 089cbcee..503854b3 100644 --- a/frontend/server/public/images/countries/pw.svg +++ b/frontend/server/public/images/countries/pw.svg @@ -1,11 +1,11 @@ - + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/py.svg b/frontend/server/public/images/countries/py.svg index bfbf01f1..78a9bc6b 100644 --- a/frontend/server/public/images/countries/py.svg +++ b/frontend/server/public/images/countries/py.svg @@ -1,157 +1,219 @@ - - - + + + - - - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/qa.svg b/frontend/server/public/images/countries/qa.svg index bd493c38..b10ee481 100644 --- a/frontend/server/public/images/countries/qa.svg +++ b/frontend/server/public/images/countries/qa.svg @@ -1,4 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/re.svg b/frontend/server/public/images/countries/re.svg index 3225dddf..9a1f36ad 100644 --- a/frontend/server/public/images/countries/re.svg +++ b/frontend/server/public/images/countries/re.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/red.svg b/frontend/server/public/images/countries/red.svg index b1ca1b64..0422092d 100644 --- a/frontend/server/public/images/countries/red.svg +++ b/frontend/server/public/images/countries/red.svg @@ -13,45 +13,45 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - - - image/svg+xml - - - - - - - + + + + + image/svg+xml + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ro.svg b/frontend/server/public/images/countries/ro.svg index fda0f7be..d4154f90 100644 --- a/frontend/server/public/images/countries/ro.svg +++ b/frontend/server/public/images/countries/ro.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/rs.svg b/frontend/server/public/images/countries/rs.svg index 120293ab..45f1fe45 100644 --- a/frontend/server/public/images/countries/rs.svg +++ b/frontend/server/public/images/countries/rs.svg @@ -1,292 +1,537 @@ - + - + - - - + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ru.svg b/frontend/server/public/images/countries/ru.svg index f4d27efc..33e3cf95 100644 --- a/frontend/server/public/images/countries/ru.svg +++ b/frontend/server/public/images/countries/ru.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/rw.svg b/frontend/server/public/images/countries/rw.svg index 6cc669ed..618ecc7e 100644 --- a/frontend/server/public/images/countries/rw.svg +++ b/frontend/server/public/images/countries/rw.svg @@ -1,13 +1,15 @@ - - - - + + + + - - + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sa.svg b/frontend/server/public/images/countries/sa.svg index 660396a7..7f09beff 100644 --- a/frontend/server/public/images/countries/sa.svg +++ b/frontend/server/public/images/countries/sa.svg @@ -1,25 +1,39 @@ - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sb.svg b/frontend/server/public/images/countries/sb.svg index a011360d..c5472aa2 100644 --- a/frontend/server/public/images/countries/sb.svg +++ b/frontend/server/public/images/countries/sb.svg @@ -1,13 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sc.svg b/frontend/server/public/images/countries/sc.svg index 9a46b369..648c1cb3 100644 --- a/frontend/server/public/images/countries/sc.svg +++ b/frontend/server/public/images/countries/sc.svg @@ -1,7 +1,7 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sd.svg b/frontend/server/public/images/countries/sd.svg index b8e4b973..7d01aa77 100644 --- a/frontend/server/public/images/countries/sd.svg +++ b/frontend/server/public/images/countries/sd.svg @@ -1,13 +1,13 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/se.svg b/frontend/server/public/images/countries/se.svg index 0e41780e..5e79b0c4 100644 --- a/frontend/server/public/images/countries/se.svg +++ b/frontend/server/public/images/countries/se.svg @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sg.svg b/frontend/server/public/images/countries/sg.svg index c4dd4ac9..2be9ad20 100644 --- a/frontend/server/public/images/countries/sg.svg +++ b/frontend/server/public/images/countries/sg.svg @@ -1,13 +1,15 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sh.svg b/frontend/server/public/images/countries/sh.svg index 131b069a..43f1f1df 100644 --- a/frontend/server/public/images/countries/sh.svg +++ b/frontend/server/public/images/countries/sh.svg @@ -1,76 +1,137 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/si.svg b/frontend/server/public/images/countries/si.svg index f2aea016..2aae6980 100644 --- a/frontend/server/public/images/countries/si.svg +++ b/frontend/server/public/images/countries/si.svg @@ -1,18 +1,25 @@ - + - - - - - - - - - - + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sj.svg b/frontend/server/public/images/countries/sj.svg index bb2799ce..0230663c 100644 --- a/frontend/server/public/images/countries/sj.svg +++ b/frontend/server/public/images/countries/sj.svg @@ -1,7 +1,7 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sk.svg b/frontend/server/public/images/countries/sk.svg index a1953fa6..8dc0c524 100644 --- a/frontend/server/public/images/countries/sk.svg +++ b/frontend/server/public/images/countries/sk.svg @@ -1,9 +1,13 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sl.svg b/frontend/server/public/images/countries/sl.svg index a07baf75..37205b54 100644 --- a/frontend/server/public/images/countries/sl.svg +++ b/frontend/server/public/images/countries/sl.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sm.svg b/frontend/server/public/images/countries/sm.svg index 0892990b..3f5c3b3c 100644 --- a/frontend/server/public/images/countries/sm.svg +++ b/frontend/server/public/images/countries/sm.svg @@ -1,75 +1,133 @@ - - + + - + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - + + + - - - + + + - + - - - - - - - - + + + + + + + + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sn.svg b/frontend/server/public/images/countries/sn.svg index 7c0673d6..0998237f 100644 --- a/frontend/server/public/images/countries/sn.svg +++ b/frontend/server/public/images/countries/sn.svg @@ -1,8 +1,9 @@ - - - + + + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/so.svg b/frontend/server/public/images/countries/so.svg index ae582f19..e6aaf767 100644 --- a/frontend/server/public/images/countries/so.svg +++ b/frontend/server/public/images/countries/so.svg @@ -1,11 +1,12 @@ - + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/social.svg b/frontend/server/public/images/countries/social.svg index 726892e5..d346bb45 100644 --- a/frontend/server/public/images/countries/social.svg +++ b/frontend/server/public/images/countries/social.svg @@ -11,279 +11,279 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sr.svg b/frontend/server/public/images/countries/sr.svg index 5e71c400..a9023115 100644 --- a/frontend/server/public/images/countries/sr.svg +++ b/frontend/server/public/images/countries/sr.svg @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ss.svg b/frontend/server/public/images/countries/ss.svg index 73804d80..48b41344 100644 --- a/frontend/server/public/images/countries/ss.svg +++ b/frontend/server/public/images/countries/ss.svg @@ -1,8 +1,8 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/st.svg b/frontend/server/public/images/countries/st.svg index f2e75c14..6a526ba4 100644 --- a/frontend/server/public/images/countries/st.svg +++ b/frontend/server/public/images/countries/st.svg @@ -1,16 +1,17 @@ - - - - + + + + - - + + - - - - + + + + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sv.svg b/frontend/server/public/images/countries/sv.svg index 3a63913d..58a33f90 100644 --- a/frontend/server/public/images/countries/sv.svg +++ b/frontend/server/public/images/countries/sv.svg @@ -1,594 +1,902 @@ - - - + + + - - - - + + + + - - - - - - - - - - - + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sx.svg b/frontend/server/public/images/countries/sx.svg index 84844e0f..e10328a3 100644 --- a/frontend/server/public/images/countries/sx.svg +++ b/frontend/server/public/images/countries/sx.svg @@ -1,56 +1,107 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sy.svg b/frontend/server/public/images/countries/sy.svg index 29636ae0..d57d2c17 100644 --- a/frontend/server/public/images/countries/sy.svg +++ b/frontend/server/public/images/countries/sy.svg @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/sz.svg b/frontend/server/public/images/countries/sz.svg index 5eef6914..999f611f 100644 --- a/frontend/server/public/images/countries/sz.svg +++ b/frontend/server/public/images/countries/sz.svg @@ -1,34 +1,45 @@ - - - - + + + + - - - + + + - - + + - - + + - - + + - + - + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ta.svg b/frontend/server/public/images/countries/ta.svg index b68ad23c..fd0e43cf 100644 --- a/frontend/server/public/images/countries/ta.svg +++ b/frontend/server/public/images/countries/ta.svg @@ -1,76 +1,137 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tc.svg b/frontend/server/public/images/countries/tc.svg index 89d29bbf..8d73c32c 100644 --- a/frontend/server/public/images/countries/tc.svg +++ b/frontend/server/public/images/countries/tc.svg @@ -1,50 +1,69 @@ - - + + - - + + - - - - + + + + - - + + - - + + - - - + + + - + - - + + - + - - + + - - - - - - - + + + + + + + - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/td.svg b/frontend/server/public/images/countries/td.svg index 9fadf85a..21ae3002 100644 --- a/frontend/server/public/images/countries/td.svg +++ b/frontend/server/public/images/countries/td.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tf.svg b/frontend/server/public/images/countries/tf.svg index 88323d2c..c0c2fb2c 100644 --- a/frontend/server/public/images/countries/tf.svg +++ b/frontend/server/public/images/countries/tf.svg @@ -1,15 +1,17 @@ - + - + - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tg.svg b/frontend/server/public/images/countries/tg.svg index e20f40d8..92d9eb24 100644 --- a/frontend/server/public/images/countries/tg.svg +++ b/frontend/server/public/images/countries/tg.svg @@ -1,14 +1,15 @@ - + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/th.svg b/frontend/server/public/images/countries/th.svg index 1e93a61e..00843d8f 100644 --- a/frontend/server/public/images/countries/th.svg +++ b/frontend/server/public/images/countries/th.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/third.svg b/frontend/server/public/images/countries/third.svg index 5ab93c67..d38e5a36 100644 --- a/frontend/server/public/images/countries/third.svg +++ b/frontend/server/public/images/countries/third.svg @@ -11,46 +11,46 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tj.svg b/frontend/server/public/images/countries/tj.svg index d2ba7333..cd26cc68 100644 --- a/frontend/server/public/images/countries/tj.svg +++ b/frontend/server/public/images/countries/tj.svg @@ -1,22 +1,32 @@ - - - - - - - - - - - - + + + + + + + + + + + + - + - - - + + + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tk.svg b/frontend/server/public/images/countries/tk.svg index 65bab137..6003afcd 100644 --- a/frontend/server/public/images/countries/tk.svg +++ b/frontend/server/public/images/countries/tk.svg @@ -1,5 +1,7 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tl.svg b/frontend/server/public/images/countries/tl.svg index bcfc1612..d72a3e75 100644 --- a/frontend/server/public/images/countries/tl.svg +++ b/frontend/server/public/images/countries/tl.svg @@ -1,13 +1,14 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tm.svg b/frontend/server/public/images/countries/tm.svg index 08792a77..492d1bf9 100644 --- a/frontend/server/public/images/countries/tm.svg +++ b/frontend/server/public/images/countries/tm.svg @@ -1,205 +1,336 @@ - + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tn.svg b/frontend/server/public/images/countries/tn.svg index 6a1989b4..a7dfc8be 100644 --- a/frontend/server/public/images/countries/tn.svg +++ b/frontend/server/public/images/countries/tn.svg @@ -1,4 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/to.svg b/frontend/server/public/images/countries/to.svg index d0723370..2a69e403 100644 --- a/frontend/server/public/images/countries/to.svg +++ b/frontend/server/public/images/countries/to.svg @@ -1,10 +1,10 @@ - - + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tr.svg b/frontend/server/public/images/countries/tr.svg index a92804f8..8bbc3e6f 100644 --- a/frontend/server/public/images/countries/tr.svg +++ b/frontend/server/public/images/countries/tr.svg @@ -1,8 +1,11 @@ - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tt.svg b/frontend/server/public/images/countries/tt.svg index 14adbe04..83cfd141 100644 --- a/frontend/server/public/images/countries/tt.svg +++ b/frontend/server/public/images/countries/tt.svg @@ -1,5 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tv.svg b/frontend/server/public/images/countries/tv.svg index 675210ec..03cce039 100644 --- a/frontend/server/public/images/countries/tv.svg +++ b/frontend/server/public/images/countries/tv.svg @@ -1,9 +1,12 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tw.svg b/frontend/server/public/images/countries/tw.svg index 57fd98b4..3a1a52ad 100644 --- a/frontend/server/public/images/countries/tw.svg +++ b/frontend/server/public/images/countries/tw.svg @@ -1,34 +1,44 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/tz.svg b/frontend/server/public/images/countries/tz.svg index 751c1672..d3c30b5c 100644 --- a/frontend/server/public/images/countries/tz.svg +++ b/frontend/server/public/images/countries/tz.svg @@ -1,13 +1,13 @@ - + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ua.svg b/frontend/server/public/images/countries/ua.svg index a339eb1b..27a6b99c 100644 --- a/frontend/server/public/images/countries/ua.svg +++ b/frontend/server/public/images/countries/ua.svg @@ -1,6 +1,6 @@ - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ug.svg b/frontend/server/public/images/countries/ug.svg index 78252a42..f3748de6 100644 --- a/frontend/server/public/images/countries/ug.svg +++ b/frontend/server/public/images/countries/ug.svg @@ -1,30 +1,48 @@ - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/um.svg b/frontend/server/public/images/countries/um.svg index 5f2822d5..002bb9f9 100644 --- a/frontend/server/public/images/countries/um.svg +++ b/frontend/server/public/images/countries/um.svg @@ -1,15 +1,18 @@ - + - - + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/un.svg b/frontend/server/public/images/countries/un.svg index e4753370..00c31402 100644 --- a/frontend/server/public/images/countries/un.svg +++ b/frontend/server/public/images/countries/un.svg @@ -1,16 +1,25 @@ - - + + - - + + - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/unk.svg b/frontend/server/public/images/countries/unk.svg index 7e2030d1..c960591a 100644 --- a/frontend/server/public/images/countries/unk.svg +++ b/frontend/server/public/images/countries/unk.svg @@ -13,56 +13,56 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - - - image/svg+xml - - - - - - - + + + + image/svg+xml + + + + + + + ? - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/us.svg b/frontend/server/public/images/countries/us.svg index 615946d4..137f1ba7 100644 --- a/frontend/server/public/images/countries/us.svg +++ b/frontend/server/public/images/countries/us.svg @@ -1,9 +1,11 @@ - - - + + + - + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ussr.svg b/frontend/server/public/images/countries/ussr.svg index cdb3d270..6bdaec5e 100644 --- a/frontend/server/public/images/countries/ussr.svg +++ b/frontend/server/public/images/countries/ussr.svg @@ -13,62 +13,62 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - - - image/svg+xml - - - - - - - - - - - - + + + + + image/svg+xml + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/uy.svg b/frontend/server/public/images/countries/uy.svg index 4a54b857..ba7d1cc9 100644 --- a/frontend/server/public/images/countries/uy.svg +++ b/frontend/server/public/images/countries/uy.svg @@ -1,28 +1,35 @@ - - - - + + + + - - - + + + - + - + - - + + - - - + + + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/uz.svg b/frontend/server/public/images/countries/uz.svg index aaf9382a..bc4a402e 100644 --- a/frontend/server/public/images/countries/uz.svg +++ b/frontend/server/public/images/countries/uz.svg @@ -1,30 +1,31 @@ - - - - - - - + + + + + + + - - + + - + - - + + - - + + - - - - - + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/va.svg b/frontend/server/public/images/countries/va.svg index c7d87916..e2934697 100644 --- a/frontend/server/public/images/countries/va.svg +++ b/frontend/server/public/images/countries/va.svg @@ -1,190 +1,251 @@ - - - + + + - - - - - + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/vc.svg b/frontend/server/public/images/countries/vc.svg index 450f6f0a..c532ad7a 100644 --- a/frontend/server/public/images/countries/vc.svg +++ b/frontend/server/public/images/countries/vc.svg @@ -1,8 +1,9 @@ - - - - + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ve.svg b/frontend/server/public/images/countries/ve.svg index 314e7f5f..68c956ac 100644 --- a/frontend/server/public/images/countries/ve.svg +++ b/frontend/server/public/images/countries/ve.svg @@ -1,26 +1,27 @@ - + - - + + - + - - + + - - - + + + - - + + - + - - + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/vg.svg b/frontend/server/public/images/countries/vg.svg index 4d2c3976..a31eae08 100644 --- a/frontend/server/public/images/countries/vg.svg +++ b/frontend/server/public/images/countries/vg.svg @@ -1,59 +1,80 @@ - + - - - + + + - - - - - - + + + + + + - - + + - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + + - - - - + + + + - - - - + + + + - + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/vi.svg b/frontend/server/public/images/countries/vi.svg index 3a64338e..d27fe04f 100644 --- a/frontend/server/public/images/countries/vi.svg +++ b/frontend/server/public/images/countries/vi.svg @@ -1,28 +1,49 @@ - - - + + + - - - - + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/vn.svg b/frontend/server/public/images/countries/vn.svg index 24bedc50..5291f28f 100644 --- a/frontend/server/public/images/countries/vn.svg +++ b/frontend/server/public/images/countries/vn.svg @@ -1,11 +1,12 @@ - + - - + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/vu.svg b/frontend/server/public/images/countries/vu.svg index efcff895..4a74d7ed 100644 --- a/frontend/server/public/images/countries/vu.svg +++ b/frontend/server/public/images/countries/vu.svg @@ -1,21 +1,25 @@ - + - + - - + + - - + + - + - - + + - + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/wf.svg b/frontend/server/public/images/countries/wf.svg index 57feb3a5..19f1d93a 100644 --- a/frontend/server/public/images/countries/wf.svg +++ b/frontend/server/public/images/countries/wf.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ws.svg b/frontend/server/public/images/countries/ws.svg index 0e758a7a..3bf655f7 100644 --- a/frontend/server/public/images/countries/ws.svg +++ b/frontend/server/public/images/countries/ws.svg @@ -1,7 +1,8 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/xk.svg b/frontend/server/public/images/countries/xk.svg index de6ef4da..7c7bdb86 100644 --- a/frontend/server/public/images/countries/xk.svg +++ b/frontend/server/public/images/countries/xk.svg @@ -1,5 +1,7 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/xx.svg b/frontend/server/public/images/countries/xx.svg index 9333be36..0bd5e9a6 100644 --- a/frontend/server/public/images/countries/xx.svg +++ b/frontend/server/public/images/countries/xx.svg @@ -1,4 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/ye.svg b/frontend/server/public/images/countries/ye.svg index 61f0ed61..b57affd9 100644 --- a/frontend/server/public/images/countries/ye.svg +++ b/frontend/server/public/images/countries/ye.svg @@ -1,7 +1,7 @@ - - - + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/yt.svg b/frontend/server/public/images/countries/yt.svg index 5ea2f648..f4308aa4 100644 --- a/frontend/server/public/images/countries/yt.svg +++ b/frontend/server/public/images/countries/yt.svg @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/yug.svg b/frontend/server/public/images/countries/yug.svg index 657cc1b5..5af7a0d3 100644 --- a/frontend/server/public/images/countries/yug.svg +++ b/frontend/server/public/images/countries/yug.svg @@ -11,43 +11,43 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> - - - - - - + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/countries/za.svg b/frontend/server/public/images/countries/za.svg index aa54beb8..35012f44 100644 --- a/frontend/server/public/images/countries/za.svg +++ b/frontend/server/public/images/countries/za.svg @@ -1,17 +1,19 @@ - + - - - - - - + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/zm.svg b/frontend/server/public/images/countries/zm.svg index b8fdd63c..1ed8e993 100644 --- a/frontend/server/public/images/countries/zm.svg +++ b/frontend/server/public/images/countries/zm.svg @@ -1,27 +1,37 @@ - + - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/countries/zw.svg b/frontend/server/public/images/countries/zw.svg index 5c197469..a785d961 100644 --- a/frontend/server/public/images/countries/zw.svg +++ b/frontend/server/public/images/countries/zw.svg @@ -1,21 +1,26 @@ - + - + - - - - - - - - - - - - + + + + + + + + + + + + - + \ No newline at end of file diff --git a/frontend/server/public/images/favicons/site.webmanifest b/frontend/server/public/images/favicons/site.webmanifest index 44c84eb7..85fe3e4b 100644 --- a/frontend/server/public/images/favicons/site.webmanifest +++ b/frontend/server/public/images/favicons/site.webmanifest @@ -1,16 +1,19 @@ { - "name": "DCS Olympus", - "short_name": "DCS Olympus", - "icons": [{ - "src": "/images/favicons/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, { - "src": "/images/favicons/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - }], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} \ No newline at end of file + "name": "DCS Olympus", + "short_name": "DCS Olympus", + "icons": [ + { + "src": "/images/favicons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/images/favicons/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/frontend/server/public/images/icon.png b/frontend/server/public/images/icon.png index dc5c994e..9e11ba9c 100644 Binary files a/frontend/server/public/images/icon.png and b/frontend/server/public/images/icon.png differ diff --git a/frontend/server/public/images/icons/altitude.svg b/frontend/server/public/images/icons/altitude.svg new file mode 100644 index 00000000..e63b1609 --- /dev/null +++ b/frontend/server/public/images/icons/altitude.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/arrow-pointer-solid.svg b/frontend/server/public/images/icons/arrow-pointer-solid.svg new file mode 100644 index 00000000..5f9a32d6 --- /dev/null +++ b/frontend/server/public/images/icons/arrow-pointer-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/arrows-to-eye-solid.svg b/frontend/server/public/images/icons/arrows-to-eye-solid.svg new file mode 100644 index 00000000..d54355c9 --- /dev/null +++ b/frontend/server/public/images/icons/arrows-to-eye-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/bomb-solid.svg b/frontend/server/public/images/icons/bomb-solid.svg new file mode 100644 index 00000000..a456f0ec --- /dev/null +++ b/frontend/server/public/images/icons/bomb-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/burst-solid.svg b/frontend/server/public/images/icons/burst-solid.svg new file mode 100644 index 00000000..99c49c2a --- /dev/null +++ b/frontend/server/public/images/icons/burst-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/camera.svg b/frontend/server/public/images/icons/camera.svg new file mode 100644 index 00000000..71e162d3 --- /dev/null +++ b/frontend/server/public/images/icons/camera.svg @@ -0,0 +1,36 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/check_square.svg b/frontend/server/public/images/icons/check_square.svg new file mode 100644 index 00000000..7c4452e1 --- /dev/null +++ b/frontend/server/public/images/icons/check_square.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/chevron-down-warning.svg b/frontend/server/public/images/icons/chevron-down-warning.svg new file mode 100644 index 00000000..388d5c1d --- /dev/null +++ b/frontend/server/public/images/icons/chevron-down-warning.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/chevron-down.svg b/frontend/server/public/images/icons/chevron-down.svg new file mode 100644 index 00000000..fe9fdcf7 --- /dev/null +++ b/frontend/server/public/images/icons/chevron-down.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/circle-info-solid.svg b/frontend/server/public/images/icons/circle-info-solid.svg new file mode 100644 index 00000000..514d6e04 --- /dev/null +++ b/frontend/server/public/images/icons/circle-info-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/circle-question-regular.svg b/frontend/server/public/images/icons/circle-question-regular.svg new file mode 100644 index 00000000..985d4582 --- /dev/null +++ b/frontend/server/public/images/icons/circle-question-regular.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/climb.svg b/frontend/server/public/images/icons/climb.svg new file mode 100644 index 00000000..4e13c498 --- /dev/null +++ b/frontend/server/public/images/icons/climb.svg @@ -0,0 +1,42 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/crosshairs-solid.svg b/frontend/server/public/images/icons/crosshairs-solid.svg new file mode 100644 index 00000000..1f86a76f --- /dev/null +++ b/frontend/server/public/images/icons/crosshairs-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/descent.svg b/frontend/server/public/images/icons/descent.svg new file mode 100644 index 00000000..d01767ac --- /dev/null +++ b/frontend/server/public/images/icons/descent.svg @@ -0,0 +1,42 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/diamond.svg b/frontend/server/public/images/icons/diamond.svg new file mode 100644 index 00000000..280cf5a9 --- /dev/null +++ b/frontend/server/public/images/icons/diamond.svg @@ -0,0 +1,73 @@ + + + + + + image/svg+xml + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/echelon-lh.svg b/frontend/server/public/images/icons/echelon-lh.svg new file mode 100644 index 00000000..1e858b89 --- /dev/null +++ b/frontend/server/public/images/icons/echelon-lh.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/echelon-rh.svg b/frontend/server/public/images/icons/echelon-rh.svg new file mode 100644 index 00000000..ed2d7c99 --- /dev/null +++ b/frontend/server/public/images/icons/echelon-rh.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/echelon.svg b/frontend/server/public/images/icons/echelon.svg new file mode 100644 index 00000000..0aebcc15 --- /dev/null +++ b/frontend/server/public/images/icons/echelon.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/explosion-solid.svg b/frontend/server/public/images/icons/explosion-solid.svg new file mode 100644 index 00000000..90fd17e9 --- /dev/null +++ b/frontend/server/public/images/icons/explosion-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/eye-solid.svg b/frontend/server/public/images/icons/eye-solid.svg new file mode 100644 index 00000000..56ded06d --- /dev/null +++ b/frontend/server/public/images/icons/eye-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/fire-solid.svg b/frontend/server/public/images/icons/fire-solid.svg new file mode 100644 index 00000000..909b2621 --- /dev/null +++ b/frontend/server/public/images/icons/fire-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/follow.svg b/frontend/server/public/images/icons/follow.svg new file mode 100644 index 00000000..ae78c6c6 --- /dev/null +++ b/frontend/server/public/images/icons/follow.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/formation-end.svg b/frontend/server/public/images/icons/formation-end.svg new file mode 100644 index 00000000..d56674d7 --- /dev/null +++ b/frontend/server/public/images/icons/formation-end.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/formation-middle.svg b/frontend/server/public/images/icons/formation-middle.svg new file mode 100644 index 00000000..dc8691fa --- /dev/null +++ b/frontend/server/public/images/icons/formation-middle.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/front.svg b/frontend/server/public/images/icons/front.svg new file mode 100644 index 00000000..c96b0dbf --- /dev/null +++ b/frontend/server/public/images/icons/front.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/fuel.svg b/frontend/server/public/images/icons/fuel.svg new file mode 100644 index 00000000..b7f13cc4 --- /dev/null +++ b/frontend/server/public/images/icons/fuel.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/gamepad-solid.svg b/frontend/server/public/images/icons/gamepad-solid.svg new file mode 100644 index 00000000..c250ecc4 --- /dev/null +++ b/frontend/server/public/images/icons/gamepad-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/gears-solid.svg b/frontend/server/public/images/icons/gears-solid.svg new file mode 100644 index 00000000..717e3c8c --- /dev/null +++ b/frontend/server/public/images/icons/gears-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/grip-lines-solid.svg b/frontend/server/public/images/icons/grip-lines-solid.svg new file mode 100644 index 00000000..33e7a98f --- /dev/null +++ b/frontend/server/public/images/icons/grip-lines-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/group-ground.svg b/frontend/server/public/images/icons/group-ground.svg new file mode 100644 index 00000000..261ae6cb --- /dev/null +++ b/frontend/server/public/images/icons/group-ground.svg @@ -0,0 +1,78 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/group-navy.svg b/frontend/server/public/images/icons/group-navy.svg new file mode 100644 index 00000000..06f47811 --- /dev/null +++ b/frontend/server/public/images/icons/group-navy.svg @@ -0,0 +1,66 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/hand-solid.svg b/frontend/server/public/images/icons/hand-solid.svg new file mode 100644 index 00000000..835f7f77 --- /dev/null +++ b/frontend/server/public/images/icons/hand-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/heading.svg b/frontend/server/public/images/icons/heading.svg new file mode 100644 index 00000000..8cd46189 --- /dev/null +++ b/frontend/server/public/images/icons/heading.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/health.svg b/frontend/server/public/images/icons/health.svg new file mode 100644 index 00000000..35246c8f --- /dev/null +++ b/frontend/server/public/images/icons/health.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/jet-fighter-up-solid.svg b/frontend/server/public/images/icons/jet-fighter-up-solid.svg new file mode 100644 index 00000000..df7b6a38 --- /dev/null +++ b/frontend/server/public/images/icons/jet-fighter-up-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/keyboard-solid.svg b/frontend/server/public/images/icons/keyboard-solid.svg new file mode 100644 index 00000000..25ca0376 --- /dev/null +++ b/frontend/server/public/images/icons/keyboard-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/land-at-point.svg b/frontend/server/public/images/icons/land-at-point.svg new file mode 100644 index 00000000..1c3ccf49 --- /dev/null +++ b/frontend/server/public/images/icons/land-at-point.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/line-abreast.svg b/frontend/server/public/images/icons/line-abreast.svg new file mode 100644 index 00000000..cf26c2fd --- /dev/null +++ b/frontend/server/public/images/icons/line-abreast.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/map-source.svg b/frontend/server/public/images/icons/map-source.svg new file mode 100644 index 00000000..0fa76064 --- /dev/null +++ b/frontend/server/public/images/icons/map-source.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/miss-blue.svg b/frontend/server/public/images/icons/miss-blue.svg new file mode 100644 index 00000000..29a23701 --- /dev/null +++ b/frontend/server/public/images/icons/miss-blue.svg @@ -0,0 +1,44 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/miss-red.svg b/frontend/server/public/images/icons/miss-red.svg new file mode 100644 index 00000000..5dfea3b2 --- /dev/null +++ b/frontend/server/public/images/icons/miss-red.svg @@ -0,0 +1,44 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/miss.svg b/frontend/server/public/images/icons/miss.svg new file mode 100644 index 00000000..9dc33158 --- /dev/null +++ b/frontend/server/public/images/icons/miss.svg @@ -0,0 +1,44 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/napalm.svg b/frontend/server/public/images/icons/napalm.svg new file mode 100644 index 00000000..09ecf9b9 --- /dev/null +++ b/frontend/server/public/images/icons/napalm.svg @@ -0,0 +1,43 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/person-military-pointing-solid.svg b/frontend/server/public/images/icons/person-military-pointing-solid.svg new file mode 100644 index 00000000..08a03dc4 --- /dev/null +++ b/frontend/server/public/images/icons/person-military-pointing-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/pin.svg b/frontend/server/public/images/icons/pin.svg new file mode 100644 index 00000000..0815ae07 --- /dev/null +++ b/frontend/server/public/images/icons/pin.svg @@ -0,0 +1,46 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/plane.svg b/frontend/server/public/images/icons/plane.svg new file mode 100644 index 00000000..ed567d52 --- /dev/null +++ b/frontend/server/public/images/icons/plane.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/ruler.svg b/frontend/server/public/images/icons/ruler.svg new file mode 100644 index 00000000..72ba6280 --- /dev/null +++ b/frontend/server/public/images/icons/ruler.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/scenic-blue.svg b/frontend/server/public/images/icons/scenic-blue.svg new file mode 100644 index 00000000..d148ede8 --- /dev/null +++ b/frontend/server/public/images/icons/scenic-blue.svg @@ -0,0 +1,51 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/scenic-red.svg b/frontend/server/public/images/icons/scenic-red.svg new file mode 100644 index 00000000..3c441582 --- /dev/null +++ b/frontend/server/public/images/icons/scenic-red.svg @@ -0,0 +1,51 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/scenic.svg b/frontend/server/public/images/icons/scenic.svg new file mode 100644 index 00000000..72e9fe9e --- /dev/null +++ b/frontend/server/public/images/icons/scenic.svg @@ -0,0 +1,51 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/secondaries.svg b/frontend/server/public/images/icons/secondaries.svg new file mode 100644 index 00000000..9fd3b61b --- /dev/null +++ b/frontend/server/public/images/icons/secondaries.svg @@ -0,0 +1,51 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/smog-solid.svg b/frontend/server/public/images/icons/smog-solid.svg new file mode 100644 index 00000000..1d80749b --- /dev/null +++ b/frontend/server/public/images/icons/smog-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/speed-decrease.svg b/frontend/server/public/images/icons/speed-decrease.svg new file mode 100644 index 00000000..9c8592a2 --- /dev/null +++ b/frontend/server/public/images/icons/speed-decrease.svg @@ -0,0 +1,59 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/speed-increase.svg b/frontend/server/public/images/icons/speed-increase.svg new file mode 100644 index 00000000..d0dab688 --- /dev/null +++ b/frontend/server/public/images/icons/speed-increase.svg @@ -0,0 +1,58 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/speed.svg b/frontend/server/public/images/icons/speed.svg new file mode 100644 index 00000000..e90d1b16 --- /dev/null +++ b/frontend/server/public/images/icons/speed.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/square-check-solid.svg b/frontend/server/public/images/icons/square-check-solid.svg new file mode 100644 index 00000000..fd49d800 --- /dev/null +++ b/frontend/server/public/images/icons/square-check-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/square-regular.svg b/frontend/server/public/images/icons/square-regular.svg new file mode 100644 index 00000000..e79a57f4 --- /dev/null +++ b/frontend/server/public/images/icons/square-regular.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/sword.svg b/frontend/server/public/images/icons/sword.svg new file mode 100644 index 00000000..24b970c4 --- /dev/null +++ b/frontend/server/public/images/icons/sword.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/trail.svg b/frontend/server/public/images/icons/trail.svg new file mode 100644 index 00000000..2d312dd6 --- /dev/null +++ b/frontend/server/public/images/icons/trail.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/trash-can-regular.svg b/frontend/server/public/images/icons/trash-can-regular.svg new file mode 100644 index 00000000..9c583fc0 --- /dev/null +++ b/frontend/server/public/images/icons/trash-can-regular.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/triangle-exclamation-solid.svg b/frontend/server/public/images/icons/triangle-exclamation-solid.svg new file mode 100644 index 00000000..8fee83a8 --- /dev/null +++ b/frontend/server/public/images/icons/triangle-exclamation-solid.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/icons/white-phosphorous.svg b/frontend/server/public/images/icons/white-phosphorous.svg new file mode 100644 index 00000000..acacc33b --- /dev/null +++ b/frontend/server/public/images/icons/white-phosphorous.svg @@ -0,0 +1,43 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/markers/airbase.svg b/frontend/server/public/images/markers/airbase.svg new file mode 100644 index 00000000..aef7666e --- /dev/null +++ b/frontend/server/public/images/markers/airbase.svg @@ -0,0 +1,83 @@ + + + + + + image/svg+xml + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/markers/bullseye.svg b/frontend/server/public/images/markers/bullseye.svg new file mode 100644 index 00000000..7e86f68e --- /dev/null +++ b/frontend/server/public/images/markers/bullseye.svg @@ -0,0 +1,45 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/markers/draw.svg b/frontend/server/public/images/markers/draw.svg new file mode 100644 index 00000000..d00ac7dd --- /dev/null +++ b/frontend/server/public/images/markers/draw.svg @@ -0,0 +1,40 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/markers/marker-icon.png b/frontend/server/public/images/markers/marker-icon.png new file mode 100644 index 00000000..950edf24 Binary files /dev/null and b/frontend/server/public/images/markers/marker-icon.png differ diff --git a/frontend/server/public/images/markers/marker-shadow.png b/frontend/server/public/images/markers/marker-shadow.png new file mode 100644 index 00000000..9fd29795 Binary files /dev/null and b/frontend/server/public/images/markers/marker-shadow.png differ diff --git a/frontend/server/public/images/markers/move.svg b/frontend/server/public/images/markers/move.svg new file mode 100644 index 00000000..254f5e0f --- /dev/null +++ b/frontend/server/public/images/markers/move.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/markers/smoke.svg b/frontend/server/public/images/markers/smoke.svg new file mode 100644 index 00000000..f49f1c44 --- /dev/null +++ b/frontend/server/public/images/markers/smoke.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/markers/target.svg b/frontend/server/public/images/markers/target.svg new file mode 100644 index 00000000..1f740173 --- /dev/null +++ b/frontend/server/public/images/markers/target.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/parrot/parrot.png b/frontend/server/public/images/parrot/parrot.png new file mode 100644 index 00000000..a61beac3 Binary files /dev/null and b/frontend/server/public/images/parrot/parrot.png differ diff --git a/frontend/server/public/images/splash/1.jpg b/frontend/server/public/images/splash/1.jpg new file mode 100644 index 00000000..93121bcb Binary files /dev/null and b/frontend/server/public/images/splash/1.jpg differ diff --git a/frontend/server/public/images/splash/2.jpg b/frontend/server/public/images/splash/2.jpg new file mode 100644 index 00000000..e211ee22 Binary files /dev/null and b/frontend/server/public/images/splash/2.jpg differ diff --git a/frontend/server/public/images/splash/3.jpg b/frontend/server/public/images/splash/3.jpg new file mode 100644 index 00000000..890f186b Binary files /dev/null and b/frontend/server/public/images/splash/3.jpg differ diff --git a/frontend/server/public/images/splash/4.jpg b/frontend/server/public/images/splash/4.jpg new file mode 100644 index 00000000..d8775404 Binary files /dev/null and b/frontend/server/public/images/splash/4.jpg differ diff --git a/frontend/server/public/images/splash/5.jpg b/frontend/server/public/images/splash/5.jpg new file mode 100644 index 00000000..a4e0c084 Binary files /dev/null and b/frontend/server/public/images/splash/5.jpg differ diff --git a/frontend/server/public/images/splash/6.jpg b/frontend/server/public/images/splash/6.jpg new file mode 100644 index 00000000..5b5e3498 Binary files /dev/null and b/frontend/server/public/images/splash/6.jpg differ diff --git a/frontend/server/public/images/splash/7.jpg b/frontend/server/public/images/splash/7.jpg new file mode 100644 index 00000000..bee73fda Binary files /dev/null and b/frontend/server/public/images/splash/7.jpg differ diff --git a/frontend/server/public/images/splash/8.jpg b/frontend/server/public/images/splash/8.jpg new file mode 100644 index 00000000..eafdf2a1 Binary files /dev/null and b/frontend/server/public/images/splash/8.jpg differ diff --git a/frontend/server/public/images/states/attack.svg b/frontend/server/public/images/states/attack.svg new file mode 100644 index 00000000..daabf0c2 --- /dev/null +++ b/frontend/server/public/images/states/attack.svg @@ -0,0 +1,53 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/awacs.svg b/frontend/server/public/images/states/awacs.svg new file mode 100644 index 00000000..669d364f --- /dev/null +++ b/frontend/server/public/images/states/awacs.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/dcs.svg b/frontend/server/public/images/states/dcs.svg new file mode 100644 index 00000000..649c3d82 --- /dev/null +++ b/frontend/server/public/images/states/dcs.svg @@ -0,0 +1,71 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/follow.svg b/frontend/server/public/images/states/follow.svg new file mode 100644 index 00000000..61c47e3c --- /dev/null +++ b/frontend/server/public/images/states/follow.svg @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/human.svg b/frontend/server/public/images/states/human.svg new file mode 100644 index 00000000..54fe73bb --- /dev/null +++ b/frontend/server/public/images/states/human.svg @@ -0,0 +1,51 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/idle.svg b/frontend/server/public/images/states/idle.svg new file mode 100644 index 00000000..302f60e3 --- /dev/null +++ b/frontend/server/public/images/states/idle.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/land-at-point.svg b/frontend/server/public/images/states/land-at-point.svg new file mode 100644 index 00000000..8d8c0c3c --- /dev/null +++ b/frontend/server/public/images/states/land-at-point.svg @@ -0,0 +1,51 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/miss-on-purpose.svg b/frontend/server/public/images/states/miss-on-purpose.svg new file mode 100644 index 00000000..c1d9a11a --- /dev/null +++ b/frontend/server/public/images/states/miss-on-purpose.svg @@ -0,0 +1,53 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/states/no-task.svg b/frontend/server/public/images/states/no-task.svg new file mode 100644 index 00000000..70e75414 --- /dev/null +++ b/frontend/server/public/images/states/no-task.svg @@ -0,0 +1,53 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/off.svg b/frontend/server/public/images/states/off.svg new file mode 100644 index 00000000..333b0d85 --- /dev/null +++ b/frontend/server/public/images/states/off.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/refuel.svg b/frontend/server/public/images/states/refuel.svg new file mode 100644 index 00000000..cb805fd2 --- /dev/null +++ b/frontend/server/public/images/states/refuel.svg @@ -0,0 +1,61 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/rtb.svg b/frontend/server/public/images/states/rtb.svg new file mode 100644 index 00000000..c394967e --- /dev/null +++ b/frontend/server/public/images/states/rtb.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/frontend/server/public/images/states/scenic-aaa.svg b/frontend/server/public/images/states/scenic-aaa.svg new file mode 100644 index 00000000..8344fa72 --- /dev/null +++ b/frontend/server/public/images/states/scenic-aaa.svg @@ -0,0 +1,77 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/states/simulate-fire-fight.svg b/frontend/server/public/images/states/simulate-fire-fight.svg new file mode 100644 index 00000000..30590b9b --- /dev/null +++ b/frontend/server/public/images/states/simulate-fire-fight.svg @@ -0,0 +1,45 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/states/tanker.svg b/frontend/server/public/images/states/tanker.svg new file mode 100644 index 00000000..3bce8241 --- /dev/null +++ b/frontend/server/public/images/states/tanker.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/a-10.png b/frontend/server/public/images/units/a-10.png index 748be4cb..bf231f50 100644 Binary files a/frontend/server/public/images/units/a-10.png and b/frontend/server/public/images/units/a-10.png differ diff --git a/frontend/server/public/images/units/a-20.png b/frontend/server/public/images/units/a-20.png index d0fb8a0c..b9d64924 100644 Binary files a/frontend/server/public/images/units/a-20.png and b/frontend/server/public/images/units/a-20.png differ diff --git a/frontend/server/public/images/units/a-29.png b/frontend/server/public/images/units/a-29.png index 8f2ead6e..71b9b390 100644 Binary files a/frontend/server/public/images/units/a-29.png and b/frontend/server/public/images/units/a-29.png differ diff --git a/frontend/server/public/images/units/a-4.png b/frontend/server/public/images/units/a-4.png index dadcb05c..d846c5b2 100644 Binary files a/frontend/server/public/images/units/a-4.png and b/frontend/server/public/images/units/a-4.png differ diff --git a/frontend/server/public/images/units/a-400.png b/frontend/server/public/images/units/a-400.png index 71863ac1..424c0e58 100644 Binary files a/frontend/server/public/images/units/a-400.png and b/frontend/server/public/images/units/a-400.png differ diff --git a/frontend/server/public/images/units/a-50.png b/frontend/server/public/images/units/a-50.png index a14b837a..96292111 100644 Binary files a/frontend/server/public/images/units/a-50.png and b/frontend/server/public/images/units/a-50.png differ diff --git a/frontend/server/public/images/units/a-6.png b/frontend/server/public/images/units/a-6.png index 8c198a7e..ad4fe2cb 100644 Binary files a/frontend/server/public/images/units/a-6.png and b/frontend/server/public/images/units/a-6.png differ diff --git a/frontend/server/public/images/units/ah-1.png b/frontend/server/public/images/units/ah-1.png index 4d1b3b40..39c3c73e 100644 Binary files a/frontend/server/public/images/units/ah-1.png and b/frontend/server/public/images/units/ah-1.png differ diff --git a/frontend/server/public/images/units/ah-64.png b/frontend/server/public/images/units/ah-64.png index ba5f43b6..b56b62bb 100644 Binary files a/frontend/server/public/images/units/ah-64.png and b/frontend/server/public/images/units/ah-64.png differ diff --git a/frontend/server/public/images/units/airUnit.png b/frontend/server/public/images/units/airUnit.png index 6578221b..29d28433 100644 Binary files a/frontend/server/public/images/units/airUnit.png and b/frontend/server/public/images/units/airUnit.png differ diff --git a/frontend/server/public/images/units/aircraft.svg b/frontend/server/public/images/units/aircraft.svg new file mode 100644 index 00000000..eefd55d1 --- /dev/null +++ b/frontend/server/public/images/units/aircraft.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/airliner2engine.png b/frontend/server/public/images/units/airliner2engine.png index ae27a626..c296d125 100644 Binary files a/frontend/server/public/images/units/airliner2engine.png and b/frontend/server/public/images/units/airliner2engine.png differ diff --git a/frontend/server/public/images/units/an-26.png b/frontend/server/public/images/units/an-26.png index 2976fdee..0d7be716 100644 Binary files a/frontend/server/public/images/units/an-26.png and b/frontend/server/public/images/units/an-26.png differ diff --git a/frontend/server/public/images/units/av8bna.png b/frontend/server/public/images/units/av8bna.png index bb3fc845..194c13ec 100644 Binary files a/frontend/server/public/images/units/av8bna.png and b/frontend/server/public/images/units/av8bna.png differ diff --git a/frontend/server/public/images/units/b-1.png b/frontend/server/public/images/units/b-1.png index dda58612..964bfb59 100644 Binary files a/frontend/server/public/images/units/b-1.png and b/frontend/server/public/images/units/b-1.png differ diff --git a/frontend/server/public/images/units/b-17.png b/frontend/server/public/images/units/b-17.png index a1515b20..1c0a4dbf 100644 Binary files a/frontend/server/public/images/units/b-17.png and b/frontend/server/public/images/units/b-17.png differ diff --git a/frontend/server/public/images/units/b-2.png b/frontend/server/public/images/units/b-2.png index e68ac71f..afcc4241 100644 Binary files a/frontend/server/public/images/units/b-2.png and b/frontend/server/public/images/units/b-2.png differ diff --git a/frontend/server/public/images/units/b-52.png b/frontend/server/public/images/units/b-52.png index ebc22079..63bfd5d3 100644 Binary files a/frontend/server/public/images/units/b-52.png and b/frontend/server/public/images/units/b-52.png differ diff --git a/frontend/server/public/images/units/b707.png b/frontend/server/public/images/units/b707.png index f8496dd2..267423fe 100644 Binary files a/frontend/server/public/images/units/b707.png and b/frontend/server/public/images/units/b707.png differ diff --git a/frontend/server/public/images/units/bf109.png b/frontend/server/public/images/units/bf109.png index e0d3691c..a4ea8316 100644 Binary files a/frontend/server/public/images/units/bf109.png and b/frontend/server/public/images/units/bf109.png differ diff --git a/frontend/server/public/images/units/bomb.svg b/frontend/server/public/images/units/bomb.svg new file mode 100644 index 00000000..d13bad6a --- /dev/null +++ b/frontend/server/public/images/units/bomb.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/c-101.png b/frontend/server/public/images/units/c-101.png index e4372e90..546f8d56 100644 Binary files a/frontend/server/public/images/units/c-101.png and b/frontend/server/public/images/units/c-101.png differ diff --git a/frontend/server/public/images/units/c-130.png b/frontend/server/public/images/units/c-130.png index 74f98897..fd15e590 100644 Binary files a/frontend/server/public/images/units/c-130.png and b/frontend/server/public/images/units/c-130.png differ diff --git a/frontend/server/public/images/units/c-17.png b/frontend/server/public/images/units/c-17.png index 4339ab18..ec37926c 100644 Binary files a/frontend/server/public/images/units/c-17.png and b/frontend/server/public/images/units/c-17.png differ diff --git a/frontend/server/public/images/units/c-5.png b/frontend/server/public/images/units/c-5.png index 00fccd57..c864a11f 100644 Binary files a/frontend/server/public/images/units/c-5.png and b/frontend/server/public/images/units/c-5.png differ diff --git a/frontend/server/public/images/units/ch-47.png b/frontend/server/public/images/units/ch-47.png index 9a1ecd22..96c4ffb5 100644 Binary files a/frontend/server/public/images/units/ch-47.png and b/frontend/server/public/images/units/ch-47.png differ diff --git a/frontend/server/public/images/units/ch-53.png b/frontend/server/public/images/units/ch-53.png index 64a2b083..8327da78 100644 Binary files a/frontend/server/public/images/units/ch-53.png and b/frontend/server/public/images/units/ch-53.png differ diff --git a/frontend/server/public/images/units/death.svg b/frontend/server/public/images/units/death.svg new file mode 100644 index 00000000..fb680f06 --- /dev/null +++ b/frontend/server/public/images/units/death.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/e-2.png b/frontend/server/public/images/units/e-2.png index fc797e9e..b2c4a30b 100644 Binary files a/frontend/server/public/images/units/e-2.png and b/frontend/server/public/images/units/e-2.png differ diff --git a/frontend/server/public/images/units/e-3.png b/frontend/server/public/images/units/e-3.png index 1967a347..c7385b45 100644 Binary files a/frontend/server/public/images/units/e-3.png and b/frontend/server/public/images/units/e-3.png differ diff --git a/frontend/server/public/images/units/eurofighter.png b/frontend/server/public/images/units/eurofighter.png index f18076e1..fc0ee314 100644 Binary files a/frontend/server/public/images/units/eurofighter.png and b/frontend/server/public/images/units/eurofighter.png differ diff --git a/frontend/server/public/images/units/f-1.png b/frontend/server/public/images/units/f-1.png index c61eb2ad..03ef0988 100644 Binary files a/frontend/server/public/images/units/f-1.png and b/frontend/server/public/images/units/f-1.png differ diff --git a/frontend/server/public/images/units/f-111.png b/frontend/server/public/images/units/f-111.png index c424ad6b..b80dde96 100644 Binary files a/frontend/server/public/images/units/f-111.png and b/frontend/server/public/images/units/f-111.png differ diff --git a/frontend/server/public/images/units/f-117.png b/frontend/server/public/images/units/f-117.png index 306133d4..37cbc2c7 100644 Binary files a/frontend/server/public/images/units/f-117.png and b/frontend/server/public/images/units/f-117.png differ diff --git a/frontend/server/public/images/units/f-14.png b/frontend/server/public/images/units/f-14.png index d7af7621..78a14e12 100644 Binary files a/frontend/server/public/images/units/f-14.png and b/frontend/server/public/images/units/f-14.png differ diff --git a/frontend/server/public/images/units/f-15.png b/frontend/server/public/images/units/f-15.png index 60e26c1b..4293dc9f 100644 Binary files a/frontend/server/public/images/units/f-15.png and b/frontend/server/public/images/units/f-15.png differ diff --git a/frontend/server/public/images/units/f-16c.png b/frontend/server/public/images/units/f-16c.png index a74de3c0..1a60dc6b 100644 Binary files a/frontend/server/public/images/units/f-16c.png and b/frontend/server/public/images/units/f-16c.png differ diff --git a/frontend/server/public/images/units/f-22.png b/frontend/server/public/images/units/f-22.png index 5f210d30..8f269b17 100644 Binary files a/frontend/server/public/images/units/f-22.png and b/frontend/server/public/images/units/f-22.png differ diff --git a/frontend/server/public/images/units/f-35.png b/frontend/server/public/images/units/f-35.png index 196283fc..0dc21a13 100644 Binary files a/frontend/server/public/images/units/f-35.png and b/frontend/server/public/images/units/f-35.png differ diff --git a/frontend/server/public/images/units/f-4.png b/frontend/server/public/images/units/f-4.png index 21784012..12739dbd 100644 Binary files a/frontend/server/public/images/units/f-4.png and b/frontend/server/public/images/units/f-4.png differ diff --git a/frontend/server/public/images/units/f-5.png b/frontend/server/public/images/units/f-5.png index 087bff8c..96a0fd9a 100644 Binary files a/frontend/server/public/images/units/f-5.png and b/frontend/server/public/images/units/f-5.png differ diff --git a/frontend/server/public/images/units/f-86.png b/frontend/server/public/images/units/f-86.png index ce576340..6ec3c491 100644 Binary files a/frontend/server/public/images/units/f-86.png and b/frontend/server/public/images/units/f-86.png differ diff --git a/frontend/server/public/images/units/fa-18c.png b/frontend/server/public/images/units/fa-18c.png index d6856033..2f11a356 100644 Binary files a/frontend/server/public/images/units/fa-18c.png and b/frontend/server/public/images/units/fa-18c.png differ diff --git a/frontend/server/public/images/units/fw190.png b/frontend/server/public/images/units/fw190.png index 8bc95546..505a15c2 100644 Binary files a/frontend/server/public/images/units/fw190.png and b/frontend/server/public/images/units/fw190.png differ diff --git a/frontend/server/public/images/units/general1.png b/frontend/server/public/images/units/general1.png index bf0bc2bd..2e5e95af 100644 Binary files a/frontend/server/public/images/units/general1.png and b/frontend/server/public/images/units/general1.png differ diff --git a/frontend/server/public/images/units/gripen.png b/frontend/server/public/images/units/gripen.png index 0d5812b2..34eb854e 100644 Binary files a/frontend/server/public/images/units/gripen.png and b/frontend/server/public/images/units/gripen.png differ diff --git a/frontend/server/public/images/units/groundunit-aaa.svg b/frontend/server/public/images/units/groundunit-aaa.svg new file mode 100644 index 00000000..beeb5fa6 --- /dev/null +++ b/frontend/server/public/images/units/groundunit-aaa.svg @@ -0,0 +1,17 @@ + + + + A + + A + A + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-apc.svg b/frontend/server/public/images/units/groundunit-apc.svg new file mode 100644 index 00000000..9f227819 --- /dev/null +++ b/frontend/server/public/images/units/groundunit-apc.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-artillery.svg b/frontend/server/public/images/units/groundunit-artillery.svg new file mode 100644 index 00000000..78a5be80 --- /dev/null +++ b/frontend/server/public/images/units/groundunit-artillery.svg @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-ewr.svg b/frontend/server/public/images/units/groundunit-ewr.svg new file mode 100644 index 00000000..fa2775fc --- /dev/null +++ b/frontend/server/public/images/units/groundunit-ewr.svg @@ -0,0 +1,60 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-infantry.svg b/frontend/server/public/images/units/groundunit-infantry.svg new file mode 100644 index 00000000..92268c40 --- /dev/null +++ b/frontend/server/public/images/units/groundunit-infantry.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-sam-launcher.svg b/frontend/server/public/images/units/groundunit-sam-launcher.svg new file mode 100644 index 00000000..ebe2ff8f --- /dev/null +++ b/frontend/server/public/images/units/groundunit-sam-launcher.svg @@ -0,0 +1,51 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-sam-radar.svg b/frontend/server/public/images/units/groundunit-sam-radar.svg new file mode 100644 index 00000000..18c3f6a5 --- /dev/null +++ b/frontend/server/public/images/units/groundunit-sam-radar.svg @@ -0,0 +1,50 @@ + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-sam.svg b/frontend/server/public/images/units/groundunit-sam.svg new file mode 100644 index 00000000..1f0e68f1 --- /dev/null +++ b/frontend/server/public/images/units/groundunit-sam.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-tactical.svg b/frontend/server/public/images/units/groundunit-tactical.svg new file mode 100644 index 00000000..40bdae5f --- /dev/null +++ b/frontend/server/public/images/units/groundunit-tactical.svg @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-tank.svg b/frontend/server/public/images/units/groundunit-tank.svg new file mode 100644 index 00000000..272113e3 --- /dev/null +++ b/frontend/server/public/images/units/groundunit-tank.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit-truck.svg b/frontend/server/public/images/units/groundunit-truck.svg new file mode 100644 index 00000000..aa581462 --- /dev/null +++ b/frontend/server/public/images/units/groundunit-truck.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/groundunit.svg b/frontend/server/public/images/units/groundunit.svg new file mode 100644 index 00000000..8d74c672 --- /dev/null +++ b/frontend/server/public/images/units/groundunit.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/h-6.png b/frontend/server/public/images/units/h-6.png index 9fb48950..573ffda2 100644 Binary files a/frontend/server/public/images/units/h-6.png and b/frontend/server/public/images/units/h-6.png differ diff --git a/frontend/server/public/images/units/hawk.png b/frontend/server/public/images/units/hawk.png index 5cd07de5..27f2ffe2 100644 Binary files a/frontend/server/public/images/units/hawk.png and b/frontend/server/public/images/units/hawk.png differ diff --git a/frontend/server/public/images/units/helicopter.svg b/frontend/server/public/images/units/helicopter.svg new file mode 100644 index 00000000..cb79e8cc --- /dev/null +++ b/frontend/server/public/images/units/helicopter.svg @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/helicopter1.png b/frontend/server/public/images/units/helicopter1.png index 454152ff..6e085372 100644 Binary files a/frontend/server/public/images/units/helicopter1.png and b/frontend/server/public/images/units/helicopter1.png differ diff --git a/frontend/server/public/images/units/i-16.png b/frontend/server/public/images/units/i-16.png index eea45594..8e8a92f9 100644 Binary files a/frontend/server/public/images/units/i-16.png and b/frontend/server/public/images/units/i-16.png differ diff --git a/frontend/server/public/images/units/il-76.png b/frontend/server/public/images/units/il-76.png index d0a3cf55..fa697729 100644 Binary files a/frontend/server/public/images/units/il-76.png and b/frontend/server/public/images/units/il-76.png differ diff --git a/frontend/server/public/images/units/j-10.png b/frontend/server/public/images/units/j-10.png index 6fa2dd21..5cf11e78 100644 Binary files a/frontend/server/public/images/units/j-10.png and b/frontend/server/public/images/units/j-10.png differ diff --git a/frontend/server/public/images/units/j-20.png b/frontend/server/public/images/units/j-20.png index 7e5b34f4..4ee50e96 100644 Binary files a/frontend/server/public/images/units/j-20.png and b/frontend/server/public/images/units/j-20.png differ diff --git a/frontend/server/public/images/units/j-7.png b/frontend/server/public/images/units/j-7.png index f1bcfd95..b67a5b2f 100644 Binary files a/frontend/server/public/images/units/j-7.png and b/frontend/server/public/images/units/j-7.png differ diff --git a/frontend/server/public/images/units/jf-17.png b/frontend/server/public/images/units/jf-17.png index 2bfde2f3..da0fe721 100644 Binary files a/frontend/server/public/images/units/jf-17.png and b/frontend/server/public/images/units/jf-17.png differ diff --git a/frontend/server/public/images/units/ju-88.png b/frontend/server/public/images/units/ju-88.png index 59768856..73a540f6 100644 Binary files a/frontend/server/public/images/units/ju-88.png and b/frontend/server/public/images/units/ju-88.png differ diff --git a/frontend/server/public/images/units/ka-27.png b/frontend/server/public/images/units/ka-27.png index be2b243d..7c2ffcff 100644 Binary files a/frontend/server/public/images/units/ka-27.png and b/frontend/server/public/images/units/ka-27.png differ diff --git a/frontend/server/public/images/units/ka-50.png b/frontend/server/public/images/units/ka-50.png index 71a3b4b4..2acf87d8 100644 Binary files a/frontend/server/public/images/units/ka-50.png and b/frontend/server/public/images/units/ka-50.png differ diff --git a/frontend/server/public/images/units/kc-10.png b/frontend/server/public/images/units/kc-10.png index 94868685..205d7e3c 100644 Binary files a/frontend/server/public/images/units/kc-10.png and b/frontend/server/public/images/units/kc-10.png differ diff --git a/frontend/server/public/images/units/kc-135.png b/frontend/server/public/images/units/kc-135.png index 64014a04..a1f23b30 100644 Binary files a/frontend/server/public/images/units/kc-135.png and b/frontend/server/public/images/units/kc-135.png differ diff --git a/frontend/server/public/images/units/l-159.png b/frontend/server/public/images/units/l-159.png index e80c6259..d81d3631 100644 Binary files a/frontend/server/public/images/units/l-159.png and b/frontend/server/public/images/units/l-159.png differ diff --git a/frontend/server/public/images/units/l-39.png b/frontend/server/public/images/units/l-39.png index 0a9558be..868bf651 100644 Binary files a/frontend/server/public/images/units/l-39.png and b/frontend/server/public/images/units/l-39.png differ diff --git a/frontend/server/public/images/units/m2000.png b/frontend/server/public/images/units/m2000.png index 03e618f9..7e3be642 100644 Binary files a/frontend/server/public/images/units/m2000.png and b/frontend/server/public/images/units/m2000.png differ diff --git a/frontend/server/public/images/units/mb-339.png b/frontend/server/public/images/units/mb-339.png index 907ff302..98d3b350 100644 Binary files a/frontend/server/public/images/units/mb-339.png and b/frontend/server/public/images/units/mb-339.png differ diff --git a/frontend/server/public/images/units/mi-24.png b/frontend/server/public/images/units/mi-24.png index 8708f4a7..64c99f81 100644 Binary files a/frontend/server/public/images/units/mi-24.png and b/frontend/server/public/images/units/mi-24.png differ diff --git a/frontend/server/public/images/units/mi-26.png b/frontend/server/public/images/units/mi-26.png index 4ad1cfd8..14c51d70 100644 Binary files a/frontend/server/public/images/units/mi-26.png and b/frontend/server/public/images/units/mi-26.png differ diff --git a/frontend/server/public/images/units/mi-28.png b/frontend/server/public/images/units/mi-28.png index 9e5aefff..6e1acedc 100644 Binary files a/frontend/server/public/images/units/mi-28.png and b/frontend/server/public/images/units/mi-28.png differ diff --git a/frontend/server/public/images/units/mi-8.png b/frontend/server/public/images/units/mi-8.png index 6cb33921..f5c004d6 100644 Binary files a/frontend/server/public/images/units/mi-8.png and b/frontend/server/public/images/units/mi-8.png differ diff --git a/frontend/server/public/images/units/mig-15.png b/frontend/server/public/images/units/mig-15.png index 1f34bc37..8ff2fc25 100644 Binary files a/frontend/server/public/images/units/mig-15.png and b/frontend/server/public/images/units/mig-15.png differ diff --git a/frontend/server/public/images/units/mig-19.png b/frontend/server/public/images/units/mig-19.png index e3ad0cb7..00722e72 100644 Binary files a/frontend/server/public/images/units/mig-19.png and b/frontend/server/public/images/units/mig-19.png differ diff --git a/frontend/server/public/images/units/mig-21.png b/frontend/server/public/images/units/mig-21.png index 09c98941..c5ea25db 100644 Binary files a/frontend/server/public/images/units/mig-21.png and b/frontend/server/public/images/units/mig-21.png differ diff --git a/frontend/server/public/images/units/mig-23.png b/frontend/server/public/images/units/mig-23.png index d1d70ccf..db4816a5 100644 Binary files a/frontend/server/public/images/units/mig-23.png and b/frontend/server/public/images/units/mig-23.png differ diff --git a/frontend/server/public/images/units/mig-25.png b/frontend/server/public/images/units/mig-25.png index 48448104..89e4b4b5 100644 Binary files a/frontend/server/public/images/units/mig-25.png and b/frontend/server/public/images/units/mig-25.png differ diff --git a/frontend/server/public/images/units/mig-29.png b/frontend/server/public/images/units/mig-29.png index 1e16dfa0..8d51acda 100644 Binary files a/frontend/server/public/images/units/mig-29.png and b/frontend/server/public/images/units/mig-29.png differ diff --git a/frontend/server/public/images/units/missile.svg b/frontend/server/public/images/units/missile.svg new file mode 100644 index 00000000..0593f71d --- /dev/null +++ b/frontend/server/public/images/units/missile.svg @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/mosquito.png b/frontend/server/public/images/units/mosquito.png index eba239e5..a7bf07e7 100644 Binary files a/frontend/server/public/images/units/mosquito.png and b/frontend/server/public/images/units/mosquito.png differ diff --git a/frontend/server/public/images/units/navyunit.svg b/frontend/server/public/images/units/navyunit.svg new file mode 100644 index 00000000..2584f42b --- /dev/null +++ b/frontend/server/public/images/units/navyunit.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/oh-58.png b/frontend/server/public/images/units/oh-58.png index e9747103..3429cf59 100644 Binary files a/frontend/server/public/images/units/oh-58.png and b/frontend/server/public/images/units/oh-58.png differ diff --git a/frontend/server/public/images/units/p-47.png b/frontend/server/public/images/units/p-47.png index 72fc236e..23d70951 100644 Binary files a/frontend/server/public/images/units/p-47.png and b/frontend/server/public/images/units/p-47.png differ diff --git a/frontend/server/public/images/units/p-51.png b/frontend/server/public/images/units/p-51.png index cc67b897..a38eea64 100644 Binary files a/frontend/server/public/images/units/p-51.png and b/frontend/server/public/images/units/p-51.png differ diff --git a/frontend/server/public/images/units/rafale.png b/frontend/server/public/images/units/rafale.png index b2370ad4..e577e93d 100644 Binary files a/frontend/server/public/images/units/rafale.png and b/frontend/server/public/images/units/rafale.png differ diff --git a/frontend/server/public/images/units/rq-1.png b/frontend/server/public/images/units/rq-1.png index cf3b0ad4..7490b5ff 100644 Binary files a/frontend/server/public/images/units/rq-1.png and b/frontend/server/public/images/units/rq-1.png differ diff --git a/frontend/server/public/images/units/rq-4.png b/frontend/server/public/images/units/rq-4.png index 090074de..95cbc0ee 100644 Binary files a/frontend/server/public/images/units/rq-4.png and b/frontend/server/public/images/units/rq-4.png differ diff --git a/frontend/server/public/images/units/s-3.png b/frontend/server/public/images/units/s-3.png index ec65bb2e..396fe2d9 100644 Binary files a/frontend/server/public/images/units/s-3.png and b/frontend/server/public/images/units/s-3.png differ diff --git a/frontend/server/public/images/units/sa-342.png b/frontend/server/public/images/units/sa-342.png index fe846183..678776ac 100644 Binary files a/frontend/server/public/images/units/sa-342.png and b/frontend/server/public/images/units/sa-342.png differ diff --git a/frontend/server/public/images/units/sam.png b/frontend/server/public/images/units/sam.png new file mode 100644 index 00000000..7f201afc Binary files /dev/null and b/frontend/server/public/images/units/sam.png differ diff --git a/frontend/server/public/images/units/spitfire.png b/frontend/server/public/images/units/spitfire.png index d6b9d2ab..65d3d1ca 100644 Binary files a/frontend/server/public/images/units/spitfire.png and b/frontend/server/public/images/units/spitfire.png differ diff --git a/frontend/server/public/images/units/static.svg b/frontend/server/public/images/units/static.svg new file mode 100644 index 00000000..a5511a12 --- /dev/null +++ b/frontend/server/public/images/units/static.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/frontend/server/public/images/units/su-17.png b/frontend/server/public/images/units/su-17.png index 32d8aa37..47dd52e9 100644 Binary files a/frontend/server/public/images/units/su-17.png and b/frontend/server/public/images/units/su-17.png differ diff --git a/frontend/server/public/images/units/su-24.png b/frontend/server/public/images/units/su-24.png index d94b7af7..0928ca61 100644 Binary files a/frontend/server/public/images/units/su-24.png and b/frontend/server/public/images/units/su-24.png differ diff --git a/frontend/server/public/images/units/su-25.png b/frontend/server/public/images/units/su-25.png index fa85f62f..9a9fca64 100644 Binary files a/frontend/server/public/images/units/su-25.png and b/frontend/server/public/images/units/su-25.png differ diff --git a/frontend/server/public/images/units/su-27.png b/frontend/server/public/images/units/su-27.png index cc2ce07a..b2c18cbe 100644 Binary files a/frontend/server/public/images/units/su-27.png and b/frontend/server/public/images/units/su-27.png differ diff --git a/frontend/server/public/images/units/su-34.png b/frontend/server/public/images/units/su-34.png index 110a3c60..de88958e 100644 Binary files a/frontend/server/public/images/units/su-34.png and b/frontend/server/public/images/units/su-34.png differ diff --git a/frontend/server/public/images/units/su-57.png b/frontend/server/public/images/units/su-57.png index c4e83c98..56d835b5 100644 Binary files a/frontend/server/public/images/units/su-57.png and b/frontend/server/public/images/units/su-57.png differ diff --git a/frontend/server/public/images/units/tornado.png b/frontend/server/public/images/units/tornado.png index c66219ea..d3eacb52 100644 Binary files a/frontend/server/public/images/units/tornado.png and b/frontend/server/public/images/units/tornado.png differ diff --git a/frontend/server/public/images/units/tu-160.png b/frontend/server/public/images/units/tu-160.png index 0391ce41..7f2b28f5 100644 Binary files a/frontend/server/public/images/units/tu-160.png and b/frontend/server/public/images/units/tu-160.png differ diff --git a/frontend/server/public/images/units/tu-22.png b/frontend/server/public/images/units/tu-22.png index cb43ca76..c807bd73 100644 Binary files a/frontend/server/public/images/units/tu-22.png and b/frontend/server/public/images/units/tu-22.png differ diff --git a/frontend/server/public/images/units/tu-95.png b/frontend/server/public/images/units/tu-95.png index cfa72a60..73e5cdfa 100644 Binary files a/frontend/server/public/images/units/tu-95.png and b/frontend/server/public/images/units/tu-95.png differ diff --git a/frontend/server/public/images/units/u-28.png b/frontend/server/public/images/units/u-28.png index 6e194456..6577d344 100644 Binary files a/frontend/server/public/images/units/u-28.png and b/frontend/server/public/images/units/u-28.png differ diff --git a/frontend/server/public/images/units/uh-1.png b/frontend/server/public/images/units/uh-1.png index 0d1102a4..1bd45cb4 100644 Binary files a/frontend/server/public/images/units/uh-1.png and b/frontend/server/public/images/units/uh-1.png differ diff --git a/frontend/server/public/images/units/uh-60.png b/frontend/server/public/images/units/uh-60.png index 145fa141..66513c80 100644 Binary files a/frontend/server/public/images/units/uh-60.png and b/frontend/server/public/images/units/uh-60.png differ diff --git a/frontend/server/public/images/units/viggen.png b/frontend/server/public/images/units/viggen.png index 76c5eda0..2e775f55 100644 Binary files a/frontend/server/public/images/units/viggen.png and b/frontend/server/public/images/units/viggen.png differ diff --git a/frontend/server/public/images/units/yak-40.png b/frontend/server/public/images/units/yak-40.png index 42a56792..46fdf8f8 100644 Binary files a/frontend/server/public/images/units/yak-40.png and b/frontend/server/public/images/units/yak-40.png differ diff --git a/frontend/server/public/images/units/yak-52.png b/frontend/server/public/images/units/yak-52.png index 1201b6d0..4b2c4845 100644 Binary files a/frontend/server/public/images/units/yak-52.png and b/frontend/server/public/images/units/yak-52.png differ diff --git a/frontend/server/public/javascripts/placeholder b/frontend/server/public/javascripts/placeholder deleted file mode 100644 index e69de29b..00000000 diff --git a/frontend/server/public/stylesheets/layout/layout.css b/frontend/server/public/stylesheets/layout/layout.css deleted file mode 100644 index 8df67322..00000000 --- a/frontend/server/public/stylesheets/layout/layout.css +++ /dev/null @@ -1,106 +0,0 @@ -/* Page style */ -#map-container { - height: 100%; - min-width: 820px; - width: 100%; -} - -#toolbar-container { - align-items: center; - display: flex; - left: 10px; - position: absolute; - top: 10px; - z-index: 99999; - column-gap: 10px; - row-gap: 10px; - margin-right: 320px; - height: fit-content; - flex-wrap: wrap; -} - -#connection-status-panel { - bottom: 20px; - font-size: 12px; - position: absolute; - right: 10px; - width: 190px; - z-index: 9999; -} - -#mouse-info-panel { - bottom: 60px; - display: flex; - flex-direction: column; - height: fit-content; - position: absolute; - right: 10px; - row-gap: 10px; - width: 190px; - z-index: 9999; -} - -#unit-control-panel { - height: fit-content; - width: fit-content; - left: 10px; - position: absolute; - z-index: 9999; -} - -#unit-info-panel { - bottom: 20px; - font-size: 12px; - position: absolute; - width: fit-content; - z-index: 9999; - padding: 24px 30px; - display: flex; - flex-direction: row; - justify-content: space-evenly; - right: 210px; - height: 180px; -} - -#hotgroup-panel { - bottom: 40px; - column-gap: 10px; - display: flex; - left: 50%; - position: absolute; - translate: -50%; - z-index: 9998; -} - -#info-popup { - position: absolute; - width: fit-content; - height: fit-content; - top: 100px; - left: 50%; - translate: -50% 0%; - z-index: 9999999999; - display: flex; - align-items: center; -} - -#slow-delete-popup { - align-self: center; - display:flex; - justify-self: center; - position: absolute; - width: fit-content; - height: fit-content; - z-index: 9999999999; -} - -#log-panel { - position: absolute; - right: 0px; - top: 170px; - width: 310px; - height: fit-content; - z-index: 9990; - overflow: hidden; - padding: 10px; -} diff --git a/frontend/server/public/stylesheets/markers/airbase.css b/frontend/server/public/stylesheets/markers/airbase.css deleted file mode 100644 index 2faa2a02..00000000 --- a/frontend/server/public/stylesheets/markers/airbase.css +++ /dev/null @@ -1,27 +0,0 @@ -.airbase-icon { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - position: relative; - width: 40px; - height: 40px; -} - -.airbase-icon svg { - width: 40px; - height: 40px; -} - -.airbase-icon[data-coalition="red"] svg * { - stroke: var(--unit-background-red); -} - -.airbase-icon[data-coalition="blue"] svg * { - stroke: var(--unit-background-blue); -} - -.airbase-icon[data-coalition="neutral"] svg * { - stroke: var(--unit-background-neutral); -} - diff --git a/frontend/server/public/stylesheets/markers/bullseye.css b/frontend/server/public/stylesheets/markers/bullseye.css deleted file mode 100644 index e75f0441..00000000 --- a/frontend/server/public/stylesheets/markers/bullseye.css +++ /dev/null @@ -1,24 +0,0 @@ -.bullseye-icon { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - position: relative; - width: 100%; - height: 100%; -} - -.bullseye-icon[data-coalition="red"] svg * { - stroke: var(--unit-background-red); - fill: var(--unit-background-red); -} - -.bullseye-icon[data-coalition="blue"] svg * { - stroke: var(--unit-background-blue); - fill: var(--unit-background-blue); -} - -.bullseye-icon[data-coalition="neutral"] svg * { - stroke: var(--unit-background-neutral); - fill: var(--unit-background-neutral); -} diff --git a/frontend/server/public/stylesheets/markers/units.css b/frontend/server/public/stylesheets/markers/units.css deleted file mode 100644 index e2cba54d..00000000 --- a/frontend/server/public/stylesheets/markers/units.css +++ /dev/null @@ -1,383 +0,0 @@ -/*** Unit marker elements ***/ -[data-object|="unit"] { - align-items: center; - cursor: pointer; - display: flex; - height: 100%; - justify-content: center; - position: relative; - width: 100%; -} - -.unit-vvi { - align-self: center; - background: var(--secondary-gunmetal-grey); - display: flex; - justify-self: center; - padding-bottom: calc((var(--unit-width) / 2) + var(--unit-stroke-width)); - position: absolute; - transform-origin: bottom; - translate: 0 -50%; - width: var(--unit-vvi-width); -} - -.unit-hotgroup { - align-content: center; - background-color: var(--background-steel); - border-radius: var(--border-radius-xs); - display: none; - height: 15px; - justify-content: center; - position: absolute; - transform: rotate(-45deg); - translate: 0 -200%; - width: 15px; -} - -.unit-hotgroup-id { - background-color: transparent; - color: white; - font-size: 9px; - font-weight: bolder; - transform: rotate(45deg); - translate: -1px 1px; -} - -.unit-icon { - height: var(--unit-height); - position: absolute; - transform-origin: center; - width: var(--unit-width); -} - -.unit-icon svg { - height: 100%; - width: 100%; -} - -[data-is-selected] .unit-icon::before { - background-color: var(--unit-spotlight-fill); - border-radius: 50%; - content: ""; - height: 100%; - position: absolute; - width: 100%; - z-index: -1; -} - -/*** Basic colours ***/ -[data-coalition="blue"] .unit-icon svg>*:first-child { - fill: var(--unit-background-blue); -} - -[data-coalition="red"] .unit-icon svg>*:first-child { - fill: var(--unit-background-red); -} - -[data-coalition="neutral"] .unit-icon svg>*:first-child { - fill: var(--unit-background-neutral); -} - -[data-is-selected] .unit-icon svg>*:first-child { - fill: white; -} - -[data-is-highlighted] .unit-icon svg>*:first-child { - stroke: white; -} - -/*** Cursors ***/ -[data-is-dead], -[data-object|="unit-missile"], -[data-object|="unit-bomb"] { - cursor: default; -} - -/*** Labels ***/ -[data-object|="unit"] .unit-short-label { - color: var(--secondary-gunmetal-grey); - font-size: var(--unit-font-size); - font-weight: var(--unit-font-weight); - line-height: normal; - position: absolute; -} - -[data-object|="unit-groundunit"] .unit-short-label { - transform: translateY(7px); -} - -/*** Health indicator ***/ -[data-object|="unit"] .unit-health { - background: white; - border: var(--unit-health-border-width) solid var(--secondary-dark-steel); - border-radius: var(--border-radius-sm); - display: none; - height: var(--unit-health-height); - position: absolute; - translate: var(--unit-health-x) var(--unit-health-y); - width: var(--unit-health-width); -} - -/*** Fuel indicator ***/ -[data-object|="unit"] .unit-fuel { - background: white; - border: var(--unit-fuel-border-width) solid var(--secondary-dark-steel); - border-radius: var(--border-radius-sm); - display: none; - height: var(--unit-fuel-height); - position: absolute; - translate: var(--unit-fuel-x) var(--unit-fuel-y); - width: var(--unit-fuel-width); -} - -[data-object|="unit"] .unit-fuel-level, -[data-object|="unit"] .unit-health-level { - background-color: var(--secondary-light-grey); - height: 100%; - width: 100%; -} - -/*** Ammo indicator ***/ -[data-object|="unit"] .unit-ammo { - column-gap: var(--unit-ammo-spacing); - display: none; - height: fit-content; - position: absolute; - translate: var(--unit-ammo-x) var(--unit-ammo-y); - width: fit-content; -} - -[data-object|="unit"] .unit-ammo>* { - background-color: white; - border: var(--unit-ammo-border-width) solid var(--secondary-dark-steel); - border-radius: 50%; - padding: var(--unit-ammo-radius); -} - -/*** Unit summary ***/ -[data-object|="unit"] .unit-summary { - color: white; - column-gap: 6px; - display: flex; - flex-wrap: wrap; - font-size: 11px; - font-weight: bold; - justify-content: right; - line-height: 12px; - pointer-events: none; - position: absolute; - row-gap: 1px; - text-shadow: - -1px -1px 0 #000, - 1px -1px 0 #000, - -1px 1px 0 #000, - 1px 1px 0 #000; - right: 100%; - width: fit-content; -} - -[data-hide-labels] [data-object|="unit"] .unit-summary { - display: none; -} - -[data-object|="unit"] .unit-summary>* { - padding: 1px; -} - -[data-object|="unit"] .unit-summary .unit-callsign { - color: white; - overflow: hidden; - text-align: right; - transform-origin: right; - white-space: nowrap; - width: 80px; -} - -[data-object|="unit"]:hover .unit-summary .unit-callsign{ - direction: rtl; - overflow: visible; -} - -/*** Common ***/ -[data-object|="unit"]:hover .unit-ammo, -[data-object|="unit"]:hover .unit-health , -[data-object|="unit"]:hover .unit-fuel { - display: flex; -} - -[data-object|="unit"][data-has-low-fuel] .unit-fuel, [data-object|="unit"][data-has-low-health] .unit-health { - animation: pulse 1.5s linear infinite; -} - -[data-object|="unit"][data-is-in-hotgroup] .unit-hotgroup, -[data-object|="unit"][data-is-selected] .unit-ammo, -[data-object|="unit"][data-is-selected] .unit-fuel, -[data-object|="unit"][data-is-selected] .unit-health, -[data-object|="unit"][data-is-selected] .unit-selected-spotlight { - display: flex; -} - -[data-object|="unit"][data-has-fox-1] .unit-ammo>div:nth-child(1), -[data-object|="unit"][data-has-fox-2] .unit-ammo>div:nth-child(2), -[data-object|="unit"][data-has-fox-3] .unit-ammo>div:nth-child(3), -[data-object|="unit"][data-has-other-ammo] .unit-ammo>div:nth-child(4) { - background-color: var(--secondary-gunmetal-grey); -} - -[data-object|="unit"][data-coalition="blue"][data-is-selected] .unit-short-label { - color: var(--secondary-blue-text); -} - -[data-object|="unit"][data-coalition="blue"] .unit-fuel-level, -[data-object|="unit"][data-coalition="blue"] .unit-health-level, -[data-object|="unit"][data-coalition="blue"][data-has-fox-1] .unit-ammo>div:nth-child(1), -[data-object|="unit"][data-coalition="blue"][data-has-fox-2] .unit-ammo>div:nth-child(2), -[data-object|="unit"][data-coalition="blue"][data-has-fox-3] .unit-ammo>div:nth-child(3), -[data-object|="unit"][data-coalition="blue"][data-has-other-ammo] .unit-ammo>div:nth-child(4) { - background-color: var(--primary-blue); -} - -[data-object|="unit"][data-coalition="blue"] .unit-vvi { - background-color: var(--secondary-blue-outline); -} - -[data-object|="unit"][data-coalition="red"][data-is-selected] .unit-short-label { - color: var(--secondary-red-text); -} - -[data-object|="unit"][data-coalition="red"] .unit-fuel-level, -[data-object|="unit"][data-coalition="red"] .unit-health-level, -[data-object|="unit"][data-coalition="red"][data-has-fox-1] .unit-ammo>div:nth-child(1), -[data-object|="unit"][data-coalition="red"][data-has-fox-2] .unit-ammo>div:nth-child(2), -[data-object|="unit"][data-coalition="red"][data-has-fox-3] .unit-ammo>div:nth-child(3), -[data-object|="unit"][data-coalition="red"][data-has-other-ammo] .unit-ammo>div:nth-child(4) { - background-color: var(--primary-red); -} - -[data-object|="unit"][data-coalition="blue"] .unit-vvi { - background-color: var(--secondary-red-outline); -} - -/*** Unit state ***/ -[data-object|="unit"] .unit-state { - background-repeat: no-repeat; - height: 20px; - position: absolute; - width: 20px; - left: 0px; - top: 0px; -} - -[data-object|="unit"][data-state="rtb"] .unit-state { - background-image: url("/resources/theme/images/states/rtb.svg"); -} - -[data-object|="unit"][data-state="land"] .unit-state { - background-image: url("/resources/theme/images/states/rtb.svg"); -} - -[data-object|="unit"][data-state="idle"] .unit-state { - background-image: url("/resources/theme/images/states/idle.svg"); -} - -[data-object*="groundunit"][data-state="idle"] .unit-state, -[data-object*="navyunit"][data-state="idle"] .unit-state { - background-image: url(""); /* To avoid clutter, dont show the idle state for non flying units */ -} - -[data-object|="unit"][data-state="attack"] .unit-state, -[data-object|="unit"][data-state="bomb-point"] .unit-state, -[data-object|="unit"][data-state="carpet-bombing"] .unit-state, -[data-object|="unit"][data-state="fire-at-area"] .unit-state { - background-image: url("/resources/theme/images/states/attack.svg"); -} - -[data-object|="unit"][data-state="follow"] .unit-state { - background-image: url("/resources/theme/images/states/follow.svg"); -} - -[data-object|="unit"][data-state="refuel"] .unit-state { - background-image: url("/resources/theme/images/states/refuel.svg"); -} - -[data-object|="unit"][data-state="human"] .unit-state { - background-image: url("/resources/theme/images/states/human.svg"); -} - -[data-object|="unit"][data-state="dcs"] .unit-state { - background-image: url("/resources/theme/images/states/dcs.svg"); -} - -[data-object|="unit"][data-state="land-at-point"] .unit-state { - background-image: url("/resources/theme/images/states/land-at-point.svg"); -} - -[data-object|="unit"][data-state="no-task"] .unit-state { - background-image: url("/resources/theme/images/states/no-task.svg"); -} - -[data-object|="unit"][data-state="off"] .unit-state { - background-image: url("/resources/theme/images/states/off.svg"); -} - -[data-object|="unit"][data-state="tanker"] .unit-state { - background-image: url("/resources/theme/images/states/tanker.svg"); -} - -[data-object|="unit"][data-state="AWACS"] .unit-state { - background-image: url("/resources/theme/images/states/awacs.svg"); -} - -[data-object|="unit"][data-state="miss-on-purpose"] .unit-state { - background-image: url("/resources/theme/images/states/miss-on-purpose.svg"); -} - -[data-object|="unit"][data-state="scenic-aaa"] .unit-state { - background-image: url("/resources/theme/images/states/scenic-aaa.svg"); -} - -[data-object|="unit"][data-state="simulate-fire-fight"] .unit-state { - background-image: url("/resources/theme/images/states/simulate-fire-fight.svg"); -} - - -[data-object|="unit"] .unit-health::before { - background-image: url("/resources/theme/images/icons/health.svg"); - background-repeat: no-repeat; - background-size: contain; - content: " "; - height: 6px; - left: 0; - position: absolute; - top: 0; - translate: -10px -2px; - width: 6px; -} - - -/*** Dead unit ***/ -[data-object|="unit"][data-is-dead] .unit-selected-spotlight, -[data-object|="unit"][data-is-dead] .unit-short-label, -[data-object|="unit"][data-is-dead] .unit-vvi, -[data-object|="unit"][data-is-dead] .unit-hotgroup, -[data-object|="unit"][data-is-dead] .unit-hotgroup-id, -[data-object|="unit"][data-is-dead] .unit-state, -[data-object|="unit"][data-is-dead] .unit-fuel, -[data-object|="unit"][data-is-dead] .unit-health, -[data-object|="unit"][data-is-dead] .unit-ammo, -[data-object|="unit"][data-is-dead]:hover .unit-fuel, -[data-object|="unit"][data-is-dead]:hover .unit-ammo { - display: none; -} - -[data-object|="unit"][data-is-dead] .unit-summary>* { - display: none; -} - -[data-object|="unit"][data-is-dead] .unit-summary .unit-callsign { - display: block; -} - -.ol-temporary-marker { - opacity: 0.5; -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/olympus.css b/frontend/server/public/stylesheets/olympus.css deleted file mode 100644 index aa3c4808..00000000 --- a/frontend/server/public/stylesheets/olympus.css +++ /dev/null @@ -1,19 +0,0 @@ -@import url("layout/layout.css"); -@import url("style/style.css"); - -@import url("panels/connectionstatus.css"); -@import url("panels/serverstatus.css"); -@import url("panels/mouseinfo.css"); -@import url("panels/unitcontrol.css"); -@import url("panels/unitinfo.css"); -@import url("panels/logpanel.css"); -@import url("panels/unitlist.css"); - -@import url("other/contextmenus.css"); -@import url("other/popup.css"); -@import url("other/toolbar.css"); - - -@import url("markers/airbase.css"); -@import url("markers/bullseye.css"); -@import url("markers/units.css"); diff --git a/frontend/server/public/stylesheets/other/contextmenus.css b/frontend/server/public/stylesheets/other/contextmenus.css deleted file mode 100644 index fd816bb7..00000000 --- a/frontend/server/public/stylesheets/other/contextmenus.css +++ /dev/null @@ -1,824 +0,0 @@ -#map-contextmenu { - display: flex; - flex-direction: column; - height: fit-content; - position: absolute; - row-gap: 5px; - width: 300px; - z-index: 9999; -} - - - -/* #map-contextmenu>div:nth-child(n+4)>div { - width: 100%; -} */ - -#map-contextmenu .spawn-mode { - display: flex; - flex-direction: column; - justify-content: space-between; - row-gap: 5px; -} - -.ol-context-menu-panel { - display: flex; - flex-direction: column; - justify-content: space-between; - row-gap: 5px; - padding: 20px; -} - -.contextmenu-advanced-options, -.contextmenu-metadata { - align-items: center; - display: flex; - flex-direction: column; - justify-content: space-between; - row-gap: 5px; - width: 100%; - padding: 5px; -} - -.contextmenu-advanced-options-toggle, -.contextmenu-metadata-toggle { - display: flex; - align-content: center; - text-align: left; - width: 100%; - margin: 5px; - column-gap: 5px; - cursor: pointer; -} - -.contextmenu-advanced-options-toggle:after, -.contextmenu-metadata-toggle:after { - content: ""; - margin-left: auto; - margin-top: auto; - background-image: url(/resources/theme/images/icons/chevron-down.svg); - background-size: 100% 100%; - width: 15px; - height: 15px; -} - -.contextmenu-advanced-options-toggle.is-open:after, -.contextmenu-metadata-toggle.is-open:after { - transform: rotate(180deg); -} - -.contextmenu-advanced-options-toggle div:first-child, -.contextmenu-metadata-toggle div:first-child { - width: fit-content; - white-space: nowrap; -} - -.contextmenu-advanced-options>*, -.contextmenu-metadata>* { - width: 100%; -} - -.contextmenu-metadata { - display: flex; - flex-direction: row; - flex-wrap: wrap; - padding: 0px 10px 10px 10px; -} - -.contextmenu-metadata>div:nth-child(1) { - margin-bottom: 5px; - width: 100%; -} - -.contextmenu-metadata>div:nth-child(2) { - display: flex; - flex-direction: row; - flex-wrap: wrap; - row-gap: 5px; - column-gap: 5px; - width: 100%; - margin-top: 10px; -} - -.unit-spawn-menu { - height: fit-content; -} - -#active-coalition-label { - border-radius: 999px; - color: var(--nav-text); - font-size: 12px; - font-weight: 600; - height: fit-content; - padding: 3px 10px; - padding-bottom: 3px; - position: absolute; - top: -28px; - width: fit-content; -} - -#coalition-switch { - margin-right: 10px; - height: 25px; - width: 50px; -} - -.unit-spawn-menu .ol-select.is-open .ol-select-options { - max-height: 300px; -} - -.ol-tag { - background-color: #FFFFFF11; - color: #FFFFFFDD; - border: 1px solid #FFFFFF55; - font-weight: normal; - padding: 2px 5px; -} - -.unit-loadout-list { - min-width: 0; -} - -.unit-loadout-list div { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - background-color: var(--background-steel); - padding: 2px 5px 2px 5px; -} - -.unit-loadout-list div:hover { - overflow: visible; - white-space: nowrap; - background-color: var(--background-steel); - width: fit-content; - border-radius: var(--border-radius-sm); -} - -.deploy-unit-button { - margin-top: 5px; - text-align: center; - width: 100%; -} - -.deploy-unit-button[data-points]:not([data-points='']):not([data-points='0']):not([data-points='Infinity'])::after { - content: " (" attr(data-points) " points)"; -} - -#spawn-mode-tabs { - align-items: center; - column-gap: 6px; - display: flex; - position: absolute; - right: 0; - top:0; - translate: -6px -100%; - z-index: 9998; -} - -#spawn-mode-tabs button { - align-items: center; - border-bottom:2px solid transparent; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - border-top-left-radius: var(--border-radius-sm); - border-top-right-radius: var(--border-radius-sm); - display: flex; - height:32px; - justify-content: center; - margin:0; - width:38px; -} - -#spawn-mode-tabs button:hover { - background-color: var(--background-steel); -} - -[data-coalition="blue"] + #spawn-mode-tabs button { - border-bottom-color: var(--primary-blue); -} - - -[data-coalition="red"] + #spawn-mode-tabs button { - border-bottom-color: var(--primary-red); -} - - -[data-coalition="neutral"] + #spawn-mode-tabs button { - border-bottom-color: var(--primary-neutral); -} - -#spawn-mode-tabs button svg { - height:24px; - margin:6px; - width:24px; -} - -.upper-bar { - align-items: center; - display: flex; - flex-direction: row; - justify-content: space-between; - padding-right: 0px; -} - -.upper-bar svg>*, -#spawn-mode-tabs button svg * { - fill: white; -} - -.upper-bar svg { - width: 22px; - margin: 0px 5px; -} - -.upper-bar button:first-of-type { - margin-left: auto; -} - -#spawn-history-menu { - align-items: center; - flex-direction: column; - max-height: 300px; - row-gap: 6px; -} - -#spawn-history-menu button { - align-items: center; - column-gap: 6px; - display:flex; - height:32px; - text-align: left; - padding:0; - width:100%; -} - -#spawn-history-menu button span { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -#spawn-history-menu button svg { - border-radius: var(--border-radius-sm); - height:24px; - padding:4px; - width:24px; -} - -#spawn-history-menu button:hover { - background-color: transparent; - text-decoration: underline; -} - -#spawn-history-menu button:hover svg * { - fill:white !important; -} - -#spawn-history-menu button[data-spawned-coalition="blue"] svg { - background-color: var(--primary-blue); -} - -#spawn-history-menu button[data-spawned-coalition="red"] svg { - background-color: var(--primary-red); -} - -#spawn-history-menu button[data-spawned-coalition="neutral"] svg { - background-color: var(--primary-neutral); -} - -[data-coalition="blue"]#active-coalition-label, -[data-coalition="blue"].deploy-unit-button, -[data-coalition="blue"]#spawn-airbase-aircraft-button, -[data-coalition="blue"].create-iads-button, -[data-coalition="blue"] + #spawn-mode-tabs button.selected { - background-color: var(--primary-blue) -} - -[data-coalition="red"]#active-coalition-label, -[data-coalition="red"].deploy-unit-button, -[data-coalition="red"]#spawn-airbase-aircraft-button, -[data-coalition="red"].create-iads-button, -[data-coalition="red"] + #spawn-mode-tabs button.selected { - background-color: var(--primary-red) -} - -[data-coalition="neutral"]#active-coalition-label, -[data-coalition="neutral"].deploy-unit-button, -[data-coalition="neutral"]#spawn-airbase-aircraft-button, -[data-coalition="neutral"].create-iads-button, -[data-coalition="neutral"] + #spawn-mode-tabs button.selected { - background-color: var(--primary-neutral) -} - -[data-coalition="blue"].deploy-unit-button:disabled { - background-color: transparent; - border: 1px solid var(--primary-blue); - cursor: default; -} - -[data-coalition="red"].deploy-unit-button:disabled { - background-color: transparent; - border: 1px solid var(--primary-red); - cursor: default; -} - -[data-coalition="neutral"].deploy-unit-button:disabled { - background-color: transparent; - border: 1px solid var(--primary-neutral); - cursor: default; -} - -[data-coalition="blue"]#active-coalition-label::after { - content: "Create blue unit"; -} - -[data-coalition="red"]#active-coalition-label::after { - content: "Create red unit"; -} - -[data-coalition="neutral"]#active-coalition-label::after { - content: "Create neutral unit"; -} - -.unit-label-count-container { - display: grid; - grid-template-columns: 187px 1fr 1fr; - align-items: center; - column-gap: 5px; -} - -.unit-label-count-container>*:first-child { - width: 100%; -} - -.unit-label-count-container button { - display: flex !important; - flex-direction: row; - align-items: center; -} - -.unit-label-count-container button>*:nth-child(1) { - margin-left: auto; -} - -.unit-loadout-preview { - align-content: space-between; - align-items: center; - column-gap: 10px; - display: flex; - flex-direction: row; - width: 100%; -} - -.unit-loadout-list { - align-content: center; - display: flex; - flex-direction: column; - height: 100%; - padding: 5px; -} - -.unit-image { - filter: invert(100%); - width: 25%; - aspect-ratio: 1/1; - margin: 5px 0px; -} - -#smoke-spawn-menu { - align-items: center; - display: flex; - flex-direction: column; - text-align: center; -} - -#explosion-menu>button, -#smoke-spawn-menu>button { - align-items: center; - column-gap: 10px; - display: flex; - flex-wrap: wrap; - text-align: left; - width: 100%; -} - -#smoke-spawn-menu>button::before { - border-radius: 999px; - content: ""; - display: block; - height: 10px; - width: 10px; -} - -[data-smoke-color="red"]::before { - background-color: red; -} - -[data-smoke-color="white"]::before { - background-color: white; -} - -[data-smoke-color="blue"]::before { - background-color: blue; -} - -[data-smoke-color="green"]::before { - background-color: green; -} - -[data-smoke-color="orange"]::before { - background-color: orange; -} - -.ol-context-menu .ol-slider-value { - color: var(--accent-light-blue); - cursor: pointer; - font-size: 14px; - font-weight: bold; -} - -.ol-context-menu .ol-slider-container { - padding: 0px 10px; -} - -.contextmenu-options-container { - display: flex; - align-items: center; - justify-content: space-between; - padding-left: 10px; -} - -.contextmenu-options-container>*:nth-child(2) { - width: 120px; -} - -/* Unit context menu */ -#unit-contextmenu { - display: flex; - flex-direction: column; - height: fit-content; - padding: 15px; - position: absolute; - row-gap: 5px; - width: fit-content; - z-index: 9999; -} - -#unit-contextmenu button { - border: 1px solid var(--background-offwhite); - border-radius: var(--border-radius-sm); - font-weight: normal; - padding: 12px; -} - -#unit-contextmenu div { - align-content: center; - display: flex; - flex-direction: row; -} - -#unit-contextmenu div:before { - display: inline-block; - filter: invert(100%); - height: 20px; - margin-right: 15px; - width: 20px; -} - -.ol-select>.ol-select-options>div button.country-dropdown-element { - display: flex; - flex-direction: row; - align-content: center; - column-gap: 10px; - width: 100%; -} - -.country-dropdown-element img { - height: 20px; - aspect-ratio: initial; -} - -/* Buttons */ -#center-map::before { - background-image: url("/resources/theme/images/icons/arrows-to-eye-solid.svg"); - content: ""; - background-size: 20px 20px; -} - -#refuel::before { - background-image: url("/resources/theme/images/icons/fuel.svg"); - content: ""; - background-size: 20px 20px; -} - -#attack::before { - background-image: url("/resources/theme/images/icons/sword.svg"); - content: ""; - background-size: 20px 20px; -} - -#bomb::before { - background-image: url("/resources/theme/images/icons/crosshairs-solid.svg"); - content: ""; - background-size: 20px 20px; -} - -#carpet-bomb::before { - background-image: url("/resources/theme/images/icons/explosion-solid.svg"); - content: ""; - background-size: 20px 20px; -} - -#fire-at-area::before { - background-image: url("/resources/theme/images/icons/crosshairs-solid.svg"); - content: ""; - background-size: 20px 20px; -} - -#simulate-fire-fight::before { - background-image: url("/resources/theme/images/icons/crosshairs-solid.svg"); - content: ""; - background-size: 20px 20px; -} - -#follow::before { - background-image: url("/resources/theme/images/icons/follow.svg"); - content: ""; - background-size: 20px 20px; -} - -#scenic-aaa::before { - background-image: url("/resources/theme/images/icons/scenic.svg"); - content: ""; - background-size: 20px 20px; -} - -#miss-aaa::before { - background-image: url("/resources/theme/images/icons/miss.svg"); - content: ""; - background-size: 20px 20px; -} - -#group-ground::before { - background-image: url("/resources/theme/images/icons/group-ground.svg"); - content: ""; - background-size: 20px 20px; -} - -#group-navy::before { - background-image: url("/resources/theme/images/icons/group-navy.svg"); - content: ""; - background-size: 20px 20px; -} - -#land-at-point::before { - background-image: url("/resources/theme/images/icons/land-at-point.svg"); - content: ""; - background-size: 20px 20px; -} - -#trail::before { - background-image: url("/resources/theme/images/icons/trail.svg"); - content: ""; - background-size: 20px 20px; -} - -#echelon-lh::before { - background-image: url("/resources/theme/images/icons/echelon-lh.svg"); - content: ""; - background-size: 20px 20px; -} - -#echelon-rh::before { - background-image: url("/resources/theme/images/icons/echelon-rh.svg"); - content: ""; - background-size: 20px 20px; -} - -#line-abreast-rh::before, -#line-abreast-lh::before { - background-image: url("/resources/theme/images/icons/line-abreast.svg"); - content: ""; - background-size: 20px 20px; -} - -#front::before { - background-image: url("/resources/theme/images/icons/front.svg"); - content: ""; - background-size: 20px 20px; -} - -#diamond::before { - background-image: url("/resources/theme/images/icons/diamond.svg"); - content: ""; - background-size: 20px 20px; -} - -#custom::before { - background-image: url("/resources/theme/images/icons/custom.svg"); - content: ""; - background-size: 20px 20px; -} - -#custom-formation-dialog { - width: 250px; -} - -#custom-formation-dialog>.ol-dialog-content { - align-items: center; - display: flex; - flex-direction: column; - flex-wrap: nowrap; - margin-bottom: 10px; - margin-top: 10px; - row-gap: 10px; -} - -#custom-formation-dialog>.ol-dialog-content>.ol-group { - justify-content: space-between; - width: 100%; -} - -#reference-system { - content: url("/images/reference-system.svg"); - display: inline-block; - filter: invert(100%); - position: absolute; - transform: translate(-50%, -50%); - width: 50px; -} - -.formation-position-clock { - height: 100px; - margin: 15px; - position: relative; - width: 100px; -} - -.formation-position-clock>.clock-hand { - align-items: center; - display: flex; - height: 20px; - justify-content: center; - position: absolute; - transform: translate(-50%, -50%); - width: 20px; -} - -/* Airbase context menu */ -#airbase-contextmenu { - display: flex; - flex-direction: column; - height: fit-content; - position: absolute; - row-gap: 5px; - width: 180px; - z-index: 9999; -} - -/* Coalition area context menu */ -#coalition-area-contextmenu { - display: flex; - flex-direction: column; - height: fit-content; - position: absolute; - row-gap: 5px; - width: 300px; - z-index: 9999; -} - -#coalition-area-switch { - margin-right: 10px; - height: 25px; - width: 50px; -} - -#coalition-area-contextmenu .ol-checkbox { - align-self: flex-start; -} - -#coalition-units-checkbox { - padding: 10px 10px; -} - -#iads-menu .ol-select-options>* { - padding-top: 8px; - padding-bottom: 8px; -} - -#iads-menu .ol-select-options>*:first-child { - padding-top: 15px; -} - -#iads-menu .ol-select-options>*:last-child { - padding-bottom: 15px; -} - -#iads-menu .ol-select { - width: 100%; -} - -#iads-menu { - row-gap: 10px; - padding: 10px; -} - -#coalition-area-contextmenu>div:nth-child(2) { - align-items: center; - display: flex; - flex-direction: row; - justify-content: space-between; - padding-right: 0px; -} - -#coalition-area-contextmenu>div:nth-child(n+3) { - align-items: center; - display: flex; - flex-direction: column; - justify-content: space-between; - row-gap: 5px; - padding: 20px; -} - -.create-iads-button { - margin-top: 5px; - text-align: center; - width: 100%; -} - -/* Airbase context menu */ -#airbase-chart-data dd { - width: 60%; - font-weight: bold; -} - -#airbase-runways { - display: flex; - flex-direction: column; - row-gap: 4px; -} - -#airbase-runways>.runway { - border: 1px solid #ccc; - display: flex; - flex-direction: row; - justify-content: space-between; -} - -#airbase-runways>.runway abbr { - cursor: help; - text-decoration: none; -} - -#airbase-runways>.runway>.heading { - align-items: center; - column-gap: 4px; - display: flex; - flex-direction: row; -} - -#airbase-runways>.runway>.heading>abbr { - font-weight: var(--font-weight-bolder); - padding: 4px; -} - -#airbase-runways>.runway>.heading:last-of-type { - flex-direction: row-reverse; -} - -/* Airbase spawn menu */ -#airbase-spawn-contextmenu { - display: flex; - flex-direction: column; - height: fit-content; - position: absolute; - row-gap: 5px; - width: 300px; - z-index: 9999; -} - -#airbase-spawn-contextmenu>div:nth-child(2) { - align-items: center; - display: flex; - flex-direction: row; - justify-content: space-evenly; - padding-right: 0px; -} - -#airbase-spawn-contextmenu >div:nth-child(n+3) { - align-items: center; - display: flex; - flex-direction: column; - justify-content: space-between; - row-gap: 5px; - padding: 20px; -} - -#airbase-spawn-contextmenu>div:nth-child(n+3)>div { - width: 100%; -} - -#force-coalition { - padding: 10px; -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/other/popup.css b/frontend/server/public/stylesheets/other/popup.css deleted file mode 100644 index 0a2c9cdd..00000000 --- a/frontend/server/public/stylesheets/other/popup.css +++ /dev/null @@ -1,33 +0,0 @@ -.ol-popup { - display: flex; - flex-direction: column; - row-gap: 5px; -} - -.ol-popup > div { - background-color: var(--background-steel); - border-radius: var(--border-radius-md); - box-shadow: 0px 2px 5px #000A; - color: white; - font-size: 12px; - height: fit-content; - width: fit-content; - padding-top: 5px; - padding-bottom: 5px; - padding-left: 15px; - padding-right: 15px; -} - -.ol-popup-stack { - margin-bottom: -20px; - z-index: -1; -} - -.visible { - opacity: 1; -} - -.invisible { - opacity: 0; - transition: opacity 2s linear; -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/other/toolbar.css b/frontend/server/public/stylesheets/other/toolbar.css deleted file mode 100644 index 5fdf1490..00000000 --- a/frontend/server/public/stylesheets/other/toolbar.css +++ /dev/null @@ -1,125 +0,0 @@ - -#primary-toolbar { - align-items: center; - display: flex; - height: fit-content; -} - -#command-mode-toolbar { - align-items: center; - display: flex; -} - -#app-icon>.ol-select-options { - width: fit-content; -} - -#app-icon>.ol-select-value { - box-shadow: none; -} - -#toolbar-summary { - background-image: url("/images/icon-round.png"); - background-position: 20px 22px; - background-repeat: no-repeat; - background-size: 45px 45px; - display: flex; - flex-direction: column; - padding: 20px; - text-indent: 60px; -} - -#toolbar-summary { - white-space: nowrap; -} - -.ol-panel-tab { - align-items: center; - display:flex; - flex-direction: row; - margin-right:6px; -} - -.ol-panel-tab svg { - height:24; - width:24px; -} - -.ol-panel-tab svg * { - fill:white; -} - -.ol-panel-tab span { - font-size:13px; - font-weight:400; - padding:0 6px; -} - -#view-label { - margin-left: 5px; -} - -#view-label svg { - height: 20px; - width: 20px; -} - -#command-mode-toolbar>svg { - display: none; -} - -#unit-visibility-control > div:nth-child(4) { - border-left: 2px solid white; - padding-left: 12px; -} - -#unit-visibility-control > div:last-child { - border-right: 2px solid white; - padding-right: 12px; -} - -@media (max-width: 1145px) { - #toolbar-container { - flex-direction: column; - align-items: start; - } - - #toolbar-container .ol-panel .ol-panel-tab { - margin-right:0; - } - - #toolbar-container .ol-panel:hover .ol-panel-tab { - display:none; - } - - #toolbar-container .ol-panel-tab span { - display:none; - } - - #toolbar-container>*:nth-child(1):not(:hover) { - width: fit-content; - height: fit-content; - } - - #toolbar-container>*:nth-child(1):not(:hover)>*:not(:first-child) { - display: none; - } - - #toolbar-container>*:not(:first-child):not(:hover) { - height: 52px; - align-items: center; - justify-content: center; - aspect-ratio: 1/1; - } - - #toolbar-container>*:not(:first-child):not(:hover)>svg { - display: block; - filter: invert(); - height: 24px; - width: 24px; - } - - #toolbar-container>*:not(:first-child):not(:hover)>*:not(:first-child) { - display: none; - } -} diff --git a/frontend/server/public/stylesheets/panels/connectionstatus.css b/frontend/server/public/stylesheets/panels/connectionstatus.css deleted file mode 100644 index 7245357f..00000000 --- a/frontend/server/public/stylesheets/panels/connectionstatus.css +++ /dev/null @@ -1,55 +0,0 @@ -#connection-status-panel { - align-items: center; - display:flex; - flex-direction: row; - justify-content: space-between; -} - -#connection-status-panel #connection-status-message::before { - content: "No connection"; -} - -#connection-status-light { - border-radius: 50%; - background: red; - content: " "; - height: 12px; - width: 12px; -} - -#connection-status-panel[data-is-connected] #connection-status-message::before { - content: ""; -} - -#connection-status-panel .time-display { - cursor:pointer; - display:none; - font-weight: bold; - text-decoration: none; -} - -#connection-status-panel[data-is-connected] .mission-elapsed-time, -#connection-status-panel[data-is-connected]:not([data-mission-time]) .mission-time { - display:none; -} - -#connection-status-panel[data-is-connected]:not([data-mission-time]) .mission-elapsed-time, -#connection-status-panel[data-is-connected][data-mission-time] .mission-time { - display:block; -} - -#connection-status-panel[data-is-connected] #connection-status-light { - background: var(--accent-green); -} - -#connection-status-panel[data-is-paused] #connection-status-message::before { - content: "Server paused"; -} - -#connection-status-panel[data-is-paused] #connection-status-light { - animation: pulse 1s infinite; -} - -#connection-status-panel[data-is-paused] #connection-status-light { - background: var(--accent-amber); -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/panels/logpanel.css b/frontend/server/public/stylesheets/panels/logpanel.css deleted file mode 100644 index 00adcaff..00000000 --- a/frontend/server/public/stylesheets/panels/logpanel.css +++ /dev/null @@ -1,84 +0,0 @@ -#log-panel>div:first-child { - width: 100%; - height: 38px; - display: flex; - justify-content: space-between; - align-items: center; - cursor: pointer; -} - -#log-panel svg { - pointer-events: none; -} - -#log-panel>div:nth-child(2) { - display: none; - margin-top: 5px; - width: 100%; - height: calc(100% - 40px); - background-color: #00000055; -} - -#log-panel.open { - height: 505px; -} - -#log-panel.open>div:nth-child(2) { - display: block; -} - -#log-panel-header-right { - align-items: center; - column-gap: 16px; - display:flex; - flex-flow: row nowrap; -} - -#log-panel-header-right svg { - width: 15px; - height: 15px; -} - -#server-status-panel abbr { - text-decoration: none; -} - -#server-status-panel dl { - column-gap: 4px; - display:flex; - flex-direction: row; - width:fit-content; -} - -#server-status-panel dl > * { - margin:0; - width:fit-content; -} - -#server-status-panel dd { - font-weight: bold; -} - -.fps-low { - color: red; -} - -.fps-medium { - color: orange; -} - -.fps-high { - color: lightgreen; -} - -.load-low { - color: lightgreen; -} - -.load-medium { - color: orange; -} - -.load-high { - color: red; -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/panels/mouseinfo.css b/frontend/server/public/stylesheets/panels/mouseinfo.css deleted file mode 100644 index c82b25e4..00000000 --- a/frontend/server/public/stylesheets/panels/mouseinfo.css +++ /dev/null @@ -1,110 +0,0 @@ -#mouse-info-panel .mouse-tool { - background-color: var(--background-grey); - border-radius: var(--border-radius-sm); - display:flex; - flex-flow:column wrap; - row-gap: 4px; - padding: 6px; -} - -#mouse-info-panel .mouse-tool .mouse-tool-item { - align-items: center; - display:flex; - flex-flow: row nowrap; - justify-content: space-between; -} - - -#mouse-info-panel svg { - padding: 3px; - height: 100%; - width: 100%; -} - -#mouse-info-panel svg > * { - fill: black; - stroke: black; -} - -#mouse-info-panel .mouse-tool .mouse-tool-item > * { - width:fit-content; -} - -#mouse-info-panel .mouse-tool .mouse-tool-item > *:last-child { - text-align: right; - width:100%; -} - -#mouse-info-panel .svg-icon, #mouse-info-panel .mouse-tool .mouse-tool-item :first-child { - align-items: center; - background-color: white; - border-radius: var(--border-radius-sm); - color: var(--background-steel); - display: flex; - font-size: 15.6px; - font-weight: bolder; - height: 22px; - justify-content: center; - text-transform: uppercase; - width: 22px; -} - -#mouse-info-panel .mouse-tool .mouse-tool-item [data-label]::after { - border-radius: var(--border-radius-sm); - content: attr(data-label); -} - - -#mouse-info-panel .mouse-tool .mouse-tool-item :last-child { - color: var(--background-offwhite); - font-weight: bold; - font-size: 13px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - width:fit-content; -} - - -/* Bullseye info */ - -#mouse-info-panel .mouse-tool .mouse-tool-item [data-label][data-coalition="blue"] { - background-color: var(--primary-blue); -} - -#mouse-info-panel .mouse-tool .mouse-tool-item [data-label][data-coalition="red"] { - background-color: var(--primary-red); -} - -.br-info::after { - content: attr(data-bearing) '\00B0 / ' attr(data-distance) " " attr(data-distance-units); -} - -.br-info[data-coalition="blue"]::after { - color: var(--primary-blue) -} - -.br-info[data-coalition="red"]::after { - color: var(--primary-red) -} - -.br-info[data-message]::after { - content: attr(data-message); -} - - -/* Coordinates */ -#coordinates-tool .elevation::after { - content: attr(data-value) -} - -#coordinates-tool[data-location-system] [data-location-system] { - cursor:pointer; - display:none; -} - -#coordinates-tool[data-location-system="LatLng"] [data-location-system="LatLng"], -#coordinates-tool[data-location-system="MGRS"] [data-location-system="MGRS"], -#coordinates-tool[data-location-system="UTM"] [data-location-system="UTM"] { - display:flex; -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/panels/serverstatus.css b/frontend/server/public/stylesheets/panels/serverstatus.css deleted file mode 100644 index 7afc8feb..00000000 --- a/frontend/server/public/stylesheets/panels/serverstatus.css +++ /dev/null @@ -1,54 +0,0 @@ -#server-status-panel { - display: flex; - flex-direction: row; - justify-content: space-between; - column-gap: 10px; -} - - -#log-panel-header-right { - align-items: center; - column-gap: 16px; - display:flex; - flex-flow: row nowrap; -} - -#server-status-panel dl { - column-gap: 4px; - display:flex; - flex-direction: row; - width:fit-content; -} - -#server-status-panel dl > * { - margin:0; - width:fit-content; -} - -#server-status-panel dd { - font-weight: bold; -} - -.fps-low { - color: red; -} - -.fps-medium { - color: orange; -} - -.fps-high { - color: lightgreen; -} - -.load-low { - color: lightgreen; -} - -.load-medium { - color: orange; -} - -.load-high { - color: red; -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/panels/unitcontrol.css b/frontend/server/public/stylesheets/panels/unitcontrol.css deleted file mode 100644 index a5f41c02..00000000 --- a/frontend/server/public/stylesheets/panels/unitcontrol.css +++ /dev/null @@ -1,417 +0,0 @@ -body.feature-forceShowUnitControlPanel #unit-control-panel { - display: block !important; -} - - -#roe-buttons-container button, -#reaction-to-threat-buttons-container button, -#emissions-countermeasures-buttons-container button, -#shots-scatter-buttons-container button #shots-intensity-buttons-container button { - align-items: center; - background-color: transparent; - border: 1px solid var(--accent-light-blue); - display: flex; - height: 30px; - justify-content: center; - width: 30px; -} - -#reaction-to-threat-buttons-container button:not(:first-child) svg { - width: 150%; - margin: -5px; -} - -#unit-control-panel h3 .num-selected-units { - margin-left:6px; -} - -#unit-control-panel h3 .num-selected-units::before { - content:"("; -} -#unit-control-panel h3 .num-selected-units::after { - content:")"; -} - -#unit-control-panel .ol-option-button button { - width: 30px; - height: 30px; -} - -#unit-control-panel .ol-option-button svg { - width: 100%; - height: 100%; -} - -#unit-control-panel .ol-option-button button.selected { - background-color: white; - border-color: white; -} - -#unit-control-panel .ol-option-button button.selected svg * { - fill: var(--background-steel); - stroke: var(--background-steel); -} - -#rapid-controls { - display: flex; - flex-direction: column; - height: fit-content; - position: absolute; - right:-10px; - row-gap: 5px; - top:0; - translate: 100% 0; - width: fit-content; -} - -#rapid-controls button { - padding: 4px; -} - -#rapid-controls button.pulse { - animation: pulse 1.5s linear infinite; -} - -#rapid-controls svg { - height: 20px; - width: 20px; - fill: white; - stroke: white; -} - -#rapid-controls button:before { - display: inline-block; - filter: invert(100%); - height: 20px; - width: 20px; -} - -#unit-control-panel { - display: flex; - flex-direction: row; - column-gap: 10px; - row-gap: 10px; -} - -#unit-control-panel>div:nth-child(2), -#unit-controls { - display: flex; - flex-direction: column; - row-gap: 10px; -} - -#unit-controls { - padding-right: 10px; -} - -#unit-control-panel>div:nth-child(2) { - width: 330px; -} - -#unit-control-panel>*:nth-child(1) { - display: none; - padding: 14px; -} - -@media (max-width: 1145px) { - #unit-control-panel>*:nth-child(1) { - display: flex; - } - - #unit-control-panel>*:nth-child(1) svg { - display: flex; - width: 24px; - height: 24px; - filter: invert(100%); - } - - #unit-control-panel:hover>*:nth-child(1) { - display: none; - } - - #unit-control-panel:not(:hover) { - width: fit-content; - } - - #unit-control-panel:not(:hover)>*:nth-child(2), - #unit-control-panel:not(:hover)>*:nth-child(3) { - display: none; - } -} - -#unit-control-panel #selected-units-container { - align-items: left; - border-radius: var(--border-radius-md); - display: flex; - flex-direction: column; - max-height: 215px; - overflow-x: hidden; - overflow-y: auto; - row-gap: 4px; -} - -#unit-control-panel #selected-units-container button { - align-items: center; - border-radius: 20px; - display: flex; - font-size: 13px; - height: 32px; - justify-content: space-between; - margin-right: 5px; - position: relative; - width: calc(100% - 5px); -} - -#unit-control-panel #selected-units-container button::after { - border-radius: 999px; - color: var(--secondary-semitransparent-white); - content: attr(data-label); - font-size: 10px; - padding: 4px 6px; - padding-right: 7px; - white-space: nowrap; - width: fit-content; -} - -#unit-control-panel #selected-units-container button:hover::after { - max-width: 100%; - text-overflow: unset; -} - -#unit-control-panel #selected-units-container button::before { - border-radius: var(--border-radius-sm); - content: attr(data-callsign); - display: block; - overflow: hidden; - padding: 4px; - padding-left: 7px; - text-align: left; - text-overflow: ellipsis; - white-space: nowrap; - width: fit-content; -} - -#unit-control-panel h4 { - margin-bottom: 8px; -} - -#advanced-settings-dialog { - width: 400px; -} - -#advanced-settings-dialog>.ol-dialog-content { - display: flex; - flex-direction: column; - flex-wrap: nowrap; - margin-bottom: 10px; - margin-top: 10px; - row-gap: 10px; -} - -#advanced-settings-dialog>.ol-dialog-content>div { - display: flex; - flex-direction: column; - flex-wrap: nowrap; - row-gap: 10px; -} - -#advanced-settings-dialog>.ol-dialog-content>div>.ol-group { - justify-content: space-between; -} - -#advanced-settings-dialog>.ol-dialog-content>div input[type="number"] { - width: 60px; -} - -#advanced-settings-dialog hr { - margin-bottom: 10px; - margin-top: 15px; -} - -#advanced-settings-dialog .ol-text-input input { - height: 40px; - width: fit-content; -} - -#advanced-settings-dialog h4 { - width: fit-content; - text-wrap: nowrap; -} - -#general-settings-grid { - display: grid; - grid-template-columns: 1fr 1fr; - row-gap: 10px; -} - -#general-settings-grid>div { - width: 49%; -} - -#flight-data .ol-slider { - margin: 20px 0px; -} - -.ol-slider-container dd { - column-gap: 5px; -} - -#flight-data .ol-switch { - height: 20px; - width: 50px; -} - -#flight-data .ol-switch-fill { - background-color: var(--accent-light-blue); -} - -#flight-data .ol-switch-fill::after { - background-color: white; -} - -#altitude-type-switch[data-value="true"]>.ol-switch-fill::before { - content: "ASL"; -} - -#altitude-type-switch[data-value="false"]>.ol-switch-fill::before { - content: "AGL"; -} - -#speed-type-switch[data-value="true"]>.ol-switch-fill::before { - content: "CAS"; -} - -#speed-type-switch[data-value="false"]>.ol-switch-fill::before { - content: "GS"; -} - -.switch-control .ol-switch { - height: 23px; - width: 40px; -} - -.ol-slider-value { - color: var(--accent-light-blue); - cursor: pointer; - font-size: 14px; - font-weight: bold; -} - -.switch-control { - align-items: center; - align-content: center; - display: flex; - width: 100%; - justify-content: space-between; -} - -.switch-control h4 { - margin: 0px !important; - padding: 0px; - display: flex; - align-items: center; -} - -.switch-control h4 img { - height: 15px; - margin-left: 10px; - cursor: pointer; - filter: invert(100%); - opacity: 80%; -} - -#advanced-settings-div { - align-items: center; - column-gap: 8px; - display: flex; - height: fit-content; - position: relative; -} - -#advanced-settings-div>button { - background-color: var(--background-grey); - /*box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.25);*/ - font-size: 13px; - height: 40px; - padding: 0 20px; -} - -#delete-options { - font-size: 13px; -} - -#delete-options.ol-select>.ol-select-value:after { - content: ""; -} - -#delete-options.ol-select>.ol-select-value svg { - background-color: transparent; - position: absolute; - right: 2px; - translate: 0 1px; -} - -#delete-options.ol-select>.ol-select-value svg * { - fill: var(--primary-red); -} - -#delete-options * { - background-color: var(--background-steel); -} - -#delete-options.ol-select>.ol-select-value:hover, -#delete-options .ol-select-options>div:not(.hr):hover, -#delete-options .ol-select-options>div:not(.hr):hover button, -#delete-options .ol-select-options>div hr { - background-color: var(--background-grey); -} - -#delete-options .ol-select-options>div:first-of-type { - margin-top: 12px; - padding-top: 0; -} - -#delete-options .ol-select-options>div:last-of-type { - margin-bottom: 12px; - padding-bottom: 0; -} - -#delete-options button { - display: flex; - flex-direction: row; - align-content: center; -} - -#delete-options button svg { - background-color: transparent; - margin-right: 10px; - width: 18px; - max-height: 18px; -} - -#delete-options button svg * { - stroke: red; -} - -/* Element visibility control */ -#unit-control-panel:not([data-show-categories-tooltip]) #categories-tooltip, -#unit-control-panel:not([data-show-speed-slider]) #speed-slider, -#unit-control-panel:not([data-show-altitude-slider]) #altitude-slider, -#unit-control-panel:not([data-show-roe]) #roe, -#unit-control-panel:not([data-show-threat]) #threat, -#unit-control-panel:not([data-show-emissions-countermeasures]) #emissions-countermeasures, -#unit-control-panel:not([data-show-shots-scatter]) #shots-scatter, -#unit-control-panel:not([data-show-shots-intensity]) #shots-intensity, -#unit-control-panel:not([data-show-tanker-button]) #tanker-on, -#unit-control-panel:not([data-show-AWACS-button]) #AWACS-on, -#unit-control-panel:not([data-show-on-off]) #ai-on-off, -#unit-control-panel:not([data-show-follow-roads]) #follow-roads, -#unit-control-panel:not([data-show-operate-as]) #operate-as, -#unit-control-panel:not([data-show-advanced-settings-button]) #advanced-settings-button, -#advanced-settings-dialog:not([data-show-settings]) #general-settings, -#advanced-settings-dialog:not([data-show-tasking]) #tasking, -#advanced-settings-dialog:not([data-show-TACAN]) #TACAN-options, -#advanced-settings-dialog:not([data-show-radio]) #radio-options, -#advanced-settings-dialog:not([data-show-air-unit-checkboxes]) .air-unit-checkbox { - display: none; -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/panels/unitinfo.css b/frontend/server/public/stylesheets/panels/unitinfo.css deleted file mode 100644 index 0b925aaf..00000000 --- a/frontend/server/public/stylesheets/panels/unitinfo.css +++ /dev/null @@ -1,184 +0,0 @@ -#unit-info-panel>* { - position: relative; - bottom: 0px; -} - -#unit-info-panel>*:nth-child(1) { - display: flex; - width: 24px; - height: 24px; - margin: 6px; - filter: invert(100%); -} - -#unit-info-panel:hover>*:nth-child(1) { - display: none; -} - -#unit-info-panel:not(:hover) { - width: fit-content; - height: fit-content; - padding: 10px; - margin: 0px; -} - -#unit-info-panel:not(:hover)>*:not(:first-child) { - display: none; -} - -#unit-info-panel>.panel-section { - border-right: 1px solid #555; - padding: 0 30px; -} - -#unit-info-panel>.panel-section:first-of-type { - padding-left: 0px; -} - -#unit-info-panel>.panel-section:last-of-type{ - padding-right: 0px; -} - -#unit-info-panel>.panel-section:last-of-type { - border-right-width: 0; -} - -#general { - display: flex; - flex-direction: column; - justify-content: space-between; - row-gap: 4px; - position: relative; - width: 300px; -} - -#unit-label { - font-weight: bold; -} - -#unit-group { - border-radius: var(--border-radius-md); - margin-top: auto; - padding: 6px 16px; - background-color: var(--secondary-light-grey); -} - -#unit-group::after { - content: attr(data-group-name); - display: block; -} - -#unit-control { - color: var(--secondary-lighter-grey); - font-weight: bold; -} - -#unit-name { - margin-bottom: 4px; - padding: 0px 0; - width: 100%; - text-overflow: ellipsis; - text-wrap: nowrap; - overflow: hidden; -} - -#current-task { - border-radius: var(--border-radius-md); - margin-top: auto; - padding: 6px 16px; -} - -#current-task::after { - content: attr(data-current-task); - display: block; -} - -#loadout { - display: flex; - overflow: visible; - width: 100%; - min-width: 125px; -} - -#loadout-container { - display: flex; - flex-direction: column; - justify-content: space-between; - width: 300px; -} - -#loadout-silhouette { - filter: invert(100%); - height: 75px; - margin-right: 25px; - width: 75px; -} - -#loadout-items { - align-self: center; - column-gap: 8px; - display: flex; - flex-flow: column nowrap; - height: 100px; - row-gap: 6px; - padding-right: 10px; -} - -#loadout-items>* { - align-items: center; - column-gap: 8px; - display: flex; - white-space: nowrap; -} - -#loadout-items>*::before { - align-items: center; - background-color: var(--secondary-light-grey); - border-radius: 999px; - content: attr(data-qty); - display: flex; - font-size: 11px; - font-weight: bold; - padding: 3px 4px; -} - -#loadout-items>*::after { - content: attr(data-item); - max-width: 125px; - overflow: hidden; - position: relative; - text-overflow: ellipsis; - width: 100%; -} - -#fuel-percentage { - align-items: center; - display: flex; - margin-top: 8px; -} - -#fuel-percentage::before { - content: ""; - background-image: url("/resources/theme/images/icons/fuel.svg"); - background-size: 16px 16px; - display: inline-block; - filter: invert(100%); - margin-right: 6px; -} - -#fuel-percentage::after { - content: attr(data-percentage) "%"; -} - -#fuel-display { - background-color: var(--background-grey); - border-radius: var(--border-radius-md); - height: 6px; - margin-top: 4px; - overflow: hidden; -} - -#fuel-display #fuel-bar { - border-radius: var(--border-radius-md); - height: 100%; -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/panels/unitlist.css b/frontend/server/public/stylesheets/panels/unitlist.css deleted file mode 100644 index 7f60bdda..00000000 --- a/frontend/server/public/stylesheets/panels/unitlist.css +++ /dev/null @@ -1,92 +0,0 @@ -#unit-list-panel { - bottom:20px; - display:flex; - flex-direction: column; - justify-self:center; - position: absolute; - z-index:999; -} - -#unit-list-panel h3 { - margin-bottom:4px; -} - -#unit-list-panel-content { - display:flex; - flex-flow: column nowrap; - max-height: 200px; - row-gap: 4px; -} - -.unit-list-unit { - border-radius: var( --border-radius-sm ); - column-gap: 2px; - display:flex; - flex-flow: row nowrap; - justify-content: space-between; -} - - -.unit-list-unit:nth-of-type(even) { - background:#ffffff10; - overflow:visible; -} - -.unit-list-unit.headers { - margin-bottom:3px; - margin-right:10px; - overflow: hidden; -} - -.unit-list-unit.headers [data-sort-field] { - cursor:pointer; -} - -.unit-list-unit.headers > * { - background-color: var( --background-grey ); - text-align: center; -} - -.unit-list-unit > * { - font-size:13px; - overflow: hidden; - padding:2px; - width:80px; -} - -.unit-list-unit :first-child { - overflow-x: hidden; - text-overflow: ellipsis; - white-space: nowrap; - width:150px; -} - -.unit-list-unit :first-child:hover { - overflow:visible; -} - -.unit-list-unit :first-child:hover span { - position:relative; - z-index:9999; -} - -.unit-list-unit :first-child:hover span:hover { - background-color: white; - color: var( --background-steel ); -} - -.unit-list-unit :nth-child(2) { - width:120px; -} - -.unit-list-unit > [data-unit-id] { - cursor:pointer; -} - -#unit-list-panel-content > * { - cursor:pointer; -} - -#unit-list-panel-content > .unit-list-unit:hover { - background-color: var( --background-grey ); -} \ No newline at end of file diff --git a/frontend/server/public/stylesheets/style/style.css b/frontend/server/public/stylesheets/style/style.css deleted file mode 100644 index 7f3bb7fd..00000000 --- a/frontend/server/public/stylesheets/style/style.css +++ /dev/null @@ -1,1775 +0,0 @@ -* { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} - -html * { - font-family: 'Open Sans', sans-serif !important; - user-select: none; -} - -body { - display: grid; - margin: 0; - padding: 0; - position: fixed; -} - -html, -body { - height: 100%; - width: 100%; -} - -.hidden-cursor { - /*cursor: none !important;*/ -} - -.hidden-cursor * { - cursor: none !important; - pointer-events: none !important; -} - -a { - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -button { - background-color: var(--background-steel); - border: 1px solid var(--background-steel); - border-radius: var(--border-radius-sm); - color: whitesmoke; - cursor: pointer; - font-weight: var(--font-weight-bolder); - padding: 6px; - column-gap: 5px; -} - -button:hover { - background-color: var(--background-hover); -} - -button[disabled="disabled"] { - color: var(--highlight-color); - cursor: not-allowed; -} - -button>svg:first-child, -button>img:first-child { - position: relative; - aspect-ratio: initial; - height: 100%; - pointer-events: none; -} - -form { - margin: 0; - padding: 0; -} - -button svg.fill-coalition * { - fill: var(--primary-neutral) !important; -} - -button svg.fill-coalition[data-coalition="blue"] * { - fill: var(--primary-blue) !important; -} - -button svg.fill-coalition[data-coalition="red"] * { - fill: var(--primary-red) !important; -} - -.pill { - background-color: var(--background-steel); - border-radius: 999px; - padding: 4px 8px; - width: fit-content; - font-weight: bold; -} - -.pill-light { - background-color: var(--background-grey); - border-radius: var(--border-radius-md); - padding: 3px 6px; - width: fit-content; -} - -.ol-scrollable { - overflow-y: auto; - scrollbar-color: white transparent; - scrollbar-width: thin; -} - -.ol-scrollable::-webkit-scrollbar { - width: var(--border-radius-md); -} - -.ol-scrollable::-webkit-scrollbar-track { - background-color: transparent; - border-bottom-right-radius: 10px; - border-top-right-radius: 10px; - margin-top: 0px; -} - -.ol-select .ol-scrollable { - scrollbar-color: white var(--background-grey); -} - -.ol-select .ol-scrollable::-webkit-scrollbar-track { - background-color: var(--background-grey); -} - -.ol-scrollable::-webkit-scrollbar-thumb { - background-color: white; - border-radius: 100px; - margin-top: 10px; - opacity: 0.8; -} - -.ol-panel { - background-color: var(--background-steel); - border-radius: var(--border-radius-md); - box-shadow: 0px 2px 5px #000A; - color: white; - font-size: 12px; - height: fit-content; - padding: 10px; - width: fit-content; -} - -.ol-panel hr { - background-color: var(--secondary-transparent-white); - border: none; - height: 1px; - margin: 10px 0; - width: 100%; -} - -.ol-panel-padding-lg { - padding: 24px 30px; -} - -.ol-select-container { - width: 100%; -} - -.ol-ellipsed { - display: inline-block; - overflow: hidden; - text-align: left; - text-overflow: ellipsis; - width: calc(100%); -} - -.ol-select { - color: var(--nav-text); - position: relative; -} - -.ol-select[disabled] { - color: var(--ol-dialog-disabled-text-color); -} - -.ol-select>.ol-select-value { - align-content: center; - /*box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);*/ - cursor: pointer; - display: flex; - justify-content: left; - min-width: 0; - text-align: center; - white-space: nowrap; - width: 100%; -} - -.ol-select:not(.ol-select-image)>.ol-select-value { - align-items: center; - background-color: var(--background-grey); - border-radius: var(--border-radius-sm); - height: 40px; - overflow: hidden; - padding-left: 20px; - padding-right: 30px; - text-overflow: ellipsis; - - width: calc(100%); -} - -.ol-select.narrow:not(.ol-select-image)>.ol-select-value { - opacity: .9; - padding: 4px 30px 4px 15px; -} - -.ol-select:not(.ol-select-image)>.ol-select-value svg { - margin-right: 10px; -} - -.ol-select:not(.ol-select-image)>.ol-select-value:after { - background-image: url("/resources/theme/images/icons/chevron-down.svg"); - content: ""; - position: absolute; - right: 10px; - width: 15px; - height: 15px; - background-size: 100% 100%; -} - -.ol-select[disabled]:not(.ol-select-image)>.ol-select-value:after { - opacity: 15%; -} - -.ol-select:not(.ol-select-image)>.ol-select-value.ol-select-warning:after { - background-image: url("/resources/theme/images/icons/chevron-down-warning.svg") !important; -} - -.ol-select.is-open:not(.ol-select-image)>.ol-select-value:after { - transform: rotate(180deg); -} - -.ol-select>.ol-select-options { - border-radius: var(--border-radius-md); - max-height: 0; - overflow: hidden; - position: absolute; - z-index: 99999; -} - -.ol-select-options.scrollbar-visible { - border-bottom-right-radius: 0px !important; - border-top-right-radius: 0px !important; -} - -.ol-select.ol-select-image>.ol-select-options { - position: absolute; -} - -.ol-select.is-open>.ol-select-options { - max-height: 382px; - min-width: 100%; - overflow: visible; - overflow-y: auto; - translate: 0px 5px; - z-index: 99999; -} - -.ol-select.is-open[data-position="top"]>.ol-select-options { - top: 0; - translate: 0 -100%; -} - -.ol-select>.ol-select-options>div { - background-color: var(--background-grey); - display: flex; - justify-content: left; - padding: 2px 15px; - width: 100%; -} - -.ol-select>.ol-select-options>div:first-of-type { - padding-top: 12px; -} - -.ol-select>.ol-select-options>div:last-of-type { - padding-bottom: 12px; -} - -.ol-select>.ol-select-options div hr { - background-color: var(--background-hover); - height: 1px; - width: 100%; -} - -.ol-select>.ol-select-options>div a, -.ol-select>.ol-select-options>div button { - background-color: transparent; - border: none; - border-radius: 0; - border-radius: var(--border-radius-sm); - color: white; - display: block; - font-size: 13px; - font-weight: normal; - height: 32px; - padding: 6px 2px; - padding: 5px; - text-align: left; - white-space: nowrap; - width: 100%; -} - -.ol-select>.ol-select-options>div a:hover, -.ol-select>.ol-select-options>div button:hover { - background-color: #FFF3; - text-decoration: none; -} - -.ol-panel-list { - border-radius: var(--border-radius-sm); - display: flex; - flex-direction: column; - height: fit-content; - row-gap: 5px; - text-align: center; - width: fit-content; -} - -.ol-panel-list .list-item { - border-radius: var(--border-radius-md); - display: flex; - justify-content: space-between; - padding: 6px 10px; -} - -.ol-panel-list.sortable>.sortable-item { - align-items: center; - column-gap: 5px; - display: flex; - flex-direction: row; -} - -.ol-panel-list.sortable>.sortable-item>.handle { - cursor: grab; - filter: invert(100); -} - -.ol-panel-list.sortable>.sortable-item>.handle img { - max-width: 16px; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0px; -} - -h1 { - font-size: 36px; - font-weight: 800; -} - -h2 { - font-size: 24px; - font-weight: bold; -} - -h3 { - font-size: 18px; - font-weight: bold; -} - -h4 { - font-size: 14px; - font-weight: normal; -} - -button.ol-button-white { - border: 1px solid white; - color: white; - font-weight: bold; -} - -button.ol-button-white>svg:first-child { - stroke: white; - fill: white; -} - -.ol-select-warning { - border: 1px solid var(--primary-red); - color: var(--primary-red) !important; - font-weight: bold !important; -} - -.ol-select-warning::after { - stroke: var(--primary-red); - fill: var(--primary-red); -} - -button.ol-button-warning { - border: 1px solid var(--primary-red); - color: var(--primary-red) !important; - font-weight: bold !important; -} - -button.ol-button-warning>svg:first-child { - stroke: var(--primary-red); - fill: var(--primary-red); -} - -nav.ol-panel { - column-gap: 10px; - display: flex; - flex-direction: row; - height: 58px; - padding-left: 15px; - padding-right: 15px; -} - -.ol-panel .ol-group { - align-items: center; - column-gap: 6px; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - row-gap: 4px; -} - -.ol-group-header { - text-align: center; - width: 100%; -} - -.ol-panel .ol-group.wrap { - flex-wrap: wrap; -} - -.ol-panel .ol-group-button-toggle { - align-items: center; - display: flex; - flex-wrap: nowrap; - white-space: nowrap; - width: fit-content; -} - -.ol-panel .ol-group-button-toggle button { - background-position: 5px 50%; - background-repeat: no-repeat; - border: 0; - display: flex; - justify-items: left; - text-indent: 2px; -} - -.ol-panel .ol-group-button-toggle button::before { - background-image: url("/resources/theme/images/icons/square-check-solid.svg"); - background-repeat: no-repeat; - content: ""; - filter: invert(100%); - -webkit-filter: invert(100%); - height: 16px; - width: 16px; - background-size: 100% 100%; -} - -.ol-panel .ol-group-button-toggle button.off::before { - background-image: url("/resources/theme/images/icons/square-regular.svg"); -} - -.highlight-primary { - background-color: var(--secondary-light-grey); -} - -.highlight-coalition, -.highlight-neutral { - background-color: var(--primary-neutral); - color: var(--secondary-gunmetal-grey) -} - -.highlight-coalition[data-coalition="blue"], -.highlight-bluefor { - background-color: var(--primary-blue); - color: white; -} - -.highlight-coalition[data-coalition="red"], -.highlight-redfor { - background-color: var(--primary-red); - color: white; -} - -.accent-green { - color: var(--accent-green); - font-weight: var(--font-weight-bolder); -} - -.accent-light-blue { - color: var(--accent-light-blue); - font-weight: var(--font-weight-bolder); -} - -.accent-bluefor { - color: var(--primary-blue); - font-weight: var(--font-weight-bolder); -} - -.accent-redfor { - color: var(--primary-red); - font-weight: var(--font-weight-bolder); -} - -.accent-neutral { - color: var(--primary-neutral); - font-weight: var(--font-weight-bolder); -} - -.hide { - display: none !important; -} - -.icon-small { - filter: invert(100%); - padding: 2px; - width: 20px; -} - -.ol-data-grid { - display: flex; - flex-direction: column; -} - -.ol-slider-container { - width: 100%; -} - -.ol-slider-container:not(:first-of-type) { - margin-top: 10px; - width: 100%; -} - -.ol-slider { - -webkit-appearance: none; - appearance: none; - background: #d3d3d3; - height: 2px; - margin-bottom: 10px; - margin-top: 15px; - opacity: 0.7; - outline: none; - -webkit-transition: .2s; - transition: opacity .2s; - width: 100%; -} - -.ol-slider:hover { - opacity: 1; -} - -.ol-slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - background: var(--background-grey); - border-radius: 999px; - cursor: pointer; - height: 25px; - width: 25px; -} - -.active .ol-slider::-webkit-slider-thumb { - background: radial-gradient(circle at center, var(--accent-light-blue), var(--accent-light-blue) 40%, var(--transparent-accent-light-blue) 50%); -} - -.ol-slider::-moz-range-thumb { - -moz-appearance: none; - border: 0px solid transparent; - background: var(--background-grey); - border-radius: 999px; - cursor: pointer; - height: 25px; - width: 25px; -} - -.active .ol-slider::-moz-range-thumb { - -moz-appearance: none; - background: radial-gradient(circle at center, var(--accent-light-blue), var(--accent-light-blue) 40%, var(--transparent-accent-light-blue) 50%); -} - -.ol-slider-min-max { - display: flex; - justify-content: space-between; - color: var(--secondary-light-grey); -} - -.ol-slider-min-max::before { - content: attr(data-min-value); -} - -.ol-slider-min-max::after { - content: attr(data-max-value); -} - -.main-logo { - height: 40px; - width: 40px; -} - -.ol-measure-box { - background-color: var(--background-steel); - border-radius: 999px; - color: var(--background-offwhite); - font-size: 12px; - font-weight: bolder; - height: fit-content; - padding-bottom: 0.2em; - padding-left: 0.5em; - padding-right: 0.5em; - padding-top: 0.2em; - position: absolute; - text-align: center; - width: fit-content; - z-index: 2000; - pointer-events: none; -} - -.ol-sortable .handle { - background-image: url("/resources/theme/images/icons/grip-lines-solid.svg"); - cursor: ns-resize; - filter: invert(); - height: 12px; - width: 12px; -} - -#unit-selection { - display: flex; - flex-direction: column; -} - -#unit-selection #unit-identification { - align-items: center; - display: flex; - margin-bottom: 11px; -} - -#unit-selection #unit-identification [data-object|="unit"] { - height: 28px; - margin-right: 6px; - width: 28px; -} - -#unit-selection #unit-identification [data-object|="unit"] .unit-icon { - background-size: 28px 28px; - height: 28px; - width: 28px; -} - -.ol-navbar-buttons-group { - align-items: center; -} - -.ol-navbar-buttons-group>div { - align-items: center; - display: flex; - flex-direction: row; -} - -.ol-navbar-buttons-group button { - border: none; - height: 32px; - padding: 0px; - width: 32px; -} - -.ol-navbar-buttons-group button svg { - height: 16px; - pointer-events: none; - width: 16px; -} - -.ol-navbar-buttons-group button { - background-color: white; - border: 1px solid transparent; -} - -.ol-navbar-buttons-group button.off { - background-color: transparent; - border: 1px solid white; -} - -.ol-navbar-buttons-group button.off svg *[fill="black"] { - fill: white !important; -} - -.ol-navbar-buttons-group button.off svg *[stroke="black"] { - stroke: white !important; -} - -.ol-navbar-buttons-group button.red svg *[fill="black"] { - fill: red !important; -} - -.ol-navbar-buttons-group button svg * { - fill: var(--background-steel); - stroke: var(--background-steel); -} - -.ol-navbar-buttons-group .protectable button:first-of-type { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - width: 28px; -} - -.ol-navbar-buttons-group>.protectable>button.lock { - align-items: center; - background-color: var(--primary-red); - border-bottom-left-radius: 0; - border-top-left-radius: 0; - display: flex; - justify-content: center; - width: 18px; -} - -.ol-navbar-buttons-group>.protectable>button[data-protected].lock { - background-color: var(--background-grey); -} - -.ol-navbar-buttons-group>.protectable>button.lock svg { - height: 10px; - width: 10px; -} - -@keyframes lock-prompt { - 100% { - opacity: 1; - } - - 0% { - opacity: 0; - } -} - -.ol-navbar-buttons-group>.protectable>button[data-protected].lock.prompt svg { - animation: lock-prompt .25s alternate infinite; -} - -.ol-navbar-buttons-group>.protectable>button.lock svg.locked * { - fill: white !important; -} - -.ol-navbar-buttons-group>.protectable>button:not([data-protected]).lock svg.unlocked, -.ol-navbar-buttons-group>.protectable>button[data-protected].lock svg.locked { - display: flex; -} - -.ol-navbar-buttons-group>.protectable>button[data-protected].lock svg.unlocked, -.ol-navbar-buttons-group>.protectable>button:not([data-protected]).lock svg.locked { - display: none; -} - - - -#roe-buttons-container button, -#reaction-to-threat-buttons-container button, -#emissions-countermeasures-buttons-container button, -#shots-scatter-buttons-container button #shots-intensity-buttons-container button { - align-items: center; - background-color: transparent; - border: 1px solid var(--accent-light-blue); - display: flex; - height: 30px; - justify-content: center; - width: 30px; -} - -#reaction-to-threat-buttons-container button:not(:first-child) svg { - width: 150%; - margin: -5px; -} - -#unit-control-panel .ol-option-button button.selected { - background-color: white; - border-color: white; -} - -#unit-control-panel .ol-option-button button.selected svg * { - fill: var(--background-steel); - stroke: var(--background-steel); -} - -#rapid-controls { - display: flex; - flex-direction: column; - row-gap: 5px; - height: fit-content; - width: fit-content; -} - -#rapid-controls button { - padding: 4px; -} - -#rapid-controls svg { - height: 20px; - width: 20px; - fill: white; - stroke: white; -} - -#rapid-controls button:before { - display: inline-block; - filter: invert(100%); - height: 20px; - width: 20px; -} - -/****************************************************************************************/ -#splash-screen { - border-radius: var(--border-radius-md); - overflow: hidden; - width: 70%; - max-width: 1200px; - z-index: 999999; - min-width: 500px; -} - -@media (min-width: 1700px) { - #splash-screen { - background-position: 100% 50%; - background-size: contain; - } -} - -#splash-content { - background-color: var(--background-steel); - display: flex; - flex-direction: column; - padding: 30px; - position: relative; - row-gap: 10px; - width: 50%; -} - -@media (max-width: 1700px) { - #splash-content { - width: auto; - } -} - -#splash-content::after { - background-color: var(--background-steel); - content: ""; - display: block; - height: 800px; - position: absolute; - right: 0; - top: 0; - transform: rotate(-23deg); - transform-origin: top right; - width: 300px; - z-index: -1; -} - -#splash-content #app-summary { - background-image: url("/images/olympus-500x500.png"); - background-position: 0 50%; - background-repeat: no-repeat; - background-size: 75px 75px; - content: ""; - display: flex; - flex-direction: column; - justify-content: space-between; - min-height: 75px; - text-indent: 85px; - row-gap: 5px; -} - -#splash-content #app-summary>* { - height: fit-content; - padding: 2px; - white-space: nowrap; - width: fit-content; -} - -#splash-content .app-version { - font-size: 11px; - padding: 0px; -} - -#splash-content .new-version { - animation: pulse 1.5s linear infinite; -} - -#splash-content .app-version:first-of-type { - margin-top: auto; -} - -#splash-content #legal-stuff { - width: 120%; - text-wrap: wrap; - max-height: 250px; - overflow-x: hidden; - padding-right: 10px; -} - -#splash-content #legal-stuff h5 { - text-transform: uppercase; -} - -#splash-content #legal-stuff p { - color: #FFF7; - font-size: 10px; - width: 100%; -} - -@media (max-width: 1700px) { - #splash-content #legal-stuff { - width: 100%; - } -} - -#splash-content.ol-dialog-content { - margin: 0px; -} - -#gray-out { - background-color: #000A; - height: 100%; - left: 0px; - position: fixed; - top: 0px; - width: 100%; - z-index: 99999; -} - -#loading-screen { - display: flex; - background-image: linear-gradient(var(--background-steel), var(--background-grey)); - height: 100%; - left: 0px; - position: fixed; - top: 0px; - width: 100%; - z-index: 999999; - justify-content: center; - align-items: center; - flex-direction: column; - row-gap: 20px; -} - -#loading-screen img { - height: 300px; - width: 300px; -} - -#loading-screen div { - color: white; - font-size: 18px; - animation: pulse 3s linear infinite; -} - -.fade-out { - opacity: 0%; - transition: opacity 1s; -} - -#authentication-form { - align-items: end; - column-gap: 10px; - display: flex; - flex-direction: row; - margin: 20px 0px; - flex-wrap: wrap; - width: 100%; - row-gap: 10px; -} - -#authentication-form>div { - align-items: start; - display: flex; - flex-direction: column; - row-gap: 4px; -} - -#authentication-form>div>input { - border: 0px solid transparent; - border-radius: var(--border-radius-sm); - height: 35px; - width: 200px; -} - -#splash-content a { - color: #FFFB; - font-weight: bold; -} - -#login-status { - margin-bottom: 5px; -} - -#login-status[data-status="connecting"]::before { - animation: blinker 1s linear infinite; - content: "Connecting..."; -} - -#login-status[data-status="failed"]::before { - color: var(--primary-red); - content: "Incorrect password!"; -} - -@keyframes blinker { - 50% { - opacity: 0; - } -} - -#hotgroup-panel>div { - align-items: center; - background-color: var(--background-steel); - border: 0px solid transparent; - border-radius: var(--border-radius-sm); - color: white; - display: flex; - font-weight: bold; - height: 50px; - justify-content: center; - width: 50px; -} - -#hotgroup-panel>div:hover { - border: 2px solid white; - cursor: pointer; -} - -.hotgroup-selector>.unit-hotgroup { - display: flex; - translate: 0% -300%; -} - -#command-mode { - display: flex; - font-size: 14px; - font-weight: bolder; - padding-left: 10px; - margin-left: -16px; - margin-top: -0px; - margin-bottom: -0px; - height: 58px; - padding: 10px; - border-top-left-radius: var(--border-radius-md); - border-bottom-left-radius: var(--border-radius-md); - align-items: center; -} - -#command-mode[data-mode="Game master"] { - background-color: lightgray; - color: var(--secondary-gunmetal-grey); -} - -#command-mode[data-mode="Blue commander"] { - background-color: var(--primary-blue); -} - -#command-mode[data-mode="Red commander"] { - background-color: var(--primary-red); -} - -#spawn-points-container { - font-size: 14px; -} - -#spawn-points { - background-color: var(--background-grey); - padding: 5px 15px; - margin-left: 15px; - border: 1px white solid; - font-size: 14px; - border-radius: var(--border-radius-md); -} - -#spawn-points-container { - height: 100%; - display: flex; - align-items: center; -} - -#command-mode-phase.setup-phase::after { - color: orange; - border: 1px solid orange; - border-radius: 999px; - padding: 5px 10px; - background-color: var(--background-grey); - content: attr(data-remaining-time); - font-size: 14px; -} - -#command-mode-phase.game-commenced { - background-color: var(--background-grey); - color: lightgreen; - border: 1px solid lightgreen; - padding: 5px 15px; - border-radius: var(--border-radius-md); - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; -} - -#command-mode-phase.game-commenced::after { - content: "Spawn restrictions on"; - font-size: 12px; -} - -#command-mode-phase.no-restrictions::after { - content: "Spawn restrictions on"; - font-size: 10px; -} - -#command-mode-toolbar { - min-width: fit-content; -} - -#command-mode-toolbar .ol-button { - border: 1px solid white; -} - -#command-mode-toolbar .ol-button>svg { - width: 20px; - height: 20px; - fill: white; -} - -#command-mode-settings-dialog { - width: 400px; -} - -#command-mode-settings-dialog>.ol-dialog-content { - display: flex; - flex-direction: column; - flex-wrap: nowrap; - margin-bottom: 10px; - margin-top: 10px; - row-gap: 10px; - width: 100%; -} - -#command-mode-settings-dialog>.ol-dialog-content .ol-group { - justify-content: space-between; -} - -#command-mode-settings-dialog h4 { - white-space: nowrap; - width: fit-content; -} - -.ol-destination-preview-icon { - background-image: url("/resources/theme/images/markers/move.svg"); - height: 52px; - pointer-events: none; - width: 52px; -} - -.ol-target-icon { - background-image: url("/resources/theme/images/markers/target.svg"); - height: 52px; - pointer-events: none; - width: 52px; - z-index: 9999; -} - -.ol-smoke-icon { - background-image: url("/resources/theme/images/markers/smoke.svg"); - height: 52px; - pointer-events: none; - width: 52px; - z-index: 9999; - opacity: 0.8; -} - -.ol-smoke-icon[data-color="white"] { - fill: white; -} - -.ol-smoke-icon[data-color="blue"] { - fill: blue; -} - -.ol-smoke-icon[data-color="red"] { - fill: red; -} - -.ol-smoke-icon[data-color="green"] { - fill: green; -} - -.ol-smoke-icon[data-color="orange"] { - fill: orange; -} - -.ol-draw-icon { - background-image: url("/resources/theme/images/markers/draw.svg"); - height: 24px; - pointer-events: none; - width: 24px; - z-index: 9999; -} - -.ol-coalitionarea-handle-icon, -.ol-coalitionarea-middle-handle-icon, -.ol-destination-preview-icon, -.ol-destination-preview-handle-icon { - pointer-events: none; - z-index: 9999; - border-radius: 999px; -} - -.ol-coalitionarea-handle-icon { - background-color: #FFFFFFEE; - width: 24px; - height: 24px; -} - -.ol-coalitionarea-middle-handle-icon { - background-color: #FFFFFFAA; - width: 16px; - height: 16px; -} - -.ol-destination-preview-handle-icon { - background-color: #247be2; - border: 2px solid white; - width: 18px; - height: 18px; -} - -dl.ol-data-grid { - align-items: center; - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin: 0; - row-gap: 4px; -} - -dl.ol-data-grid dt.icon { - text-indent: 10px; -} - -dl.ol-data-grid dt.icon::before { - content: url("/resources/theme/images/icons/speed.svg"); - display: inline-block; - filter: invert(100%); - translate: -20px 2px; - width: 20px; -} - -dl.ol-data-grid dt.icon-speed::before { - content: url("/images/icons/speed.svg"); -} - -dl.ol-data-grid dt.icon-altitude::before { - content: url("/images/icons/altitude.svg"); -} - -dl.ol-data-grid dd { - display: flex; - justify-content: flex-end; - margin-left: auto; -} - -.ol-button-box { - column-gap: 6px; - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin: 5px 0; - row-gap: 5px; -} - -.ol-button-box button { - background-repeat: no-repeat; - ; - border: 1px solid var(--accent-light-blue); - color: var(--accent-light-blue); -} - -.ol-dialog { - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: var(--background-slate-blue); - color: white; - position: absolute; - z-index: 999999; -} - -.ol-panel.ol-dialog { - padding: 24px 30px; -} - -.ol-dialog-close { - cursor: pointer; - font-size: 16px; - font-weight: var(--font-weight-bolder); - position: absolute; - right: 20px; - top: 10px; -} - -.ol-dialog-close::before { - content: "\d7"; -} - -.ol-dialog-header { - border-bottom: 1px solid var(--background-grey); - padding-bottom: 10px; -} - -.ol-dialog-content { - margin: 4px 0; -} - - -.ol-dialog label[disabled] { - color: var(--ol-dialog-disabled-text-color) -} - -.ol-dialog-content table th { - background-color: var(--background-grey); - color: white; - font-size: 14px; - font-weight: normal; -} - -.ol-dialog-content table tbody th { - text-align: left; -} - -.ol-dialog-footer { - align-content: center; - border-top: 1px solid var(--background-grey); - display: flex; - justify-content: flex-end; - padding-top: 15px; - row-gap: 10px; -} - -.ol-dialog.scrollable .ol-dialog-content { - overflow-y: auto; -} - -.ol-checkbox label, -.ol-text-input label { - align-items: center; - cursor: pointer; - display: flex; - flex-wrap: nowrap; - white-space: nowrap; -} - -.ol-text-input label { - justify-content: space-between; - width: 100%; -} - -.ol-checkbox input[type="checkbox"] { - appearance: none; - background-color: transparent; - border: none; - margin: 0; -} - -.ol-checkbox input[type="checkbox"]::before { - align-self: center; - background-image: url("/resources/theme/images/icons/square-regular.svg"); - background-repeat: no-repeat; - content: ""; - display: flex; - filter: invert(100%); - height: 16px; - margin-right: 10px; - width: 16px; - background-size: 100% 100%; -} - -.ol-checkbox input[type="checkbox"]:disabled:before { - opacity: 10%; -} - -.ol-checkbox input[type="checkbox"]:checked::before { - background-image: url("/resources/theme/images/icons/square-check-solid.svg"); -} - -.ol-text-input input { - background-color: var(--background-grey); - border: 1px solid var(--background-grey); - border-radius: var(--border-radius-sm); - /*box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);*/ - color: var(--background-offwhite); - height: 32px; - text-align: center; -} - -.ol-text-input.border input { - border: 1px solid var(--background-offwhite); -} - -.ol-text-input input[disabled] { - color: var(--ol-dialog-disabled-text-color); -} - -input[type=number] { - -moz-appearance: textfield; - appearance: textfield; - margin: 0; -} - -input[type=number]::-webkit-inner-spin-button, -input[type=number]::-webkit-outer-spin-button { - -webkit-appearance: none; - margin: 0; -} - -[class|="ol-button"] { - align-items: center; - background-repeat: no-repeat; - display: flex; - font-weight: normal; - padding: 8px 10px; - white-space: nowrap; -} - -[class|="ol-button"]::before { - margin-right: 8px; -} - -.ol-button-close { - background: transparent; - border: 1px solid white; -} - -.ol-button-close::before { - content: "\d7"; -} - -.ol-button-apply { - background: transparent; - border: 1px solid white; -} - -.ol-button-apply[disabled] { - border-color: var(--ol-dialog-disabled-text-color); - color: var(--ol-dialog-disabled-text-color); -} - -.ol-button-apply::before { - content: "\2713"; -} - -.ol-button-settings { - background-color: var(--background-slate-blue); -} - -.ol-button-settings::before { - background-image: url("/resources/theme/images/icons/gears-solid.svg"); - background-position: 0 50%; - background-size: 24px 24px; - content: ""; - display: flex; - filter: invert(100%); - height: 24px; - width: 24px; -} - -.ol-switch { - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; -} - -.ol-switch-input { - display: none; -} - -.ol-switch-fill { - border-radius: 999px; - position: relative; - transition: background-color 0.2s; - height: var(--height); - width: var(--width); -} - -.ol-switch-fill::after { - aspect-ratio: 1 / 1; - background-clip: content-box; - background-color: #ffffff; - border-radius: 999px; - box-sizing: border-box; - content: ""; - height: 100%; - padding: 3px; - position: absolute; - transition: transform 0.2s; - top: 0px; -} - -.ol-switch-fill::before { - align-items: center; - box-sizing: border-box; - color: white; - display: flex; - font-size: 11px; - height: 100%; - padding: 0px 7px; - position: absolute; - transition: transform 0.2s; -} - -.ol-switch[data-value="false"]>.ol-switch-fill::before { - transform: translateX(calc(var(--width) - 100%)); -} - -.ol-switch[data-value="true"]>.ol-switch-fill::after { - transform: translateX(calc(var(--width) - var(--height))); -} - -.ol-switch[data-value="undefined"]>.ol-switch-fill::after { - transform: translateX(calc((var(--width) - var(--height)) * 0.5)); -} - -.switch-control.yes-no .ol-switch[data-value="true"] .ol-switch-fill { - background-color: var(--accent-light-blue); -} - -.switch-control.yes-no .ol-switch[data-value="false"] .ol-switch-fill { - background-color: var(--ol-switch-off); -} - -.switch-control.yes-no .ol-switch[data-value="undefined"] .ol-switch-fill { - background-color: var(--ol-switch-undefined); -} - -.switch-control.coalition .ol-switch>.ol-switch-fill::before, -.switch-control.yes-no .ol-switch>.ol-switch-fill::before { - translate: -100% 0; - transform: none; -} - -.switch-control.yes-no .ol-switch[data-value="true"]>.ol-switch-fill::before { - content: "YES"; -} - -.switch-control.yes-no .ol-switch[data-value="false"]>.ol-switch-fill::before { - content: "NO"; -} - -.switch-control.coalition [data-value="true"] .ol-switch-fill { - background-color: var(--primary-blue); -} - -.switch-control.coalition [data-value="false"] .ol-switch-fill { - background-color: var(--primary-red); -} - -.switch-control.coalition [data-value="undefined"] .ol-switch-fill { - background-color: var(--primary-neutral); -} - -.switch-control.coalition [data-value="true"] .ol-switch-fill::before { - content: "BLUE"; -} - -.switch-control.coalition [data-value="false"] .ol-switch-fill::before { - content: "RED"; -} - -.switch-control.no-label [data-value] .ol-switch-fill::before { - content: ""; -} - -.ol-context-menu>ul { - max-height: 200px; - overflow-x: hidden; - overflow-y: auto; -} - -.ol-context-menu .ol-panel { - border-radius: var(--border-radius-sm); - width: 100%; -} - -.ol-context-menu ul { - margin: 0px; -} - -.ol-context-menu .ol-select-container { - align-self: stretch; - flex: 0 0 auto; - width: 100%; -} - -.ol-context-menu-button { - border: none; - border-radius: 0px; - height: 48px; - margin-bottom: -10px; - margin-top: -10px; - width: 48px; -} - -.ol-context-menu-button:last-of-type { - border-bottom-right-radius: var(--border-radius-sm); - border-top-right-radius: var(--border-radius-sm); -} - -[data-coalition="blue"].ol-context-menu-button:hover, -[data-coalition="blue"].ol-context-menu-button.is-open { - background-color: var(--primary-blue) -} - -[data-coalition="red"].ol-context-menu-button:hover, -[data-coalition="red"].ol-context-menu-button.is-open { - background-color: var(--primary-red) -} - -[data-coalition="neutral"].ol-context-menu-button:hover, -[data-coalition="neutral"].ol-context-menu-button.is-open { - background-color: var(--primary-neutral) -} - -#map-type svg, -#map-visibility-options svg { - height: 20px; - width: 20px; - fill: lightgray; -} - -#map-visibility-options .ol-select-options .ol-checkbox { - font-size: 13px; - font-weight: 400; - padding: 6px 15px; -} - -#map-visibility-options .ol-select-options .ol-checkbox:first-of-type { - padding-top: 12px; -} - -#map-visibility-options .ol-select-options .ol-checkbox:last-of-type { - padding-bottom: 18px; -} - -#map-visibility-options .ol-select-options .ol-checkbox label:hover span { - text-decoration: underline; -} - -.ol-log-entry:first-of-type { - border-top: 1px solid #FFFFFF44; -} - -.ol-log-entry { - border-bottom: 1px solid #FFFFFF44; -} - -.file-import-export { - max-width: 500px; -} - -.file-import-export .ol-dialog-content { - display: flex; - flex-direction: column; - justify-content: center; -} - -.file-import-export p { - background-color: var(--background-grey); - border-left: 6px solid var(--secondary-blue-text); - padding: 12px; -} - -.file-import-export th { - padding: 4px 6px; -} - -.file-import-export tr td:first-child { - text-align: left; -} - -.file-import-export td { - color: white; - text-align: center; -} - -.file-import-export .ol-checkbox { - display: flex; - justify-content: center; -} - -.file-import-export .ol-checkbox input::before { - margin-right: 0; -} - -.file-import-export .ol-checkbox span { - display: none; -} - -.file-import-export button.start-transfer { - background-color: var(--secondary-blue-text); - border-color: var(--secondary-blue-text); -} - -.file-import-export .export-filename-container { - display: flex; - column-gap: 15px; - width: 100%; - align-items: center; - padding: 10px 0px; - color: white; - font-size: 14px; -} - -.file-import-export .export-filename-container input { - width: 100%; - background-color: var(--background-grey); - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; - border-style: solid; - border: 1px solid var(--background-steel); - color: white; - font-size: 14px; - padding: 4px; -} - -.file-import-export .export-filename-container img { - height: 16px; - width: 16px; - filter: invert(100%); - margin-left: -31px; - transform: translateX(-15px); - pointer-events: none; -} - -.file-import-export .ol-dialog-footer button:first-of-type { - margin-left: auto; -} - -@keyframes pulse { - 50% { - opacity: 0; - } -} - -#camera-link-type-switch { - width: 60px; - height: 25px; -} - -#camera-link-type-switch[data-value="true"]>.ol-switch-fill::before { - content: "MAP"; -} - -#camera-link-type-switch[data-value="false"]>.ol-switch-fill::before { - content: "LIVE"; -} - -#camera-link-type-switch[data-value="true"]>.ol-switch-fill { - background-color: var(--background-grey); -} - -#camera-link-type-switch[data-value="false"]>.ol-switch-fill { - background-color: var(--background-offwhite); -} - -#camera-link-type-switch[data-value="false"]>.ol-switch-fill::before { - color: var(--background-steel); -} - -#camera-link-type-switch[data-value="false"]>.ol-switch-fill::after { - background-color: var(--background-steel); -} diff --git a/frontend/server/public/stylesheets/uikit/uikit.css b/frontend/server/public/stylesheets/uikit/uikit.css deleted file mode 100644 index d7a8881c..00000000 --- a/frontend/server/public/stylesheets/uikit/uikit.css +++ /dev/null @@ -1,101 +0,0 @@ -body { - background-color:#eaeaea; -} - -#content-wrapper { - row-gap: 5px; - display: flex; - flex-direction: column; - flex-wrap: wrap; - height:100%; - width:100%; -} - -section { - column-gap: 20px; - display:flex; - flex-direction: row; - flex-wrap: wrap; -} - -.content { - background:white; - border-radius: 10px; - height:fit-content; - margin-bottom:4vh; - padding:20px; - width:fit-content; -} - -.content-header { - color:#666; - letter-spacing:1px; - margin-bottom: 1vh; -} - -.content-body { - column-gap: 20px; - display:flex; - flex-direction: row; - flex-wrap: wrap; -} - -.example { - align-items: center; - display:flex; - flex-direction: column; - min-width: 100px; -} - -.caption { - margin:2vh 0 1vh 0; -} - - -#paragraph { - max-width: 750px; -} - - -#tabs { - column-gap: 10px; - display: flex; - flex-direction: row; - margin-bottom:1em; -} - -#tabs > div { - background:#660066; - border-radius: 5px; - color:white; - cursor: pointer; - padding:6px 10px; -} - - -#overlaying-planes { - background-color:#99ccff; - padding:60px; - position:relative; -} - -#overlaying-planes .unit:nth-of-type(2) { - position: absolute; - left: 40px; - top: 10px; -} - -.icon-list { - text-align: center; -} - -.icon-list { - display: flex; - flex-direction: column; - row-gap: 10px; -} - -.icon-list span { - display:block; - font-size: 12px; -} \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/emissions/attack.svg b/frontend/server/public/themes/olympus/images/buttons/emissions/attack.svg deleted file mode 100644 index 0e1bd78d..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/emissions/attack.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/emissions/defend.svg b/frontend/server/public/themes/olympus/images/buttons/emissions/defend.svg deleted file mode 100644 index 6d13f0de..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/emissions/defend.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/emissions/free.svg b/frontend/server/public/themes/olympus/images/buttons/emissions/free.svg deleted file mode 100644 index 19fd8b25..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/emissions/free.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/emissions/silent.svg b/frontend/server/public/themes/olympus/images/buttons/emissions/silent.svg deleted file mode 100644 index 9ecb6737..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/emissions/silent.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/intensity/1.svg b/frontend/server/public/themes/olympus/images/buttons/intensity/1.svg deleted file mode 100644 index 428226dc..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/intensity/1.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/intensity/2.svg b/frontend/server/public/themes/olympus/images/buttons/intensity/2.svg deleted file mode 100644 index 63b73775..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/intensity/2.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/intensity/3.svg b/frontend/server/public/themes/olympus/images/buttons/intensity/3.svg deleted file mode 100644 index 8241e7d9..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/intensity/3.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/other/arrow-down-solid.svg b/frontend/server/public/themes/olympus/images/buttons/other/arrow-down-solid.svg deleted file mode 100644 index a31ed4b6..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/other/arrow-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/other/back.svg b/frontend/server/public/themes/olympus/images/buttons/other/back.svg deleted file mode 100644 index 0b86d7f1..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/other/back.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/other/clock-rotate-left-solid.svg b/frontend/server/public/themes/olympus/images/buttons/other/clock-rotate-left-solid.svg deleted file mode 100644 index 50966792..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/other/clock-rotate-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/other/delete.svg b/frontend/server/public/themes/olympus/images/buttons/other/delete.svg deleted file mode 100644 index 68a91a1a..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/other/delete.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/other/edit.svg b/frontend/server/public/themes/olympus/images/buttons/other/edit.svg deleted file mode 100644 index a690992f..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/other/edit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/other/lock-open-solid.svg b/frontend/server/public/themes/olympus/images/buttons/other/lock-open-solid.svg deleted file mode 100644 index 444c234e..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/other/lock-open-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/other/lock-solid.svg b/frontend/server/public/themes/olympus/images/buttons/other/lock-solid.svg deleted file mode 100644 index fe66baea..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/other/lock-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/roe/designated.svg b/frontend/server/public/themes/olympus/images/buttons/roe/designated.svg deleted file mode 100644 index 23107028..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/roe/designated.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/roe/free.svg b/frontend/server/public/themes/olympus/images/buttons/roe/free.svg deleted file mode 100644 index 19fd8b25..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/roe/free.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/roe/hold.svg b/frontend/server/public/themes/olympus/images/buttons/roe/hold.svg deleted file mode 100644 index 9ecb6737..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/roe/hold.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/roe/return.svg b/frontend/server/public/themes/olympus/images/buttons/roe/return.svg deleted file mode 100644 index 6d13f0de..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/roe/return.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/scatter/1.svg b/frontend/server/public/themes/olympus/images/buttons/scatter/1.svg deleted file mode 100644 index 3981c876..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/scatter/1.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/scatter/2.svg b/frontend/server/public/themes/olympus/images/buttons/scatter/2.svg deleted file mode 100644 index 3957af5a..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/scatter/2.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/scatter/3.svg b/frontend/server/public/themes/olympus/images/buttons/scatter/3.svg deleted file mode 100644 index 446228c2..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/scatter/3.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/spawn/aircraft.svg b/frontend/server/public/themes/olympus/images/buttons/spawn/aircraft.svg deleted file mode 100644 index 50b02231..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/spawn/aircraft.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/spawn/explosion.svg b/frontend/server/public/themes/olympus/images/buttons/spawn/explosion.svg deleted file mode 100644 index b3803f61..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/spawn/explosion.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/spawn/groundunit.svg b/frontend/server/public/themes/olympus/images/buttons/spawn/groundunit.svg deleted file mode 100644 index 28c22079..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/spawn/groundunit.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/spawn/helicopter.svg b/frontend/server/public/themes/olympus/images/buttons/spawn/helicopter.svg deleted file mode 100644 index 585c9678..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/spawn/helicopter.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/spawn/more.svg b/frontend/server/public/themes/olympus/images/buttons/spawn/more.svg deleted file mode 100644 index abeb13eb..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/spawn/more.svg +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/spawn/navyunit.svg b/frontend/server/public/themes/olympus/images/buttons/spawn/navyunit.svg deleted file mode 100644 index b5d83ba2..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/spawn/navyunit.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/spawn/sam.svg b/frontend/server/public/themes/olympus/images/buttons/spawn/sam.svg deleted file mode 100644 index bf91d6f5..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/spawn/sam.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/spawn/smoke.svg b/frontend/server/public/themes/olympus/images/buttons/spawn/smoke.svg deleted file mode 100644 index b4ba491d..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/spawn/smoke.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/threat/evade.svg b/frontend/server/public/themes/olympus/images/buttons/threat/evade.svg deleted file mode 100644 index fb5dc6ba..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/threat/evade.svg +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/threat/manoeuvre.svg b/frontend/server/public/themes/olympus/images/buttons/threat/manoeuvre.svg deleted file mode 100644 index 81fc8534..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/threat/manoeuvre.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/threat/none.svg b/frontend/server/public/themes/olympus/images/buttons/threat/none.svg deleted file mode 100644 index ebe6b795..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/threat/none.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/threat/passive.svg b/frontend/server/public/themes/olympus/images/buttons/threat/passive.svg deleted file mode 100644 index c7a9d0d0..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/threat/passive.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/tools/draw-polygon-solid.svg b/frontend/server/public/themes/olympus/images/buttons/tools/draw-polygon-solid.svg deleted file mode 100644 index f755fed5..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/tools/draw-polygon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/tools/ground.svg b/frontend/server/public/themes/olympus/images/buttons/tools/ground.svg deleted file mode 100644 index 34ab621c..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/tools/ground.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/tools/pen-solid.svg b/frontend/server/public/themes/olympus/images/buttons/tools/pen-solid.svg deleted file mode 100644 index a690992f..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/tools/pen-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/tools/tower.svg b/frontend/server/public/themes/olympus/images/buttons/tools/tower.svg deleted file mode 100644 index a5134f93..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/tools/tower.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/airbase.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/airbase.svg deleted file mode 100644 index af684050..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/airbase.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/aircraft.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/aircraft.svg deleted file mode 100644 index 593e7643..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/aircraft.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/circle-dot.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/circle-dot.svg deleted file mode 100644 index f98ede3a..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/circle-dot.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/dcs.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/dcs.svg deleted file mode 100644 index bb7bd479..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/dcs.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - image/svg+xml - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/flag.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/flag.svg deleted file mode 100644 index a1efc147..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/flag.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/groundunit-sam.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/groundunit-sam.svg deleted file mode 100644 index 3198968b..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/groundunit-sam.svg +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/groundunit.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/groundunit.svg deleted file mode 100644 index 4070e4ce..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/groundunit.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/helicopter.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/helicopter.svg deleted file mode 100644 index c333457b..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/helicopter.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/human.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/human.svg deleted file mode 100644 index 51278e9e..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/human.svg +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/navyunit.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/navyunit.svg deleted file mode 100644 index 87f20c12..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/navyunit.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/olympus.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/olympus.svg deleted file mode 100644 index c13a36a3..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/olympus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/buttons/visibility/shield.svg b/frontend/server/public/themes/olympus/images/buttons/visibility/shield.svg deleted file mode 100644 index d8ff87ec..00000000 --- a/frontend/server/public/themes/olympus/images/buttons/visibility/shield.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/altitude.svg b/frontend/server/public/themes/olympus/images/icons/altitude.svg deleted file mode 100644 index bb87c249..00000000 --- a/frontend/server/public/themes/olympus/images/icons/altitude.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/arrow-pointer-solid.svg b/frontend/server/public/themes/olympus/images/icons/arrow-pointer-solid.svg deleted file mode 100644 index 4499db1b..00000000 --- a/frontend/server/public/themes/olympus/images/icons/arrow-pointer-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/arrows-to-eye-solid.svg b/frontend/server/public/themes/olympus/images/icons/arrows-to-eye-solid.svg deleted file mode 100644 index 11815283..00000000 --- a/frontend/server/public/themes/olympus/images/icons/arrows-to-eye-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/bomb-solid.svg b/frontend/server/public/themes/olympus/images/icons/bomb-solid.svg deleted file mode 100644 index 79718751..00000000 --- a/frontend/server/public/themes/olympus/images/icons/bomb-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/burst-solid.svg b/frontend/server/public/themes/olympus/images/icons/burst-solid.svg deleted file mode 100644 index 81719666..00000000 --- a/frontend/server/public/themes/olympus/images/icons/burst-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/check_square.svg b/frontend/server/public/themes/olympus/images/icons/check_square.svg deleted file mode 100644 index 85359d47..00000000 --- a/frontend/server/public/themes/olympus/images/icons/check_square.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/server/public/themes/olympus/images/icons/chevron-down-warning.svg b/frontend/server/public/themes/olympus/images/icons/chevron-down-warning.svg deleted file mode 100644 index b919934f..00000000 --- a/frontend/server/public/themes/olympus/images/icons/chevron-down-warning.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/server/public/themes/olympus/images/icons/chevron-down.svg b/frontend/server/public/themes/olympus/images/icons/chevron-down.svg deleted file mode 100644 index 800f4fe2..00000000 --- a/frontend/server/public/themes/olympus/images/icons/chevron-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/server/public/themes/olympus/images/icons/circle-info-solid.svg b/frontend/server/public/themes/olympus/images/icons/circle-info-solid.svg deleted file mode 100644 index 652acbee..00000000 --- a/frontend/server/public/themes/olympus/images/icons/circle-info-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/circle-question-regular.svg b/frontend/server/public/themes/olympus/images/icons/circle-question-regular.svg deleted file mode 100644 index 588be4cf..00000000 --- a/frontend/server/public/themes/olympus/images/icons/circle-question-regular.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/climb.svg b/frontend/server/public/themes/olympus/images/icons/climb.svg deleted file mode 100644 index 85299ba7..00000000 --- a/frontend/server/public/themes/olympus/images/icons/climb.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/crosshairs-solid.svg b/frontend/server/public/themes/olympus/images/icons/crosshairs-solid.svg deleted file mode 100644 index c2a60f84..00000000 --- a/frontend/server/public/themes/olympus/images/icons/crosshairs-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/descent.svg b/frontend/server/public/themes/olympus/images/icons/descent.svg deleted file mode 100644 index 67df6b2d..00000000 --- a/frontend/server/public/themes/olympus/images/icons/descent.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/diamond.svg b/frontend/server/public/themes/olympus/images/icons/diamond.svg deleted file mode 100644 index eef3c6f2..00000000 --- a/frontend/server/public/themes/olympus/images/icons/diamond.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/echelon-lh.svg b/frontend/server/public/themes/olympus/images/icons/echelon-lh.svg deleted file mode 100644 index 9359bfba..00000000 --- a/frontend/server/public/themes/olympus/images/icons/echelon-lh.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/echelon-rh.svg b/frontend/server/public/themes/olympus/images/icons/echelon-rh.svg deleted file mode 100644 index 2da057de..00000000 --- a/frontend/server/public/themes/olympus/images/icons/echelon-rh.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/echelon.svg b/frontend/server/public/themes/olympus/images/icons/echelon.svg deleted file mode 100644 index 21bb81bb..00000000 --- a/frontend/server/public/themes/olympus/images/icons/echelon.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/explosion-solid.svg b/frontend/server/public/themes/olympus/images/icons/explosion-solid.svg deleted file mode 100644 index b6383531..00000000 --- a/frontend/server/public/themes/olympus/images/icons/explosion-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/eye-solid.svg b/frontend/server/public/themes/olympus/images/icons/eye-solid.svg deleted file mode 100644 index 63bc71ba..00000000 --- a/frontend/server/public/themes/olympus/images/icons/eye-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/fire-solid.svg b/frontend/server/public/themes/olympus/images/icons/fire-solid.svg deleted file mode 100644 index c227821a..00000000 --- a/frontend/server/public/themes/olympus/images/icons/fire-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/follow.svg b/frontend/server/public/themes/olympus/images/icons/follow.svg deleted file mode 100644 index b3296b24..00000000 --- a/frontend/server/public/themes/olympus/images/icons/follow.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/formation-end.svg b/frontend/server/public/themes/olympus/images/icons/formation-end.svg deleted file mode 100644 index f8235368..00000000 --- a/frontend/server/public/themes/olympus/images/icons/formation-end.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/formation-middle.svg b/frontend/server/public/themes/olympus/images/icons/formation-middle.svg deleted file mode 100644 index edf78e19..00000000 --- a/frontend/server/public/themes/olympus/images/icons/formation-middle.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/front.svg b/frontend/server/public/themes/olympus/images/icons/front.svg deleted file mode 100644 index cfb0f29a..00000000 --- a/frontend/server/public/themes/olympus/images/icons/front.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/fuel.svg b/frontend/server/public/themes/olympus/images/icons/fuel.svg deleted file mode 100644 index b3772d72..00000000 --- a/frontend/server/public/themes/olympus/images/icons/fuel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/gamepad-solid.svg b/frontend/server/public/themes/olympus/images/icons/gamepad-solid.svg deleted file mode 100644 index 2fc91782..00000000 --- a/frontend/server/public/themes/olympus/images/icons/gamepad-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/gears-solid.svg b/frontend/server/public/themes/olympus/images/icons/gears-solid.svg deleted file mode 100644 index 35a083dd..00000000 --- a/frontend/server/public/themes/olympus/images/icons/gears-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/grip-lines-solid.svg b/frontend/server/public/themes/olympus/images/icons/grip-lines-solid.svg deleted file mode 100644 index 85af24c3..00000000 --- a/frontend/server/public/themes/olympus/images/icons/grip-lines-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/hand-solid.svg b/frontend/server/public/themes/olympus/images/icons/hand-solid.svg deleted file mode 100644 index 4a6ba3aa..00000000 --- a/frontend/server/public/themes/olympus/images/icons/hand-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/heading.svg b/frontend/server/public/themes/olympus/images/icons/heading.svg deleted file mode 100644 index cc2eb09b..00000000 --- a/frontend/server/public/themes/olympus/images/icons/heading.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/health.svg b/frontend/server/public/themes/olympus/images/icons/health.svg deleted file mode 100644 index 850b69a3..00000000 --- a/frontend/server/public/themes/olympus/images/icons/health.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/jet-fighter-up-solid.svg b/frontend/server/public/themes/olympus/images/icons/jet-fighter-up-solid.svg deleted file mode 100644 index 9df104e9..00000000 --- a/frontend/server/public/themes/olympus/images/icons/jet-fighter-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/keyboard-solid.svg b/frontend/server/public/themes/olympus/images/icons/keyboard-solid.svg deleted file mode 100644 index 8838d567..00000000 --- a/frontend/server/public/themes/olympus/images/icons/keyboard-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/land-at-point.svg b/frontend/server/public/themes/olympus/images/icons/land-at-point.svg deleted file mode 100644 index 8ed58233..00000000 --- a/frontend/server/public/themes/olympus/images/icons/land-at-point.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/line-abreast.svg b/frontend/server/public/themes/olympus/images/icons/line-abreast.svg deleted file mode 100644 index c146a848..00000000 --- a/frontend/server/public/themes/olympus/images/icons/line-abreast.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/map-source.svg b/frontend/server/public/themes/olympus/images/icons/map-source.svg deleted file mode 100644 index 977057cc..00000000 --- a/frontend/server/public/themes/olympus/images/icons/map-source.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/miss-blue.svg b/frontend/server/public/themes/olympus/images/icons/miss-blue.svg deleted file mode 100644 index 4f6ee87f..00000000 --- a/frontend/server/public/themes/olympus/images/icons/miss-blue.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/miss-red.svg b/frontend/server/public/themes/olympus/images/icons/miss-red.svg deleted file mode 100644 index 8bb47e46..00000000 --- a/frontend/server/public/themes/olympus/images/icons/miss-red.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/miss.svg b/frontend/server/public/themes/olympus/images/icons/miss.svg deleted file mode 100644 index 0a88637e..00000000 --- a/frontend/server/public/themes/olympus/images/icons/miss.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/napalm.svg b/frontend/server/public/themes/olympus/images/icons/napalm.svg deleted file mode 100644 index b82d15a8..00000000 --- a/frontend/server/public/themes/olympus/images/icons/napalm.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/person-military-pointing-solid.svg b/frontend/server/public/themes/olympus/images/icons/person-military-pointing-solid.svg deleted file mode 100644 index 919b3a6f..00000000 --- a/frontend/server/public/themes/olympus/images/icons/person-military-pointing-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/pin.svg b/frontend/server/public/themes/olympus/images/icons/pin.svg deleted file mode 100644 index e42653e9..00000000 --- a/frontend/server/public/themes/olympus/images/icons/pin.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/plane.svg b/frontend/server/public/themes/olympus/images/icons/plane.svg deleted file mode 100644 index b672646e..00000000 --- a/frontend/server/public/themes/olympus/images/icons/plane.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/server/public/themes/olympus/images/icons/ruler.svg b/frontend/server/public/themes/olympus/images/icons/ruler.svg deleted file mode 100644 index 30ddf813..00000000 --- a/frontend/server/public/themes/olympus/images/icons/ruler.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/secondaries.svg b/frontend/server/public/themes/olympus/images/icons/secondaries.svg deleted file mode 100644 index 2863e9a4..00000000 --- a/frontend/server/public/themes/olympus/images/icons/secondaries.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/smog-solid.svg b/frontend/server/public/themes/olympus/images/icons/smog-solid.svg deleted file mode 100644 index f114fe64..00000000 --- a/frontend/server/public/themes/olympus/images/icons/smog-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/speed-decrease.svg b/frontend/server/public/themes/olympus/images/icons/speed-decrease.svg deleted file mode 100644 index 94ba5dcc..00000000 --- a/frontend/server/public/themes/olympus/images/icons/speed-decrease.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/speed-increase.svg b/frontend/server/public/themes/olympus/images/icons/speed-increase.svg deleted file mode 100644 index f6bc0bdc..00000000 --- a/frontend/server/public/themes/olympus/images/icons/speed-increase.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/speed.svg b/frontend/server/public/themes/olympus/images/icons/speed.svg deleted file mode 100644 index 2a3aa3fa..00000000 --- a/frontend/server/public/themes/olympus/images/icons/speed.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/square-check-solid.svg b/frontend/server/public/themes/olympus/images/icons/square-check-solid.svg deleted file mode 100644 index 2bd2823a..00000000 --- a/frontend/server/public/themes/olympus/images/icons/square-check-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/square-regular.svg b/frontend/server/public/themes/olympus/images/icons/square-regular.svg deleted file mode 100644 index f66b39f7..00000000 --- a/frontend/server/public/themes/olympus/images/icons/square-regular.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/sword.svg b/frontend/server/public/themes/olympus/images/icons/sword.svg deleted file mode 100644 index 2d925c03..00000000 --- a/frontend/server/public/themes/olympus/images/icons/sword.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/trail.svg b/frontend/server/public/themes/olympus/images/icons/trail.svg deleted file mode 100644 index fb23fd08..00000000 --- a/frontend/server/public/themes/olympus/images/icons/trail.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/icons/trash-can-regular.svg b/frontend/server/public/themes/olympus/images/icons/trash-can-regular.svg deleted file mode 100644 index 011e1a5e..00000000 --- a/frontend/server/public/themes/olympus/images/icons/trash-can-regular.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/triangle-exclamation-solid.svg b/frontend/server/public/themes/olympus/images/icons/triangle-exclamation-solid.svg deleted file mode 100644 index bb69b55f..00000000 --- a/frontend/server/public/themes/olympus/images/icons/triangle-exclamation-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/public/themes/olympus/images/icons/white-phosphorous.svg b/frontend/server/public/themes/olympus/images/icons/white-phosphorous.svg deleted file mode 100644 index 95627c72..00000000 --- a/frontend/server/public/themes/olympus/images/icons/white-phosphorous.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/markers/airbase.svg b/frontend/server/public/themes/olympus/images/markers/airbase.svg deleted file mode 100644 index d1fcf84c..00000000 --- a/frontend/server/public/themes/olympus/images/markers/airbase.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/markers/bullseye.svg b/frontend/server/public/themes/olympus/images/markers/bullseye.svg deleted file mode 100644 index 92d0b60d..00000000 --- a/frontend/server/public/themes/olympus/images/markers/bullseye.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/markers/draw.svg b/frontend/server/public/themes/olympus/images/markers/draw.svg deleted file mode 100644 index 7e1d8f98..00000000 --- a/frontend/server/public/themes/olympus/images/markers/draw.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/markers/move.svg b/frontend/server/public/themes/olympus/images/markers/move.svg deleted file mode 100644 index 4af0aa8e..00000000 --- a/frontend/server/public/themes/olympus/images/markers/move.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/markers/smoke.svg b/frontend/server/public/themes/olympus/images/markers/smoke.svg deleted file mode 100644 index 4c058371..00000000 --- a/frontend/server/public/themes/olympus/images/markers/smoke.svg +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/markers/target - Copy.svg b/frontend/server/public/themes/olympus/images/markers/target - Copy.svg deleted file mode 100644 index 7afbf612..00000000 --- a/frontend/server/public/themes/olympus/images/markers/target - Copy.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/markers/target.svg b/frontend/server/public/themes/olympus/images/markers/target.svg deleted file mode 100644 index 7afbf612..00000000 --- a/frontend/server/public/themes/olympus/images/markers/target.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/splash/1.png b/frontend/server/public/themes/olympus/images/splash/1.png deleted file mode 100644 index 1ae92cce..00000000 Binary files a/frontend/server/public/themes/olympus/images/splash/1.png and /dev/null differ diff --git a/frontend/server/public/themes/olympus/images/states/attack.svg b/frontend/server/public/themes/olympus/images/states/attack.svg deleted file mode 100644 index 84cd084f..00000000 --- a/frontend/server/public/themes/olympus/images/states/attack.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/states/awacs.svg b/frontend/server/public/themes/olympus/images/states/awacs.svg deleted file mode 100644 index c7d581ec..00000000 --- a/frontend/server/public/themes/olympus/images/states/awacs.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/states/dcs.svg b/frontend/server/public/themes/olympus/images/states/dcs.svg deleted file mode 100644 index 1652fc61..00000000 --- a/frontend/server/public/themes/olympus/images/states/dcs.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/states/follow.svg b/frontend/server/public/themes/olympus/images/states/follow.svg deleted file mode 100644 index 92dadcac..00000000 --- a/frontend/server/public/themes/olympus/images/states/follow.svg +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/states/human.svg b/frontend/server/public/themes/olympus/images/states/human.svg deleted file mode 100644 index dd64fcc8..00000000 --- a/frontend/server/public/themes/olympus/images/states/human.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/states/idle.svg b/frontend/server/public/themes/olympus/images/states/idle.svg deleted file mode 100644 index 757ee216..00000000 --- a/frontend/server/public/themes/olympus/images/states/idle.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/server/public/themes/olympus/images/states/land-at-point.svg b/frontend/server/public/themes/olympus/images/states/land-at-point.svg deleted file mode 100644 index 23bec41f..00000000 --- a/frontend/server/public/themes/olympus/images/states/land-at-point.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/states/no-task.svg b/frontend/server/public/themes/olympus/images/states/no-task.svg deleted file mode 100644 index 2e1e906d..00000000 --- a/frontend/server/public/themes/olympus/images/states/no-task.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/states/off.svg b/frontend/server/public/themes/olympus/images/states/off.svg deleted file mode 100644 index d4078418..00000000 --- a/frontend/server/public/themes/olympus/images/states/off.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/states/refuel.svg b/frontend/server/public/themes/olympus/images/states/refuel.svg deleted file mode 100644 index 422193f1..00000000 --- a/frontend/server/public/themes/olympus/images/states/refuel.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/states/rtb.svg b/frontend/server/public/themes/olympus/images/states/rtb.svg deleted file mode 100644 index f40e2627..00000000 --- a/frontend/server/public/themes/olympus/images/states/rtb.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/server/public/themes/olympus/images/states/tanker.svg b/frontend/server/public/themes/olympus/images/states/tanker.svg deleted file mode 100644 index 9d4a9fc1..00000000 --- a/frontend/server/public/themes/olympus/images/states/tanker.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/aircraft.svg b/frontend/server/public/themes/olympus/images/units/aircraft.svg deleted file mode 100644 index 104f9bcf..00000000 --- a/frontend/server/public/themes/olympus/images/units/aircraft.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/server/public/themes/olympus/images/units/bomb.svg b/frontend/server/public/themes/olympus/images/units/bomb.svg deleted file mode 100644 index a38a168e..00000000 --- a/frontend/server/public/themes/olympus/images/units/bomb.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/server/public/themes/olympus/images/units/death.svg b/frontend/server/public/themes/olympus/images/units/death.svg deleted file mode 100644 index c68ab1d1..00000000 --- a/frontend/server/public/themes/olympus/images/units/death.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-aaa.svg b/frontend/server/public/themes/olympus/images/units/groundunit-aaa.svg deleted file mode 100644 index 1174f3bb..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-aaa.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - A - - A - A - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-apc.svg b/frontend/server/public/themes/olympus/images/units/groundunit-apc.svg deleted file mode 100644 index bb70f4be..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-apc.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-artillery.svg b/frontend/server/public/themes/olympus/images/units/groundunit-artillery.svg deleted file mode 100644 index 66fb468d..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-artillery.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-ewr.svg b/frontend/server/public/themes/olympus/images/units/groundunit-ewr.svg deleted file mode 100644 index 2105f061..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-ewr.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-infantry.svg b/frontend/server/public/themes/olympus/images/units/groundunit-infantry.svg deleted file mode 100644 index 459b7de0..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-infantry.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-sam-launcher.svg b/frontend/server/public/themes/olympus/images/units/groundunit-sam-launcher.svg deleted file mode 100644 index 1732a5b0..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-sam-launcher.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-sam-radar.svg b/frontend/server/public/themes/olympus/images/units/groundunit-sam-radar.svg deleted file mode 100644 index 0472f81e..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-sam-radar.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-sam.svg b/frontend/server/public/themes/olympus/images/units/groundunit-sam.svg deleted file mode 100644 index ffc18a40..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-sam.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-tactical.svg b/frontend/server/public/themes/olympus/images/units/groundunit-tactical.svg deleted file mode 100644 index 95292f22..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-tactical.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-tank.svg b/frontend/server/public/themes/olympus/images/units/groundunit-tank.svg deleted file mode 100644 index 48ae29d1..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-tank.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit-truck.svg b/frontend/server/public/themes/olympus/images/units/groundunit-truck.svg deleted file mode 100644 index 9152ad3c..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit-truck.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/groundunit.svg b/frontend/server/public/themes/olympus/images/units/groundunit.svg deleted file mode 100644 index 6b6dcc7c..00000000 --- a/frontend/server/public/themes/olympus/images/units/groundunit.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/helicopter.svg b/frontend/server/public/themes/olympus/images/units/helicopter.svg deleted file mode 100644 index f54cc278..00000000 --- a/frontend/server/public/themes/olympus/images/units/helicopter.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - diff --git a/frontend/server/public/themes/olympus/images/units/missile.svg b/frontend/server/public/themes/olympus/images/units/missile.svg deleted file mode 100644 index d7711d7c..00000000 --- a/frontend/server/public/themes/olympus/images/units/missile.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/navyunit.svg b/frontend/server/public/themes/olympus/images/units/navyunit.svg deleted file mode 100644 index b3b2ed1b..00000000 --- a/frontend/server/public/themes/olympus/images/units/navyunit.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/server/public/themes/olympus/images/units/static.svg b/frontend/server/public/themes/olympus/images/units/static.svg deleted file mode 100644 index ead61396..00000000 --- a/frontend/server/public/themes/olympus/images/units/static.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/server/public/themes/olympus/theme.css b/frontend/server/public/themes/olympus/theme.css deleted file mode 100644 index f888f8dd..00000000 --- a/frontend/server/public/themes/olympus/theme.css +++ /dev/null @@ -1,99 +0,0 @@ -:root { - /** Colours **/ - - /*** Coalition: neutral ***/ - --primary-neutral: #949ba7; - --secondary-neutral-outline: #111111; - --secondary-neutral-text: #111111; - --unit-background-neutral: #CFD9E8; - - /*** Coalition: blue ***/ - --primary-blue: #247be2; - --secondary-blue-outline: #082e44; - --secondary-blue-text: #017DC1; - --unit-background-blue: #3BB9FF; - - /*** Coalition: red ***/ - --primary-red: #ff5858; - --secondary-red-outline: #262222; - --secondary-red-text: #D42121; - --unit-background-red: #FF5858; - - /*** UI Colours **/ - --accent-amber: #ffd828; - --accent-green: #8bff63; - --accent-light-blue: #5ca7ff; - --accent-dark-blue: #017DC1; - --transparent-accent-light-blue: rgba(92, 167, 255, .33); - --accent-light-red: #F5B6B6; - - --background-grey: #3d4651; - --background-dark-grey: #35393d; - --background-slate-blue: #363c43; - --background-offwhite: #f2f2f3; - --background-steel: #202831; - - --secondary-dark-steel: #181e25; - --secondary-gunmetal-grey: #2f2f2f; - --secondary-lighter-grey: #949ba7; - --secondary-light-grey: #797e83; - --secondary-semitransparent-white: #FFFFFFAA; - --secondary-transparent-white: #FFFFFF30; - --secondary-yellow: #ffd46893; - - --background-hover: #f2f2f333; - - --nav-text: #ECECEC; - - --ol-select-secondary: #545F6C; - --ol-switch-off:#686868; - --ol-switch-undefined:#383838; - - --ol-dialog-disabled-text-color: #ffffff20; - - /*** General border radii **/ - --border-radius-xs: 2px; - --border-radius-sm: 5px; - --border-radius-md: 10px; - --border-radius-lg: 15px; - - /*** Fonts **/ - --font-weight-bolder: 600; - - /*** Unit marker settings ***/ - /*** All markers **/ - --unit-border-radius: var(--border-radius-xs); - --unit-font-size: 14px; - --unit-font-weight: bolder; - --unit-label-border-width: 2px; - --unit-spotlight-fill: var(--secondary-yellow); - --unit-spotlight-radius: 26px; - --unit-stroke-width: 3px; - --unit-height: 50px; - --unit-width: 50px; - - --unit-health-border-width: 2px; - --unit-health-height: 6px; - --unit-health-width: 36px; - --unit-health-x: 0px; - --unit-health-y: 26px; - - /*** Air units ***/ - --unit-ammo-gap: calc(2px + var(--unit-stroke-width)); - --unit-ammo-border-radius: 50%; - --unit-ammo-border-width: 2px; - --unit-ammo-radius: 2px; - --unit-ammo-spacing: 2px; - --unit-ammo-x: 0px; - --unit-ammo-y: 30px; - --unit-fuel-border-width: 2px; - --unit-fuel-height: 6px; - --unit-fuel-width: 36px; - --unit-fuel-x: 0px; - --unit-fuel-y: 22px; - --unit-vvi-width: 4px; -} - -* { - font-weight:600; -} diff --git a/frontend/server/public/themes/parrot/images/parrot.svg b/frontend/server/public/themes/parrot/images/parrot.svg deleted file mode 100644 index 54ff6895..00000000 --- a/frontend/server/public/themes/parrot/images/parrot.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/server/public/themes/parrot/theme.css b/frontend/server/public/themes/parrot/theme.css deleted file mode 100644 index 7b127637..00000000 --- a/frontend/server/public/themes/parrot/theme.css +++ /dev/null @@ -1,109 +0,0 @@ -:root { - /** Colours **/ - - /*** Coalition: neutral ***/ - --primary-neutral: #949ba7; - --secondary-neutral-outline: #111111; - --secondary-neutral-text: #111111; - --unit-background-neutral: #CFD9E8; - - /*** Coalition: blue ***/ - --primary-blue: #247be2; - --secondary-blue-outline: #082e44; - --secondary-blue-text: #017DC1; - --unit-background-blue: #3BB9FF; - - /*** Coalition: red ***/ - --primary-red: #ff5858; - --secondary-red-outline: #262222; - --secondary-red-text: #D42121; - --unit-background-red: #FF5858; - - /*** UI Colours **/ - --accent-amber: #ffd828; - --accent-green: #8bff63; - --accent-light-blue: #5ca7ff; - --accent-dark-blue: #017DC1; - --transparent-accent-light-blue: rgba(92, 167, 255, .33); - --accent-light-red: #F5B6B6; - - --background-grey: #3d4651; - --background-slate-blue: #363c43; - --background-offwhite: #f2f2f3; - --background-steel: #202831; - - --secondary-dark-steel: #181e25; - --secondary-gunmetal-grey: #2f2f2f; - --secondary-lighter-grey: #949ba7; - --secondary-light-grey: #797e83; - --secondary-semitransparent-white: #FFFFFFAA; - --secondary-transparent-white: #FFFFFF30; - --secondary-yellow: #ffd46893; - - --background-hover: #f2f2f333; - - --nav-text: #ECECEC; - - --ol-select-secondary: #545F6C; - --ol-switch-off:#686868; - --ol-switch-undefined:#383838; - - /*** General border radii **/ - --border-radius-xs: 2px; - --border-radius-sm: 5px; - --border-radius-md: 10px; - --border-radius-lg: 15px; - - /*** Fonts **/ - --font-weight-bolder: 600; - - /*** Unit marker settings ***/ - /*** All markers **/ - --unit-border-radius: var(--border-radius-xs); - --unit-font-size: 14px; - --unit-font-weight: bolder; - --unit-label-border-width: 2px; - --unit-spotlight-fill: var(--secondary-yellow); - --unit-spotlight-radius: 26px; - --unit-stroke-width: 3px; - --unit-height: 50px; - --unit-width: 50px; - - --unit-health-border-width: 2px; - --unit-health-height: 6px; - --unit-health-width: 36px; - --unit-health-x: 0px; - --unit-health-y: 26px; - - /*** Air units ***/ - --unit-ammo-gap: calc(2px + var(--unit-stroke-width)); - --unit-ammo-border-radius: 50%; - --unit-ammo-border-width: 2px; - --unit-ammo-radius: 2px; - --unit-ammo-spacing: 2px; - --unit-ammo-x: 0px; - --unit-ammo-y: 30px; - --unit-fuel-border-width: 2px; - --unit-fuel-height: 6px; - --unit-fuel-width: 36px; - --unit-fuel-x: 0px; - --unit-fuel-y: 22px; - --unit-vvi-width: 4px; -} - -* { - font-weight:600; -} - -svg { - animation: spin linear infinite 1s; -} - -@keyframes spin { - from { - transform:rotate(0deg); - } - to { - transform:rotate(360deg); - } -} \ No newline at end of file diff --git a/frontend/server/routes/api/airbases.js b/frontend/server/routes/api/airbases.js deleted file mode 100644 index 54f1c862..00000000 --- a/frontend/server/routes/api/airbases.js +++ /dev/null @@ -1,75 +0,0 @@ -var express = require('express'); -var app = express(); - -var fs = require('fs'); - -const bodyParser = require('body-parser'); -app.use(bodyParser.urlencoded({ extended: false})); -app.use(bodyParser.json()); - -const allowedTheatres = [ - "caucasus", - "falklands", - "marianas", - "nevada", - "normandy", - "persiangulf", - "sinaimap", - "syria", - "thechannel", - "kola", - "afghanistan" -]; - -function getAirbasesData( theatreName ) { - if ( !isValidTheatre( theatreName ) ) { - return false; - } - - return JSON.parse( fs.readFileSync( `public/databases/airbases/${theatreName}.json` ) ).airfields -} - -function isValidTheatre( theatre ) { - return ( allowedTheatres.indexOf( theatre ) > -1 ) -} - -function sendInvalidTheatre( res ) { - res.status( 400 ).send( "Missing/invalid theatre name; must be one of:\n\t" + allowedTheatres.join( "\n\t" ) ); -} - -/**************************************************************************************************************/ -// Endpoints -/**************************************************************************************************************/ -app.get( "/", ( req, res ) => { - sendInvalidTheatre( res ); -}); - -app.get( "/:theatreName/:airbaseName", ( req, res ) => { - const airbases = getAirbasesData( req.params.theatreName ); - if ( !airbases ) { - sendInvalidTheatre( res ); - return; - } - - const airbaseName = req.params.airbaseName; - if ( !airbases.hasOwnProperty( airbaseName ) ) { - res.status( 404 ).send( `Unknown airbase name "${airbaseName}". Available options are:\n\t` + Object.keys( airbases ).join( "\n\t" ) ); - } else { - res.status( 200 ).json( airbases[ airbaseName ] ); - } -}); - - -app.get( "/:theatreName", ( req, res ) => { - const theatreName = req.params.theatreName.toLowerCase().replace( /\s*/g, "" ); - const airbases = getAirbasesData( theatreName ); - - if ( !airbases ) { - sendInvalidTheatre( res ); - return; - } - - res.status( 200 ).json( airbases ); -}); - -module.exports = app; \ No newline at end of file diff --git a/frontend/server/routes/api/airbases.js.bak b/frontend/server/routes/api/airbases.js.bak deleted file mode 100644 index f5144f67..00000000 --- a/frontend/server/routes/api/airbases.js.bak +++ /dev/null @@ -1,74 +0,0 @@ -var express = require('express'); -var app = express(); - -var fs = require('fs'); - -const bodyParser = require('body-parser'); -app.use(bodyParser.urlencoded({ extended: false})); -app.use(bodyParser.json()); - -const allowedTheatres = [ - "caucasus", - "falklands", - "marianas", - "nevada", - "normandy", - "persiangulf", - "sinaimap", - "syria", - "thechannel", - "kola" -]; - -function getAirbasesData( theatreName ) { - if ( !isValidTheatre( theatreName ) ) { - return false; - } - - return JSON.parse( fs.readFileSync( `public/databases/airbases/${theatreName}.json` ) ).airfields -} - -function isValidTheatre( theatre ) { - return ( allowedTheatres.indexOf( theatre ) > -1 ) -} - -function sendInvalidTheatre( res ) { - res.status( 400 ).send( "Missing/invalid theatre name; must be one of:\n\t" + allowedTheatres.join( "\n\t" ) ); -} - -/**************************************************************************************************************/ -// Endpoints -/**************************************************************************************************************/ -app.get( "/", ( req, res ) => { - sendInvalidTheatre( res ); -}); - -app.get( "/:theatreName/:airbaseName", ( req, res ) => { - const airbases = getAirbasesData( req.params.theatreName ); - if ( !airbases ) { - sendInvalidTheatre( res ); - return; - } - - const airbaseName = req.params.airbaseName; - if ( !airbases.hasOwnProperty( airbaseName ) ) { - res.status( 404 ).send( `Unknown airbase name "${airbaseName}". Available options are:\n\t` + Object.keys( airbases ).join( "\n\t" ) ); - } else { - res.status( 200 ).json( airbases[ airbaseName ] ); - } -}); - - -app.get( "/:theatreName", ( req, res ) => { - const theatreName = req.params.theatreName.toLowerCase().replace( /\s*/g, "" ); - const airbases = getAirbasesData( theatreName ); - - if ( !airbases ) { - sendInvalidTheatre( res ); - return; - } - - res.status( 200 ).json( airbases ); -}); - -module.exports = app; \ No newline at end of file diff --git a/frontend/server/routes/api/atc.js b/frontend/server/routes/api/atc.js deleted file mode 100644 index b0896b15..00000000 --- a/frontend/server/routes/api/atc.js +++ /dev/null @@ -1,266 +0,0 @@ -var express = require('express'); -var app = express(); - -const bodyParser = require('body-parser'); -app.use(bodyParser.urlencoded({ extended: false })); -app.use(bodyParser.json()); - -function uuidv4() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); -} -function Flight(name, boardId, unitId) { - this.assignedAltitude = 0; - this.assignedSpeed = 0; - this.id = uuidv4(); - this.boardId = boardId; - this.name = name; - this.status = "unknown"; - this.takeoffTime = -1; - this.unitId = parseInt(unitId); -} - -Flight.prototype.getData = function () { - return { - "assignedAltitude": this.assignedAltitude, - "assignedSpeed": this.assignedSpeed, - "id": this.id, - "boardId": this.boardId, - "name": this.name, - "status": this.status, - "takeoffTime": this.takeoffTime, - "unitId": this.unitId - }; -} - -Flight.prototype.setAssignedAltitude = function (assignedAltitude) { - - if (isNaN(assignedAltitude)) { - return "Altitude must be a number" - } - - this.assignedAltitude = parseInt(assignedAltitude); - - return true; - -} - -Flight.prototype.setAssignedSpeed = function (assignedSpeed) { - - if (isNaN(assignedSpeed)) { - return "Speed must be a number" - } - - this.assignedSpeed = parseInt(assignedSpeed); - - return true; - -} - -Flight.prototype.setOrder = function (order) { - - this.order = order; - - return true; - -} - -Flight.prototype.setStatus = function (status) { - - if (["unknown", "checkedin", "readytotaxi", "clearedtotaxi", "halted", "terminated"].indexOf(status) < 0) { - return "Invalid status"; - } - - this.status = status; - - return true; - -} - -Flight.prototype.setTakeoffTime = function (takeoffTime) { - - if (takeoffTime === "" || takeoffTime === -1) { - this.takeoffTime = -1; - } - - if (isNaN(takeoffTime)) { - return "Invalid takeoff time" - } - - this.takeoffTime = parseInt(takeoffTime); - - return true; - -} - -function ATCDataHandler(data) { - this.data = data; -} - -ATCDataHandler.prototype.addFlight = function (flight) { - - if (flight instanceof Flight === false) { - throw new Error("Given flight is not an instance of Flight"); - } - - this.data.flights[flight.id] = flight; - -} - -ATCDataHandler.prototype.deleteFlight = function (flightId) { - delete this.data.flights[flightId]; -} - -ATCDataHandler.prototype.getFlight = function (flightId) { - return this.data.flights[flightId] || false; -} - -ATCDataHandler.prototype.getFlights = function () { - return this.data.flights; -} - -const dataHandler = new ATCDataHandler({ - "flights": {} -}); - -/**************************************************************************************************************/ -// Endpoints -/**************************************************************************************************************/ -app.get("/flight", (req, res) => { - - let flights = Object.values(dataHandler.getFlights()); - - if (flights && req.query.boardId) { - - flights = flights.reduce((acc, flight) => { - if (flight.boardId === req.query.boardId) { - acc[flight.id] = flight; - } - return acc; - }, {}); - - } - - res.json(flights); - -}); - - -app.patch("/flight/:flightId", (req, res) => { - - const flightId = req.params.flightId; - const flight = dataHandler.getFlight(flightId); - - if (!flight) { - res.status(400).send(`Unrecognised flight ID (given: "${req.params.flightId}")`); - } - - if (req.body.hasOwnProperty("assignedAltitude")) { - - const altitudeChangeSuccess = flight.setAssignedAltitude(req.body.assignedAltitude); - - if (altitudeChangeSuccess !== true) { - res.status(400).send(altitudeChangeSuccess); - } - - } - - if (req.body.hasOwnProperty("assignedSpeed")) { - - const speedChangeSuccess = flight.setAssignedSpeed(req.body.assignedSpeed); - - if (speedChangeSuccess !== true) { - res.status(400).send(speedChangeSuccess); - } - - } - - if (req.body.status) { - - const statusChangeSuccess = flight.setStatus(req.body.status); - - if (statusChangeSuccess !== true) { - res.status(400).send(statusChangeSuccess); - } - - } - - if (req.body.hasOwnProperty("takeoffTime")) { - - const takeoffChangeSuccess = flight.setTakeoffTime(req.body.takeoffTime); - - if (takeoffChangeSuccess !== true) { - res.status(400).send(takeoffChangeSuccess); - } - - } - - res.json(flight.getData()); - -}); - - -app.post("/flight/order", (req, res) => { - - if (!req.body.boardId) { - res.status(400).send("Invalid/missing boardId"); - } - - if (!req.body.order || !Array.isArray(req.body.order)) { - res.status(400).send("Invalid/missing boardId"); - } - - req.body.order.forEach((flightId, i) => { - - dataHandler.getFlight(flightId).setOrder(i); - - }); - - res.send(""); - -}); - - -app.post("/flight", (req, res) => { - - if (!req.body.boardId) { - res.status(400).send("Invalid/missing boardId"); - } - - if (!req.body.name) { - res.status(400).send("Invalid/missing flight name"); - } - - if (!req.body.unitId || isNaN(req.body.unitId)) { - res.status(400).send("Invalid/missing unitId"); - } - - const flight = new Flight(req.body.name, req.body.boardId, req.body.unitId); - - dataHandler.addFlight(flight); - - res.status(201); - - res.json(flight.getData()); - -}); - - -app.delete("/flight/:flightId", (req, res) => { - - const flight = dataHandler.getFlight(req.params.flightId); - - if (!flight) { - res.status(400).send(`Unrecognised flight ID (given: "${req.params.flightId}")`); - } - - dataHandler.deleteFlight(req.params.flightId); - - res.status(204).send(""); - -}); - - -module.exports = app; \ No newline at end of file diff --git a/frontend/server/routes/resources.js b/frontend/server/routes/resources.js deleted file mode 100644 index 3e326008..00000000 --- a/frontend/server/routes/resources.js +++ /dev/null @@ -1,32 +0,0 @@ -const express = require('express'); -const fs = require('fs'); -const router = express.Router(); - -module.exports = function (configLocation) { - router.get('/theme/*', function (req, res, next) { - var reqTheme = "olympus"; - - /* Yes, this in an easter egg! :D Feel free to ignore it, or activate the parrot theme to check what it does. Why parrots? The story is a bit long, come to the Discord and ask :D */ - if (reqTheme === "parrot" && !req.url.includes(".css")) - res.redirect('/themes/parrot/images/parrot.svg'); - else - res.redirect(req.url.replace("theme", "themes/" + reqTheme)); - }); - - router.put('/theme/:newTheme', function (req, res, next) { - res.end("Ok"); - }); - - router.get('/config', function (req, res, next) { - if (fs.existsSync(configLocation)) { - let rawdata = fs.readFileSync(configLocation); - config = JSON.parse(rawdata); - res.send(JSON.stringify(config.frontend)); - res.end() - } else { - res.sendStatus(404); - } - }); - - return router; -} diff --git a/frontend/server/routes/uikit.js b/frontend/server/routes/uikit.js deleted file mode 100644 index d9d4cb46..00000000 --- a/frontend/server/routes/uikit.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express'); -var router = express.Router(); - -/* GET home page. */ -router.get('/', function (req, res, next) { - res.render('uikit', { title: 'Express' }); -}); - -module.exports = router; diff --git a/frontend/server/routes/users.js b/frontend/server/routes/users.js deleted file mode 100644 index f85a6edb..00000000 --- a/frontend/server/routes/users.js +++ /dev/null @@ -1,9 +0,0 @@ -var express = require('express'); -var router = express.Router(); - -/* GET users listing. */ -router.get('/', function (req, res, next) { - res.send('respond with a resource'); -}); - -module.exports = router; diff --git a/frontend/server/scripts/demo-server.bat b/frontend/server/scripts/demo-server.bat index 27a06af6..49ef125d 100644 --- a/frontend/server/scripts/demo-server.bat +++ b/frontend/server/scripts/demo-server.bat @@ -1,3 +1,3 @@ call .\scripts\copy.bat call .\scripts\create-mock-dcs.bat -node .\bin\demo --config %1 \ No newline at end of file +nodemon --watch src\demo\**\*.ts --exec node --inspect -r ts-node\register .\src\demo\www.ts -c %1 \ No newline at end of file diff --git a/frontend/server/src/app.ts b/frontend/server/src/app.ts new file mode 100644 index 00000000..1280973d --- /dev/null +++ b/frontend/server/src/app.ts @@ -0,0 +1,78 @@ +/* Requires */ +import express = require("express"); +import path = require("path"); +import logger = require("morgan"); +import fs = require("fs"); +import bodyParser = require("body-parser"); +import cors = require("cors"); + +/* Load the proxy middleware plugin */ +import httpProxyMiddleware = require("http-proxy-middleware"); + +module.exports = function (configLocation) { + /* Config specific routers */ + const elevationRouter = require("./routes/api/elevation")(configLocation); + const resourcesRouter = require("./routes/resources")(configLocation); + + /* Default routers */ + const airbasesRouter = require("./routes/api/airbases"); + const databasesRouter = require("./routes/api/databases")( + path.join( + path.dirname(configLocation), + "..", + "Mods", + "Services", + "Olympus", + "databases" + ) + ); + const indexRouter = require("./routes/index"); + const pluginsRouter = require("./routes/plugins"); + + /* Load the config and create the express app */ + let config = {}; + console.log(`Loading configuration file from ${configLocation}`); + if (fs.existsSync(configLocation)) { + let rawdata = fs.readFileSync(configLocation, { encoding: "utf-8" }); + config = JSON.parse(rawdata); + } else { + console.error("Error loading configuration file."); + return undefined; + } + + /* Load the backend address where DCS is listening */ + const backendAddress = config["backend"]["address"]; + + /* Start the express app */ + const app = express(); + + /* Define middleware */ + app.use(logger("dev")); + app.use( + "/olympus", + httpProxyMiddleware.createProxyMiddleware({ + target: `http://${ + backendAddress === "*" ? "localhost" : backendAddress + }:${config["backend"]["port"]}/`, + changeOrigin: true, + }) + ); + app.use( + "/vite", + httpProxyMiddleware.createProxyMiddleware({ target: `http://localhost:8080/`, ws: true }) + ); + app.use(bodyParser.json({ limit: "50mb" })); + app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); + app.use(express.static(path.join(__dirname, "..", "public"))); + app.use(cors()); + + /* Apply routers */ + app.use("/", indexRouter); + app.use("/api/airbases", airbasesRouter); + app.use("/api/elevation", elevationRouter); + app.use("/api/databases", databasesRouter); + app.use("/plugins", pluginsRouter); + app.use("/resources", resourcesRouter); + + return app; +}; diff --git a/frontend/server/src/demo/demo.ts b/frontend/server/src/demo/demo.ts new file mode 100644 index 00000000..8a1db149 --- /dev/null +++ b/frontend/server/src/demo/demo.ts @@ -0,0 +1,652 @@ +const TEST_UNIT_GENERATION = false; + +module.exports = function (configLocation) { + var basicAuth = require("express-basic-auth"); + var logger = require("morgan"); + var enc = new TextEncoder(); + const path = require("path"); + var cors = require("cors"); + + var express = require("express"); + var fs = require("fs"); + + let rawdata = fs.readFileSync(configLocation); + let config = JSON.parse(rawdata); + + var app = express(); + + app.use(logger("dev")); + app.use(cors()); + + const DEMO_UNIT_DATA = {}; + const DEMO_WEAPONS_DATA = {}; + + class DemoDataGenerator { + startTime: number; + + constructor(app, config) { + app.get("/olympus/units", (req, res) => this.units(req, res)); + app.get("/olympus/weapons", (req, res) => this.weapons(req, res)); + app.get("/olympus/logs", (req, res) => this.logs(req, res)); + app.get("/olympus/bullseyes", (req, res) => this.bullseyes(req, res)); + app.get("/olympus/airbases", (req, res) => this.airbases(req, res)); + app.get("/olympus/mission", (req, res) => this.mission(req, res)); + app.get("/olympus/commands", (req, res) => this.command(req, res)); + app.put("/olympus", (req, res) => this.put(req, res)); + + app.use( + "/olympus", + basicAuth({ + users: { + admin: config["authentication"]["gameMasterPassword"], + blue: config["authentication"]["blueCommanderPassword"], + red: config["authentication"]["redCommanderPassword"], + }, + }) + ); + + let baseData = { + alive: true, + human: false, + controlled: true, + coalition: 2, + country: 0, + unitName: "Cool guy", + groupName: "Cool group 1", + state: 13, + task: "Being cool!", + hasTask: true, + position: { lat: 37, lng: -116, alt: 1000 }, + speed: 200, + horizontalVelocity: 200, + verticalVelicity: 0, + heading: 45, + track: 45, + isActiveTanker: false, + isActiveAWACS: false, + onOff: true, + followRoads: false, + fuel: 50, + desiredSpeed: 300, + desiredSpeedType: 1, + desiredAltitude: 1000, + desiredAltitudeType: 1, + leaderID: 0, + formationOffset: { x: 0, y: 0, z: 0 }, + targetID: 0, + targetPosition: { lat: 0, lng: 0, alt: 0 }, + ROE: 1, + reactionToThreat: 1, + emissionsCountermeasures: 1, + TACAN: { isOn: false, XY: "Y", callsign: "TKR", channel: 40 }, + radio: { frequency: 124000000, callsign: 1, callsignNumber: 1 }, + generalSettings: { + prohibitAA: false, + prohibitAfterburner: false, + prohibitAG: false, + prohibitAirWpn: false, + prohibitJettison: false, + }, + ammo: [], + contacts: [], + activePath: [{ lat: 37.1, lng: -116.1 }], + isLeader: true, + }; + + if (TEST_UNIT_GENERATION) { + const aircraftDatabase = require(path.join( + path.dirname(configLocation), + "../../Mods/Services/Olympus/databases/units/aircraftdatabase.json" + )); + const helicopterDatabase = require(path.join( + path.dirname(configLocation), + "../../Mods/Services/Olympus/databases/units/helicopterdatabase.json" + )); + const groundUnitDatabase = require(path.join( + path.dirname(configLocation), + "../../Mods/Services/Olympus/databases/units/groundunitdatabase.json" + )); + const navyUnitDatabase = require(path.join( + path.dirname(configLocation), + "../../Mods/Services/Olympus/databases/units/navyunitdatabase.json" + )); + + var databases = Object.assign( + {}, + aircraftDatabase, + helicopterDatabase, + groundUnitDatabase, + navyUnitDatabase + ); + var t = Object.keys(databases).length; + var l = Math.floor(Math.sqrt(t)); + let latIdx = 0; + let lngIdx = 0; + let idx = 1; + + for (let name in databases) { + if (databases[name].enabled) { + DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); + DEMO_UNIT_DATA[idx].name = name; + DEMO_UNIT_DATA[idx].groupName = `Group-${idx}`; + DEMO_UNIT_DATA[idx].position.lat += latIdx / 5; + DEMO_UNIT_DATA[idx].position.lng += lngIdx / 5; + DEMO_UNIT_DATA[idx].coalition = Math.floor(Math.random() * 3); + + latIdx += 1; + if (latIdx === l) { + latIdx = 0; + lngIdx += 1; + } + + if (name in aircraftDatabase) + DEMO_UNIT_DATA[idx].category = "Aircraft"; + else if (name in helicopterDatabase) + DEMO_UNIT_DATA[idx].category = "Helicopter"; + else if (name in groundUnitDatabase) + DEMO_UNIT_DATA[idx].category = "GroundUnit"; + else if (name in navyUnitDatabase) + DEMO_UNIT_DATA[idx].category = "NavyUnit"; + + idx += 1; + } + } + } else { + let idx = 1; + DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); + DEMO_UNIT_DATA[idx].name = "S_75M_Volhov"; + DEMO_UNIT_DATA[idx].groupName = `Group`; + DEMO_UNIT_DATA[idx].position.lat += idx / 100; + DEMO_UNIT_DATA[idx].category = "GroundUnit"; + DEMO_UNIT_DATA[idx].isLeader = true; + + idx += 1; + DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); + DEMO_UNIT_DATA[idx].name = "SNR_75V"; + DEMO_UNIT_DATA[idx].groupName = `Group`; + DEMO_UNIT_DATA[idx].position.lat += idx / 100; + DEMO_UNIT_DATA[idx].category = "GroundUnit"; + DEMO_UNIT_DATA[idx].isLeader = false; + + idx += 1; + DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); + DEMO_UNIT_DATA[idx].name = "Ural-4320 APA-5D"; + DEMO_UNIT_DATA[idx].groupName = `Group`; + DEMO_UNIT_DATA[idx].position.lat += idx / 100; + DEMO_UNIT_DATA[idx].category = "GroundUnit"; + DEMO_UNIT_DATA[idx].isLeader = false; + + idx += 1; + DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); + DEMO_UNIT_DATA[idx].name = "F-14B"; + DEMO_UNIT_DATA[idx].groupName = `Group-1`; + DEMO_UNIT_DATA[idx].position.lat += idx / 100; + DEMO_UNIT_DATA[idx].category = "Aircraft"; + DEMO_UNIT_DATA[idx].isLeader = false; + DEMO_UNIT_DATA[idx].coalition = 1; + DEMO_UNIT_DATA[idx].desiredAltitude = 10000; + DEMO_UNIT_DATA[idx].desiredAltitudeType = 0; + + idx += 1; + DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); + DEMO_UNIT_DATA[idx].name = "Infantry AK"; + DEMO_UNIT_DATA[idx].groupName = `Group-2`; + DEMO_UNIT_DATA[idx].position.lat += idx / 100; + DEMO_UNIT_DATA[idx].category = "GroundUnit"; + DEMO_UNIT_DATA[idx].isLeader = true; + DEMO_UNIT_DATA[idx].coalition = 0; + DEMO_UNIT_DATA[idx].operateAs = 2; + + idx += 1; + DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); + DEMO_UNIT_DATA[idx].name = "Infantry AK"; + DEMO_UNIT_DATA[idx].groupName = `Group-3`; + DEMO_UNIT_DATA[idx].position.lat += idx / 100; + DEMO_UNIT_DATA[idx].category = "GroundUnit"; + DEMO_UNIT_DATA[idx].isLeader = true; + DEMO_UNIT_DATA[idx].coalition = 0; + DEMO_UNIT_DATA[idx].operateAs = 1; + + idx += 1; + DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); + DEMO_UNIT_DATA[idx].name = "KC-135"; + DEMO_UNIT_DATA[idx].groupName = `Group-4`; + DEMO_UNIT_DATA[idx].position.lat += idx / 100; + DEMO_UNIT_DATA[idx].category = "Aircraft"; + DEMO_UNIT_DATA[idx].isLeader = true; + + this.startTime = Date.now(); + } + } + + units(req, res) { + var array = new Uint8Array(); + var time = Date.now(); + array = this.concat(array, this.uint64ToByteArray(BigInt(time))); + if (req.query["time"] == 0) { + for (let idx in DEMO_UNIT_DATA) { + const unit = DEMO_UNIT_DATA[idx]; + var dataIndex = 1; + array = this.concat(array, this.uint32ToByteArray(idx)); + array = this.appendString(array, unit.category, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.alive, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.human, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.controlled, dataIndex); + dataIndex++; + array = this.appendUint16(array, unit.coalition, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.country, dataIndex); + dataIndex++; + array = this.appendString(array, unit.name, dataIndex); + dataIndex++; + array = this.appendString(array, unit.unitName, dataIndex); + dataIndex++; + array = this.appendString(array, unit.groupName, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.state, dataIndex); + dataIndex++; + array = this.appendString(array, unit.task, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.hasTask, dataIndex); + dataIndex++; + array = this.appendCoordinates(array, unit.position, dataIndex); + dataIndex++; + array = this.appendDouble(array, unit.speed, dataIndex); + dataIndex++; + array = this.appendDouble(array, unit.horizontalVelocity, dataIndex); + dataIndex++; + array = this.appendDouble(array, unit.verticalVelicity, dataIndex); + dataIndex++; + array = this.appendDouble(array, unit.heading, dataIndex); + dataIndex++; + array = this.appendDouble(array, unit.track, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.isActiveTanker, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.isActiveAWACS, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.onOff, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.followRoads, dataIndex); + dataIndex++; + array = this.appendUint16(array, unit.fuel, dataIndex); + dataIndex++; + array = this.appendDouble(array, unit.desiredSpeed, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.desiredSpeedType, dataIndex); + dataIndex++; + array = this.appendDouble(array, unit.desiredAltitude, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.desiredAltitudeType, dataIndex); + dataIndex++; + array = this.appendUint32(array, unit.leaderID, dataIndex); + dataIndex++; + array = this.appendOffset(array, unit.formationOffset, dataIndex); + dataIndex++; + array = this.appendUint32(array, unit.targetID, dataIndex); + dataIndex++; + array = this.appendCoordinates(array, unit.targetPosition, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.ROE, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.reactionToThreat, dataIndex); + dataIndex++; + array = this.appendUint8( + array, + unit.emissionsCountermeasures, + dataIndex + ); + dataIndex++; + array = this.appendTACAN(array, unit.TACAN, dataIndex); + dataIndex++; + array = this.appendRadio(array, unit.radio, dataIndex); + dataIndex++; + array = this.appendRadio(array, unit.generalSettings, dataIndex); + dataIndex++; + array = this.appendAmmo(array, unit.ammo, dataIndex); + dataIndex++; + array = this.appendContacts(array, unit.contacts, dataIndex); + dataIndex++; + array = this.appendActivePath(array, unit.activePath, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.isLeader, dataIndex); + dataIndex++; + array = this.appendUint8(array, unit.operateAs, dataIndex); + dataIndex++; + array = this.concat(array, this.uint8ToByteArray(255)); + } + } + res.end(Buffer.from(array)); + } + + weapons(req, res) { + var array = new Uint8Array(); + var time = Date.now(); + array = this.concat(array, this.uint64ToByteArray(BigInt(time))); + for (let idx in DEMO_WEAPONS_DATA) { + const weapon = DEMO_WEAPONS_DATA[idx]; + array = this.concat(array, this.uint32ToByteArray(idx)); + array = this.appendString(array, weapon.category, 1); + array = this.appendUint8(array, weapon.alive, 2); + array = this.appendUint16(array, weapon.coalition, 5); + array = this.appendString(array, weapon.name, 7); + array = this.appendCoordinates(array, weapon.position, 13); + array = this.appendDouble(array, weapon.speed, 14); + array = this.appendDouble(array, weapon.heading, 15); + array = this.concat(array, this.uint8ToByteArray(255)); + } + res.end(Buffer.from(array)); + } + + concat(array1, array2) { + var mergedArray = new Uint8Array(array1.length + array2.length); + mergedArray.set(array1); + mergedArray.set(array2, array1.length); + return mergedArray; + } + + uint8ToByteArray(number) { + var buffer = new ArrayBuffer(1); + var longNum = new Uint8Array(buffer); + longNum[0] = number; + return Array.from(new Uint8Array(buffer)); + } + + uint16ToByteArray(number) { + var buffer = new ArrayBuffer(2); + var longNum = new Uint16Array(buffer); + longNum[0] = number; + return Array.from(new Uint8Array(buffer)); + } + + uint32ToByteArray(number) { + var buffer = new ArrayBuffer(4); + var longNum = new Uint32Array(buffer); + longNum[0] = number; + return Array.from(new Uint8Array(buffer)); + } + + uint64ToByteArray(number) { + var buffer = new ArrayBuffer(8); + var longNum = new BigUint64Array(buffer); + longNum[0] = number; + return Array.from(new Uint8Array(buffer)); + } + + doubleToByteArray(number) { + var buffer = new ArrayBuffer(8); + var longNum = new Float64Array(buffer); + longNum[0] = number; + return Array.from(new Uint8Array(buffer)); + } + + appendUint8(array, number, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.uint8ToByteArray(number)); + return array; + } + + appendUint16(array, number, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.uint16ToByteArray(number)); + return array; + } + + appendUint32(array, number, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.uint32ToByteArray(number)); + return array; + } + + appendDouble(array, number, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.doubleToByteArray(number)); + return array; + } + + appendCoordinates(array, coordinates, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.doubleToByteArray(coordinates.lat)); + array = this.concat(array, this.doubleToByteArray(coordinates.lng)); + array = this.concat(array, this.doubleToByteArray(coordinates.alt)); + return array; + } + + appendOffset(array, offset, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.doubleToByteArray(offset.x)); + array = this.concat(array, this.doubleToByteArray(offset.y)); + array = this.concat(array, this.doubleToByteArray(offset.z)); + return array; + } + + appendString(array, string, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.uint16ToByteArray(string.length)); + array = this.concat(array, enc.encode(string)); + return array; + } + + padString(string, length) { + while (string.length < length) string += " "; + return string.substring(0, length); + } + + appendTACAN(array, TACAN, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.uint8ToByteArray(TACAN.isOn)); + array = this.concat(array, this.uint8ToByteArray(TACAN.channel)); + array = this.concat(array, enc.encode(TACAN.XY)); + array = this.concat(array, enc.encode(this.padString(TACAN.callsign, 4))); + return array; + } + + appendRadio(array, radio, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.uint32ToByteArray(radio.frequency)); + array = this.concat(array, this.uint8ToByteArray(radio.callsign)); + array = this.concat(array, this.uint8ToByteArray(radio.callsignNumber)); + return array; + } + + appendGeneralSettings(array, generalSettings, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat( + array, + this.uint8ToByteArray(generalSettings.prohibitAA) + ); + array = this.concat( + array, + this.uint8ToByteArray(generalSettings.prohibitAfterburner) + ); + array = this.concat( + array, + this.uint8ToByteArray(generalSettings.prohibitAG) + ); + array = this.concat( + array, + this.uint8ToByteArray(generalSettings.prohibitAirWpn) + ); + array = this.concat( + array, + this.uint8ToByteArray(generalSettings.prohibitJettison) + ); + return array; + } + + appendAmmo(array, ammo, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.uint16ToByteArray(ammo.length)); + ammo.forEach((element) => { + array = this.concat(array, this.uint16ToByteArray(element.quantity)); + array = this.concat( + array, + enc.encode(this.padString(element.name, 33)) + ); + array = this.concat(array, this.uint8ToByteArray(element.guidance)); + array = this.concat(array, this.uint8ToByteArray(element.category)); + array = this.concat( + array, + this.uint8ToByteArray(element.missileCategory) + ); + }); + return array; + } + + appendContacts(array, contacts, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.uint16ToByteArray(contacts.length)); + contacts.forEach((element) => { + array = this.concat(array, this.uint32ToByteArray(element.ID)); + array = this.concat( + array, + this.uint8ToByteArray(element.detectionMethod) + ); + }); + return array; + } + + appendActivePath(array, activePath, datumIndex) { + array = this.concat(array, this.uint8ToByteArray(datumIndex)); + array = this.concat(array, this.uint16ToByteArray(activePath.length)); + activePath.forEach((element) => { + array = this.concat(array, this.doubleToByteArray(element.lat)); + array = this.concat(array, this.doubleToByteArray(element.lng)); + array = this.concat(array, this.doubleToByteArray(element.alt)); + }); + return array; + } + + logs(req, res) { + var ret = { + logs: { "1": "I'm a log!", "2": "I'm a different log!" }, + time: Date.now(), + frameRate: 60, + load: 0, + }; + + res.send(JSON.stringify(ret)); + } + + airbases(req, res) { + var ret = { + airbases: { + ["0"]: { + callsign: "Nellis", + latitude: 37.3, + longitude: -115.8, + coalition: "neutral", + }, + ["1"]: { + callsign: "Red", + latitude: 37.3, + longitude: -115.75, + coalition: "red", + }, + ["2"]: { + callsign: "Blue", + latitude: 37.3, + longitude: -115.7, + coalition: "blue", + }, + }, + time: Date.now(), + }; + res.send(JSON.stringify(ret)); + } + + bullseyes(req, res) { + var ret = { + bullseyes: { + "0": { + latitude: 37.25, + longitude: -115.8, + coalition: "neutral", + }, + "1": { + latitude: 37.25, + longitude: -115.75, + coalition: "red", + }, + "2": { + latitude: 37.25, + longitude: -115.7, + coalition: "blue", + }, + }, + time: Date.now(), + }; + res.send(JSON.stringify(ret)); + } + + mission(req, res) { + var ret = { + mission: { + theatre: "Nevada", + dateAndTime: { + time: { h: 10, m: 15, s: 34 }, + date: "", + elapsedTime: (Date.now() - this.startTime) / 1000, + startTime: 0, + }, + coalitions: { + red: ["RUSSIA", "CHINA"], + blue: ["UK", "USA"], + neutral: ["ITALY"], + }, + commandModeOptions: { + restrictSpawns: true, + restrictToCoalition: true, + setupTime: 0, + spawnPoints: { + red: 400, + blue: 400, + }, + eras: ["WW2", "Early Cold War", "Late Cold War", "Modern"], + commandMode: "", + }, + }, + time: Date.now(), + }; + + var auth = req.get("Authorization"); + if (auth) { + var username = Buffer.from(auth.replace("Basic ", ""), "base64") + .toString("binary") + .split(":")[0]; + var password = Buffer.from(auth.replace("Basic ", ""), "base64") + .toString("binary") + .split(":")[1]; + switch (password) { + case "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918": + ret.mission.commandModeOptions.commandMode = "Game master"; + break; + case "16477688c0e00699c6cfa4497a3612d7e83c532062b64b250fed8908128ed548": + ret.mission.commandModeOptions.commandMode = "Blue commander"; + break; + case "b1f51a511f1da0cd348b8f8598db32e61cb963e5fc69e2b41485bf99590ed75a": + ret.mission.commandModeOptions.commandMode = "Red commander"; + break; + } + } + res.send(JSON.stringify(ret)); + } + + command(req, res) { + var ret = { commandExecuted: Math.random() > 0.5 }; + res.send(JSON.stringify(ret)); + } + + put(req, res) { + var ret = { commandHash: Math.random().toString(36).slice(2, 19) }; + res.send(JSON.stringify(ret)); + } + } + + const demoDataGenerator = new DemoDataGenerator(app, config); + + return app; +}; diff --git a/frontend/server/src/demo/www.ts b/frontend/server/src/demo/www.ts new file mode 100644 index 00000000..61509a9e --- /dev/null +++ b/frontend/server/src/demo/www.ts @@ -0,0 +1,112 @@ +import yargs = require("yargs"); +import fs = require("fs"); +import http = require("http"); + +/* Define configuration parameter */ +yargs + .alias("c", "config") + .describe("c", "olympus.json config location") + .string("rp"); +const args = yargs.argv; + +console.log("Please wait while DCS Olympus DEMO Backend Server starts up..."); +console.log(`Config location: ${args["config"]}`); + +let rawdata = fs.readFileSync(args["config"], "utf-8"); +let config = JSON.parse(rawdata); + +/** + * Module dependencies. + */ + +var app = require("./demo")(args["config"]); + +/** + * Get port from environment and store in Express. + */ + +var configPort = null; +if (config["backend"] != undefined && config["backend"]["port"] != undefined) { + configPort = config["backend"]["port"]; +} + +var port = normalizePort(configPort || "3001"); +app.set("port", port); +console.log("Express server listening on port: " + port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on("error", onError); +server.on("listening", onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== "listen") { + throw error; + } + + var bind = typeof port === "string" ? "Pipe " + port : "Port " + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case "EACCES": + console.error(bind + " requires elevated privileges"); + process.exit(1); + break; + case "EADDRINUSE": + console.error(bind + " is already in use"); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === "string" ? "pipe " + addr : "port " + addr.port; + console.log("Listening on " + bind); +} + +console.log( + "DCS Olympus DEMO Backend Server {{OLYMPUS_VERSION_NUMBER}}.{{OLYMPUS_COMMIT_HASH}} started correctly!" +); +console.log("Waiting for connections..."); + +process.title = `DCS Olympus DEMO Backend Server {{OLYMPUS_VERSION_NUMBER}} (${port})`; diff --git a/frontend/server/src/routes/api/airbases.ts b/frontend/server/src/routes/api/airbases.ts new file mode 100644 index 00000000..bc7e96c6 --- /dev/null +++ b/frontend/server/src/routes/api/airbases.ts @@ -0,0 +1,83 @@ +import express = require("express"); +import fs = require("fs"); + +const app = express(); + +const allowedTheatres = [ + "caucasus", + "falklands", + "marianas", + "nevada", + "normandy", + "persiangulf", + "sinaimap", + "syria", + "thechannel", + "kola", +]; + +function getAirbasesData(theatreName) { + if (!isValidTheatre(theatreName)) { + return false; + } + + return JSON.parse( + fs.readFileSync(`public/databases/airbases/${theatreName}.json`, { + encoding: "utf-8", + }) + ).airfields; +} + +function isValidTheatre(theatre) { + return allowedTheatres.indexOf(theatre) > -1; +} + +function sendInvalidTheatre(res) { + res + .status(400) + .send( + "Missing/invalid theatre name; must be one of:\n\t" + + allowedTheatres.join("\n\t") + ); +} + +/**************************************************************************************************************/ +// Endpoints +/**************************************************************************************************************/ +app.get("/", (req, res) => { + sendInvalidTheatre(res); +}); + +app.get("/:theatreName/:airbaseName", (req, res) => { + const airbases = getAirbasesData(req.params.theatreName); + if (!airbases) { + sendInvalidTheatre(res); + return; + } + + const airbaseName = req.params.airbaseName; + if (!airbases.hasOwnProperty(airbaseName)) { + res + .status(404) + .send( + `Unknown airbase name "${airbaseName}". Available options are:\n\t` + + Object.keys(airbases).join("\n\t") + ); + } else { + res.status(200).json(airbases[airbaseName]); + } +}); + +app.get("/:theatreName", (req, res) => { + const theatreName = req.params.theatreName.toLowerCase().replace(/\s*/g, ""); + const airbases = getAirbasesData(theatreName); + + if (!airbases) { + sendInvalidTheatre(res); + return; + } + + res.status(200).json(airbases); +}); + +module.exports = app; diff --git a/frontend/server/routes/api/databases.js b/frontend/server/src/routes/api/databases.ts similarity index 94% rename from frontend/server/routes/api/databases.js rename to frontend/server/src/routes/api/databases.ts index ed77e3f4..7d34eb24 100644 --- a/frontend/server/routes/api/databases.js +++ b/frontend/server/src/routes/api/databases.ts @@ -1,9 +1,10 @@ -module.exports = function (databasesLocation) { - const express = require('express'); - const router = express.Router(); - const fs = require("fs"); - const path = require("path"); +import express = require('express'); +import fs = require("fs"); +import path = require("path"); +const router = express.Router(); + +module.exports = function (databasesLocation) { router.get('/:type/:name', function (req, res) { var contents = fs.readFileSync(path.join(databasesLocation, req.params.type, req.params.name + ".json")); res.status(200).send(contents); diff --git a/frontend/server/routes/api/elevation.js b/frontend/server/src/routes/api/elevation.ts similarity index 71% rename from frontend/server/routes/api/elevation.js rename to frontend/server/src/routes/api/elevation.ts index f2450065..c5176e8f 100644 --- a/frontend/server/routes/api/elevation.js +++ b/frontend/server/src/routes/api/elevation.ts @@ -1,11 +1,13 @@ -module.exports = function (configLocation) { - const express = require('express'); - var fs = require('fs'); - const router = express.Router(); - const TileSet = require('srtm-elevation').TileSet; - const SRTMElevationDownloader = require('srtm-elevation').SRTMElevationDownloader; +import express = require('express'); +import fs = require('fs'); +import srtmElevation = require('srtm-elevation'); - let rawdata = fs.readFileSync(configLocation); +const TileSet = srtmElevation.TileSet; +const SRTMElevationDownloader = srtmElevation.SRTMElevationDownloader; +const router = express.Router(); + +module.exports = function (configLocation) { + let rawdata = fs.readFileSync(configLocation, "utf-8"); let config = JSON.parse(rawdata); var tileset = null; diff --git a/frontend/server/routes/index.js b/frontend/server/src/routes/index.ts similarity index 66% rename from frontend/server/routes/index.js rename to frontend/server/src/routes/index.ts index c674b0c2..06600ebd 100644 --- a/frontend/server/routes/index.js +++ b/frontend/server/src/routes/index.ts @@ -1,5 +1,5 @@ -var express = require('express'); -var router = express.Router(); +import express = require('express'); +const router = express.Router(); /* GET home page. */ router.get('/', function (req, res, next) { diff --git a/frontend/server/routes/plugins.js b/frontend/server/src/routes/plugins.ts similarity index 84% rename from frontend/server/routes/plugins.js rename to frontend/server/src/routes/plugins.ts index fd3ad0af..64d6443d 100644 --- a/frontend/server/routes/plugins.js +++ b/frontend/server/src/routes/plugins.ts @@ -1,9 +1,8 @@ -const express = require('express'); -const fs = require('fs'); -const path = require('path'); +import express = require('express'); +import fs = require('fs'); +import path = require('path'); const pluginsDirectory = "./public/plugins" - const router = express.Router(); function listDirectories(source) { diff --git a/frontend/server/src/routes/resources.ts b/frontend/server/src/routes/resources.ts new file mode 100644 index 00000000..d2d12506 --- /dev/null +++ b/frontend/server/src/routes/resources.ts @@ -0,0 +1,18 @@ +import express = require('express'); +import fs = require('fs'); +const router = express.Router(); + +module.exports = function (configLocation) { + router.get('/config', function (req, res, next) { + if (fs.existsSync(configLocation)) { + let rawdata = fs.readFileSync(configLocation, "utf-8"); + const config = JSON.parse(rawdata); + res.send(JSON.stringify(config.frontend)); + res.end() + } else { + res.sendStatus(404); + } + }); + + return router; +} \ No newline at end of file diff --git a/frontend/server/src/www.ts b/frontend/server/src/www.ts new file mode 100644 index 00000000..07594f58 --- /dev/null +++ b/frontend/server/src/www.ts @@ -0,0 +1,112 @@ +import yargs = require("yargs"); +import fs = require("fs"); +import http = require("http"); + +/* Define configuration parameter */ +yargs + .alias("c", "config") + .describe("c", "olympus.json config location") + .string("rp"); +const args = yargs.argv; + +/* Startup print */ +console.log("Please wait while DCS Olympus Server starts up..."); +console.log(`Config location: ${args["config"]}`); + +/* Load the configuration file */ +let httpPort = 0; +if (fs.existsSync(args["config"])) { + const json = JSON.parse(fs.readFileSync(args["config"], "utf-8")); + httpPort = json["frontend"]["port"]; + + /* Load the dependencies. The app is loaded providing the configuration file location */ + const app = require("./app")(args["config"]); + + /* Normalize port */ + const port = normalizePort(httpPort); + app.set("port", port); + console.log("Express server listening on port: " + port); + + /* Create HTTP server */ + const server = http.createServer(app); + + /* Listen on provided port, on all network interfaces. */ + server.listen(port); + server.on("error", (error) => onError(error, port)); + server.on("listening", () => onListening(server.address())); + + /* Optional https support */ + let https = null; + let credentials = null; + let httpsServer = null; + if (json["frontend"]["https"] === true) { + https = require("https"); + const privateKey = fs.readFileSync( + json["frontend"]["keyPath"] ?? "./cert/default.key", + "utf8" + ); + const certificate = fs.readFileSync( + json["frontend"]["certPath"] ?? "./cert/default.crt", + "utf8" + ); + const httpsPort = json["frontend"]["httpsPort"] ?? 3433; + credentials = { key: privateKey, cert: certificate }; + httpsServer = https.createServer(credentials, app); + httpsServer.listen(httpsPort); + console.log("Express server listening on SSL port: " + httpsPort); + } + + /* Final user friendly printing */ + console.log( + "DCS Olympus server {{OLYMPUS_VERSION_NUMBER}}.{{OLYMPUS_COMMIT_HASH}} started correctly!" + ); + console.log("Waiting for connections..."); + process.title = `DCS Olympus server {{OLYMPUS_VERSION_NUMBER}} (${port})`; +} else { + console.log("Failed to read config, aborting!"); +} + +/* Normalize a port into a number, string, or false. */ +function normalizePort(val) { + let port = parseInt(val, 10); + + if (isNaN(port)) { + return val; + } + + if (port >= 0) { + return port; + } + + return false; +} + +/* Event listener for HTTP server "error" event. */ +function onError(error, port: number) { + if (error.syscall !== "listen") { + throw error; + } + + const bind = typeof port === "string" ? "Pipe " + port : "Port " + port; + + /* Handle specific listen errors with friendly messages */ + switch (error.code) { + case "EACCES": + console.error(bind + " requires elevated privileges"); + process.exit(1); + break; + case "EADDRINUSE": + console.error(bind + " is already in use"); + process.exit(1); + break; + default: + throw error; + } +} + +/* Event listener for HTTP server "listening" event. */ +function onListening(address) { + const bind = + typeof address === "string" ? "pipe " + address : "port " + address.port; + console.log("Listening on " + bind); +} diff --git a/frontend/server/tsconfig.json b/frontend/server/tsconfig.json new file mode 100644 index 00000000..c415111d --- /dev/null +++ b/frontend/server/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "outDir": "./build", + "allowJs": true, + "target": "es5", + "sourceMap": true + }, + "include": [ + "./src/**/*" + ] +} \ No newline at end of file diff --git a/frontend/server/views/contextmenus/airbase.ejs b/frontend/server/views/contextmenus/airbase.ejs deleted file mode 100644 index dcba379a..00000000 --- a/frontend/server/views/contextmenus/airbase.ejs +++ /dev/null @@ -1,22 +0,0 @@ -
    -

    - -
    -
    ICAO
    -
    -
    Coalition
    -
    -
    Elevation
    -
    ft
    -
    TACAN
    -
    -
    - -

    Runways

    -
    -
    - -
    - - -
    \ No newline at end of file diff --git a/frontend/server/views/contextmenus/airbasespawn.ejs b/frontend/server/views/contextmenus/airbasespawn.ejs deleted file mode 100644 index d5863dfc..00000000 --- a/frontend/server/views/contextmenus/airbasespawn.ejs +++ /dev/null @@ -1,15 +0,0 @@ -
    -
    -
    - - -
    -
    - -
    -
    - -
    -
    \ No newline at end of file diff --git a/frontend/server/views/contextmenus/coalitionarea.ejs b/frontend/server/views/contextmenus/coalitionarea.ejs deleted file mode 100644 index cb1f6973..00000000 --- a/frontend/server/views/contextmenus/coalitionarea.ejs +++ /dev/null @@ -1,67 +0,0 @@ -
    -
    -
    -
    - - - - -
    -
    -
    -
    Unit types
    -
    - -
    -
    -
    -
    -
    Units eras
    -
    - -
    -
    -
    -
    -
    -
    Units ranges
    -
    - -
    -
    -
    - - - -
    -
    -
    IADS density
    -
    - -
    -
    -
    -
    IADS distribution
    -
    - -
    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/frontend/server/views/contextmenus/map.ejs b/frontend/server/views/contextmenus/map.ejs deleted file mode 100644 index 4f375786..00000000 --- a/frontend/server/views/contextmenus/map.ejs +++ /dev/null @@ -1,71 +0,0 @@ -
    -
    -
    - - -
    -
    -

    Spawn history

    -
    -

    You do not have any units to show.

    -
    -
    -
    -
    -
    - - - - - - - -
    -
    - - - - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    - - - - - -
    -
    - - - - - - -
    -
    -
    \ No newline at end of file diff --git a/frontend/server/views/contextmenus/unit.ejs b/frontend/server/views/contextmenus/unit.ejs deleted file mode 100644 index 540bd66a..00000000 --- a/frontend/server/views/contextmenus/unit.ejs +++ /dev/null @@ -1,3 +0,0 @@ -
    - -
    \ No newline at end of file diff --git a/frontend/server/views/index.ejs b/frontend/server/views/index.ejs deleted file mode 100644 index c991ce06..00000000 --- a/frontend/server/views/index.ejs +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - Olympus client - - - - - - - - - - - - - - - - - - -
    - - -
    - <%- include('toolbars/primary.ejs') %> - <%- include('toolbars/commandmode.ejs') %> -
    - - - <%- include('panels/unitcontrol.ejs') %> - <%- include('panels/unitinfo.ejs') %> - <%- include('panels/mouseinfo.ejs') %> - <%- include('panels/connectionstatus.ejs') %> - - <%- include('panels/hotgroup.ejs') %> - <%- include('panels/logpanel.ejs') %> - <%- include('panels/unitlist.ejs') %> - - - <%- include('contextmenus/airbase.ejs') %> - <%- include('contextmenus/airbasespawn.ejs') %> - <%- include('contextmenus/coalitionarea.ejs') %> - <%- include('contextmenus/map.ejs') %> - <%- include('contextmenus/unit.ejs') %> - - - <%- include('other/dialogs.ejs') %> - <%- include('other/popups.ejs') %> - - -
    - - -
    - -
    Loading DCS Olympus...
    -
    - - - - - diff --git a/frontend/server/views/other/dialogs.ejs b/frontend/server/views/other/dialogs.ejs deleted file mode 100644 index 4fa33d6b..00000000 --- a/frontend/server/views/other/dialogs.ejs +++ /dev/null @@ -1,19 +0,0 @@ -<%- include('dialogs/advancedsettings.ejs') %> -<%- include('dialogs/commandmodesettings.ejs') %> -<%- include('dialogs/customformation.ejs') %> -<%- include('dialogs/importexport.ejs', { - "dialogId": "unit-export-dialog", - "submitButtonText": "Export units to file", - "textContent": "Select the unit categories you would like to export. Note: only ground and naval units can be exported at this time.", - "title": "Export", - "showFilenameInput": true -}) %> -<%- include('dialogs/importexport.ejs', { - "dialogId": "unit-import-dialog", - "submitButtonText": "Import units into mission", - "textContent": "Select the unit categories you would like to import.", - "title": "Import", - "showFilenameInput": false -}) %> -<%- include('dialogs/slowdelete.ejs') %> -<%- include('dialogs/splash.ejs') %> \ No newline at end of file diff --git a/frontend/server/views/other/dialogs/advancedsettings.ejs b/frontend/server/views/other/dialogs/advancedsettings.ejs deleted file mode 100644 index ad3222e1..00000000 --- a/frontend/server/views/other/dialogs/advancedsettings.ejs +++ /dev/null @@ -1,162 +0,0 @@ -
    -
    - -
    -

    Olympus 1-1

    -
    - -
    - - -
    -
    -

    General settings

    -
    -
    -
    -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    -
    -
    - - - - - -
    -
    -

    TACAN options

    -
    -
    -
    - -
    - -
    - - -
    -
    - -
    - -
    -
    X
    -
    -
    -
    - -
    - -
    -
    -
    -
    - - -
    -
    -

    Radio options

    -
    -
    - -
    - - -
    -
    - -
    - -
    -
    .000
    -
    -
    -
    -
    -
    - -
    - - -
    -
    -
    -
    -
    -
    - - - -
    - -
    -
    -
    -
    -
    - - - -
    \ No newline at end of file diff --git a/frontend/server/views/other/dialogs/commandmodesettings.ejs b/frontend/server/views/other/dialogs/commandmodesettings.ejs deleted file mode 100644 index 5d783473..00000000 --- a/frontend/server/views/other/dialogs/commandmodesettings.ejs +++ /dev/null @@ -1,72 +0,0 @@ -
    -
    - -
    -

    Command mode settings

    -
    - -
    -
    - -
    - -
    - -
    - -
    - -
    - - -
    -
    - -
    - -
    -
    - -
    - - -
    -
    Select eras
    -
    - -
    -
    -
    - -
    -

    Spawn points

    -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    - - -
    \ No newline at end of file diff --git a/frontend/server/views/other/dialogs/customformation.ejs b/frontend/server/views/other/dialogs/customformation.ejs deleted file mode 100644 index b682121d..00000000 --- a/frontend/server/views/other/dialogs/customformation.ejs +++ /dev/null @@ -1,48 +0,0 @@ -
    -
    - -
    -

    Custom formation

    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - - -
    -
    - -
    - -
    -
    - -
    - - -
    -
    - -
    - -
    -
    -
    - - -
    \ No newline at end of file diff --git a/frontend/server/views/other/dialogs/importexport.ejs b/frontend/server/views/other/dialogs/importexport.ejs deleted file mode 100644 index 59e77431..00000000 --- a/frontend/server/views/other/dialogs/importexport.ejs +++ /dev/null @@ -1,43 +0,0 @@ -
    -
    -

    <%= title %>

    -
    - -
    - -
    -

    <%= textContent %>

    - - <% if (showFilenameInput) { %> -
    - - - -
    - <% } %> - - - - - - -
    -
    - -
    - -

    Data could not be imported because:

    - -
      - -
      Please correct the error(s) and run the import again.
      - -
      - - - -
      -
      \ No newline at end of file diff --git a/frontend/server/views/other/dialogs/slowdelete.ejs b/frontend/server/views/other/dialogs/slowdelete.ejs deleted file mode 100644 index 372eff82..00000000 --- a/frontend/server/views/other/dialogs/slowdelete.ejs +++ /dev/null @@ -1,21 +0,0 @@ -
      -
      -

      Confirm deletion method

      -
      - -
      -

      You are trying to delete a large amount of units (), which can cause the server to lag for players.

      -

      You may: -

        -
      • delete in batches (less lag but Olympus cannot process any additional orders until
        all units have been deleted);
      • -
      • delete immediately (you can continue to give Olympus orders but players may
        experience lag while this happens);
      • -
      • cancel this instruction.
      • -

      -
      - - -
      \ No newline at end of file diff --git a/frontend/server/views/other/dialogs/splash.ejs b/frontend/server/views/other/dialogs/splash.ejs deleted file mode 100644 index 4d17115a..00000000 --- a/frontend/server/views/other/dialogs/splash.ejs +++ /dev/null @@ -1,51 +0,0 @@ -
      -
      -
      -

      DCS Olympus

      -

      Dynamic Unit Command

      -
      Version {{OLYMPUS_VERSION_NUMBER}}
      -
      Latest version
      -
      - -
      -
      Display Name
      -
      Password
      - -
      - -

      - - -
      -
      \ No newline at end of file diff --git a/frontend/server/views/other/popups.ejs b/frontend/server/views/other/popups.ejs deleted file mode 100644 index aa2e8af4..00000000 --- a/frontend/server/views/other/popups.ejs +++ /dev/null @@ -1,3 +0,0 @@ -
      - -
      \ No newline at end of file diff --git a/frontend/server/views/panels/connectionstatus.ejs b/frontend/server/views/panels/connectionstatus.ejs deleted file mode 100644 index 067f9abd..00000000 --- a/frontend/server/views/panels/connectionstatus.ejs +++ /dev/null @@ -1,7 +0,0 @@ -
      -
      - - -
      -
      -
      \ No newline at end of file diff --git a/frontend/server/views/panels/hotgroup.ejs b/frontend/server/views/panels/hotgroup.ejs deleted file mode 100644 index 0838c635..00000000 --- a/frontend/server/views/panels/hotgroup.ejs +++ /dev/null @@ -1,3 +0,0 @@ -
      - -
      \ No newline at end of file diff --git a/frontend/server/views/panels/logpanel.ejs b/frontend/server/views/panels/logpanel.ejs deleted file mode 100644 index 719dc8a8..00000000 --- a/frontend/server/views/panels/logpanel.ejs +++ /dev/null @@ -1,22 +0,0 @@ -
      -
      -
      Server log
      - -
      -
      -
      -
      FPS:
      -
      -
      -
      -
      Load:
      -
      -
      -
      - -
      - -
      -
      -
      -
      \ No newline at end of file diff --git a/frontend/server/views/panels/mouseinfo.ejs b/frontend/server/views/panels/mouseinfo.ejs deleted file mode 100644 index 990258e7..00000000 --- a/frontend/server/views/panels/mouseinfo.ejs +++ /dev/null @@ -1,63 +0,0 @@ -
      - -
      -
      -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      - -
      \ No newline at end of file diff --git a/frontend/server/views/panels/serverstatus.ejs b/frontend/server/views/panels/serverstatus.ejs deleted file mode 100644 index 6cf7d63b..00000000 --- a/frontend/server/views/panels/serverstatus.ejs +++ /dev/null @@ -1,10 +0,0 @@ -
      -
      -
      Server frame rate:
      -
      -
      -
      -
      Olympus load:
      -
      -
      -
      \ No newline at end of file diff --git a/frontend/server/views/panels/unitcontrol.ejs b/frontend/server/views/panels/unitcontrol.ejs deleted file mode 100644 index 16e2a420..00000000 --- a/frontend/server/views/panels/unitcontrol.ejs +++ /dev/null @@ -1,168 +0,0 @@ -
      -
      - -
      -

      Selected Units

      - -
      - -
      - - -
      -
      - -
      - -
      -
      -
      -
      -
      Speed
      -
      -
      -
      -
      -
      - -
      -
      -
      -
      -
      Altitude -
      -
      -
      -
      -
      -
      - -
      -
      -
      Multiple categories selected
      -
      - -
      - -
      -

      Rules of engagement

      -
      - -
      -
      - -
      -

      Reaction to threat

      -
      - -
      -
      - -
      -

      Radar & ECM

      -
      - -
      -
      - -
      -

      Shots scatter

      -
      - -
      -
      - -
      -

      Shots intensity

      -
      - -
      -
      - -
      -

      Enable tanker -

      -
      -
      - -
      -

      Airborne Early Warning -

      -
      -
      - -
      -

      Operate as

      -
      -
      - -
      -

      Unit active -

      -
      -
      - -
      -

      Follow roads

      -
      -
      -
      - -
      - -
      - -
      -
      - Delete unit -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - - - - - -
      - -
      \ No newline at end of file diff --git a/frontend/server/views/panels/unitinfo.ejs b/frontend/server/views/panels/unitinfo.ejs deleted file mode 100644 index 017e346e..00000000 --- a/frontend/server/views/panels/unitinfo.ejs +++ /dev/null @@ -1,29 +0,0 @@ -
      - - -
      -

      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      - -
      -
      -
      - -
      -
      -
      -
      - -
      - -
      \ No newline at end of file diff --git a/frontend/server/views/panels/unitlist.ejs b/frontend/server/views/panels/unitlist.ejs deleted file mode 100644 index 23514c55..00000000 --- a/frontend/server/views/panels/unitlist.ejs +++ /dev/null @@ -1,11 +0,0 @@ -
      -

      Unit List

      -
      -
      Name
      -
      Vehicle
      -
      Category
      -
      Coalition
      -
      Human/AI
      -
      -
      -
      \ No newline at end of file diff --git a/frontend/server/views/toolbars/commandmode.ejs b/frontend/server/views/toolbars/commandmode.ejs deleted file mode 100644 index 69000053..00000000 --- a/frontend/server/views/toolbars/commandmode.ejs +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/frontend/server/views/toolbars/primary.ejs b/frontend/server/views/toolbars/primary.ejs deleted file mode 100644 index 268d3d27..00000000 --- a/frontend/server/views/toolbars/primary.ejs +++ /dev/null @@ -1,110 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/server/views/uikit/uikit.ejs b/frontend/server/views/uikit/uikit.ejs deleted file mode 100644 index 224cc7b3..00000000 --- a/frontend/server/views/uikit/uikit.ejs +++ /dev/null @@ -1,1313 +0,0 @@ - - - - Olympus UI Kit - - - - - - - -
      - -

      Olympus UI Kit

      - -
      -
      Typeography
      -
      Navbar
      -
      Context menu
      -
      Unit control panel
      -
      Mouse info panel
      -
      Buttons
      -
      Ground Units
      -
      Planes
      -
      Weapons
      -
      .ol-panel
      -
      Icons
      -
      - -
      - -
      - -
      Headings
      -
      - -
      -

      h1 | open sans | 32px

      -

      h2 | open sans | 24px

      -

      h3 | open sans | 18.72px

      -

      h4 | open sans | 16px

      -
      h5 | open sans | 13.28px
      -
      h6 | open sans | 10.72px
      -
      - -
      - -
      - -
      - -
      Paragraph
      -
      - -
      -
      Plain
      -

      Nullam iaculis nisi sed mi tincidunt pretium blandit tempus urna. Vestibulum non ex vitae massa tristique auctor. Praesent orci justo, porttitor pellentesque convallis non, commodo at augue.

      -
      - -
      -
      In a panel
      -
      -

      Donec nibh est, fringilla sed pharetra eu, varius vel sem. Aliquam ac libero leo. Sed consectetur enim aliquam dui pellentesque luctus. Pellentesque vel iaculis quam.

      -
      -
      - -
      - -
      - -
      - - -
      - -
      - -
      Primary nav
      -
      - -
      - <%- include('navbar.ejs') %> -
      - -
      - -
      - -
      - -
      - -
      - -
      Context menu
      -
      -
      - <%- include('contextmenus.ejs') %> -
      -
      -
      - -
      - -
      - -
      - -
      Unit Control Panel
      -
      - -
      - <%- include('unitcontrolpanel.ejs') %> -
      - -
      - -
      - -
      - -
      - -
      - -
      Primary nav
      -
      - -
      - <%- include('mouseinfopanel.ejs') %> -
      - -
      - -
      - -
      - - -
      - -
      - -
      Buttons
      -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      - - -
      - -
      - -
      Ground
      -
      - -
      - -
      Neutral
      - -
      -
      -
      -
      Z
      -
      - -
      - -
      - -
      Blue
      - -
      -
      -
      -
      Y
      -
      - -
      - -
      - -
      Red
      - -
      -
      -
      -
      X
      -
      - -
      - -
      - -
      - - -
      - -
      SAM
      -
      - -
      - -
      Neutral
      - -
      -
      -
      -
      Z
      -
      - -
      - -
      - -
      Blue
      - -
      -
      -
      -
      Y
      -
      - -
      - -
      - -
      Red
      - -
      -
      -
      -
      X
      -
      - -
      - -
      - -
      - -
      - -
      navyunit
      -
      - -
      - -
      Neutral
      - -
      -
      -
      -
      Z
      -
      - -
      - -
      - -
      Blue
      - -
      -
      -
      -
      Y
      -
      - -
      - -
      - -
      Red
      - -
      -
      -
      -
      X
      -
      - -
      - -
      - -
      - -
      - -
      Buildings
      -
      - -
      - -
      Neutral
      - -
      -
      -
      -
      J
      -
      - -
      - -
      - -
      Blue
      - -
      -
      -
      -
      K
      -
      - -
      - -
      - -
      Red
      - -
      -
      -
      -
      L
      -
      - -
      - -
      - -
      - -
      - - -
      - -
      - -
      Fuel states (AI only)
      -
      - -
      - -
      0% (empty)
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      - -
      10%
      - -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      - -
      20%
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - - -
      - -
      50%
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      - -
      75%
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      - -
      100%
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      - -
      - -
      - -
      Status icons
      -
      - -
      - -
      -
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      Springfield 3-1 | Longname
      -
      260
      -
      31
      -
      -
      - -
      - - -
      - -
      -
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      Springfield 3-1 | Longname
      -
      260
      -
      31
      -
      -
      - -
      - -
      - -
      -
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      Springfield 3-1 | Longname
      -
      260
      -
      31
      -
      -
      - -
      - - -
      - -
      -
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      Springfield 3-1 | Longname
      -
      260
      -
      31
      -
      -
      - -
      - - -
      - -
      -
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      Springfield 3-1 | Longname
      -
      260
      -
      31
      -
      -
      - -
      - -
      - -
      -
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      Springfield 3-1 | Longname
      -
      260
      -
      31
      -
      -
      - -
      - - -
      -
      - -
      - -
      Dead
      -
      - -
      - -
      -
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      Springfield 3-1 | Longname
      -
      260
      -
      31
      -
      -
      - -
      - - -
      - -
      -
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      Springfield 3-1 | Longname
      -
      260
      -
      31
      -
      -
      - -
      - -
      - -
      -
      -
      -
      -
      -
      4
      -
      -
      -
      18
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      Springfield 3-1 | Longname
      -
      260
      -
      31
      -
      -
      - -
      - - -
      -
      - -
      - -
      - -
      - -
      Missile
      - -
      - -
      - -
      -
      -
      - -
      - - -
      - -
      -
      -
      - -
      - -
      - -
      -
      -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      Plain panel
      - -
      - -
      - -
      - Disconnected -
      - -
      - -
      - -
      - -
      - -
      Panel list
      - -
      - -
      - -
      Basic list
      - -
      -
      -
      List item 1
      -
      List item 2
      -
      List item 3
      -
      -
      - -
      - -
      - -
      List with .highlight-primary
      - -
      -
      -
      List item with highlight-primary
      -
      List item with highlight-bluefor
      -
      List item with highlight-redfor
      -
      List item with highlight-neutral
      -
      -
      - -
      - -
      - -
      Sortable list
      - -
      -
      -
      -
      -
      List item 1
      -
      -
      -
      -
      List item 2
      -
      -
      -
      -
      List item 3
      -
      -
      - -
      - -
      - - - -
      - -
      - -
      - -
      Panel board
      - -
      - -
      - -
      -
      -
      -

      Unit Callsign

      -
      Airframe
      -
      Group
      -
      -
      -

      Flight data

      -
      -
      -

      Loadout

      -
      -
      -
      - -
      - - -
      - -
      - -
      - -
      Button group
      - -
      - -
      - -
      -
      - - - -
      -
      - -
      - - -
      - -
      - - -
      -
      ol select
      -
      -
      - -
      -
      - -
      -
      -
      - -
      -
      -
      -
      -
      - -
      -
      -
      - -
      - -
      - -
      -
      - The selected value goes here -
      -
      -
      - -
      -
      - -
      -
      -
      - -
      - -
      - -
      -
      - Options go up -
      -
      -
      - -
      -
      - -
      -
      -
      - -
      -
      -
      - - -
      -
      Airfield menu
      -
      -
      - -
      -

      Al Alhambra

      -
      -
      Runway 1
      -
      31 / 13
      -
      Runway 2
      -
      27 / 09
      -
      TCN
      -
      19X
      -
      ILS
      -
      -
      -
      -
      -

      Parking available:

      -
      -
      Shelters
      -
      2
      -
      Open air
      -
      5
      -
      - - -
      - -
      -
      -
      - - -
      -
      Airfield menu
      -
      -
      - -
      - -
      - -
      -

      Olympus 1-1

      -
      -
      Name
      -
      AI Controlled
      -
      -
      -
      - -
      - -
      -
      -
      - Empty loadout -
      -
      - - -
      -
      -
      -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      -

      Olympus 1-1

      -
      -
      Name
      -
      AI Controlled
      -
      -
      -
      - -
      - -
      -
      -
      -
      -
      -
      -
      -
      - - -
      -
      -
      -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      -
      -
      -
      -
      -
      -
      -
      - - -
      -
      -
      -
      - -
      - -
      - -
      - -
      -
      -
      - -
      - -
      - -
      - -
      Icons
      -
      - -
      -
      Actions
      -
      -
      - - icons_actions_gas -
      -
      - - icons_actions_nothing -
      -
      - - icons_actions_rtb -
      -
      - - icons_actions_search -
      -
      -
      - -
      -
      RoE
      -
      -
      - - icons_roe_free -
      -
      - - icons_roe_return -
      -
      - - icons_roe_stop -
      -
      - - icons_roe_target -
      -
      -
      - -
      -
      Threat
      -
      -
      - - icons_threat_protect -
      -
      - - icons_threat_retreat -
      -
      -
      - -
      - -
      - -
      - -
      - - - - - \ No newline at end of file diff --git a/frontend/setup.bat b/frontend/setup.bat index 54ff5d29..0d56313f 100644 --- a/frontend/setup.bat +++ b/frontend/setup.bat @@ -1,8 +1,6 @@ -cd website +cd react call npm install -call npm install -g watchify babelify tsify -call npm run build-debug cd .. diff --git a/scripts/python/map_generator/.gitignore b/scripts/python/map_generator/.gitignore index 6efe1baa..87d6c496 100644 --- a/scripts/python/map_generator/.gitignore +++ b/scripts/python/map_generator/.gitignore @@ -1,3 +1,3 @@ .venv tiles -screenshots \ No newline at end of file +screenshots diff --git a/version.json b/version.json index c29a7836..1ffac4bd 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "v1.0.4" + "version": "v2.0.0" }