From d54c8da0aaf9093b86d518a6d9d3a54c1fafd253 Mon Sep 17 00:00:00 2001 From: Wannes Gennar Date: Wed, 3 Apr 2024 23:23:12 +0200 Subject: [PATCH] .NET rewrite (#30) * scaffold .NET API * setup OpenAPI integration * strip OpenAPI dependencies from release builds * switch to NSwag for OpenAPI support * add mapping of ArrowHead's official API * setup configuration and sync service * make application aware of OpenApi documentation * setup localization see #1 see #14 * add CORS headers see #2 * add ApiService for loading ArrowHead information * setup ArrowHead API endpoints * generate separate OpenAPI document for only ArrowHead endpoints * add war summary endpoint * add domain mappings * add domain mapping & fix warnings * fix Docker builds Make Fly builds work again (hopefully) * fix OpenAPI spec * add planets for v1 API endpoints * Remove old workflows * Add github pages workflow for automatic documentation updates * Change pages.yml from CRLF to LF * Add a .yml editorconfig entry * use CultureDictionary for proper culture selection on API level * add newsfeed endpoint * add assignments endpoints * add LocalizedMessage for handling multilanguage strings * fix return type of war summary OpenAPI * setup Fly deploy for .NET * add 'health' endpoint that doesn't fail to avoid load balancing issues * add rate limit middleware * add missing fields to ArrowHead warstatus * remove test endpoint * add response compression * add Steam news feed * added some documentation to API's Program.cs * run `dotnet format` on codebase * add Github community health files * introduce concept of stores * format code and add some docs * hide JSON folder in solution explorer * rework entire data model * add API endpoint for Steam news feed * fix release builds * fix crash when synchronizing more than once * add player count to statistics * reduce logging verbosity * add CI for .NET * add test projects * re-add health checks * added steam mapping tests * update JSON module * scrap unit tests for initial rewrite * fix compiler warnings * add contributor documentation and templates * run dotnet format on codebase * update README * fix language sometimes returning empty fix #33 * add endpoint for planets with events * fix warnings for planet event endpoint * Apply suggestions from code review Co-authored-by: TheDarkGlobe * add missing todo's for code review --------- Co-authored-by: TheDarkGlobe --- .dockerignore | 71 +- .editorconfig | 245 +++ .formatter.exs | 5 - .gitattributes | 63 + .github/ISSUE_TEMPLATE/bug_report.yml | 102 ++ .github/ISSUE_TEMPLATE/config.yml | 11 + .github/ISSUE_TEMPLATE/feature_request.md | 21 + .github/workflows/dotnet.yml | 31 + .github/workflows/elixir.yml | 38 - .github/workflows/ex_docs.yml | 51 - .github/workflows/fly.yml | 2 +- .github/workflows/pages.yml | 64 + .gitignore | 379 +++- .gitmodules | 3 + CODE_OF_CONDUCT.md | 128 ++ CONTRIBUTING.md | 73 + Directory.Build.props | 8 + Dockerfile | 97 - Helldivers-2.sln | 93 + assets/vendor/heroicons/LICENSE.md => LICENSE | 4 +- README.md | 119 +- SECURITY.md | 9 + assets/css/app.css | 5 - assets/js/app.js | 41 - assets/tailwind.config.js | 68 - assets/vendor/heroicons/UPGRADE.md | 6 - .../optimized/20/solid/academic-cap.svg | 3 - .../20/solid/adjustments-horizontal.svg | 3 - .../20/solid/adjustments-vertical.svg | 3 - .../20/solid/archive-box-arrow-down.svg | 3 - .../optimized/20/solid/archive-box-x-mark.svg | 4 - .../optimized/20/solid/archive-box.svg | 4 - .../optimized/20/solid/arrow-down-circle.svg | 3 - .../optimized/20/solid/arrow-down-left.svg | 3 - .../20/solid/arrow-down-on-square-stack.svg | 3 - .../20/solid/arrow-down-on-square.svg | 3 - .../optimized/20/solid/arrow-down-right.svg | 3 - .../optimized/20/solid/arrow-down-tray.svg | 4 - .../optimized/20/solid/arrow-down.svg | 3 - .../optimized/20/solid/arrow-left-circle.svg | 10 - .../20/solid/arrow-left-on-rectangle.svg | 4 - .../optimized/20/solid/arrow-left.svg | 3 - .../optimized/20/solid/arrow-long-down.svg | 3 - .../optimized/20/solid/arrow-long-left.svg | 3 - .../optimized/20/solid/arrow-long-right.svg | 3 - .../optimized/20/solid/arrow-long-up.svg | 3 - .../20/solid/arrow-path-rounded-square.svg | 3 - .../optimized/20/solid/arrow-path.svg | 3 - .../optimized/20/solid/arrow-right-circle.svg | 3 - .../20/solid/arrow-right-on-rectangle.svg | 4 - .../optimized/20/solid/arrow-right.svg | 3 - .../optimized/20/solid/arrow-small-down.svg | 3 - .../optimized/20/solid/arrow-small-left.svg | 3 - .../optimized/20/solid/arrow-small-right.svg | 3 - .../optimized/20/solid/arrow-small-up.svg | 3 - .../20/solid/arrow-top-right-on-square.svg | 4 - .../20/solid/arrow-trending-down.svg | 3 - .../optimized/20/solid/arrow-trending-up.svg | 3 - .../optimized/20/solid/arrow-up-circle.svg | 3 - .../optimized/20/solid/arrow-up-left.svg | 3 - .../20/solid/arrow-up-on-square-stack.svg | 3 - .../optimized/20/solid/arrow-up-on-square.svg | 3 - .../optimized/20/solid/arrow-up-right.svg | 3 - .../optimized/20/solid/arrow-up-tray.svg | 4 - .../heroicons/optimized/20/solid/arrow-up.svg | 3 - .../optimized/20/solid/arrow-uturn-down.svg | 3 - .../optimized/20/solid/arrow-uturn-left.svg | 3 - .../optimized/20/solid/arrow-uturn-right.svg | 3 - .../optimized/20/solid/arrow-uturn-up.svg | 3 - .../optimized/20/solid/arrows-pointing-in.svg | 3 - .../20/solid/arrows-pointing-out.svg | 3 - .../optimized/20/solid/arrows-right-left.svg | 3 - .../optimized/20/solid/arrows-up-down.svg | 3 - .../optimized/20/solid/at-symbol.svg | 3 - .../optimized/20/solid/backspace.svg | 3 - .../heroicons/optimized/20/solid/backward.svg | 3 - .../optimized/20/solid/banknotes.svg | 3 - .../heroicons/optimized/20/solid/bars-2.svg | 3 - .../optimized/20/solid/bars-3-bottom-left.svg | 3 - .../20/solid/bars-3-bottom-right.svg | 3 - .../optimized/20/solid/bars-3-center-left.svg | 3 - .../heroicons/optimized/20/solid/bars-3.svg | 3 - .../heroicons/optimized/20/solid/bars-4.svg | 3 - .../optimized/20/solid/bars-arrow-down.svg | 3 - .../optimized/20/solid/bars-arrow-up.svg | 3 - .../optimized/20/solid/battery-0.svg | 3 - .../optimized/20/solid/battery-100.svg | 4 - .../optimized/20/solid/battery-50.svg | 4 - .../heroicons/optimized/20/solid/beaker.svg | 3 - .../optimized/20/solid/bell-alert.svg | 4 - .../optimized/20/solid/bell-slash.svg | 3 - .../optimized/20/solid/bell-snooze.svg | 3 - .../heroicons/optimized/20/solid/bell.svg | 3 - .../optimized/20/solid/bolt-slash.svg | 4 - .../heroicons/optimized/20/solid/bolt.svg | 3 - .../optimized/20/solid/book-open.svg | 3 - .../optimized/20/solid/bookmark-slash.svg | 3 - .../optimized/20/solid/bookmark-square.svg | 3 - .../heroicons/optimized/20/solid/bookmark.svg | 3 - .../optimized/20/solid/briefcase.svg | 4 - .../heroicons/optimized/20/solid/bug-ant.svg | 3 - .../optimized/20/solid/building-library.svg | 3 - .../optimized/20/solid/building-office-2.svg | 3 - .../optimized/20/solid/building-office.svg | 3 - .../20/solid/building-storefront.svg | 3 - .../heroicons/optimized/20/solid/cake.svg | 3 - .../optimized/20/solid/calculator.svg | 3 - .../optimized/20/solid/calendar-days.svg | 4 - .../heroicons/optimized/20/solid/calendar.svg | 3 - .../heroicons/optimized/20/solid/camera.svg | 3 - .../optimized/20/solid/chart-bar-square.svg | 3 - .../optimized/20/solid/chart-bar.svg | 3 - .../optimized/20/solid/chart-pie.svg | 4 - .../solid/chat-bubble-bottom-center-text.svg | 3 - .../20/solid/chat-bubble-bottom-center.svg | 3 - .../20/solid/chat-bubble-left-ellipsis.svg | 3 - .../20/solid/chat-bubble-left-right.svg | 4 - .../optimized/20/solid/chat-bubble-left.svg | 3 - .../solid/chat-bubble-oval-left-ellipsis.svg | 3 - .../20/solid/chat-bubble-oval-left.svg | 3 - .../optimized/20/solid/check-badge.svg | 3 - .../optimized/20/solid/check-circle.svg | 3 - .../heroicons/optimized/20/solid/check.svg | 3 - .../20/solid/chevron-double-down.svg | 3 - .../20/solid/chevron-double-left.svg | 3 - .../20/solid/chevron-double-right.svg | 4 - .../optimized/20/solid/chevron-double-up.svg | 3 - .../optimized/20/solid/chevron-down.svg | 3 - .../optimized/20/solid/chevron-left.svg | 3 - .../optimized/20/solid/chevron-right.svg | 3 - .../optimized/20/solid/chevron-up-down.svg | 3 - .../optimized/20/solid/chevron-up.svg | 3 - .../optimized/20/solid/circle-stack.svg | 3 - .../20/solid/clipboard-document-check.svg | 4 - .../20/solid/clipboard-document-list.svg | 4 - .../optimized/20/solid/clipboard-document.svg | 4 - .../optimized/20/solid/clipboard.svg | 3 - .../heroicons/optimized/20/solid/clock.svg | 3 - .../optimized/20/solid/cloud-arrow-down.svg | 3 - .../optimized/20/solid/cloud-arrow-up.svg | 3 - .../heroicons/optimized/20/solid/cloud.svg | 3 - .../20/solid/code-bracket-square.svg | 3 - .../optimized/20/solid/code-bracket.svg | 3 - .../optimized/20/solid/cog-6-tooth.svg | 3 - .../optimized/20/solid/cog-8-tooth.svg | 3 - .../heroicons/optimized/20/solid/cog.svg | 4 - .../optimized/20/solid/command-line.svg | 3 - .../optimized/20/solid/computer-desktop.svg | 3 - .../heroicons/optimized/20/solid/cpu-chip.svg | 4 - .../optimized/20/solid/credit-card.svg | 3 - .../optimized/20/solid/cube-transparent.svg | 3 - .../heroicons/optimized/20/solid/cube.svg | 3 - .../20/solid/currency-bangladeshi.svg | 3 - .../optimized/20/solid/currency-dollar.svg | 4 - .../optimized/20/solid/currency-euro.svg | 3 - .../optimized/20/solid/currency-pound.svg | 3 - .../optimized/20/solid/currency-rupee.svg | 3 - .../optimized/20/solid/currency-yen.svg | 3 - .../optimized/20/solid/cursor-arrow-rays.svg | 3 - .../20/solid/cursor-arrow-ripple.svg | 3 - .../20/solid/device-phone-mobile.svg | 4 - .../optimized/20/solid/device-tablet.svg | 3 - .../20/solid/document-arrow-down.svg | 3 - .../optimized/20/solid/document-arrow-up.svg | 3 - .../optimized/20/solid/document-chart-bar.svg | 3 - .../optimized/20/solid/document-check.svg | 3 - .../optimized/20/solid/document-duplicate.svg | 4 - .../20/solid/document-magnifying-glass.svg | 4 - .../optimized/20/solid/document-minus.svg | 3 - .../optimized/20/solid/document-plus.svg | 3 - .../optimized/20/solid/document-text.svg | 3 - .../heroicons/optimized/20/solid/document.svg | 3 - .../20/solid/ellipsis-horizontal-circle.svg | 3 - .../20/solid/ellipsis-horizontal.svg | 3 - .../optimized/20/solid/ellipsis-vertical.svg | 3 - .../optimized/20/solid/envelope-open.svg | 3 - .../heroicons/optimized/20/solid/envelope.svg | 4 - .../optimized/20/solid/exclamation-circle.svg | 3 - .../20/solid/exclamation-triangle.svg | 3 - .../optimized/20/solid/eye-dropper.svg | 3 - .../optimized/20/solid/eye-slash.svg | 4 - .../heroicons/optimized/20/solid/eye.svg | 4 - .../optimized/20/solid/face-frown.svg | 3 - .../optimized/20/solid/face-smile.svg | 3 - .../heroicons/optimized/20/solid/film.svg | 3 - .../optimized/20/solid/finger-print.svg | 3 - .../heroicons/optimized/20/solid/fire.svg | 3 - .../heroicons/optimized/20/solid/flag.svg | 3 - .../optimized/20/solid/folder-arrow-down.svg | 3 - .../optimized/20/solid/folder-minus.svg | 3 - .../optimized/20/solid/folder-open.svg | 3 - .../optimized/20/solid/folder-plus.svg | 3 - .../heroicons/optimized/20/solid/folder.svg | 3 - .../heroicons/optimized/20/solid/forward.svg | 3 - .../heroicons/optimized/20/solid/funnel.svg | 3 - .../heroicons/optimized/20/solid/gif.svg | 3 - .../heroicons/optimized/20/solid/gift-top.svg | 3 - .../heroicons/optimized/20/solid/gift.svg | 4 - .../optimized/20/solid/globe-alt.svg | 3 - .../optimized/20/solid/globe-americas.svg | 3 - .../20/solid/globe-asia-australia.svg | 3 - .../20/solid/globe-europe-africa.svg | 3 - .../optimized/20/solid/hand-raised.svg | 3 - .../optimized/20/solid/hand-thumb-down.svg | 3 - .../optimized/20/solid/hand-thumb-up.svg | 3 - .../heroicons/optimized/20/solid/hashtag.svg | 3 - .../heroicons/optimized/20/solid/heart.svg | 3 - .../optimized/20/solid/home-modern.svg | 3 - .../heroicons/optimized/20/solid/home.svg | 3 - .../optimized/20/solid/identification.svg | 3 - .../optimized/20/solid/inbox-arrow-down.svg | 4 - .../optimized/20/solid/inbox-stack.svg | 4 - .../heroicons/optimized/20/solid/inbox.svg | 3 - .../optimized/20/solid/information-circle.svg | 3 - .../heroicons/optimized/20/solid/key.svg | 3 - .../heroicons/optimized/20/solid/language.svg | 4 - .../heroicons/optimized/20/solid/lifebuoy.svg | 3 - .../optimized/20/solid/light-bulb.svg | 3 - .../heroicons/optimized/20/solid/link.svg | 4 - .../optimized/20/solid/list-bullet.svg | 3 - .../optimized/20/solid/lock-closed.svg | 3 - .../optimized/20/solid/lock-open.svg | 3 - .../20/solid/magnifying-glass-circle.svg | 4 - .../20/solid/magnifying-glass-minus.svg | 4 - .../20/solid/magnifying-glass-plus.svg | 4 - .../optimized/20/solid/magnifying-glass.svg | 3 - .../heroicons/optimized/20/solid/map-pin.svg | 3 - .../heroicons/optimized/20/solid/map.svg | 3 - .../optimized/20/solid/megaphone.svg | 3 - .../optimized/20/solid/microphone.svg | 4 - .../optimized/20/solid/minus-circle.svg | 3 - .../optimized/20/solid/minus-small.svg | 3 - .../heroicons/optimized/20/solid/minus.svg | 3 - .../heroicons/optimized/20/solid/moon.svg | 3 - .../optimized/20/solid/musical-note.svg | 3 - .../optimized/20/solid/newspaper.svg | 4 - .../optimized/20/solid/no-symbol.svg | 3 - .../optimized/20/solid/paint-brush.svg | 3 - .../optimized/20/solid/paper-airplane.svg | 3 - .../optimized/20/solid/paper-clip.svg | 3 - .../optimized/20/solid/pause-circle.svg | 3 - .../heroicons/optimized/20/solid/pause.svg | 3 - .../optimized/20/solid/pencil-square.svg | 4 - .../heroicons/optimized/20/solid/pencil.svg | 3 - .../20/solid/phone-arrow-down-left.svg | 3 - .../20/solid/phone-arrow-up-right.svg | 3 - .../optimized/20/solid/phone-x-mark.svg | 3 - .../heroicons/optimized/20/solid/phone.svg | 3 - .../heroicons/optimized/20/solid/photo.svg | 3 - .../optimized/20/solid/play-circle.svg | 3 - .../optimized/20/solid/play-pause.svg | 3 - .../heroicons/optimized/20/solid/play.svg | 3 - .../optimized/20/solid/plus-circle.svg | 3 - .../optimized/20/solid/plus-small.svg | 3 - .../heroicons/optimized/20/solid/plus.svg | 3 - .../heroicons/optimized/20/solid/power.svg | 3 - .../20/solid/presentation-chart-bar.svg | 3 - .../20/solid/presentation-chart-line.svg | 3 - .../heroicons/optimized/20/solid/printer.svg | 3 - .../optimized/20/solid/puzzle-piece.svg | 3 - .../heroicons/optimized/20/solid/qr-code.svg | 3 - .../20/solid/question-mark-circle.svg | 3 - .../optimized/20/solid/queue-list.svg | 3 - .../heroicons/optimized/20/solid/radio.svg | 3 - .../optimized/20/solid/receipt-percent.svg | 3 - .../optimized/20/solid/receipt-refund.svg | 3 - .../optimized/20/solid/rectangle-group.svg | 3 - .../optimized/20/solid/rectangle-stack.svg | 3 - .../optimized/20/solid/rocket-launch.svg | 4 - .../heroicons/optimized/20/solid/rss.svg | 4 - .../heroicons/optimized/20/solid/scale.svg | 3 - .../heroicons/optimized/20/solid/scissors.svg | 4 - .../optimized/20/solid/server-stack.svg | 4 - .../heroicons/optimized/20/solid/server.svg | 4 - .../heroicons/optimized/20/solid/share.svg | 3 - .../optimized/20/solid/shield-check.svg | 3 - .../optimized/20/solid/shield-exclamation.svg | 3 - .../optimized/20/solid/shopping-bag.svg | 3 - .../optimized/20/solid/shopping-cart.svg | 3 - .../optimized/20/solid/signal-slash.svg | 3 - .../heroicons/optimized/20/solid/signal.svg | 4 - .../heroicons/optimized/20/solid/sparkles.svg | 3 - .../optimized/20/solid/speaker-wave.svg | 4 - .../optimized/20/solid/speaker-x-mark.svg | 3 - .../optimized/20/solid/square-2-stack.svg | 4 - .../optimized/20/solid/square-3-stack-3d.svg | 5 - .../optimized/20/solid/squares-2x2.svg | 3 - .../optimized/20/solid/squares-plus.svg | 3 - .../heroicons/optimized/20/solid/star.svg | 3 - .../optimized/20/solid/stop-circle.svg | 3 - .../heroicons/optimized/20/solid/stop.svg | 3 - .../heroicons/optimized/20/solid/sun.svg | 3 - .../heroicons/optimized/20/solid/swatch.svg | 3 - .../optimized/20/solid/table-cells.svg | 3 - .../heroicons/optimized/20/solid/tag.svg | 3 - .../heroicons/optimized/20/solid/ticket.svg | 3 - .../heroicons/optimized/20/solid/trash.svg | 3 - .../heroicons/optimized/20/solid/trophy.svg | 3 - .../heroicons/optimized/20/solid/truck.svg | 4 - .../heroicons/optimized/20/solid/tv.svg | 4 - .../optimized/20/solid/user-circle.svg | 3 - .../optimized/20/solid/user-group.svg | 3 - .../optimized/20/solid/user-minus.svg | 3 - .../optimized/20/solid/user-plus.svg | 3 - .../heroicons/optimized/20/solid/user.svg | 3 - .../heroicons/optimized/20/solid/users.svg | 3 - .../heroicons/optimized/20/solid/variable.svg | 3 - .../optimized/20/solid/video-camera-slash.svg | 3 - .../optimized/20/solid/video-camera.svg | 3 - .../optimized/20/solid/view-columns.svg | 3 - .../optimized/20/solid/viewfinder-circle.svg | 3 - .../heroicons/optimized/20/solid/wallet.svg | 3 - .../heroicons/optimized/20/solid/wifi.svg | 3 - .../heroicons/optimized/20/solid/window.svg | 3 - .../optimized/20/solid/wrench-screwdriver.svg | 4 - .../heroicons/optimized/20/solid/wrench.svg | 3 - .../heroicons/optimized/20/solid/x-circle.svg | 3 - .../heroicons/optimized/20/solid/x-mark.svg | 3 - .../optimized/24/outline/academic-cap.svg | 3 - .../24/outline/adjustments-horizontal.svg | 3 - .../24/outline/adjustments-vertical.svg | 3 - .../24/outline/archive-box-arrow-down.svg | 3 - .../24/outline/archive-box-x-mark.svg | 3 - .../optimized/24/outline/archive-box.svg | 3 - .../24/outline/arrow-down-circle.svg | 3 - .../optimized/24/outline/arrow-down-left.svg | 3 - .../24/outline/arrow-down-on-square-stack.svg | 3 - .../24/outline/arrow-down-on-square.svg | 3 - .../optimized/24/outline/arrow-down-right.svg | 3 - .../optimized/24/outline/arrow-down-tray.svg | 3 - .../optimized/24/outline/arrow-down.svg | 3 - .../24/outline/arrow-left-circle.svg | 3 - .../24/outline/arrow-left-on-rectangle.svg | 3 - .../optimized/24/outline/arrow-left.svg | 3 - .../optimized/24/outline/arrow-long-down.svg | 3 - .../optimized/24/outline/arrow-long-left.svg | 3 - .../optimized/24/outline/arrow-long-right.svg | 3 - .../optimized/24/outline/arrow-long-up.svg | 3 - .../24/outline/arrow-path-rounded-square.svg | 3 - .../optimized/24/outline/arrow-path.svg | 3 - .../24/outline/arrow-right-circle.svg | 3 - .../24/outline/arrow-right-on-rectangle.svg | 3 - .../optimized/24/outline/arrow-right.svg | 3 - .../optimized/24/outline/arrow-small-down.svg | 3 - .../optimized/24/outline/arrow-small-left.svg | 3 - .../24/outline/arrow-small-right.svg | 3 - .../optimized/24/outline/arrow-small-up.svg | 3 - .../24/outline/arrow-top-right-on-square.svg | 3 - .../24/outline/arrow-trending-down.svg | 3 - .../24/outline/arrow-trending-up.svg | 3 - .../optimized/24/outline/arrow-up-circle.svg | 3 - .../optimized/24/outline/arrow-up-left.svg | 3 - .../24/outline/arrow-up-on-square-stack.svg | 3 - .../24/outline/arrow-up-on-square.svg | 3 - .../optimized/24/outline/arrow-up-right.svg | 3 - .../optimized/24/outline/arrow-up-tray.svg | 3 - .../optimized/24/outline/arrow-up.svg | 3 - .../optimized/24/outline/arrow-uturn-down.svg | 3 - .../optimized/24/outline/arrow-uturn-left.svg | 3 - .../24/outline/arrow-uturn-right.svg | 3 - .../optimized/24/outline/arrow-uturn-up.svg | 3 - .../24/outline/arrows-pointing-in.svg | 3 - .../24/outline/arrows-pointing-out.svg | 3 - .../24/outline/arrows-right-left.svg | 3 - .../optimized/24/outline/arrows-up-down.svg | 3 - .../optimized/24/outline/at-symbol.svg | 3 - .../optimized/24/outline/backspace.svg | 3 - .../optimized/24/outline/backward.svg | 3 - .../optimized/24/outline/banknotes.svg | 3 - .../heroicons/optimized/24/outline/bars-2.svg | 3 - .../24/outline/bars-3-bottom-left.svg | 3 - .../24/outline/bars-3-bottom-right.svg | 3 - .../24/outline/bars-3-center-left.svg | 3 - .../heroicons/optimized/24/outline/bars-3.svg | 3 - .../heroicons/optimized/24/outline/bars-4.svg | 3 - .../optimized/24/outline/bars-arrow-down.svg | 3 - .../optimized/24/outline/bars-arrow-up.svg | 3 - .../optimized/24/outline/battery-0.svg | 3 - .../optimized/24/outline/battery-100.svg | 3 - .../optimized/24/outline/battery-50.svg | 3 - .../heroicons/optimized/24/outline/beaker.svg | 3 - .../optimized/24/outline/bell-alert.svg | 3 - .../optimized/24/outline/bell-slash.svg | 3 - .../optimized/24/outline/bell-snooze.svg | 3 - .../heroicons/optimized/24/outline/bell.svg | 3 - .../optimized/24/outline/bolt-slash.svg | 3 - .../heroicons/optimized/24/outline/bolt.svg | 3 - .../optimized/24/outline/book-open.svg | 3 - .../optimized/24/outline/bookmark-slash.svg | 3 - .../optimized/24/outline/bookmark-square.svg | 3 - .../optimized/24/outline/bookmark.svg | 3 - .../optimized/24/outline/briefcase.svg | 3 - .../optimized/24/outline/bug-ant.svg | 3 - .../optimized/24/outline/building-library.svg | 3 - .../24/outline/building-office-2.svg | 3 - .../optimized/24/outline/building-office.svg | 3 - .../24/outline/building-storefront.svg | 3 - .../heroicons/optimized/24/outline/cake.svg | 3 - .../optimized/24/outline/calculator.svg | 3 - .../optimized/24/outline/calendar-days.svg | 3 - .../optimized/24/outline/calendar.svg | 3 - .../heroicons/optimized/24/outline/camera.svg | 4 - .../optimized/24/outline/chart-bar-square.svg | 3 - .../optimized/24/outline/chart-bar.svg | 3 - .../optimized/24/outline/chart-pie.svg | 4 - .../chat-bubble-bottom-center-text.svg | 3 - .../24/outline/chat-bubble-bottom-center.svg | 3 - .../24/outline/chat-bubble-left-ellipsis.svg | 3 - .../24/outline/chat-bubble-left-right.svg | 3 - .../optimized/24/outline/chat-bubble-left.svg | 3 - .../chat-bubble-oval-left-ellipsis.svg | 3 - .../24/outline/chat-bubble-oval-left.svg | 3 - .../optimized/24/outline/check-badge.svg | 3 - .../optimized/24/outline/check-circle.svg | 3 - .../heroicons/optimized/24/outline/check.svg | 3 - .../24/outline/chevron-double-down.svg | 3 - .../24/outline/chevron-double-left.svg | 3 - .../24/outline/chevron-double-right.svg | 3 - .../24/outline/chevron-double-up.svg | 3 - .../optimized/24/outline/chevron-down.svg | 3 - .../optimized/24/outline/chevron-left.svg | 3 - .../optimized/24/outline/chevron-right.svg | 3 - .../optimized/24/outline/chevron-up-down.svg | 3 - .../optimized/24/outline/chevron-up.svg | 3 - .../optimized/24/outline/circle-stack.svg | 3 - .../24/outline/clipboard-document-check.svg | 3 - .../24/outline/clipboard-document-list.svg | 3 - .../24/outline/clipboard-document.svg | 3 - .../optimized/24/outline/clipboard.svg | 3 - .../heroicons/optimized/24/outline/clock.svg | 3 - .../optimized/24/outline/cloud-arrow-down.svg | 3 - .../optimized/24/outline/cloud-arrow-up.svg | 3 - .../heroicons/optimized/24/outline/cloud.svg | 3 - .../24/outline/code-bracket-square.svg | 3 - .../optimized/24/outline/code-bracket.svg | 3 - .../optimized/24/outline/cog-6-tooth.svg | 4 - .../optimized/24/outline/cog-8-tooth.svg | 4 - .../heroicons/optimized/24/outline/cog.svg | 3 - .../optimized/24/outline/command-line.svg | 3 - .../optimized/24/outline/computer-desktop.svg | 3 - .../optimized/24/outline/cpu-chip.svg | 3 - .../optimized/24/outline/credit-card.svg | 3 - .../optimized/24/outline/cube-transparent.svg | 3 - .../heroicons/optimized/24/outline/cube.svg | 3 - .../24/outline/currency-bangladeshi.svg | 3 - .../optimized/24/outline/currency-dollar.svg | 3 - .../optimized/24/outline/currency-euro.svg | 3 - .../optimized/24/outline/currency-pound.svg | 3 - .../optimized/24/outline/currency-rupee.svg | 3 - .../optimized/24/outline/currency-yen.svg | 3 - .../24/outline/cursor-arrow-rays.svg | 3 - .../24/outline/cursor-arrow-ripple.svg | 3 - .../24/outline/device-phone-mobile.svg | 3 - .../optimized/24/outline/device-tablet.svg | 3 - .../24/outline/document-arrow-down.svg | 3 - .../24/outline/document-arrow-up.svg | 3 - .../24/outline/document-chart-bar.svg | 3 - .../optimized/24/outline/document-check.svg | 3 - .../24/outline/document-duplicate.svg | 3 - .../24/outline/document-magnifying-glass.svg | 3 - .../optimized/24/outline/document-minus.svg | 3 - .../optimized/24/outline/document-plus.svg | 3 - .../optimized/24/outline/document-text.svg | 3 - .../optimized/24/outline/document.svg | 3 - .../24/outline/ellipsis-horizontal-circle.svg | 3 - .../24/outline/ellipsis-horizontal.svg | 3 - .../24/outline/ellipsis-vertical.svg | 3 - .../optimized/24/outline/envelope-open.svg | 3 - .../optimized/24/outline/envelope.svg | 3 - .../24/outline/exclamation-circle.svg | 3 - .../24/outline/exclamation-triangle.svg | 3 - .../optimized/24/outline/eye-dropper.svg | 3 - .../optimized/24/outline/eye-slash.svg | 3 - .../heroicons/optimized/24/outline/eye.svg | 4 - .../optimized/24/outline/face-frown.svg | 3 - .../optimized/24/outline/face-smile.svg | 3 - .../heroicons/optimized/24/outline/film.svg | 3 - .../optimized/24/outline/finger-print.svg | 3 - .../heroicons/optimized/24/outline/fire.svg | 4 - .../heroicons/optimized/24/outline/flag.svg | 3 - .../24/outline/folder-arrow-down.svg | 3 - .../optimized/24/outline/folder-minus.svg | 3 - .../optimized/24/outline/folder-open.svg | 3 - .../optimized/24/outline/folder-plus.svg | 3 - .../heroicons/optimized/24/outline/folder.svg | 3 - .../optimized/24/outline/forward.svg | 3 - .../heroicons/optimized/24/outline/funnel.svg | 3 - .../heroicons/optimized/24/outline/gif.svg | 3 - .../optimized/24/outline/gift-top.svg | 3 - .../heroicons/optimized/24/outline/gift.svg | 3 - .../optimized/24/outline/globe-alt.svg | 3 - .../optimized/24/outline/globe-americas.svg | 3 - .../24/outline/globe-asia-australia.svg | 3 - .../24/outline/globe-europe-africa.svg | 3 - .../optimized/24/outline/hand-raised.svg | 3 - .../optimized/24/outline/hand-thumb-down.svg | 3 - .../optimized/24/outline/hand-thumb-up.svg | 3 - .../optimized/24/outline/hashtag.svg | 3 - .../heroicons/optimized/24/outline/heart.svg | 3 - .../optimized/24/outline/home-modern.svg | 3 - .../heroicons/optimized/24/outline/home.svg | 3 - .../optimized/24/outline/identification.svg | 3 - .../optimized/24/outline/inbox-arrow-down.svg | 3 - .../optimized/24/outline/inbox-stack.svg | 3 - .../heroicons/optimized/24/outline/inbox.svg | 3 - .../24/outline/information-circle.svg | 3 - .../heroicons/optimized/24/outline/key.svg | 3 - .../optimized/24/outline/language.svg | 3 - .../optimized/24/outline/lifebuoy.svg | 3 - .../optimized/24/outline/light-bulb.svg | 3 - .../heroicons/optimized/24/outline/link.svg | 3 - .../optimized/24/outline/list-bullet.svg | 3 - .../optimized/24/outline/lock-closed.svg | 3 - .../optimized/24/outline/lock-open.svg | 3 - .../24/outline/magnifying-glass-circle.svg | 3 - .../24/outline/magnifying-glass-minus.svg | 3 - .../24/outline/magnifying-glass-plus.svg | 3 - .../optimized/24/outline/magnifying-glass.svg | 3 - .../optimized/24/outline/map-pin.svg | 4 - .../heroicons/optimized/24/outline/map.svg | 3 - .../optimized/24/outline/megaphone.svg | 3 - .../optimized/24/outline/microphone.svg | 3 - .../optimized/24/outline/minus-circle.svg | 3 - .../optimized/24/outline/minus-small.svg | 3 - .../heroicons/optimized/24/outline/minus.svg | 3 - .../heroicons/optimized/24/outline/moon.svg | 3 - .../optimized/24/outline/musical-note.svg | 3 - .../optimized/24/outline/newspaper.svg | 3 - .../optimized/24/outline/no-symbol.svg | 3 - .../optimized/24/outline/paint-brush.svg | 3 - .../optimized/24/outline/paper-airplane.svg | 3 - .../optimized/24/outline/paper-clip.svg | 3 - .../optimized/24/outline/pause-circle.svg | 3 - .../heroicons/optimized/24/outline/pause.svg | 3 - .../optimized/24/outline/pencil-square.svg | 3 - .../heroicons/optimized/24/outline/pencil.svg | 3 - .../24/outline/phone-arrow-down-left.svg | 3 - .../24/outline/phone-arrow-up-right.svg | 3 - .../optimized/24/outline/phone-x-mark.svg | 3 - .../heroicons/optimized/24/outline/phone.svg | 3 - .../heroicons/optimized/24/outline/photo.svg | 3 - .../optimized/24/outline/play-circle.svg | 4 - .../optimized/24/outline/play-pause.svg | 3 - .../heroicons/optimized/24/outline/play.svg | 3 - .../optimized/24/outline/plus-circle.svg | 3 - .../optimized/24/outline/plus-small.svg | 3 - .../heroicons/optimized/24/outline/plus.svg | 3 - .../heroicons/optimized/24/outline/power.svg | 3 - .../24/outline/presentation-chart-bar.svg | 3 - .../24/outline/presentation-chart-line.svg | 3 - .../optimized/24/outline/printer.svg | 3 - .../optimized/24/outline/puzzle-piece.svg | 3 - .../optimized/24/outline/qr-code.svg | 4 - .../24/outline/question-mark-circle.svg | 3 - .../optimized/24/outline/queue-list.svg | 3 - .../heroicons/optimized/24/outline/radio.svg | 3 - .../optimized/24/outline/receipt-percent.svg | 3 - .../optimized/24/outline/receipt-refund.svg | 3 - .../optimized/24/outline/rectangle-group.svg | 3 - .../optimized/24/outline/rectangle-stack.svg | 3 - .../optimized/24/outline/rocket-launch.svg | 3 - .../heroicons/optimized/24/outline/rss.svg | 3 - .../heroicons/optimized/24/outline/scale.svg | 3 - .../optimized/24/outline/scissors.svg | 3 - .../optimized/24/outline/server-stack.svg | 3 - .../heroicons/optimized/24/outline/server.svg | 3 - .../heroicons/optimized/24/outline/share.svg | 3 - .../optimized/24/outline/shield-check.svg | 3 - .../24/outline/shield-exclamation.svg | 3 - .../optimized/24/outline/shopping-bag.svg | 3 - .../optimized/24/outline/shopping-cart.svg | 3 - .../optimized/24/outline/signal-slash.svg | 3 - .../heroicons/optimized/24/outline/signal.svg | 3 - .../optimized/24/outline/sparkles.svg | 3 - .../optimized/24/outline/speaker-wave.svg | 3 - .../optimized/24/outline/speaker-x-mark.svg | 3 - .../optimized/24/outline/square-2-stack.svg | 3 - .../24/outline/square-3-stack-3d.svg | 3 - .../optimized/24/outline/squares-2x2.svg | 3 - .../optimized/24/outline/squares-plus.svg | 3 - .../heroicons/optimized/24/outline/star.svg | 3 - .../optimized/24/outline/stop-circle.svg | 4 - .../heroicons/optimized/24/outline/stop.svg | 3 - .../heroicons/optimized/24/outline/sun.svg | 3 - .../heroicons/optimized/24/outline/swatch.svg | 3 - .../optimized/24/outline/table-cells.svg | 3 - .../heroicons/optimized/24/outline/tag.svg | 4 - .../heroicons/optimized/24/outline/ticket.svg | 3 - .../heroicons/optimized/24/outline/trash.svg | 3 - .../heroicons/optimized/24/outline/trophy.svg | 3 - .../heroicons/optimized/24/outline/truck.svg | 3 - .../heroicons/optimized/24/outline/tv.svg | 3 - .../optimized/24/outline/user-circle.svg | 3 - .../optimized/24/outline/user-group.svg | 3 - .../optimized/24/outline/user-minus.svg | 3 - .../optimized/24/outline/user-plus.svg | 3 - .../heroicons/optimized/24/outline/user.svg | 3 - .../heroicons/optimized/24/outline/users.svg | 3 - .../optimized/24/outline/variable.svg | 3 - .../24/outline/video-camera-slash.svg | 3 - .../optimized/24/outline/video-camera.svg | 3 - .../optimized/24/outline/view-columns.svg | 3 - .../24/outline/viewfinder-circle.svg | 3 - .../heroicons/optimized/24/outline/wallet.svg | 3 - .../heroicons/optimized/24/outline/wifi.svg | 3 - .../heroicons/optimized/24/outline/window.svg | 3 - .../24/outline/wrench-screwdriver.svg | 3 - .../heroicons/optimized/24/outline/wrench.svg | 4 - .../optimized/24/outline/x-circle.svg | 3 - .../heroicons/optimized/24/outline/x-mark.svg | 3 - .../optimized/24/solid/academic-cap.svg | 5 - .../24/solid/adjustments-horizontal.svg | 3 - .../24/solid/adjustments-vertical.svg | 3 - .../24/solid/archive-box-arrow-down.svg | 4 - .../optimized/24/solid/archive-box-x-mark.svg | 4 - .../optimized/24/solid/archive-box.svg | 4 - .../optimized/24/solid/arrow-down-circle.svg | 3 - .../optimized/24/solid/arrow-down-left.svg | 3 - .../24/solid/arrow-down-on-square-stack.svg | 4 - .../24/solid/arrow-down-on-square.svg | 3 - .../optimized/24/solid/arrow-down-right.svg | 3 - .../optimized/24/solid/arrow-down-tray.svg | 3 - .../optimized/24/solid/arrow-down.svg | 3 - .../optimized/24/solid/arrow-left-circle.svg | 3 - .../24/solid/arrow-left-on-rectangle.svg | 3 - .../optimized/24/solid/arrow-left.svg | 3 - .../optimized/24/solid/arrow-long-down.svg | 3 - .../optimized/24/solid/arrow-long-left.svg | 3 - .../optimized/24/solid/arrow-long-right.svg | 3 - .../optimized/24/solid/arrow-long-up.svg | 3 - .../24/solid/arrow-path-rounded-square.svg | 3 - .../optimized/24/solid/arrow-path.svg | 3 - .../optimized/24/solid/arrow-right-circle.svg | 3 - .../24/solid/arrow-right-on-rectangle.svg | 3 - .../optimized/24/solid/arrow-right.svg | 3 - .../optimized/24/solid/arrow-small-down.svg | 3 - .../optimized/24/solid/arrow-small-left.svg | 3 - .../optimized/24/solid/arrow-small-right.svg | 3 - .../optimized/24/solid/arrow-small-up.svg | 3 - .../24/solid/arrow-top-right-on-square.svg | 3 - .../24/solid/arrow-trending-down.svg | 3 - .../optimized/24/solid/arrow-trending-up.svg | 3 - .../optimized/24/solid/arrow-up-circle.svg | 3 - .../optimized/24/solid/arrow-up-left.svg | 3 - .../24/solid/arrow-up-on-square-stack.svg | 4 - .../optimized/24/solid/arrow-up-on-square.svg | 3 - .../optimized/24/solid/arrow-up-right.svg | 3 - .../optimized/24/solid/arrow-up-tray.svg | 3 - .../heroicons/optimized/24/solid/arrow-up.svg | 3 - .../optimized/24/solid/arrow-uturn-down.svg | 3 - .../optimized/24/solid/arrow-uturn-left.svg | 3 - .../optimized/24/solid/arrow-uturn-right.svg | 3 - .../optimized/24/solid/arrow-uturn-up.svg | 3 - .../optimized/24/solid/arrows-pointing-in.svg | 3 - .../24/solid/arrows-pointing-out.svg | 3 - .../optimized/24/solid/arrows-right-left.svg | 3 - .../optimized/24/solid/arrows-up-down.svg | 3 - .../optimized/24/solid/at-symbol.svg | 3 - .../optimized/24/solid/backspace.svg | 3 - .../heroicons/optimized/24/solid/backward.svg | 3 - .../optimized/24/solid/banknotes.svg | 5 - .../heroicons/optimized/24/solid/bars-2.svg | 3 - .../optimized/24/solid/bars-3-bottom-left.svg | 3 - .../24/solid/bars-3-bottom-right.svg | 3 - .../optimized/24/solid/bars-3-center-left.svg | 3 - .../heroicons/optimized/24/solid/bars-3.svg | 3 - .../heroicons/optimized/24/solid/bars-4.svg | 3 - .../optimized/24/solid/bars-arrow-down.svg | 3 - .../optimized/24/solid/bars-arrow-up.svg | 3 - .../optimized/24/solid/battery-0.svg | 3 - .../optimized/24/solid/battery-100.svg | 3 - .../optimized/24/solid/battery-50.svg | 4 - .../heroicons/optimized/24/solid/beaker.svg | 3 - .../optimized/24/solid/bell-alert.svg | 4 - .../optimized/24/solid/bell-slash.svg | 4 - .../optimized/24/solid/bell-snooze.svg | 3 - .../heroicons/optimized/24/solid/bell.svg | 3 - .../optimized/24/solid/bolt-slash.svg | 3 - .../heroicons/optimized/24/solid/bolt.svg | 3 - .../optimized/24/solid/book-open.svg | 3 - .../optimized/24/solid/bookmark-slash.svg | 3 - .../optimized/24/solid/bookmark-square.svg | 3 - .../heroicons/optimized/24/solid/bookmark.svg | 3 - .../optimized/24/solid/briefcase.svg | 4 - .../heroicons/optimized/24/solid/bug-ant.svg | 3 - .../optimized/24/solid/building-library.svg | 5 - .../optimized/24/solid/building-office-2.svg | 3 - .../optimized/24/solid/building-office.svg | 3 - .../24/solid/building-storefront.svg | 4 - .../heroicons/optimized/24/solid/cake.svg | 3 - .../optimized/24/solid/calculator.svg | 3 - .../optimized/24/solid/calendar-days.svg | 4 - .../heroicons/optimized/24/solid/calendar.svg | 3 - .../heroicons/optimized/24/solid/camera.svg | 4 - .../optimized/24/solid/chart-bar-square.svg | 3 - .../optimized/24/solid/chart-bar.svg | 3 - .../optimized/24/solid/chart-pie.svg | 4 - .../solid/chat-bubble-bottom-center-text.svg | 3 - .../24/solid/chat-bubble-bottom-center.svg | 3 - .../24/solid/chat-bubble-left-ellipsis.svg | 3 - .../24/solid/chat-bubble-left-right.svg | 4 - .../optimized/24/solid/chat-bubble-left.svg | 3 - .../solid/chat-bubble-oval-left-ellipsis.svg | 3 - .../24/solid/chat-bubble-oval-left.svg | 3 - .../optimized/24/solid/check-badge.svg | 3 - .../optimized/24/solid/check-circle.svg | 3 - .../heroicons/optimized/24/solid/check.svg | 3 - .../24/solid/chevron-double-down.svg | 3 - .../24/solid/chevron-double-left.svg | 3 - .../24/solid/chevron-double-right.svg | 3 - .../optimized/24/solid/chevron-double-up.svg | 3 - .../optimized/24/solid/chevron-down.svg | 3 - .../optimized/24/solid/chevron-left.svg | 3 - .../optimized/24/solid/chevron-right.svg | 3 - .../optimized/24/solid/chevron-up-down.svg | 3 - .../optimized/24/solid/chevron-up.svg | 3 - .../optimized/24/solid/circle-stack.svg | 6 - .../24/solid/clipboard-document-check.svg | 4 - .../24/solid/clipboard-document-list.svg | 4 - .../optimized/24/solid/clipboard-document.svg | 5 - .../optimized/24/solid/clipboard.svg | 3 - .../heroicons/optimized/24/solid/clock.svg | 3 - .../optimized/24/solid/cloud-arrow-down.svg | 3 - .../optimized/24/solid/cloud-arrow-up.svg | 3 - .../heroicons/optimized/24/solid/cloud.svg | 3 - .../24/solid/code-bracket-square.svg | 3 - .../optimized/24/solid/code-bracket.svg | 3 - .../optimized/24/solid/cog-6-tooth.svg | 3 - .../optimized/24/solid/cog-8-tooth.svg | 3 - .../heroicons/optimized/24/solid/cog.svg | 4 - .../optimized/24/solid/command-line.svg | 3 - .../optimized/24/solid/computer-desktop.svg | 3 - .../heroicons/optimized/24/solid/cpu-chip.svg | 4 - .../optimized/24/solid/credit-card.svg | 4 - .../optimized/24/solid/cube-transparent.svg | 3 - .../heroicons/optimized/24/solid/cube.svg | 3 - .../24/solid/currency-bangladeshi.svg | 3 - .../optimized/24/solid/currency-dollar.svg | 4 - .../optimized/24/solid/currency-euro.svg | 3 - .../optimized/24/solid/currency-pound.svg | 3 - .../optimized/24/solid/currency-rupee.svg | 3 - .../optimized/24/solid/currency-yen.svg | 3 - .../optimized/24/solid/cursor-arrow-rays.svg | 3 - .../24/solid/cursor-arrow-ripple.svg | 3 - .../24/solid/device-phone-mobile.svg | 4 - .../optimized/24/solid/device-tablet.svg | 4 - .../24/solid/document-arrow-down.svg | 4 - .../optimized/24/solid/document-arrow-up.svg | 4 - .../optimized/24/solid/document-chart-bar.svg | 4 - .../optimized/24/solid/document-check.svg | 4 - .../optimized/24/solid/document-duplicate.svg | 4 - .../24/solid/document-magnifying-glass.svg | 5 - .../optimized/24/solid/document-minus.svg | 4 - .../optimized/24/solid/document-plus.svg | 4 - .../optimized/24/solid/document-text.svg | 4 - .../heroicons/optimized/24/solid/document.svg | 4 - .../24/solid/ellipsis-horizontal-circle.svg | 3 - .../24/solid/ellipsis-horizontal.svg | 3 - .../optimized/24/solid/ellipsis-vertical.svg | 3 - .../optimized/24/solid/envelope-open.svg | 4 - .../heroicons/optimized/24/solid/envelope.svg | 4 - .../optimized/24/solid/exclamation-circle.svg | 3 - .../24/solid/exclamation-triangle.svg | 3 - .../optimized/24/solid/eye-dropper.svg | 3 - .../optimized/24/solid/eye-slash.svg | 5 - .../heroicons/optimized/24/solid/eye.svg | 4 - .../optimized/24/solid/face-frown.svg | 3 - .../optimized/24/solid/face-smile.svg | 3 - .../heroicons/optimized/24/solid/film.svg | 3 - .../optimized/24/solid/finger-print.svg | 3 - .../heroicons/optimized/24/solid/fire.svg | 3 - .../heroicons/optimized/24/solid/flag.svg | 3 - .../optimized/24/solid/folder-arrow-down.svg | 3 - .../optimized/24/solid/folder-minus.svg | 3 - .../optimized/24/solid/folder-open.svg | 3 - .../optimized/24/solid/folder-plus.svg | 3 - .../heroicons/optimized/24/solid/folder.svg | 3 - .../heroicons/optimized/24/solid/forward.svg | 3 - .../heroicons/optimized/24/solid/funnel.svg | 3 - .../heroicons/optimized/24/solid/gif.svg | 3 - .../heroicons/optimized/24/solid/gift-top.svg | 4 - .../heroicons/optimized/24/solid/gift.svg | 3 - .../optimized/24/solid/globe-alt.svg | 3 - .../optimized/24/solid/globe-americas.svg | 3 - .../24/solid/globe-asia-australia.svg | 4 - .../24/solid/globe-europe-africa.svg | 3 - .../optimized/24/solid/hand-raised.svg | 3 - .../optimized/24/solid/hand-thumb-down.svg | 3 - .../optimized/24/solid/hand-thumb-up.svg | 3 - .../heroicons/optimized/24/solid/hashtag.svg | 3 - .../heroicons/optimized/24/solid/heart.svg | 3 - .../optimized/24/solid/home-modern.svg | 4 - .../heroicons/optimized/24/solid/home.svg | 4 - .../optimized/24/solid/identification.svg | 3 - .../optimized/24/solid/inbox-arrow-down.svg | 4 - .../optimized/24/solid/inbox-stack.svg | 4 - .../heroicons/optimized/24/solid/inbox.svg | 3 - .../optimized/24/solid/information-circle.svg | 3 - .../heroicons/optimized/24/solid/key.svg | 3 - .../heroicons/optimized/24/solid/language.svg | 3 - .../heroicons/optimized/24/solid/lifebuoy.svg | 3 - .../optimized/24/solid/light-bulb.svg | 4 - .../heroicons/optimized/24/solid/link.svg | 3 - .../optimized/24/solid/list-bullet.svg | 3 - .../optimized/24/solid/lock-closed.svg | 3 - .../optimized/24/solid/lock-open.svg | 3 - .../24/solid/magnifying-glass-circle.svg | 4 - .../24/solid/magnifying-glass-minus.svg | 3 - .../24/solid/magnifying-glass-plus.svg | 3 - .../optimized/24/solid/magnifying-glass.svg | 3 - .../heroicons/optimized/24/solid/map-pin.svg | 3 - .../heroicons/optimized/24/solid/map.svg | 3 - .../optimized/24/solid/megaphone.svg | 3 - .../optimized/24/solid/microphone.svg | 4 - .../optimized/24/solid/minus-circle.svg | 3 - .../optimized/24/solid/minus-small.svg | 3 - .../heroicons/optimized/24/solid/minus.svg | 3 - .../heroicons/optimized/24/solid/moon.svg | 3 - .../optimized/24/solid/musical-note.svg | 3 - .../optimized/24/solid/newspaper.svg | 4 - .../optimized/24/solid/no-symbol.svg | 3 - .../optimized/24/solid/paint-brush.svg | 3 - .../optimized/24/solid/paper-airplane.svg | 3 - .../optimized/24/solid/paper-clip.svg | 3 - .../optimized/24/solid/pause-circle.svg | 3 - .../heroicons/optimized/24/solid/pause.svg | 3 - .../optimized/24/solid/pencil-square.svg | 4 - .../heroicons/optimized/24/solid/pencil.svg | 3 - .../24/solid/phone-arrow-down-left.svg | 4 - .../24/solid/phone-arrow-up-right.svg | 4 - .../optimized/24/solid/phone-x-mark.svg | 3 - .../heroicons/optimized/24/solid/phone.svg | 3 - .../heroicons/optimized/24/solid/photo.svg | 3 - .../optimized/24/solid/play-circle.svg | 3 - .../optimized/24/solid/play-pause.svg | 3 - .../heroicons/optimized/24/solid/play.svg | 3 - .../optimized/24/solid/plus-circle.svg | 3 - .../optimized/24/solid/plus-small.svg | 3 - .../heroicons/optimized/24/solid/plus.svg | 3 - .../heroicons/optimized/24/solid/power.svg | 3 - .../24/solid/presentation-chart-bar.svg | 3 - .../24/solid/presentation-chart-line.svg | 3 - .../heroicons/optimized/24/solid/printer.svg | 3 - .../optimized/24/solid/puzzle-piece.svg | 3 - .../heroicons/optimized/24/solid/qr-code.svg | 3 - .../24/solid/question-mark-circle.svg | 3 - .../optimized/24/solid/queue-list.svg | 3 - .../heroicons/optimized/24/solid/radio.svg | 3 - .../optimized/24/solid/receipt-percent.svg | 3 - .../optimized/24/solid/receipt-refund.svg | 3 - .../optimized/24/solid/rectangle-group.svg | 3 - .../optimized/24/solid/rectangle-stack.svg | 3 - .../optimized/24/solid/rocket-launch.svg | 4 - .../heroicons/optimized/24/solid/rss.svg | 3 - .../heroicons/optimized/24/solid/scale.svg | 3 - .../heroicons/optimized/24/solid/scissors.svg | 4 - .../optimized/24/solid/server-stack.svg | 4 - .../heroicons/optimized/24/solid/server.svg | 4 - .../heroicons/optimized/24/solid/share.svg | 3 - .../optimized/24/solid/shield-check.svg | 3 - .../optimized/24/solid/shield-exclamation.svg | 3 - .../optimized/24/solid/shopping-bag.svg | 3 - .../optimized/24/solid/shopping-cart.svg | 3 - .../optimized/24/solid/signal-slash.svg | 3 - .../heroicons/optimized/24/solid/signal.svg | 3 - .../heroicons/optimized/24/solid/sparkles.svg | 3 - .../optimized/24/solid/speaker-wave.svg | 4 - .../optimized/24/solid/speaker-x-mark.svg | 3 - .../optimized/24/solid/square-2-stack.svg | 4 - .../optimized/24/solid/square-3-stack-3d.svg | 5 - .../optimized/24/solid/squares-2x2.svg | 3 - .../optimized/24/solid/squares-plus.svg | 3 - .../heroicons/optimized/24/solid/star.svg | 3 - .../optimized/24/solid/stop-circle.svg | 3 - .../heroicons/optimized/24/solid/stop.svg | 3 - .../heroicons/optimized/24/solid/sun.svg | 3 - .../heroicons/optimized/24/solid/swatch.svg | 4 - .../optimized/24/solid/table-cells.svg | 3 - .../heroicons/optimized/24/solid/tag.svg | 3 - .../heroicons/optimized/24/solid/ticket.svg | 3 - .../heroicons/optimized/24/solid/trash.svg | 3 - .../heroicons/optimized/24/solid/trophy.svg | 3 - .../heroicons/optimized/24/solid/truck.svg | 5 - .../heroicons/optimized/24/solid/tv.svg | 4 - .../optimized/24/solid/user-circle.svg | 3 - .../optimized/24/solid/user-group.svg | 4 - .../optimized/24/solid/user-minus.svg | 3 - .../optimized/24/solid/user-plus.svg | 3 - .../heroicons/optimized/24/solid/user.svg | 3 - .../heroicons/optimized/24/solid/users.svg | 3 - .../heroicons/optimized/24/solid/variable.svg | 3 - .../optimized/24/solid/video-camera-slash.svg | 3 - .../optimized/24/solid/video-camera.svg | 3 - .../optimized/24/solid/view-columns.svg | 3 - .../optimized/24/solid/viewfinder-circle.svg | 3 - .../heroicons/optimized/24/solid/wallet.svg | 3 - .../heroicons/optimized/24/solid/wifi.svg | 3 - .../heroicons/optimized/24/solid/window.svg | 3 - .../optimized/24/solid/wrench-screwdriver.svg | 5 - .../heroicons/optimized/24/solid/wrench.svg | 3 - .../heroicons/optimized/24/solid/x-circle.svg | 3 - .../heroicons/optimized/24/solid/x-mark.svg | 3 - assets/vendor/topbar.js | 165 -- config/config.exs | 71 - config/dev.exs | 77 - config/prod.exs | 15 - config/runtime.exs | 89 - config/test.exs | 29 - fly.toml | 20 +- lib/helldivers_2.ex | 9 - lib/helldivers_2/application.ex | 44 - lib/helldivers_2/macros/from_json.ex | 34 - lib/helldivers_2/models/news_feed.ex | 47 - lib/helldivers_2/models/news_feed/message.ex | 39 - lib/helldivers_2/models/war_info.ex | 70 - lib/helldivers_2/models/war_info/faction.ex | 15 - .../models/war_info/home_world.ex | 40 - lib/helldivers_2/models/war_info/planet.ex | 67 - lib/helldivers_2/models/war_info/sector.ex | 13 - lib/helldivers_2/models/war_status.ex | 131 -- .../models/war_status/campaign.ex | 31 - lib/helldivers_2/models/war_status/effect.ex | 14 - .../models/war_status/global_event.ex | 83 - .../models/war_status/joint_operation.ex | 28 - .../models/war_status/planet_event.ex | 69 - .../models/war_status/planet_status.ex | 57 - lib/helldivers_2/war_season.ex | 198 -- lib/helldivers_2/war_sync.ex | 79 - lib/helldivers_2_web.ex | 120 -- lib/helldivers_2_web/api_spec.ex | 44 - .../components/core_components.ex | 670 ------- lib/helldivers_2_web/components/layouts.ex | 5 - .../components/layouts/app.html.heex | 32 - .../components/layouts/root.html.heex | 17 - .../controllers/api/campaign_json.ex | 13 - .../api/global_events_controller.ex | 49 - .../controllers/api/global_events_json.ex | 27 - .../controllers/api/home_world_json.ex | 15 - .../controllers/api/joint_operations_json.ex | 12 - .../controllers/api/planets_controller.ex | 76 - .../controllers/api/planets_json.ex | 62 - .../controllers/api/war_season_controller.ex | 94 - .../controllers/api/war_season_json.ex | 60 - .../controllers/error_html.ex | 19 - .../controllers/error_json.ex | 15 - .../controllers/fallback_controller.ex | 32 - .../controllers/page_controller.ex | 9 - lib/helldivers_2_web/controllers/page_html.ex | 5 - .../controllers/page_html/home.html.heex | 222 --- lib/helldivers_2_web/endpoint.ex | 52 - lib/helldivers_2_web/plugs/rate_limit.ex | 72 - lib/helldivers_2_web/plugs/war_season.ex | 35 - lib/helldivers_2_web/router.ex | 71 - .../schemas/campaign_schema.ex | 28 - .../schemas/global_event_schema.ex | 78 - .../schemas/home_world_schema.ex | 24 - .../schemas/joint_operation_schema.ex | 24 - .../schemas/news_feed_message_schema.ex | 57 - .../schemas/not_found_schema.ex | 19 - .../schemas/planet_event_schema.ex | 48 - lib/helldivers_2_web/schemas/planet_schema.ex | 57 - .../schemas/planet_status_schema.ex | 34 - .../schemas/too_many_requests_schema.ex | 27 - .../schemas/war_info_schema.ex | 58 - .../schemas/war_season_overview.ex | 15 - .../schemas/war_status_schema.ex | 80 - lib/helldivers_2_web/telemetry.ex | 69 - mix.exs | 76 - mix.lock | 48 - priv/effects.json | 2 - priv/factions.json | 5 - priv/planets.json | 263 --- priv/sectors.json | 8 - priv/static/favicon.ico | Bin 152 -> 0 bytes priv/static/images/logo.svg | 6 - priv/static/robots.txt | 5 - rel/env.sh.eex | 14 - rel/overlays/bin/server | 5 - rel/overlays/bin/server.bat | 2 - .../Controllers/ArrowHeadController.cs | 79 + .../Controllers/V1/AssignmentsController.cs | 36 + .../Controllers/V1/CampaignsController.cs | 36 + .../Controllers/V1/DispatchController.cs | 36 + .../Controllers/V1/PlanetController.cs | 50 + .../Controllers/V1/SteamController.cs | 40 + .../Controllers/V1/WarController.cs | 22 + src/Helldivers-2-API/Dockerfile | 34 + src/Helldivers-2-API/Helldivers-2-API.csproj | 45 + .../Middlewares/RateLimitMiddleware.cs | 59 + .../OpenApi/ArrowHeadDocumentProcessor.cs | 49 + src/Helldivers-2-API/Program.cs | 197 ++ .../Properties/launchSettings.json | 15 + .../appsettings.Development.json | 20 + src/Helldivers-2-API/appsettings.json | 28 + .../wwwroot/Helldivers-2-API.json | 1624 +++++++++++++++++ .../wwwroot/Helldivers-2-API_arrowhead.json | 872 +++++++++ src/Helldivers-2-API/wwwroot/redoc.html | 3 + src/Helldivers-2-API/wwwroot/swagger-ui.html | 11 + .../Contracts/Collections/IStore.cs | 32 + src/Helldivers-2-Core/Contracts/IStore.cs | 24 + .../Extensions/ServiceCollectionExtensions.cs | 98 + .../Facades/ArrowHeadFacade.cs | 29 + src/Helldivers-2-Core/Facades/SteamFacade.cs | 22 + src/Helldivers-2-Core/Facades/V1Facade.cs | 83 + .../Helldivers-2-Core.csproj | 13 + .../Localization/CultureDictionary.cs | 36 + .../Mapping/Steam/SteamNewsMapper.cs | 25 + .../Mapping/V1/AssignmentMapper.cs | 74 + .../Mapping/V1/CampaignMapper.cs | 24 + .../Mapping/V1/DispatchMapper.cs | 49 + .../Mapping/V1/PlanetMapper.cs | 77 + .../Mapping/V1/StatisticsMapper.cs | 59 + src/Helldivers-2-Core/Mapping/V1/WarMapper.cs | 26 + .../Storage/ArrowHead/AssignmentStore.cs | 39 + .../Storage/ArrowHead/NewsFeedStore.cs | 39 + .../Storage/ArrowHead/WarIdStore.cs | 10 + .../Storage/ArrowHead/WarInfoStore.cs | 10 + .../Storage/ArrowHead/WarStatusStore.cs | 27 + .../Storage/ArrowHead/WarSummaryStore.cs | 10 + .../Storage/Steam/SteamNewsStore.cs | 12 + src/Helldivers-2-Core/Storage/StoreBase.cs | 73 + .../Storage/V1/AssignmentStore.cs | 12 + .../Storage/V1/CampaignStore.cs | 12 + .../Storage/V1/DispatchStore.cs | 12 + .../Storage/V1/PlanetStore.cs | 11 + src/Helldivers-2-Core/Storage/V1/WarStore.cs | 10 + src/Helldivers-2-Core/StorageFacade.cs | 27 + .../ArrowHead/Assignment.cs | 17 + .../ArrowHead/Assignments/Reward.cs | 13 + .../ArrowHead/Assignments/Setting.cs | 21 + .../ArrowHead/Assignments/Task.cs | 14 + .../ArrowHead/Info/HomeWorld.cs | 8 + .../ArrowHead/Info/PlanetCoordinates.cs | 8 + .../ArrowHead/Info/PlanetInfo.cs | 23 + .../ArrowHead/NewsFeedItem.cs | 15 + .../ArrowHead/Status/Campaign.cs | 15 + .../ArrowHead/Status/JointOperation.cs | 13 + .../ArrowHead/Status/PlanetAttack.cs | 13 + .../ArrowHead/Status/PlanetEvent.cs | 27 + .../ArrowHead/Status/PlanetStatus.cs | 19 + .../ArrowHead/Summary/GalaxyStats.cs | 35 + .../ArrowHead/Summary/PlanetStats.cs | 39 + src/Helldivers-2-Models/ArrowHead/WarId.cs | 6 + src/Helldivers-2-Models/ArrowHead/WarInfo.cs | 23 + .../ArrowHead/WarStatus.cs | 32 + .../ArrowHead/WarSummary.cs | 22 + .../ArrowHeadSerializerContext.cs | 20 + .../Domain/Localization/LocalizedMessage.cs | 40 + .../Localization/LocalizedMessageConverter.cs | 32 + .../Helldivers-2-Models.csproj | 17 + src/Helldivers-2-Models/Steam/SteamAppNews.cs | 11 + .../Steam/SteamNewsFeed.cs | 9 + .../Steam/SteamNewsFeedItem.cs | 19 + .../SteamSerializerContext.cs | 16 + src/Helldivers-2-Models/V1/Assignment.cs | 24 + .../V1/Assignments/Reward.cs | 11 + .../V1/Assignments/Task.cs | 14 + src/Helldivers-2-Models/V1/Campaign.cs | 15 + src/Helldivers-2-Models/V1/Dispatch.cs | 17 + src/Helldivers-2-Models/V1/Planet.cs | 37 + src/Helldivers-2-Models/V1/Planets/Event.cs | 23 + .../V1/Planets/Position.cs | 11 + src/Helldivers-2-Models/V1/Statistics.cs | 37 + src/Helldivers-2-Models/V1/SteamNews.cs | 19 + src/Helldivers-2-Models/V1/War.cs | 21 + .../V1SerializerContext.cs | 25 + src/Helldivers-2-Models/json | 1 + .../Helldivers-2-SourceGen.csproj | 59 + .../Properties/launchSettings.json | 9 + src/Helldivers-2-SourceGen/Readme.md | 29 + .../StaticJsonSourceGenerator.cs | 108 ++ .../HelldiversSyncConfiguration.cs | 22 + .../Extensions/ServiceCollectionExtensions.cs | 27 + .../Helldivers-2-Sync.csproj | 18 + .../Hosted/ArrowHeadSyncService.cs | 167 ++ .../Hosted/SteamSyncService.cs | 61 + .../Services/ArrowHeadApiService.cs | 128 ++ .../Services/SteamApiService.cs | 27 + .../api/planets_controller_test.exs | 109 -- .../api/war_season_controller_test.exs | 69 - .../controllers/error_html_test.exs | 15 - .../controllers/error_json_test.exs | 12 - .../controllers/page_controller_test.exs | 8 - test/support/conn_case.ex | 40 - test/support/fixtures/war_season_fixtures.ex | 183 -- test/test_helper.exs | 1 - 1086 files changed, 6950 insertions(+), 8082 deletions(-) create mode 100644 .editorconfig delete mode 100644 .formatter.exs create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/dotnet.yml delete mode 100644 .github/workflows/elixir.yml delete mode 100644 .github/workflows/ex_docs.yml create mode 100644 .github/workflows/pages.yml create mode 100644 .gitmodules create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Directory.Build.props delete mode 100644 Dockerfile create mode 100644 Helldivers-2.sln rename assets/vendor/heroicons/LICENSE.md => LICENSE (95%) create mode 100644 SECURITY.md delete mode 100644 assets/css/app.css delete mode 100644 assets/js/app.js delete mode 100644 assets/tailwind.config.js delete mode 100644 assets/vendor/heroicons/UPGRADE.md delete mode 100644 assets/vendor/heroicons/optimized/20/solid/academic-cap.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/archive-box.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-path.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/at-symbol.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/backspace.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/backward.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/banknotes.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bars-2.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bars-3.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bars-4.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/battery-0.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/battery-100.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/battery-50.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/beaker.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bell-alert.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bell-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bell.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bolt.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/book-open.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bookmark.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/briefcase.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/bug-ant.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/building-library.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/building-office-2.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/building-office.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/building-storefront.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cake.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/calculator.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/calendar-days.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/calendar.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/camera.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chart-bar.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chart-pie.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/check-badge.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/check-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/check.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chevron-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chevron-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chevron-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/chevron-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/circle-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/clipboard.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/clock.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cloud.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/code-bracket.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cog.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/command-line.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/credit-card.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cube.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/currency-euro.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/currency-pound.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/currency-yen.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/device-tablet.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document-check.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document-text.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/document.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/envelope-open.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/envelope.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/eye-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/eye.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/face-frown.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/face-smile.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/film.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/finger-print.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/fire.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/flag.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/folder-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/folder-open.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/folder-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/folder.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/forward.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/funnel.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/gif.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/gift-top.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/gift.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/globe-alt.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/globe-americas.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/hand-raised.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/hashtag.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/heart.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/home-modern.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/home.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/identification.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/inbox.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/information-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/key.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/language.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/light-bulb.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/link.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/list-bullet.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/lock-closed.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/lock-open.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/map-pin.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/map.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/megaphone.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/microphone.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/minus-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/minus-small.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/minus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/moon.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/musical-note.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/newspaper.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/no-symbol.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/paint-brush.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/paper-clip.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/pause-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/pause.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/pencil-square.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/pencil.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/phone.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/photo.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/play-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/play-pause.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/play.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/plus-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/plus-small.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/plus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/power.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/printer.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/qr-code.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/queue-list.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/radio.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/rss.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/scale.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/scissors.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/server-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/server.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/share.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/shield-check.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/signal-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/signal.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/sparkles.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/squares-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/star.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/stop-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/stop.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/sun.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/swatch.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/table-cells.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/tag.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/ticket.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/trash.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/trophy.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/truck.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/tv.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/user-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/user-group.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/user-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/user-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/user.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/users.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/variable.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/video-camera.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/view-columns.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/wallet.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/wifi.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/window.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/wrench.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/x-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/20/solid/x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/academic-cap.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/archive-box.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-path.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/at-symbol.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/backspace.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/backward.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/banknotes.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bars-2.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bars-3.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bars-4.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/battery-0.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/battery-100.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/battery-50.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/beaker.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bell-alert.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bell-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bell.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bolt.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/book-open.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bookmark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/briefcase.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/bug-ant.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/building-library.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/building-office-2.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/building-office.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/building-storefront.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cake.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/calculator.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/calendar-days.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/calendar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/camera.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chart-bar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chart-pie.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/check-badge.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/check-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/check.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chevron-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chevron-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chevron-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/chevron-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/circle-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/clipboard.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/clock.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cloud.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/code-bracket.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cog.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/command-line.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/credit-card.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cube.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/currency-euro.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/currency-pound.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/currency-yen.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/device-tablet.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document-check.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document-text.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/document.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/envelope-open.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/envelope.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/eye-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/eye.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/face-frown.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/face-smile.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/film.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/finger-print.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/fire.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/flag.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/folder-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/folder-open.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/folder-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/folder.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/forward.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/funnel.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/gif.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/gift-top.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/gift.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/globe-alt.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/globe-americas.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/hand-raised.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/hashtag.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/heart.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/home-modern.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/home.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/identification.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/inbox.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/information-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/key.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/language.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/light-bulb.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/link.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/list-bullet.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/lock-closed.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/lock-open.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/map-pin.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/map.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/megaphone.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/microphone.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/minus-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/minus-small.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/moon.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/musical-note.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/newspaper.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/no-symbol.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/paint-brush.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/paper-clip.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/pause-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/pause.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/pencil-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/pencil.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/phone.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/photo.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/play-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/play-pause.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/play.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/plus-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/plus-small.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/power.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/printer.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/qr-code.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/queue-list.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/radio.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/rss.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/scale.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/scissors.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/server-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/server.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/share.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/shield-check.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/signal-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/signal.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/sparkles.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/squares-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/star.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/stop-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/stop.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/sun.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/swatch.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/table-cells.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/tag.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/ticket.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/trash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/trophy.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/truck.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/tv.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/user-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/user-group.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/user-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/user-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/user.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/users.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/variable.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/video-camera.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/view-columns.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/wallet.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/wifi.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/window.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/wrench.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/x-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/outline/x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/academic-cap.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/archive-box.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-path.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/at-symbol.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/backspace.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/backward.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/banknotes.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bars-2.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bars-3.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bars-4.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/battery-0.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/battery-100.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/battery-50.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/beaker.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bell-alert.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bell-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bell.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bolt.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/book-open.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bookmark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/briefcase.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/bug-ant.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/building-library.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/building-office-2.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/building-office.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/building-storefront.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cake.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/calculator.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/calendar-days.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/calendar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/camera.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chart-bar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chart-pie.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/check-badge.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/check-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/check.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chevron-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chevron-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chevron-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/chevron-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/circle-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/clipboard.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/clock.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cloud.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/code-bracket.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cog.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/command-line.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/credit-card.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cube.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/currency-euro.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/currency-pound.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/currency-yen.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/device-tablet.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document-check.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document-text.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/document.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/envelope-open.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/envelope.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/eye-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/eye.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/face-frown.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/face-smile.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/film.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/finger-print.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/fire.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/flag.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/folder-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/folder-open.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/folder-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/folder.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/forward.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/funnel.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/gif.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/gift-top.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/gift.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/globe-alt.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/globe-americas.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/hand-raised.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/hashtag.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/heart.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/home-modern.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/home.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/identification.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/inbox.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/information-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/key.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/language.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/light-bulb.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/link.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/list-bullet.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/lock-closed.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/lock-open.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/map-pin.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/map.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/megaphone.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/microphone.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/minus-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/minus-small.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/moon.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/musical-note.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/newspaper.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/no-symbol.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/paint-brush.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/paper-clip.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/pause-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/pause.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/pencil-square.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/pencil.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/phone.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/photo.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/play-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/play-pause.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/play.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/plus-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/plus-small.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/power.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/printer.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/qr-code.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/queue-list.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/radio.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/rss.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/scale.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/scissors.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/server-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/server.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/share.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/shield-check.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/signal-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/signal.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/sparkles.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/squares-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/star.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/stop-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/stop.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/sun.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/swatch.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/table-cells.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/tag.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/ticket.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/trash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/trophy.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/truck.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/tv.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/user-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/user-group.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/user-minus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/user-plus.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/user.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/users.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/variable.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/video-camera.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/view-columns.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/wallet.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/wifi.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/window.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/wrench.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/x-circle.svg delete mode 100644 assets/vendor/heroicons/optimized/24/solid/x-mark.svg delete mode 100644 assets/vendor/topbar.js delete mode 100644 config/config.exs delete mode 100644 config/dev.exs delete mode 100644 config/prod.exs delete mode 100644 config/runtime.exs delete mode 100644 config/test.exs delete mode 100644 lib/helldivers_2.ex delete mode 100644 lib/helldivers_2/application.ex delete mode 100644 lib/helldivers_2/macros/from_json.ex delete mode 100644 lib/helldivers_2/models/news_feed.ex delete mode 100644 lib/helldivers_2/models/news_feed/message.ex delete mode 100644 lib/helldivers_2/models/war_info.ex delete mode 100644 lib/helldivers_2/models/war_info/faction.ex delete mode 100644 lib/helldivers_2/models/war_info/home_world.ex delete mode 100644 lib/helldivers_2/models/war_info/planet.ex delete mode 100644 lib/helldivers_2/models/war_info/sector.ex delete mode 100644 lib/helldivers_2/models/war_status.ex delete mode 100644 lib/helldivers_2/models/war_status/campaign.ex delete mode 100644 lib/helldivers_2/models/war_status/effect.ex delete mode 100644 lib/helldivers_2/models/war_status/global_event.ex delete mode 100644 lib/helldivers_2/models/war_status/joint_operation.ex delete mode 100644 lib/helldivers_2/models/war_status/planet_event.ex delete mode 100644 lib/helldivers_2/models/war_status/planet_status.ex delete mode 100644 lib/helldivers_2/war_season.ex delete mode 100644 lib/helldivers_2/war_sync.ex delete mode 100644 lib/helldivers_2_web.ex delete mode 100644 lib/helldivers_2_web/api_spec.ex delete mode 100644 lib/helldivers_2_web/components/core_components.ex delete mode 100644 lib/helldivers_2_web/components/layouts.ex delete mode 100644 lib/helldivers_2_web/components/layouts/app.html.heex delete mode 100644 lib/helldivers_2_web/components/layouts/root.html.heex delete mode 100644 lib/helldivers_2_web/controllers/api/campaign_json.ex delete mode 100644 lib/helldivers_2_web/controllers/api/global_events_controller.ex delete mode 100644 lib/helldivers_2_web/controllers/api/global_events_json.ex delete mode 100644 lib/helldivers_2_web/controllers/api/home_world_json.ex delete mode 100644 lib/helldivers_2_web/controllers/api/joint_operations_json.ex delete mode 100644 lib/helldivers_2_web/controllers/api/planets_controller.ex delete mode 100644 lib/helldivers_2_web/controllers/api/planets_json.ex delete mode 100644 lib/helldivers_2_web/controllers/api/war_season_controller.ex delete mode 100644 lib/helldivers_2_web/controllers/api/war_season_json.ex delete mode 100644 lib/helldivers_2_web/controllers/error_html.ex delete mode 100644 lib/helldivers_2_web/controllers/error_json.ex delete mode 100644 lib/helldivers_2_web/controllers/fallback_controller.ex delete mode 100644 lib/helldivers_2_web/controllers/page_controller.ex delete mode 100644 lib/helldivers_2_web/controllers/page_html.ex delete mode 100644 lib/helldivers_2_web/controllers/page_html/home.html.heex delete mode 100644 lib/helldivers_2_web/endpoint.ex delete mode 100644 lib/helldivers_2_web/plugs/rate_limit.ex delete mode 100644 lib/helldivers_2_web/plugs/war_season.ex delete mode 100644 lib/helldivers_2_web/router.ex delete mode 100644 lib/helldivers_2_web/schemas/campaign_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/global_event_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/home_world_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/joint_operation_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/news_feed_message_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/not_found_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/planet_event_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/planet_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/planet_status_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/too_many_requests_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/war_info_schema.ex delete mode 100644 lib/helldivers_2_web/schemas/war_season_overview.ex delete mode 100644 lib/helldivers_2_web/schemas/war_status_schema.ex delete mode 100644 lib/helldivers_2_web/telemetry.ex delete mode 100644 mix.exs delete mode 100644 mix.lock delete mode 100644 priv/effects.json delete mode 100644 priv/factions.json delete mode 100644 priv/planets.json delete mode 100644 priv/sectors.json delete mode 100644 priv/static/favicon.ico delete mode 100644 priv/static/images/logo.svg delete mode 100644 priv/static/robots.txt delete mode 100755 rel/env.sh.eex delete mode 100755 rel/overlays/bin/server delete mode 100755 rel/overlays/bin/server.bat create mode 100644 src/Helldivers-2-API/Controllers/ArrowHeadController.cs create mode 100644 src/Helldivers-2-API/Controllers/V1/AssignmentsController.cs create mode 100644 src/Helldivers-2-API/Controllers/V1/CampaignsController.cs create mode 100644 src/Helldivers-2-API/Controllers/V1/DispatchController.cs create mode 100644 src/Helldivers-2-API/Controllers/V1/PlanetController.cs create mode 100644 src/Helldivers-2-API/Controllers/V1/SteamController.cs create mode 100644 src/Helldivers-2-API/Controllers/V1/WarController.cs create mode 100644 src/Helldivers-2-API/Dockerfile create mode 100644 src/Helldivers-2-API/Helldivers-2-API.csproj create mode 100644 src/Helldivers-2-API/Middlewares/RateLimitMiddleware.cs create mode 100644 src/Helldivers-2-API/OpenApi/ArrowHeadDocumentProcessor.cs create mode 100644 src/Helldivers-2-API/Program.cs create mode 100644 src/Helldivers-2-API/Properties/launchSettings.json create mode 100644 src/Helldivers-2-API/appsettings.Development.json create mode 100644 src/Helldivers-2-API/appsettings.json create mode 100644 src/Helldivers-2-API/wwwroot/Helldivers-2-API.json create mode 100644 src/Helldivers-2-API/wwwroot/Helldivers-2-API_arrowhead.json create mode 100644 src/Helldivers-2-API/wwwroot/redoc.html create mode 100644 src/Helldivers-2-API/wwwroot/swagger-ui.html create mode 100644 src/Helldivers-2-Core/Contracts/Collections/IStore.cs create mode 100644 src/Helldivers-2-Core/Contracts/IStore.cs create mode 100644 src/Helldivers-2-Core/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/Helldivers-2-Core/Facades/ArrowHeadFacade.cs create mode 100644 src/Helldivers-2-Core/Facades/SteamFacade.cs create mode 100644 src/Helldivers-2-Core/Facades/V1Facade.cs create mode 100644 src/Helldivers-2-Core/Helldivers-2-Core.csproj create mode 100644 src/Helldivers-2-Core/Localization/CultureDictionary.cs create mode 100644 src/Helldivers-2-Core/Mapping/Steam/SteamNewsMapper.cs create mode 100644 src/Helldivers-2-Core/Mapping/V1/AssignmentMapper.cs create mode 100644 src/Helldivers-2-Core/Mapping/V1/CampaignMapper.cs create mode 100644 src/Helldivers-2-Core/Mapping/V1/DispatchMapper.cs create mode 100644 src/Helldivers-2-Core/Mapping/V1/PlanetMapper.cs create mode 100644 src/Helldivers-2-Core/Mapping/V1/StatisticsMapper.cs create mode 100644 src/Helldivers-2-Core/Mapping/V1/WarMapper.cs create mode 100644 src/Helldivers-2-Core/Storage/ArrowHead/AssignmentStore.cs create mode 100644 src/Helldivers-2-Core/Storage/ArrowHead/NewsFeedStore.cs create mode 100644 src/Helldivers-2-Core/Storage/ArrowHead/WarIdStore.cs create mode 100644 src/Helldivers-2-Core/Storage/ArrowHead/WarInfoStore.cs create mode 100644 src/Helldivers-2-Core/Storage/ArrowHead/WarStatusStore.cs create mode 100644 src/Helldivers-2-Core/Storage/ArrowHead/WarSummaryStore.cs create mode 100644 src/Helldivers-2-Core/Storage/Steam/SteamNewsStore.cs create mode 100644 src/Helldivers-2-Core/Storage/StoreBase.cs create mode 100644 src/Helldivers-2-Core/Storage/V1/AssignmentStore.cs create mode 100644 src/Helldivers-2-Core/Storage/V1/CampaignStore.cs create mode 100644 src/Helldivers-2-Core/Storage/V1/DispatchStore.cs create mode 100644 src/Helldivers-2-Core/Storage/V1/PlanetStore.cs create mode 100644 src/Helldivers-2-Core/Storage/V1/WarStore.cs create mode 100644 src/Helldivers-2-Core/StorageFacade.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Assignment.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Assignments/Reward.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Assignments/Setting.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Assignments/Task.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Info/HomeWorld.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Info/PlanetCoordinates.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Info/PlanetInfo.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/NewsFeedItem.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Status/Campaign.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Status/JointOperation.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Status/PlanetAttack.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Status/PlanetEvent.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Status/PlanetStatus.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Summary/GalaxyStats.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/Summary/PlanetStats.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/WarId.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/WarInfo.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/WarStatus.cs create mode 100644 src/Helldivers-2-Models/ArrowHead/WarSummary.cs create mode 100644 src/Helldivers-2-Models/ArrowHeadSerializerContext.cs create mode 100644 src/Helldivers-2-Models/Domain/Localization/LocalizedMessage.cs create mode 100644 src/Helldivers-2-Models/Domain/Localization/LocalizedMessageConverter.cs create mode 100644 src/Helldivers-2-Models/Helldivers-2-Models.csproj create mode 100644 src/Helldivers-2-Models/Steam/SteamAppNews.cs create mode 100644 src/Helldivers-2-Models/Steam/SteamNewsFeed.cs create mode 100644 src/Helldivers-2-Models/Steam/SteamNewsFeedItem.cs create mode 100644 src/Helldivers-2-Models/SteamSerializerContext.cs create mode 100644 src/Helldivers-2-Models/V1/Assignment.cs create mode 100644 src/Helldivers-2-Models/V1/Assignments/Reward.cs create mode 100644 src/Helldivers-2-Models/V1/Assignments/Task.cs create mode 100644 src/Helldivers-2-Models/V1/Campaign.cs create mode 100644 src/Helldivers-2-Models/V1/Dispatch.cs create mode 100644 src/Helldivers-2-Models/V1/Planet.cs create mode 100644 src/Helldivers-2-Models/V1/Planets/Event.cs create mode 100644 src/Helldivers-2-Models/V1/Planets/Position.cs create mode 100644 src/Helldivers-2-Models/V1/Statistics.cs create mode 100644 src/Helldivers-2-Models/V1/SteamNews.cs create mode 100644 src/Helldivers-2-Models/V1/War.cs create mode 100644 src/Helldivers-2-Models/V1SerializerContext.cs create mode 160000 src/Helldivers-2-Models/json create mode 100644 src/Helldivers-2-SourceGen/Helldivers-2-SourceGen.csproj create mode 100644 src/Helldivers-2-SourceGen/Properties/launchSettings.json create mode 100644 src/Helldivers-2-SourceGen/Readme.md create mode 100644 src/Helldivers-2-SourceGen/StaticJsonSourceGenerator.cs create mode 100644 src/Helldivers-2-Sync/Configuration/HelldiversSyncConfiguration.cs create mode 100644 src/Helldivers-2-Sync/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/Helldivers-2-Sync/Helldivers-2-Sync.csproj create mode 100644 src/Helldivers-2-Sync/Hosted/ArrowHeadSyncService.cs create mode 100644 src/Helldivers-2-Sync/Hosted/SteamSyncService.cs create mode 100644 src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs create mode 100644 src/Helldivers-2-Sync/Services/SteamApiService.cs delete mode 100644 test/helldivers_2_web/controllers/api/planets_controller_test.exs delete mode 100644 test/helldivers_2_web/controllers/api/war_season_controller_test.exs delete mode 100644 test/helldivers_2_web/controllers/error_html_test.exs delete mode 100644 test/helldivers_2_web/controllers/error_json_test.exs delete mode 100644 test/helldivers_2_web/controllers/page_controller_test.exs delete mode 100644 test/support/conn_case.ex delete mode 100644 test/support/fixtures/war_season_fixtures.ex delete mode 100644 test/test_helper.exs diff --git a/.dockerignore b/.dockerignore index 61a7393..9785ee1 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,45 +1,26 @@ -# This file excludes paths from the Docker build context. -# -# By default, Docker's build context includes all files (and folders) in the -# current directory. Even if a file isn't copied into the container it is still sent to -# the Docker daemon. -# -# There are multiple reasons to exclude files from the build context: -# -# 1. Prevent nested folders from being copied into the container (ex: exclude -# /assets/node_modules when copying /assets) -# 2. Reduce the size of the build context and improve build time (ex. /build, /deps, /doc) -# 3. Avoid sending files containing sensitive information -# -# More information on using .dockerignore is available here: -# https://docs.docker.com/engine/reference/builder/#dockerignore-file - -.dockerignore - -# Ignore git, but keep git HEAD and refs to access current commit hash if needed: -# -# $ cat .git/HEAD | awk '{print ".git/"$2}' | xargs cat -# d0b8727759e1e0e7aa3d41707d12376e373d5ecc -.git -!.git/HEAD -!.git/refs - -# Common development/test artifacts -/cover/ -/doc/ -/test/ -/tmp/ -.elixir_ls - -# Mix artifacts -/_build/ -/deps/ -*.ez - -# Generated on crash by the VM -erl_crash.dump - -# Static artifacts - These should be fetched and built inside the Docker image -/assets/node_modules/ -/priv/static/assets/ -/priv/static/cache_manifest.json +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/.idea +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md +tests/ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..77abb89 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,245 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories +root = true + +[*] +end_of_line = lf +insert_final_newline = true + +[*.{props,csproj}] +# Indentation and spacing +indent_size = 4 +indent_style = space +tab_width = 4 + +# yml files +[*.yml] +# Indentation and spacing +indent_size = 2 +indent_style = space +tab_width = 2 + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_style = space + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = false +file_header_template = unset + +# this. and Me. preferences +dotnet_style_qualification_for_event = false +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false +dotnet_style_qualification_for_property = false + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members + +# Expression-level preferences +dotnet_style_namespace_match_folder = true +dotnet_style_prefer_collection_expression = when_types_loosely_match +dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed + +# Field preferences +dotnet_style_readonly_field = true + +# Parameter preferences +dotnet_code_quality_unused_parameters = all + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +# New line preferences +dotnet_style_allow_multiple_blank_lines_experimental = true +dotnet_style_allow_statement_immediately_after_block_experimental = true + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = false +csharp_style_var_for_built_in_types = false +csharp_style_var_when_type_is_apparent = false + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true +csharp_style_pattern_matching_over_is_with_cast_check = true +csharp_style_prefer_extended_property_pattern = true +csharp_style_prefer_not_pattern = true +csharp_style_prefer_pattern_matching = true +csharp_style_prefer_switch_expression = true + +# Null-checking preferences +csharp_style_conditional_delegate_call = true + +# Modifier preferences +csharp_prefer_static_local_function = true +csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async +csharp_style_prefer_readonly_struct = true +csharp_style_prefer_readonly_struct_member = true + +# Code-block preferences +csharp_prefer_braces = true:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_style_namespace_declarations = file_scoped:silent +csharp_style_prefer_method_group_conversion = true:silent +csharp_style_prefer_primary_constructors = true:suggestion +csharp_style_prefer_top_level_statements = true:silent + +# Expression-level preferences +csharp_prefer_simple_default_expression = true +csharp_style_deconstructed_variable_declaration = true +csharp_style_implicit_object_creation_when_type_is_apparent = true +csharp_style_inlined_variable_declaration = true +csharp_style_prefer_index_operator = true +csharp_style_prefer_local_over_anonymous_function = true +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_range_operator = true +csharp_style_prefer_tuple_swap = true +csharp_style_prefer_utf8_string_literals = true +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable +csharp_style_unused_value_expression_statement_preference = discard_variable + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace:silent + +# New line preferences +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true +csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true +csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true +csharp_style_allow_embedded_statements_on_same_line_experimental = true + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_operator_placement_when_wrapping = beginning_of_line +tab_width = 4 +indent_size = 4 +dotnet_style_prefer_simplified_interpolation = true:suggestion diff --git a/.formatter.exs b/.formatter.exs deleted file mode 100644 index 0871027..0000000 --- a/.formatter.exs +++ /dev/null @@ -1,5 +0,0 @@ -[ - import_deps: [:phoenix, :open_api_spex], - plugins: [Phoenix.LiveView.HTMLFormatter], - inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}"] -] diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..60ded18 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,102 @@ +name: "\U0001F41E Bug report" +description: Report something that isn't working as it should or is outright broken +title: "[BUG]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + **Before You Start...** + + This form is only for submitting bug reports. If you have a usage question + or are unsure if this is really a bug, make sure to: + + - Read the [docs](https://helldivers-2.fly.dev/swagger-ui.html) + - Ask on [Discord Chat](https://discord.gg/E8UUfWYmf9) + - Ask on [GitHub Discussions](https://github.com/helldivers-2/api/discussions) + + Also try to search for your issue - it may have already been answered or even fixed in the development branch. + However, if you find that an old, closed issue still persists in the latest version, + you should open a new issue using the form below instead of commenting on the old issue. + - type: input + id: reproduction-link + attributes: + label: Link to faulty endpoint + description: | + Provide a link to the endpoint that is malfunctioning. + + Please do not just fill in a random link. The issue will be closed if no valid reproduction is provided. + placeholder: Reproduction Link + validations: + required: true + - type: input + id: client-name + attributes: + label: The name of your client/application + description: | + This helps us identifying the errors in our logs that are related to the problem you are reporting. + For websites that access the API directly you should put the domain of your website here, if you are writing + a server side application (aka an API, Discord bot or if your website only accesses the API server side) put + the name of the application here that it reports in the `User-Agent` header. + placeholder: Client name + validations: + required: true + - type: textarea + id: request-data + attributes: + label: Request information + description: | + Provide as much information about your request as you can. + If you are accessing the API from the browser you can right click the request in the network tab of your devtools + see [this link](https://everything.curl.dev/cmdline/copyas.html) for more information on how to do this in your + browser. + + If you are writing a server side application include all headers and the URL you are sending, in case of doubt + feel free to put the code you use to call the API here. + placeholder: Request information + validations: + required: true + - type: textarea + id: steps-to-reproduce + attributes: + label: Steps to reproduce + description: | + What exactly is your application doing that causes the API to malfunction? + If we have to investigate the issue, what would we have to do to reproduce the issue? + placeholder: Steps to reproduce + validations: + required: true + - type: textarea + id: expected + attributes: + label: What is expected? + description: | + This can range from a textual explanation of what you were expecting to see/happen to providing JSON snippets + that illustrate what should be outputted. + validations: + required: true + - type: textarea + id: actually-happening + attributes: + label: What is actually happening? + description: | + Explain what is happening that deviates from the expected output. + You can use screenshots (in the comments), but please make sure to provide the JSON output that the API returned + and if possible the JSON output of the official ArrowHead API (can be fetched through the `/raw` endpoints). + render: json + validations: + required: true + - type: textarea + id: system-info + attributes: + label: System Info + description: | + Provide as much information about the environment you are using, this can range from the browser you are accessing + the API with to the programming language of your app/website, your editor/IDE, ... + render: shell + placeholder: System, browser, programming language, editor, ... + - type: textarea + id: additional-comments + attributes: + label: Any additional comments? + description: e.g. some background/context of how you ran into this bug. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..7f669a9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Discord Chat + url: https://discord.gg/E8UUfWYmf9 + about: Ask questions and discuss with other developers in real time. + - name: Questions & Discussions + url: https://github.com/helldivers-2/api/discussions + about: Use GitHub discussions for message-board style questions and discussions. + - name: Buy me a coffee + url: https://www.buymeacoffee.com/dealloc + about: If you want to support the development, check out buymeacoffee diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..ef0037f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,21 @@ +--- +name: Feature request +about: Suggest new features for the API +title: '[FEATURE]: ' +labels: ['feature request'] +--- + +### What problem does it solve +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +### What is the solution +A clear and concise description of what you want to happen. + +### Existing alternatives +A clear and concise description of any alternative solutions or features you've considered. + +### Added value +A clear description of the value this feature would add to the community and applications. + +### Additional notes +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml new file mode 100644 index 0000000..201b06e --- /dev/null +++ b/.github/workflows/dotnet.yml @@ -0,0 +1,31 @@ +# This workflow will build a .NET project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net +name: .NET CI + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + - name: download JSON submodule + run: git submodule update --init ./src/Helldivers-2-Models/json + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --no-restore --no-incremental /p:TreatWarningsAsErrors=true + - name: Check formatting + run: dotnet format --no-restore --verify-no-changes --exclude-diagnostics IL2026 IL3050 + - name: Check tests + run: dotnet test --no-build --verbosity normal diff --git a/.github/workflows/elixir.yml b/.github/workflows/elixir.yml deleted file mode 100644 index 6957f94..0000000 --- a/.github/workflows/elixir.yml +++ /dev/null @@ -1,38 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -name: Elixir CI - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - -permissions: - contents: read - -jobs: - build: - name: Build and test - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Set up Elixir - uses: erlef/setup-beam@61e01a43a562a89bfc54c7f9a378ff67b03e4a21 # v1.16.0 - with: - elixir-version: '1.16.1' # [Required] Define the Elixir version - otp-version: '26.2.2' # [Required] Define the Erlang/OTP version - - name: Restore dependencies cache - uses: actions/cache@v3 - with: - path: deps - key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }} - restore-keys: ${{ runner.os }}-mix- - - name: Install dependencies - run: mix deps.get - - name: Run tests - run: mix test --trace diff --git a/.github/workflows/ex_docs.yml b/.github/workflows/ex_docs.yml deleted file mode 100644 index f573ce6..0000000 --- a/.github/workflows/ex_docs.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Publish ex_doc;s - -on: - push: - branches: - - master - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -jobs: - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - name: Generate and publish docs - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Set up Elixir - uses: erlef/setup-beam@61e01a43a562a89bfc54c7f9a378ff67b03e4a21 # v1.16.0 - with: - elixir-version: '1.16.1' # [Required] Define the Elixir version - otp-version: '26.2.2' # [Required] Define the Erlang/OTP version - - - name: Restore dependencies cache - uses: actions/cache@v3 - with: - path: deps - key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }} - restore-keys: ${{ runner.os }}-mix- - - - name: Install dependencies - run: mix deps.get - - name: Generate documentation - run: mix docs - - - name: Setup Pages - uses: actions/configure-pages@v4 - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: './doc' - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.github/workflows/fly.yml b/.github/workflows/fly.yml index 6f2d286..88ac5f5 100644 --- a/.github/workflows/fly.yml +++ b/.github/workflows/fly.yml @@ -2,7 +2,7 @@ name: Fly Deploy on: push: branches: - - master # change to main if needed + - master jobs: deploy: environment: Fly diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..e506acd --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,64 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: [ "master" ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + - name: Initial static JSON schema submodule + run: git submodule update --init ./src/Helldivers-2-Models/json + - name: Generate OpenAPI JSON files + run: dotnet build -c Debug + - name: Rename Swagger HTML file to index + run: mv src/Helldivers-2-API/wwwroot/swagger-ui.html src/Helldivers-2-API/wwwroot/index.html + - name: Upload OpenAPI artifact + uses: actions/upload-artifact@master + with: + name: 'OpenAPI-artifact' + path: './src/Helldivers-2-API/wwwroot' + deploy: + needs: build + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Download generated OpenAPI files + uses: actions/download-artifact@master + with: + name: 'OpenAPI-artifact' + path: '.' + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: '.' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 43038c8..af9c418 100644 --- a/.gitignore +++ b/.gitignore @@ -1,37 +1,366 @@ -# The directory Mix will write compiled artifacts to. -/_build/ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore -# If you run "mix test --cover", coverage assets end up here. -/cover/ +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates -# The directory Mix downloads your dependencies sources to. -/deps/ +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs -# Where 3rd-party dependencies like ExDoc output generated docs. -/doc/ +# Mono auto generated files +mono_crash.* -# Ignore .fetch files in case you like to edit your project deps locally. -/.fetch +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ -# If the VM crashes, it generates a dump, let's ignore it too. -erl_crash.dump +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ -# Also ignore archive artifacts (built via "mix archive.build"). -*.ez +# Visual Studio 2017 auto generated files +Generated\ Files/ -# Temporary files, for example, from tests. -/tmp/ +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* -# Ignore package tarball (built via "mix hex.build"). -helldivers_2-*.tar +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml -# Ignore assets that are produced by build tools. -/priv/static/assets/ +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c -# Ignore digested assets cache. -/priv/static/cache_manifest.json +# Benchmark Results +BenchmarkDotNet.Artifacts/ -# In case you use Node.js/npm, you want to ignore these. -npm-debug.log -/assets/node_modules/ +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# Jetbrains generated folders +.idea/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..90f345c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "src/Helldivers-2-Models/json"] + path = src/Helldivers-2-Models/json + url = https://github.com/helldivers-2/json.git diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..930f103 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement on +[Discord](https://discord.gg/9tgBFvuEnt). +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..70bd4fe --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,73 @@ +# Contributing to the Helldivers 2 Community API + +First of all, thank you very much for taking the time to contribute to this community driven API! +If you aren't already, feel free to take a peek in [Helldivers 2 Developers Discord](https://discord.gg/E8UUfWYmf9). + +Let's run you through the process of contributing to the community API. + +## Create an issue if none exist + +The first step to contributing is making sure that your contribution will be accepted. +Opening a [bug](https://github.com/helldivers-2/api/issues/new/choose) +or [feature request](https://github.com/helldivers-2/api/issues/new/choose) +(that can potentially be transformed into a discussion) will ensure that the relevant maintainers are aware something +will be worked on. This ensures that they aren't working on the same issue you are, or in the case of a feature request, +that we are open to implementing the feature +(see [Why we might not accept all Pull Requests](#why-we-might-not-accept-all-pull-requests)). +Once a maintainer (most notably @dealloc and/or @lambstream) approves your change request, you can get started. + +## Fork the API +See [Github's fork documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo). + +## Set up a local development environment +(TODO: expand on all required dependencies, setup etc) +Once you have cloned your fork or the API itself, run the following commands to initialize the local environment: +```shell +git submodule update .\src\Helldivers-2-Models\json +dotnet restore +dotnet build --no-restore --no-incremental +``` +If you don't get any errors, that means your development environment is all set to get developing! +Open the `Helldivers-2.sln` file in the root of the repository and you're good to go! + +### Formatting, line endings and syntax +There's three pilars when it comes to coding conventions, formatting etc: +- [.editorconfig](https://editorconfig.org/) is set up in the repository, if your IDE supports it you should install + the required plugin to ensure your code is correctly formatted according to the configuration. +- [Microsoft C# coding conventions](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions) + write idiomatic C# and try to follow conventions from either Microsoft or the project if it deviates from a specific + rule. +- [dotnet-format](https://github.com/dotnet/format) we use `dotnet format` in our CI pipeline to ensure consistent + formatting, line endings and syntax. Before submitting a pull request, make sure you run `dotnet format` on your code. + +### Be respectful +Disagreements happen, discussions are perfectly fine (we encourage a healthy discussion even!), however you (and we) are +to remain respectful at **all times**. While we try to listen to the community whenever possible, please keep in mind +that 1. we do this in our spare time (for free, to boot!), and 2. we have the *final* say when it comes to decisions +regarding the code that we maintain. See [Code of conduct](https://github.com/helldivers-2/api?tab=coc-ov-file) for more +information on our expectations on the behaviour of our maintainers and community. + +### Licensing +At the time of writing our project is licensed under [MIT](https://en.wikipedia.org/wiki/MIT_License) (you can read the +'plain English' version [here](https://www.tldrlegal.com/license/mit-license)). +When you contribute to this project you accept that your code will also be licensed under MIT, and that you give full +ownership of the contributed code to the [helldivers-2/api](https://github.com/helldivers-2/api) project and it's +maintainers. Under no circumstance are you entitled to compensation in any form, nor entitled to more involvement or +authority over the code in this project, both contributed and otherwise. + +## Why we might not accept all Pull Requests +There are three primary reasons we might choose not to accept your pull request (however it's not limited to these two); +1. **We don't accept pull requests that are cosmetic in nature** (think formatting, whitespace, ...) + we don't do this for the same reason the [Ruby Rails](https://github.com/rails/rails) project does not allow such + changes, [TLDR](https://github.com/rails/rails/pull/13771#issuecomment-32746700) it adds noise and makes maintenance + even more difficult than it already is. +2. **We don't accept pull requests with features we don't want/feel comfortable maintaining** + If you create an awesome feature that is rather complex, we might choose not to accept the feature. + This is probably not related to the quality of your code (that's what PR's are for in the first place), but rather + with the fact that after you've left, the maintainers still need to make sure it keeps working for as long as we + don't sunset the feature. If your feature/PR would add too much of a burden on the maintenance we might choose not + to accept it, regardless of how cool or convenient it is (sorry!). +3. **It falls outside the scope of this project** + This project aims to be a wrapper API around the official Helldivers API by ArrowHead studios. While there *might* + be exceptions, any information not available in the API (or the game) falls outside the scope, the same goes for + endpoints that might be considered dangerous (for example those that require authentication on the ArrowHead API). diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..3d05571 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,8 @@ + + + enable + enable + net8.0 + true + + diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 1ef3f3e..0000000 --- a/Dockerfile +++ /dev/null @@ -1,97 +0,0 @@ -# Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian -# instead of Alpine to avoid DNS resolution issues in production. -# -# https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu -# https://hub.docker.com/_/ubuntu?tab=tags -# -# This file is based on these images: -# -# - https://hub.docker.com/r/hexpm/elixir/tags - for the build image -# - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20240130-slim - for the release image -# - https://pkgs.org/ - resource for finding needed packages -# - Ex: hexpm/elixir:1.15.7-erlang-26.1.2-debian-bullseye-20240130-slim -# -ARG ELIXIR_VERSION=1.15.7 -ARG OTP_VERSION=26.1.2 -ARG DEBIAN_VERSION=bullseye-20240130-slim - -ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}" -ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}" - -FROM ${BUILDER_IMAGE} as builder - -# install build dependencies -RUN apt-get update -y && apt-get install -y build-essential git \ - && apt-get clean && rm -f /var/lib/apt/lists/*_* - -# prepare build dir -WORKDIR /app - -# install hex + rebar -RUN mix local.hex --force && \ - mix local.rebar --force - -# set build ENV -ENV MIX_ENV="prod" - -# install mix dependencies -COPY mix.exs mix.lock ./ -RUN mix deps.get --only $MIX_ENV -RUN mkdir config - -# copy compile-time config files before we compile dependencies -# to ensure any relevant config change will trigger the dependencies -# to be re-compiled. -COPY config/config.exs config/${MIX_ENV}.exs config/ -RUN mix deps.compile - -COPY priv priv - -COPY lib lib - -COPY assets assets - -# compile assets -RUN mix assets.deploy - -# Compile the release -RUN mix compile - -# Changes to config/runtime.exs don't require recompiling the code -COPY config/runtime.exs config/ - -COPY rel rel -RUN mix release - -# start a new build stage so that the final image will only contain -# the compiled release and other runtime necessities -FROM ${RUNNER_IMAGE} - -RUN apt-get update -y && \ - apt-get install -y libstdc++6 openssl libncurses5 locales ca-certificates \ - && apt-get clean && rm -f /var/lib/apt/lists/*_* - -# Set the locale -RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen - -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 - -WORKDIR "/app" -RUN chown nobody /app - -# set runner ENV -ENV MIX_ENV="prod" - -# Only copy the final release from the build stage -COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/helldivers_2 ./ - -USER nobody - -# If using an environment that doesn't automatically reap zombie processes, it is -# advised to add an init process such as tini via `apt-get install` -# above and adding an entrypoint. See https://github.com/krallin/tini for details -# ENTRYPOINT ["/tini", "--"] - -CMD ["/app/bin/server"] diff --git a/Helldivers-2.sln b/Helldivers-2.sln new file mode 100644 index 0000000..babd9da --- /dev/null +++ b/Helldivers-2.sln @@ -0,0 +1,93 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Helldivers-2-API", "src\Helldivers-2-API\Helldivers-2-API.csproj", "{7E23AA66-93C0-495D-A5FB-9956965F33DA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C0ECDBEB-FC7B-4F3C-AF8F-D0961BD22F61}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitattributes = .gitattributes + .gitignore = .gitignore + Directory.Build.props = Directory.Build.props + fly.toml = fly.toml + .dockerignore = .dockerignore + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Helldivers-2-Models", "src\Helldivers-2-Models\Helldivers-2-Models.csproj", "{9B017849-C756-4B98-9B98-885AEBE9EAD4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Helldivers-2-Sync", "src\Helldivers-2-Sync\Helldivers-2-Sync.csproj", "{CB53B78C-7AB2-4B39-98B0-394778AF882F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Helldivers-2-Core", "src\Helldivers-2-Core\Helldivers-2-Core.csproj", "{939EFFA5-462B-4F5F-969A-61B4C424407A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{154421CC-393F-4BDC-8D6D-7EECB28FD874}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Helldivers-2-SourceGen", "src\Helldivers-2-SourceGen\Helldivers-2-SourceGen.csproj", "{32AE19FB-7D9E-4AC7-A0A5-80DED3680369}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Github", "Github", "{18D4A0EA-02CE-4FEA-A641-848A13603040}" + ProjectSection(SolutionItems) = preProject + CODE_OF_CONDUCT.md = CODE_OF_CONDUCT.md + README.md = README.md + SECURITY.md = SECURITY.md + LICENSE = LICENSE + CONTRIBUTING.md = CONTRIBUTING.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workflows", "Workflows", "{9D663AC9-2CD8-4114-A802-D12284662FF0}" + ProjectSection(SolutionItems) = preProject + .github\workflows\fly.yml = .github\workflows\fly.yml + .github\workflows\pages.yml = .github\workflows\pages.yml + .github\workflows\dotnet.yml = .github\workflows\dotnet.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Templates", "Templates", "{FD5B9284-4689-48BE-B520-633C7269F97C}" + ProjectSection(SolutionItems) = preProject + .github\ISSUE_TEMPLATE\bug_report.yml = .github\ISSUE_TEMPLATE\bug_report.yml + .github\ISSUE_TEMPLATE\config.yml = .github\ISSUE_TEMPLATE\config.yml + .github\ISSUE_TEMPLATE\feature_request.md = .github\ISSUE_TEMPLATE\feature_request.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7E23AA66-93C0-495D-A5FB-9956965F33DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E23AA66-93C0-495D-A5FB-9956965F33DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E23AA66-93C0-495D-A5FB-9956965F33DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E23AA66-93C0-495D-A5FB-9956965F33DA}.Release|Any CPU.Build.0 = Release|Any CPU + {9B017849-C756-4B98-9B98-885AEBE9EAD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B017849-C756-4B98-9B98-885AEBE9EAD4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B017849-C756-4B98-9B98-885AEBE9EAD4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B017849-C756-4B98-9B98-885AEBE9EAD4}.Release|Any CPU.Build.0 = Release|Any CPU + {CB53B78C-7AB2-4B39-98B0-394778AF882F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB53B78C-7AB2-4B39-98B0-394778AF882F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB53B78C-7AB2-4B39-98B0-394778AF882F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB53B78C-7AB2-4B39-98B0-394778AF882F}.Release|Any CPU.Build.0 = Release|Any CPU + {939EFFA5-462B-4F5F-969A-61B4C424407A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {939EFFA5-462B-4F5F-969A-61B4C424407A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {939EFFA5-462B-4F5F-969A-61B4C424407A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {939EFFA5-462B-4F5F-969A-61B4C424407A}.Release|Any CPU.Build.0 = Release|Any CPU + {32AE19FB-7D9E-4AC7-A0A5-80DED3680369}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32AE19FB-7D9E-4AC7-A0A5-80DED3680369}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32AE19FB-7D9E-4AC7-A0A5-80DED3680369}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32AE19FB-7D9E-4AC7-A0A5-80DED3680369}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3511FD7F-508F-4E9A-ABEB-7F7656961728} + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {939EFFA5-462B-4F5F-969A-61B4C424407A} = {154421CC-393F-4BDC-8D6D-7EECB28FD874} + {9B017849-C756-4B98-9B98-885AEBE9EAD4} = {154421CC-393F-4BDC-8D6D-7EECB28FD874} + {CB53B78C-7AB2-4B39-98B0-394778AF882F} = {154421CC-393F-4BDC-8D6D-7EECB28FD874} + {32AE19FB-7D9E-4AC7-A0A5-80DED3680369} = {154421CC-393F-4BDC-8D6D-7EECB28FD874} + {18D4A0EA-02CE-4FEA-A641-848A13603040} = {C0ECDBEB-FC7B-4F3C-AF8F-D0961BD22F61} + {9D663AC9-2CD8-4114-A802-D12284662FF0} = {18D4A0EA-02CE-4FEA-A641-848A13603040} + {FD5B9284-4689-48BE-B520-633C7269F97C} = {18D4A0EA-02CE-4FEA-A641-848A13603040} + EndGlobalSection +EndGlobal diff --git a/assets/vendor/heroicons/LICENSE.md b/LICENSE similarity index 95% rename from assets/vendor/heroicons/LICENSE.md rename to LICENSE index 1ac3e40..bdb77f7 100644 --- a/assets/vendor/heroicons/LICENSE.md +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 Refactoring UI Inc. +Copyright (c) 2024 Helldivers 2 Community Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/README.md b/README.md index 48302b1..52ccc29 100644 --- a/README.md +++ b/README.md @@ -1,95 +1,54 @@ -# Helldivers2 -[![Fly Deploy](https://github.com/dealloc/helldivers2-api/actions/workflows/fly.yml/badge.svg)](https://github.com/dealloc/helldivers2-api/actions/workflows/fly.yml) -[![Docs](https://img.shields.io/badge/hex-docs-lightgreen.svg)](https://dealloc.github.io/helldivers2-api) -[![CI](https://github.com/dealloc/helldivers2-api/actions/workflows/elixir.yml/badge.svg)](https://github.com/dealloc/helldivers2-api/actions/workflows/elixir.yml) +# helldivers-2/api -This is a reverse engineered API of the official [Helldivers 2](https://store.steampowered.com/agecheck/app/553850/) video game. +The `helldivers-2/api` project is a community API around the popular video game +[Helldivers 2](https://store.steampowered.com/app/553850/HELLDIVERS_2/?curator_clanid=33602140) by ArrowHead studios. +It provides (most) information you can also find in-game in a neat JSON format so you can build awesome applications +(see [Community](#community) below). -This is **NOT** an official *nor* endorsed API and may stop functioning at any time. +Important to note is that this is **not** an officially endorsed API and is in **no** way affiliated with ArrowHead studios, +but rather a community driven effort to provide the information of Helldivers 2 to it's community. -> [!TIP] -> Hitting rate limits? You can run a local docker image, see [Local development](#running-in-docker--podman) +### Getting started +The API does not require authentication (unless you'd like higher rate limits than the default, see [rate limits](#rate-limits)), +so all you need to do is call it's publicly available endpoints. -> [!TIP] -> Want to contribute even though you aren't a developer or don't know [Elixir](https://elixir-lang.org/)? -> You can help by finding more planet names, notifying us of new ongoing events -> or suggesting features! +We provide an [OpenAPI](src/Helldivers-2-API/wwwroot/Helldivers-2-API.json) specification of the community API as well as +a [SwaggerUI](https://helldivers-2.fly.dev/swagger-ui.html) (which visualizes the OpenAPI document). We also provide an +[OpenAPI](src/Helldivers-2-API/wwwroot/Helldivers-2-API_arrowhead.json) of the official ArrowHead studio's API we use +internally, however we strongly encourage you to use the `/raw` endpoints of the community wrapper instead of accessing +the ArrowHead API directly, as it puts additional load on their servers (besides, we have shinier endpoints, I swear!). -### Getting started -Currently the API does not enforce authentication. -You can see all active war seasons at `/api/` +The root URL of the API is available here: https://helldivers-2-dotnet.fly.dev/ +> [!WARNING] +> Note that it might change as we are transitioning from the Elixir version to a new version! + +We also ask that you send us a `User-Agent` header when making requests (if accessing directly from the browser, +the headers sent by those should suffice and you don't need to add anything special). +While this is currently not *required*, we are considering making this required in the future, so adding it now +is the safer option. -We provide an OpenApi specification which you can download at [`/api/openapi`](https://helldivers-2.fly.dev/api/openapi) +We also ask that you include an `X-Application-Contact` header with either a Discord, email or other contact handle +so we know how to reach out to you (see below). -We also provide a SwaggerUI view on the above specification [here](https://helldivers-2.fly.dev/api/swaggerui). +We ask this so we can identify the applications making requests, and so we can reach out in case we notice weird or +incorrect behaviour (or we notice you're generating more traffic than we can handle). -### Rate limit -Currently the rate limit is set at 100 requests/5 minutes. -This limit will probably be increased in the future, but given the limited API endpoints available this should be sufficient. +### Rate limits +Currently the rate limit is set at 5 requests/10 seconds. +This limit will probably be increased in the future, and is used during the transition to our new version. To avoid hitting rate limits in your clients check the following headers in your response: - `X-Ratelimit-Limit` contains the total amount of requests you can make in the given timeframe - `X-RateLimit-Remaining` how many requests you can still make in the current window -- `X-RateLimit-Reset` the unix epoch (in milliseconds) when you can start making more requests - `Retry-After` only added to 429 requests, the amount of seconds to wait before making a new request -### Roadmap -- [X] map /WarInfo & /Status -- [X] Provide endpoint for fetching WarInfo -- [X] Provide endpoint for fetching War status -- [X] Provide endpoint for fetching planet information -- [X] Provide endpoint for querying planets -- [ ] Provide endpoints for all mapped entities -- [ ] reverse-engineer entire Helldivers 2 API -- [X] tests -- [ ] health checks - -### Goals -It aims to achieve 2 things: -- Provide developers with an easy to use API into the Helldivers stats -- Cache the amount of API calls so that Helldivers' servers don't get overloaded *further* - -### Local development -You'll need to have [Elixir](https://elixir-lang.org/install.html) installed, and I recommend following [Phoenix's](https://hexdocs.pm/phoenix/installation.html) installation guide. - -Once you have cloned the local repository, set up everything with -```shell -mix setup -``` - -You can run an interactive shell and the application with -```shell -iex -S mix phx.server -``` - -### Running in Docker / Podman -Want to run a private instance of the API, or simply want a local container without rate limits -so you can develop your app without being hit with rate limits constantly? - -Fortunately, it's very easy to get a local/private copy of the Helldivers 2 API running! -All you need is to have either [Docker](https://www.docker.com/) or [Podman](https://podman.io/) installed. - -You can build a local image like this (takes a few minutes, but you only need to re-run this when something changes): -```shell -# Docker -docker build -t helldivers2:latest . -# Or if you're using Podman -podman build -t helldivers2:latest . -``` - -Now to run this container, you'll need a few variables to configure how the API behaves (TLDR below!): -- `SECRET_KEY_BASE` used by the application for signing private or sensitive information, if you're running a private instance publicly you'll want a secure random string of 64 characters -- `FLY_APP_NAME` used internally for networking code to find other instances (you can just use `helldivers-2` for this) -- `FLY_IMAGE_REF` the container reference, this helps cluster to only the same version of the app (you can set this to `0`) -- `FLY_PRIVATE_IP` - used to uniquely identify this node in the cluster (if you're running a single instance you can use `127.0.0.1`) -- `RATE_LIMIT_MAX_REQUESTS` - (optional) the max amount of requests the rate limit will allow, set to `0` to disable rate limiting -- `RATE_LIMIT_INTERVAL` - (optional) how many seconds before the rate limit will reset itself (must be a valid number greater than `0`) -- `ENABLE_IPV6` - disables IPv6, use this if your host is incompatible with IPv6 (see [#7](https://github.com/dealloc/helldivers2-api/issues/7)) +### Contributing +make sure to check out our [contribution](CONTRIBUTING.md) guidelines for more detailed information on how to +help us contributing! -or if you're just setting up a local development instance, you can copy paste the command below: -```shell -# Docker -docker run -e SECRET_KEY_BASE=JlU7vU9xt9uWbf82Z9HrUjAuNGtqwqG8h8AaUc3AOyH0a86wa5Q4DITNLorGmILv -e FLY_APP_NAME=helldivers-2 -e FLY_IMAGE_REF=0 -e FLY_PRIVATE_IP=127.0.0.1 -p 4000:4000 helldivers2:latest -# Or if you're using Podman -podman run -e SECRET_KEY_BASE=JlU7vU9xt9uWbf82Z9HrUjAuNGtqwqG8h8AaUc3AOyH0a86wa5Q4DITNLorGmILv -e FLY_APP_NAME=helldivers-2 -e FLY_IMAGE_REF=0 -e FLY_PRIVATE_IP=127.0.0.1 -p 4000:4000 helldivers2:latest -``` \ No newline at end of file +### Community +Check out some awesome projects made by our community! +- [sebsebmc/helldivers-history](https://github.com/sebsebmc/helldivers-history) + Dashboard and graphs made by git scraping the community made API +- [stonemercy/galactic-wide-web](https://github.com/Stonemercy/Galactic-Wide-Web) + The Galactic Wide Web - a discord bot diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..70e3900 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,9 @@ +# Reporting security issues +We take security very seriously and appreciate your efforts in responsibly disclosing your findings. +We will make every effort to acknowledge your contributions to the safety of the API. + +To report a security issue related to either ArrowHead's API or the unofficial community wrapper, please use +Github Security Advisory ["Report a Vulnerability"](https://github.com/helldivers-2/api/security/advisories/new) tab. + +This will notify the relevant maintainers and action will be taken as soon as possible. +We will also try to acknowledge receiving your report as soon as possible. diff --git a/assets/css/app.css b/assets/css/app.css deleted file mode 100644 index 378c8f9..0000000 --- a/assets/css/app.css +++ /dev/null @@ -1,5 +0,0 @@ -@import "tailwindcss/base"; -@import "tailwindcss/components"; -@import "tailwindcss/utilities"; - -/* This file is for your main application CSS */ diff --git a/assets/js/app.js b/assets/js/app.js deleted file mode 100644 index df0cdd9..0000000 --- a/assets/js/app.js +++ /dev/null @@ -1,41 +0,0 @@ -// If you want to use Phoenix channels, run `mix help phx.gen.channel` -// to get started and then uncomment the line below. -// import "./user_socket.js" - -// You can include dependencies in two ways. -// -// The simplest option is to put them in assets/vendor and -// import them using relative paths: -// -// import "../vendor/some-package.js" -// -// Alternatively, you can `npm install some-package --prefix assets` and import -// them using a path starting with the package name: -// -// import "some-package" -// - -// Include phoenix_html to handle method=PUT/DELETE in forms and buttons. -import "phoenix_html" -// Establish Phoenix Socket and LiveView configuration. -import {Socket} from "phoenix" -import {LiveSocket} from "phoenix_live_view" -import topbar from "../vendor/topbar" - -let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") -let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}}) - -// Show progress bar on live navigation and form submits -topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"}) -window.addEventListener("phx:page-loading-start", _info => topbar.show(300)) -window.addEventListener("phx:page-loading-stop", _info => topbar.hide()) - -// connect if there are any LiveViews on the page -liveSocket.connect() - -// expose liveSocket on window for web console debug logs and latency simulation: -// >> liveSocket.enableDebug() -// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session -// >> liveSocket.disableLatencySim() -window.liveSocket = liveSocket - diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js deleted file mode 100644 index 47af041..0000000 --- a/assets/tailwind.config.js +++ /dev/null @@ -1,68 +0,0 @@ -// See the Tailwind configuration guide for advanced usage -// https://tailwindcss.com/docs/configuration - -const plugin = require("tailwindcss/plugin") -const fs = require("fs") -const path = require("path") - -module.exports = { - content: [ - "./js/**/*.js", - "../lib/helldivers_2_web.ex", - "../lib/helldivers_2_web/**/*.*ex" - ], - theme: { - extend: { - colors: { - brand: "#FD4F00", - } - }, - }, - plugins: [ - require("@tailwindcss/forms"), - // Allows prefixing tailwind classes with LiveView classes to add rules - // only when LiveView classes are applied, for example: - // - //
- // - plugin(({addVariant}) => addVariant("phx-no-feedback", [".phx-no-feedback&", ".phx-no-feedback &"])), - plugin(({addVariant}) => addVariant("phx-click-loading", [".phx-click-loading&", ".phx-click-loading &"])), - plugin(({addVariant}) => addVariant("phx-submit-loading", [".phx-submit-loading&", ".phx-submit-loading &"])), - plugin(({addVariant}) => addVariant("phx-change-loading", [".phx-change-loading&", ".phx-change-loading &"])), - - // Embeds Heroicons (https://heroicons.com) into your app.css bundle - // See your `CoreComponents.icon/1` for more information. - // - plugin(function({matchComponents, theme}) { - let iconsDir = path.join(__dirname, "./vendor/heroicons/optimized") - let values = {} - let icons = [ - ["", "/24/outline"], - ["-solid", "/24/solid"], - ["-mini", "/20/solid"] - ] - icons.forEach(([suffix, dir]) => { - fs.readdirSync(path.join(iconsDir, dir)).forEach(file => { - let name = path.basename(file, ".svg") + suffix - values[name] = {name, fullPath: path.join(iconsDir, dir, file)} - }) - }) - matchComponents({ - "hero": ({name, fullPath}) => { - let content = fs.readFileSync(fullPath).toString().replace(/\r?\n|\r/g, "") - return { - [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, - "-webkit-mask": `var(--hero-${name})`, - "mask": `var(--hero-${name})`, - "mask-repeat": "no-repeat", - "background-color": "currentColor", - "vertical-align": "middle", - "display": "inline-block", - "width": theme("spacing.5"), - "height": theme("spacing.5") - } - } - }, {values}) - }) - ] -} diff --git a/assets/vendor/heroicons/UPGRADE.md b/assets/vendor/heroicons/UPGRADE.md deleted file mode 100644 index 5a140b9..0000000 --- a/assets/vendor/heroicons/UPGRADE.md +++ /dev/null @@ -1,6 +0,0 @@ -You are running heroicons v2.0.16. To upgrade in place, you can run the following command, -where your `HERO_VSN` export is your desired version: - - export HERO_VSN="2.0.16" ; \ - curl -L "https://github.com/tailwindlabs/heroicons/archive/refs/tags/v${HERO_VSN}.tar.gz" | \ - tar -xvz --strip-components=1 heroicons-${HERO_VSN}/optimized diff --git a/assets/vendor/heroicons/optimized/20/solid/academic-cap.svg b/assets/vendor/heroicons/optimized/20/solid/academic-cap.svg deleted file mode 100644 index bb980e6..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/academic-cap.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg b/assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg deleted file mode 100644 index 13f9251..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg b/assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg deleted file mode 100644 index 6f75b6c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg deleted file mode 100644 index 5ccef9d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg deleted file mode 100644 index 73acbef..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/archive-box.svg b/assets/vendor/heroicons/optimized/20/solid/archive-box.svg deleted file mode 100644 index 2205ae8..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/archive-box.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg deleted file mode 100644 index bb21a89..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg deleted file mode 100644 index f0c3624..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg deleted file mode 100644 index d9c4db0..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg deleted file mode 100644 index 4e8ee0f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg deleted file mode 100644 index 65cdada..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg deleted file mode 100644 index 5c3589d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down.svg deleted file mode 100644 index 8d577b1..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg deleted file mode 100644 index 8cce243..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg deleted file mode 100644 index 74d0699..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-left.svg deleted file mode 100644 index c7efd30..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg deleted file mode 100644 index d263061..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg deleted file mode 100644 index 297553c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg deleted file mode 100644 index eea945e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg deleted file mode 100644 index 193ff97..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg deleted file mode 100644 index 7d3deb5..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-path.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-path.svg deleted file mode 100644 index 1a31b4c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-path.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg deleted file mode 100644 index 4178da9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg deleted file mode 100644 index 27c4dff..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-right.svg deleted file mode 100644 index 95cc517..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg deleted file mode 100644 index b986c6c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg deleted file mode 100644 index 0cb7e71..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg deleted file mode 100644 index 16beb5e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg deleted file mode 100644 index 7fda0e5..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg deleted file mode 100644 index c93df54..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg deleted file mode 100644 index 5ec7c03..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg deleted file mode 100644 index 67af2cc..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg deleted file mode 100644 index 21d87f2..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg deleted file mode 100644 index fb50038..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg deleted file mode 100644 index 0df0ed2..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg deleted file mode 100644 index 01f18a8..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg deleted file mode 100644 index 4841916..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg deleted file mode 100644 index 832afe5..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up.svg deleted file mode 100644 index 24b12b7..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg deleted file mode 100644 index 6839676..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg deleted file mode 100644 index 6691aa4..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg deleted file mode 100644 index 9a6e23b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg deleted file mode 100644 index 8e65bf8..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg deleted file mode 100644 index 6275807..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg deleted file mode 100644 index 14e1bcd..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg deleted file mode 100644 index 87616d3..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg deleted file mode 100644 index b9c43d9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/at-symbol.svg b/assets/vendor/heroicons/optimized/20/solid/at-symbol.svg deleted file mode 100644 index a9e960d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/at-symbol.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/backspace.svg b/assets/vendor/heroicons/optimized/20/solid/backspace.svg deleted file mode 100644 index d3c1686..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/backspace.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/backward.svg b/assets/vendor/heroicons/optimized/20/solid/backward.svg deleted file mode 100644 index 8d341b2..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/backward.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/banknotes.svg b/assets/vendor/heroicons/optimized/20/solid/banknotes.svg deleted file mode 100644 index 979c586..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/banknotes.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-2.svg b/assets/vendor/heroicons/optimized/20/solid/bars-2.svg deleted file mode 100644 index 4ce1e19..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bars-2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg deleted file mode 100644 index ebf785d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg deleted file mode 100644 index af69c3d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg deleted file mode 100644 index ee8a526..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3.svg deleted file mode 100644 index d164cfd..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bars-3.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-4.svg b/assets/vendor/heroicons/optimized/20/solid/bars-4.svg deleted file mode 100644 index 8e3f650..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bars-4.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg deleted file mode 100644 index fd8f98d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg deleted file mode 100644 index ba77dbe..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/battery-0.svg b/assets/vendor/heroicons/optimized/20/solid/battery-0.svg deleted file mode 100644 index 2320f7e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/battery-0.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/battery-100.svg b/assets/vendor/heroicons/optimized/20/solid/battery-100.svg deleted file mode 100644 index e04408f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/battery-100.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/battery-50.svg b/assets/vendor/heroicons/optimized/20/solid/battery-50.svg deleted file mode 100644 index e5e8498..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/battery-50.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/beaker.svg b/assets/vendor/heroicons/optimized/20/solid/beaker.svg deleted file mode 100644 index 025c46b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/beaker.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bell-alert.svg b/assets/vendor/heroicons/optimized/20/solid/bell-alert.svg deleted file mode 100644 index c84dc7c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bell-alert.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bell-slash.svg b/assets/vendor/heroicons/optimized/20/solid/bell-slash.svg deleted file mode 100644 index a4296ac..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bell-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg b/assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg deleted file mode 100644 index ad4f8c5..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bell.svg b/assets/vendor/heroicons/optimized/20/solid/bell.svg deleted file mode 100644 index 2a81bba..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bell.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg b/assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg deleted file mode 100644 index e4c2499..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bolt.svg b/assets/vendor/heroicons/optimized/20/solid/bolt.svg deleted file mode 100644 index 53f4fb9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bolt.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/book-open.svg b/assets/vendor/heroicons/optimized/20/solid/book-open.svg deleted file mode 100644 index 99cf0d4..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/book-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg b/assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg deleted file mode 100644 index 1442fd4..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg b/assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg deleted file mode 100644 index 849c425..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bookmark.svg b/assets/vendor/heroicons/optimized/20/solid/bookmark.svg deleted file mode 100644 index a3e68de..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bookmark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/briefcase.svg b/assets/vendor/heroicons/optimized/20/solid/briefcase.svg deleted file mode 100644 index 275f4b3..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/briefcase.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/bug-ant.svg b/assets/vendor/heroicons/optimized/20/solid/bug-ant.svg deleted file mode 100644 index bc86615..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/bug-ant.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/building-library.svg b/assets/vendor/heroicons/optimized/20/solid/building-library.svg deleted file mode 100644 index 610bce7..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/building-library.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/building-office-2.svg b/assets/vendor/heroicons/optimized/20/solid/building-office-2.svg deleted file mode 100644 index b25c33d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/building-office-2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/building-office.svg b/assets/vendor/heroicons/optimized/20/solid/building-office.svg deleted file mode 100644 index 8fb3fab..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/building-office.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/building-storefront.svg b/assets/vendor/heroicons/optimized/20/solid/building-storefront.svg deleted file mode 100644 index 0d7da7c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/building-storefront.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cake.svg b/assets/vendor/heroicons/optimized/20/solid/cake.svg deleted file mode 100644 index c58d3b9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cake.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/calculator.svg b/assets/vendor/heroicons/optimized/20/solid/calculator.svg deleted file mode 100644 index cc26160..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/calculator.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/calendar-days.svg b/assets/vendor/heroicons/optimized/20/solid/calendar-days.svg deleted file mode 100644 index ded2318..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/calendar-days.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/calendar.svg b/assets/vendor/heroicons/optimized/20/solid/calendar.svg deleted file mode 100644 index dea374d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/calendar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/camera.svg b/assets/vendor/heroicons/optimized/20/solid/camera.svg deleted file mode 100644 index 17356ae..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg b/assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg deleted file mode 100644 index 6d5b976..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chart-bar.svg b/assets/vendor/heroicons/optimized/20/solid/chart-bar.svg deleted file mode 100644 index c496112..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chart-pie.svg b/assets/vendor/heroicons/optimized/20/solid/chart-pie.svg deleted file mode 100644 index 37d18c9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chart-pie.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg deleted file mode 100644 index fee91be..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg deleted file mode 100644 index 24de840..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg deleted file mode 100644 index 7e2b06c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg deleted file mode 100644 index fceca7f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg deleted file mode 100644 index cd706f9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg deleted file mode 100644 index 88d9c32..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg deleted file mode 100644 index f3b3883..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/check-badge.svg b/assets/vendor/heroicons/optimized/20/solid/check-badge.svg deleted file mode 100644 index b13190c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/check-badge.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/check-circle.svg b/assets/vendor/heroicons/optimized/20/solid/check-circle.svg deleted file mode 100644 index dbbc905..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/check-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/check.svg b/assets/vendor/heroicons/optimized/20/solid/check.svg deleted file mode 100644 index d1956aa..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg deleted file mode 100644 index 3c65193..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg deleted file mode 100644 index a41e615..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg deleted file mode 100644 index d78c932..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg deleted file mode 100644 index f7ac668..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-down.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-down.svg deleted file mode 100644 index 6b63dfb..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chevron-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-left.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-left.svg deleted file mode 100644 index b484a40..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chevron-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-right.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-right.svg deleted file mode 100644 index 9ce3745..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chevron-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg deleted file mode 100644 index 2499bb1..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-up.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-up.svg deleted file mode 100644 index 8aaaa1f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/chevron-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/circle-stack.svg b/assets/vendor/heroicons/optimized/20/solid/circle-stack.svg deleted file mode 100644 index fae2090..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/circle-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg deleted file mode 100644 index 2447012..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg deleted file mode 100644 index a78b24c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg deleted file mode 100644 index f29a433..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard.svg deleted file mode 100644 index 3b2a7ff..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/clipboard.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/clock.svg b/assets/vendor/heroicons/optimized/20/solid/clock.svg deleted file mode 100644 index d72dd62..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/clock.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg deleted file mode 100644 index cb32c04..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg deleted file mode 100644 index 06b2c4a..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cloud.svg b/assets/vendor/heroicons/optimized/20/solid/cloud.svg deleted file mode 100644 index c5eb0c8..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cloud.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg b/assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg deleted file mode 100644 index e4e3530..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/code-bracket.svg b/assets/vendor/heroicons/optimized/20/solid/code-bracket.svg deleted file mode 100644 index 4adfd32..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/code-bracket.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg b/assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg deleted file mode 100644 index 435032f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg b/assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg deleted file mode 100644 index 0450feb..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cog.svg b/assets/vendor/heroicons/optimized/20/solid/cog.svg deleted file mode 100644 index 10f43b5..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cog.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/command-line.svg b/assets/vendor/heroicons/optimized/20/solid/command-line.svg deleted file mode 100644 index 59cf34c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/command-line.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg b/assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg deleted file mode 100644 index 4eeac1b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg b/assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg deleted file mode 100644 index f7c49b4..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/credit-card.svg b/assets/vendor/heroicons/optimized/20/solid/credit-card.svg deleted file mode 100644 index d650fea..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/credit-card.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg b/assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg deleted file mode 100644 index bfe9dae..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cube.svg b/assets/vendor/heroicons/optimized/20/solid/cube.svg deleted file mode 100644 index c3436ed..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cube.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg b/assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg deleted file mode 100644 index 2a27260..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg b/assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg deleted file mode 100644 index 1b00de7..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-euro.svg b/assets/vendor/heroicons/optimized/20/solid/currency-euro.svg deleted file mode 100644 index 43fda8e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/currency-euro.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-pound.svg b/assets/vendor/heroicons/optimized/20/solid/currency-pound.svg deleted file mode 100644 index 9bc57fe..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/currency-pound.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg b/assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg deleted file mode 100644 index 67da528..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-yen.svg b/assets/vendor/heroicons/optimized/20/solid/currency-yen.svg deleted file mode 100644 index 68fca06..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/currency-yen.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg deleted file mode 100644 index d2d36a7..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg deleted file mode 100644 index 89ccfda..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg b/assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg deleted file mode 100644 index 68fac4f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/device-tablet.svg b/assets/vendor/heroicons/optimized/20/solid/device-tablet.svg deleted file mode 100644 index 2490e1f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/device-tablet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg deleted file mode 100644 index a51461d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg deleted file mode 100644 index d55aacd..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg b/assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg deleted file mode 100644 index 8d5f60a..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document-check.svg b/assets/vendor/heroicons/optimized/20/solid/document-check.svg deleted file mode 100644 index b28da14..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document-check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg b/assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg deleted file mode 100644 index 64768cf..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg b/assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg deleted file mode 100644 index 0dc8eba..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document-minus.svg b/assets/vendor/heroicons/optimized/20/solid/document-minus.svg deleted file mode 100644 index bf7af06..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document-plus.svg b/assets/vendor/heroicons/optimized/20/solid/document-plus.svg deleted file mode 100644 index 133cc82..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document-text.svg b/assets/vendor/heroicons/optimized/20/solid/document-text.svg deleted file mode 100644 index f7d91ba..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document-text.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/document.svg b/assets/vendor/heroicons/optimized/20/solid/document.svg deleted file mode 100644 index aa7070c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/document.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg deleted file mode 100644 index 799cf88..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg deleted file mode 100644 index a82211c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg b/assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg deleted file mode 100644 index ac9c83f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/envelope-open.svg b/assets/vendor/heroicons/optimized/20/solid/envelope-open.svg deleted file mode 100644 index a60035b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/envelope-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/envelope.svg b/assets/vendor/heroicons/optimized/20/solid/envelope.svg deleted file mode 100644 index b582b8f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/envelope.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg b/assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg deleted file mode 100644 index 3cf5b59..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg b/assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg deleted file mode 100644 index a6cc02f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg b/assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg deleted file mode 100644 index cce0833..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/eye-slash.svg b/assets/vendor/heroicons/optimized/20/solid/eye-slash.svg deleted file mode 100644 index cc2e222..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/eye-slash.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/eye.svg b/assets/vendor/heroicons/optimized/20/solid/eye.svg deleted file mode 100644 index b17cec9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/eye.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/face-frown.svg b/assets/vendor/heroicons/optimized/20/solid/face-frown.svg deleted file mode 100644 index 8cbb3b3..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/face-frown.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/face-smile.svg b/assets/vendor/heroicons/optimized/20/solid/face-smile.svg deleted file mode 100644 index 434c83e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/face-smile.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/film.svg b/assets/vendor/heroicons/optimized/20/solid/film.svg deleted file mode 100644 index 9573445..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/film.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/finger-print.svg b/assets/vendor/heroicons/optimized/20/solid/finger-print.svg deleted file mode 100644 index 409d67e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/finger-print.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/fire.svg b/assets/vendor/heroicons/optimized/20/solid/fire.svg deleted file mode 100644 index 88fb85e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/fire.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/flag.svg b/assets/vendor/heroicons/optimized/20/solid/flag.svg deleted file mode 100644 index b790f05..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/flag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg deleted file mode 100644 index 4c2a915..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-minus.svg b/assets/vendor/heroicons/optimized/20/solid/folder-minus.svg deleted file mode 100644 index 248388b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/folder-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-open.svg b/assets/vendor/heroicons/optimized/20/solid/folder-open.svg deleted file mode 100644 index 79d245e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/folder-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-plus.svg b/assets/vendor/heroicons/optimized/20/solid/folder-plus.svg deleted file mode 100644 index 0780a54..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/folder-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/folder.svg b/assets/vendor/heroicons/optimized/20/solid/folder.svg deleted file mode 100644 index c92e0ff..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/folder.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/forward.svg b/assets/vendor/heroicons/optimized/20/solid/forward.svg deleted file mode 100644 index 11fd161..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/forward.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/funnel.svg b/assets/vendor/heroicons/optimized/20/solid/funnel.svg deleted file mode 100644 index af3078f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/funnel.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/gif.svg b/assets/vendor/heroicons/optimized/20/solid/gif.svg deleted file mode 100644 index ff1cd38..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/gif.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/gift-top.svg b/assets/vendor/heroicons/optimized/20/solid/gift-top.svg deleted file mode 100644 index d650d04..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/gift-top.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/gift.svg b/assets/vendor/heroicons/optimized/20/solid/gift.svg deleted file mode 100644 index 90362ab..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/gift.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-alt.svg b/assets/vendor/heroicons/optimized/20/solid/globe-alt.svg deleted file mode 100644 index c8ff599..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/globe-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-americas.svg b/assets/vendor/heroicons/optimized/20/solid/globe-americas.svg deleted file mode 100644 index 7de8723..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/globe-americas.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg b/assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg deleted file mode 100644 index b3da4dd..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg b/assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg deleted file mode 100644 index 92db1e1..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/hand-raised.svg b/assets/vendor/heroicons/optimized/20/solid/hand-raised.svg deleted file mode 100644 index caa27db..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/hand-raised.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg deleted file mode 100644 index 06ffbe0..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg deleted file mode 100644 index 3d67d98..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/hashtag.svg b/assets/vendor/heroicons/optimized/20/solid/hashtag.svg deleted file mode 100644 index 29c9f10..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/hashtag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/heart.svg b/assets/vendor/heroicons/optimized/20/solid/heart.svg deleted file mode 100644 index 96e63d9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/heart.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/home-modern.svg b/assets/vendor/heroicons/optimized/20/solid/home-modern.svg deleted file mode 100644 index 95033a3..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/home-modern.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/home.svg b/assets/vendor/heroicons/optimized/20/solid/home.svg deleted file mode 100644 index ae2acdc..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/home.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/identification.svg b/assets/vendor/heroicons/optimized/20/solid/identification.svg deleted file mode 100644 index 7a8338c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/identification.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg deleted file mode 100644 index 37f464e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg b/assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg deleted file mode 100644 index b8f22d1..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/inbox.svg b/assets/vendor/heroicons/optimized/20/solid/inbox.svg deleted file mode 100644 index 87ae30d..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/inbox.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/information-circle.svg b/assets/vendor/heroicons/optimized/20/solid/information-circle.svg deleted file mode 100644 index 25ac644..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/information-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/key.svg b/assets/vendor/heroicons/optimized/20/solid/key.svg deleted file mode 100644 index 97e8ad8..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/key.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/language.svg b/assets/vendor/heroicons/optimized/20/solid/language.svg deleted file mode 100644 index e7524be..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/language.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg b/assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg deleted file mode 100644 index 79134c1..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/light-bulb.svg b/assets/vendor/heroicons/optimized/20/solid/light-bulb.svg deleted file mode 100644 index 415e374..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/light-bulb.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/link.svg b/assets/vendor/heroicons/optimized/20/solid/link.svg deleted file mode 100644 index e820413..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/link.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/list-bullet.svg b/assets/vendor/heroicons/optimized/20/solid/list-bullet.svg deleted file mode 100644 index 3637934..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/list-bullet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/lock-closed.svg b/assets/vendor/heroicons/optimized/20/solid/lock-closed.svg deleted file mode 100644 index e7e1dc1..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/lock-closed.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/lock-open.svg b/assets/vendor/heroicons/optimized/20/solid/lock-open.svg deleted file mode 100644 index 2ac4b14..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/lock-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg deleted file mode 100644 index e025769..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg deleted file mode 100644 index a8fb7a2..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg deleted file mode 100644 index e55fc4c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg deleted file mode 100644 index d90520a..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/map-pin.svg b/assets/vendor/heroicons/optimized/20/solid/map-pin.svg deleted file mode 100644 index 7adc8a9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/map-pin.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/map.svg b/assets/vendor/heroicons/optimized/20/solid/map.svg deleted file mode 100644 index 7e25c7b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/map.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/megaphone.svg b/assets/vendor/heroicons/optimized/20/solid/megaphone.svg deleted file mode 100644 index cf73785..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/megaphone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/microphone.svg b/assets/vendor/heroicons/optimized/20/solid/microphone.svg deleted file mode 100644 index 635ded0..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/microphone.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/minus-circle.svg b/assets/vendor/heroicons/optimized/20/solid/minus-circle.svg deleted file mode 100644 index 5c361e2..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/minus-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/minus-small.svg b/assets/vendor/heroicons/optimized/20/solid/minus-small.svg deleted file mode 100644 index 4e041d3..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/minus-small.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/minus.svg b/assets/vendor/heroicons/optimized/20/solid/minus.svg deleted file mode 100644 index 6d8dd24..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/moon.svg b/assets/vendor/heroicons/optimized/20/solid/moon.svg deleted file mode 100644 index b592110..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/moon.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/musical-note.svg b/assets/vendor/heroicons/optimized/20/solid/musical-note.svg deleted file mode 100644 index c7f0aa8..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/musical-note.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/newspaper.svg b/assets/vendor/heroicons/optimized/20/solid/newspaper.svg deleted file mode 100644 index be785e3..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/newspaper.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/no-symbol.svg b/assets/vendor/heroicons/optimized/20/solid/no-symbol.svg deleted file mode 100644 index 8463da2..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/no-symbol.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/paint-brush.svg b/assets/vendor/heroicons/optimized/20/solid/paint-brush.svg deleted file mode 100644 index c2db8c0..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/paint-brush.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg b/assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg deleted file mode 100644 index 35315ad..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/paper-clip.svg b/assets/vendor/heroicons/optimized/20/solid/paper-clip.svg deleted file mode 100644 index b38155e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/paper-clip.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/pause-circle.svg b/assets/vendor/heroicons/optimized/20/solid/pause-circle.svg deleted file mode 100644 index 732530a..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/pause-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/pause.svg b/assets/vendor/heroicons/optimized/20/solid/pause.svg deleted file mode 100644 index b6544ba..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/pause.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/pencil-square.svg b/assets/vendor/heroicons/optimized/20/solid/pencil-square.svg deleted file mode 100644 index 129ee44..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/pencil-square.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/pencil.svg b/assets/vendor/heroicons/optimized/20/solid/pencil.svg deleted file mode 100644 index fa50498..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/pencil.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg deleted file mode 100644 index feeb636..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg deleted file mode 100644 index e1d9331..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg deleted file mode 100644 index 6f1fd36..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/phone.svg b/assets/vendor/heroicons/optimized/20/solid/phone.svg deleted file mode 100644 index 5fd57fc..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/phone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/photo.svg b/assets/vendor/heroicons/optimized/20/solid/photo.svg deleted file mode 100644 index db063d3..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/photo.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/play-circle.svg b/assets/vendor/heroicons/optimized/20/solid/play-circle.svg deleted file mode 100644 index d1587b7..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/play-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/play-pause.svg b/assets/vendor/heroicons/optimized/20/solid/play-pause.svg deleted file mode 100644 index cdfa63b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/play-pause.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/play.svg b/assets/vendor/heroicons/optimized/20/solid/play.svg deleted file mode 100644 index 2cd53e1..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/play.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/plus-circle.svg b/assets/vendor/heroicons/optimized/20/solid/plus-circle.svg deleted file mode 100644 index 3925a14..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/plus-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/plus-small.svg b/assets/vendor/heroicons/optimized/20/solid/plus-small.svg deleted file mode 100644 index eb22598..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/plus-small.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/plus.svg b/assets/vendor/heroicons/optimized/20/solid/plus.svg deleted file mode 100644 index 218ab93..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/power.svg b/assets/vendor/heroicons/optimized/20/solid/power.svg deleted file mode 100644 index 1603820..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/power.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg deleted file mode 100644 index e1a4242..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg deleted file mode 100644 index 2e9281f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/printer.svg b/assets/vendor/heroicons/optimized/20/solid/printer.svg deleted file mode 100644 index 81d93dc..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/printer.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg b/assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg deleted file mode 100644 index e5329e5..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/qr-code.svg b/assets/vendor/heroicons/optimized/20/solid/qr-code.svg deleted file mode 100644 index d5daf2a..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/qr-code.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg b/assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg deleted file mode 100644 index 893dab5..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/queue-list.svg b/assets/vendor/heroicons/optimized/20/solid/queue-list.svg deleted file mode 100644 index 91f5b57..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/queue-list.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/radio.svg b/assets/vendor/heroicons/optimized/20/solid/radio.svg deleted file mode 100644 index 9a12c8b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/radio.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg b/assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg deleted file mode 100644 index 1a8f254..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg b/assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg deleted file mode 100644 index a134c56..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg b/assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg deleted file mode 100644 index 599d5f4..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg b/assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg deleted file mode 100644 index 94b5654..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg b/assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg deleted file mode 100644 index b97e89e..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/rss.svg b/assets/vendor/heroicons/optimized/20/solid/rss.svg deleted file mode 100644 index 538ae9a..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/rss.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/scale.svg b/assets/vendor/heroicons/optimized/20/solid/scale.svg deleted file mode 100644 index 60b0ed9..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/scale.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/scissors.svg b/assets/vendor/heroicons/optimized/20/solid/scissors.svg deleted file mode 100644 index 3122658..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/scissors.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/server-stack.svg b/assets/vendor/heroicons/optimized/20/solid/server-stack.svg deleted file mode 100644 index 2247dbe..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/server-stack.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/server.svg b/assets/vendor/heroicons/optimized/20/solid/server.svg deleted file mode 100644 index 6c8899b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/server.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/share.svg b/assets/vendor/heroicons/optimized/20/solid/share.svg deleted file mode 100644 index e5aafee..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/share.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/shield-check.svg b/assets/vendor/heroicons/optimized/20/solid/shield-check.svg deleted file mode 100644 index a8572d4..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/shield-check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg b/assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg deleted file mode 100644 index 8562de4..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg b/assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg deleted file mode 100644 index e70c815..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg b/assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg deleted file mode 100644 index 855a631..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/signal-slash.svg b/assets/vendor/heroicons/optimized/20/solid/signal-slash.svg deleted file mode 100644 index 822179a..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/signal-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/signal.svg b/assets/vendor/heroicons/optimized/20/solid/signal.svg deleted file mode 100644 index 7539204..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/signal.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/sparkles.svg b/assets/vendor/heroicons/optimized/20/solid/sparkles.svg deleted file mode 100644 index a247c94..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/sparkles.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg b/assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg deleted file mode 100644 index 2e6b3e0..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg deleted file mode 100644 index 0c39f61..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg b/assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg deleted file mode 100644 index 177d43a..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg b/assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg deleted file mode 100644 index 7d6b44f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg b/assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg deleted file mode 100644 index 47c1817..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/squares-plus.svg b/assets/vendor/heroicons/optimized/20/solid/squares-plus.svg deleted file mode 100644 index 019eb37..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/squares-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/star.svg b/assets/vendor/heroicons/optimized/20/solid/star.svg deleted file mode 100644 index a870365..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/star.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/stop-circle.svg b/assets/vendor/heroicons/optimized/20/solid/stop-circle.svg deleted file mode 100644 index 9167a64..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/stop-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/stop.svg b/assets/vendor/heroicons/optimized/20/solid/stop.svg deleted file mode 100644 index b0e40db..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/stop.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/sun.svg b/assets/vendor/heroicons/optimized/20/solid/sun.svg deleted file mode 100644 index 449e36c..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/sun.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/swatch.svg b/assets/vendor/heroicons/optimized/20/solid/swatch.svg deleted file mode 100644 index 1089548..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/swatch.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/table-cells.svg b/assets/vendor/heroicons/optimized/20/solid/table-cells.svg deleted file mode 100644 index aa8eacd..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/table-cells.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/tag.svg b/assets/vendor/heroicons/optimized/20/solid/tag.svg deleted file mode 100644 index d6c9c8b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/tag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/ticket.svg b/assets/vendor/heroicons/optimized/20/solid/ticket.svg deleted file mode 100644 index 7d04b01..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/ticket.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/trash.svg b/assets/vendor/heroicons/optimized/20/solid/trash.svg deleted file mode 100644 index 16bd5c6..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/trash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/trophy.svg b/assets/vendor/heroicons/optimized/20/solid/trophy.svg deleted file mode 100644 index e2ebdaf..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/trophy.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/truck.svg b/assets/vendor/heroicons/optimized/20/solid/truck.svg deleted file mode 100644 index a50085a..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/truck.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/tv.svg b/assets/vendor/heroicons/optimized/20/solid/tv.svg deleted file mode 100644 index b0c7209..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/tv.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/user-circle.svg b/assets/vendor/heroicons/optimized/20/solid/user-circle.svg deleted file mode 100644 index abd6c98..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/user-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/user-group.svg b/assets/vendor/heroicons/optimized/20/solid/user-group.svg deleted file mode 100644 index dc83736..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/user-group.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/user-minus.svg b/assets/vendor/heroicons/optimized/20/solid/user-minus.svg deleted file mode 100644 index b092b77..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/user-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/user-plus.svg b/assets/vendor/heroicons/optimized/20/solid/user-plus.svg deleted file mode 100644 index afd5965..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/user-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/user.svg b/assets/vendor/heroicons/optimized/20/solid/user.svg deleted file mode 100644 index 4d9b2ee..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/user.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/users.svg b/assets/vendor/heroicons/optimized/20/solid/users.svg deleted file mode 100644 index 43526a6..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/users.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/variable.svg b/assets/vendor/heroicons/optimized/20/solid/variable.svg deleted file mode 100644 index 3460817..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/variable.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg b/assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg deleted file mode 100644 index 95b9413..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/video-camera.svg b/assets/vendor/heroicons/optimized/20/solid/video-camera.svg deleted file mode 100644 index 4d22f16..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/video-camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/view-columns.svg b/assets/vendor/heroicons/optimized/20/solid/view-columns.svg deleted file mode 100644 index 1111492..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/view-columns.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg b/assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg deleted file mode 100644 index 5cfe9fb..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/wallet.svg b/assets/vendor/heroicons/optimized/20/solid/wallet.svg deleted file mode 100644 index 6ce8050..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/wallet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/wifi.svg b/assets/vendor/heroicons/optimized/20/solid/wifi.svg deleted file mode 100644 index f3c7118..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/wifi.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/window.svg b/assets/vendor/heroicons/optimized/20/solid/window.svg deleted file mode 100644 index 9110a2b..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/window.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg b/assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg deleted file mode 100644 index 2ad879f..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/wrench.svg b/assets/vendor/heroicons/optimized/20/solid/wrench.svg deleted file mode 100644 index 2643e00..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/wrench.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/x-circle.svg b/assets/vendor/heroicons/optimized/20/solid/x-circle.svg deleted file mode 100644 index a660014..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/x-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/20/solid/x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/x-mark.svg deleted file mode 100644 index 0635bac..0000000 --- a/assets/vendor/heroicons/optimized/20/solid/x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/academic-cap.svg b/assets/vendor/heroicons/optimized/24/outline/academic-cap.svg deleted file mode 100644 index fc18107..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/academic-cap.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg b/assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg deleted file mode 100644 index e859e5d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg b/assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg deleted file mode 100644 index 6153809..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg deleted file mode 100644 index 1a0a830..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg deleted file mode 100644 index 49bd087..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/archive-box.svg b/assets/vendor/heroicons/optimized/24/outline/archive-box.svg deleted file mode 100644 index 704f353..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/archive-box.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg deleted file mode 100644 index 248b0e8..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg deleted file mode 100644 index 262b5ff..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg deleted file mode 100644 index 42a5b84..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg deleted file mode 100644 index da1b827..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg deleted file mode 100644 index 9cc7a30..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg deleted file mode 100644 index a77546c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down.svg deleted file mode 100644 index b5b04fd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg deleted file mode 100644 index 849cc5f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg deleted file mode 100644 index 0d6a3cc..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-left.svg deleted file mode 100644 index 49f15d4..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg deleted file mode 100644 index eb7a92b..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg deleted file mode 100644 index d3e9005..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg deleted file mode 100644 index 413d6b5..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg deleted file mode 100644 index fb029f4..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg deleted file mode 100644 index 0cfe39e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-path.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-path.svg deleted file mode 100644 index 7da4fd2..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-path.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg deleted file mode 100644 index e7bcb80..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg deleted file mode 100644 index 2b49bec..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-right.svg deleted file mode 100644 index 8527a52..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg deleted file mode 100644 index 1f1a210..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg deleted file mode 100644 index 778cb17..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg deleted file mode 100644 index 1b5fc64..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg deleted file mode 100644 index 4ed197e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg deleted file mode 100644 index c4a9239..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg deleted file mode 100644 index aebbb18..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg deleted file mode 100644 index 868f3d3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg deleted file mode 100644 index 51340d6..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg deleted file mode 100644 index ba4e54e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg deleted file mode 100644 index 0d4d823..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg deleted file mode 100644 index 2c38ea0..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg deleted file mode 100644 index 0b7a372..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg deleted file mode 100644 index 448b853..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up.svg deleted file mode 100644 index e269624..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg deleted file mode 100644 index 51f9929..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg deleted file mode 100644 index b8f240e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg deleted file mode 100644 index ece5091..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg deleted file mode 100644 index b76c54b..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg deleted file mode 100644 index 0a8872d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg deleted file mode 100644 index 936ac45..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg deleted file mode 100644 index 18890f3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg deleted file mode 100644 index da4cdf3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/at-symbol.svg b/assets/vendor/heroicons/optimized/24/outline/at-symbol.svg deleted file mode 100644 index fe2f644..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/at-symbol.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/backspace.svg b/assets/vendor/heroicons/optimized/24/outline/backspace.svg deleted file mode 100644 index f76c5df..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/backspace.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/backward.svg b/assets/vendor/heroicons/optimized/24/outline/backward.svg deleted file mode 100644 index fb1da49..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/backward.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/banknotes.svg b/assets/vendor/heroicons/optimized/24/outline/banknotes.svg deleted file mode 100644 index 0603b0d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/banknotes.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-2.svg b/assets/vendor/heroicons/optimized/24/outline/bars-2.svg deleted file mode 100644 index 9c49ca2..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bars-2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg deleted file mode 100644 index e23bbc3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg deleted file mode 100644 index a0f683d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg deleted file mode 100644 index a8e83e1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3.svg deleted file mode 100644 index a7cf320..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bars-3.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-4.svg b/assets/vendor/heroicons/optimized/24/outline/bars-4.svg deleted file mode 100644 index f34bddf..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bars-4.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg deleted file mode 100644 index 200fd3a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg deleted file mode 100644 index d88bf4e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/battery-0.svg b/assets/vendor/heroicons/optimized/24/outline/battery-0.svg deleted file mode 100644 index fd2aa9d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/battery-0.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/battery-100.svg b/assets/vendor/heroicons/optimized/24/outline/battery-100.svg deleted file mode 100644 index ba012c6..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/battery-100.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/battery-50.svg b/assets/vendor/heroicons/optimized/24/outline/battery-50.svg deleted file mode 100644 index f6f9838..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/battery-50.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/beaker.svg b/assets/vendor/heroicons/optimized/24/outline/beaker.svg deleted file mode 100644 index 2d143fd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/beaker.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bell-alert.svg b/assets/vendor/heroicons/optimized/24/outline/bell-alert.svg deleted file mode 100644 index c4af427..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bell-alert.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bell-slash.svg b/assets/vendor/heroicons/optimized/24/outline/bell-slash.svg deleted file mode 100644 index 2df7520..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bell-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg b/assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg deleted file mode 100644 index 117de29..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bell.svg b/assets/vendor/heroicons/optimized/24/outline/bell.svg deleted file mode 100644 index 63ab153..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bell.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg b/assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg deleted file mode 100644 index 13af346..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bolt.svg b/assets/vendor/heroicons/optimized/24/outline/bolt.svg deleted file mode 100644 index 5e629fe..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bolt.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/book-open.svg b/assets/vendor/heroicons/optimized/24/outline/book-open.svg deleted file mode 100644 index a4153b6..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/book-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg b/assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg deleted file mode 100644 index f3ae625..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg b/assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg deleted file mode 100644 index 00e5cc3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bookmark.svg b/assets/vendor/heroicons/optimized/24/outline/bookmark.svg deleted file mode 100644 index 6d06e4f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bookmark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/briefcase.svg b/assets/vendor/heroicons/optimized/24/outline/briefcase.svg deleted file mode 100644 index adab6ff..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/briefcase.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/bug-ant.svg b/assets/vendor/heroicons/optimized/24/outline/bug-ant.svg deleted file mode 100644 index ac04fad..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/bug-ant.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/building-library.svg b/assets/vendor/heroicons/optimized/24/outline/building-library.svg deleted file mode 100644 index 4e2e1da..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/building-library.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/building-office-2.svg b/assets/vendor/heroicons/optimized/24/outline/building-office-2.svg deleted file mode 100644 index 45e063c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/building-office-2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/building-office.svg b/assets/vendor/heroicons/optimized/24/outline/building-office.svg deleted file mode 100644 index 0efd982..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/building-office.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/building-storefront.svg b/assets/vendor/heroicons/optimized/24/outline/building-storefront.svg deleted file mode 100644 index 31fca55..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/building-storefront.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cake.svg b/assets/vendor/heroicons/optimized/24/outline/cake.svg deleted file mode 100644 index a603e90..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cake.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/calculator.svg b/assets/vendor/heroicons/optimized/24/outline/calculator.svg deleted file mode 100644 index d97740e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/calculator.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/calendar-days.svg b/assets/vendor/heroicons/optimized/24/outline/calendar-days.svg deleted file mode 100644 index 64b5f8f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/calendar-days.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/calendar.svg b/assets/vendor/heroicons/optimized/24/outline/calendar.svg deleted file mode 100644 index 5e44911..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/calendar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/camera.svg b/assets/vendor/heroicons/optimized/24/outline/camera.svg deleted file mode 100644 index b8bdae3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/camera.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg b/assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg deleted file mode 100644 index d7fa42c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chart-bar.svg b/assets/vendor/heroicons/optimized/24/outline/chart-bar.svg deleted file mode 100644 index 27f20fa..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chart-pie.svg b/assets/vendor/heroicons/optimized/24/outline/chart-pie.svg deleted file mode 100644 index fa51c16..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chart-pie.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg deleted file mode 100644 index 4bc306e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg deleted file mode 100644 index d59d02a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg deleted file mode 100644 index 9a0ec73..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg deleted file mode 100644 index 4d366b8..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg deleted file mode 100644 index a41bf1e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg deleted file mode 100644 index 83d1751..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg deleted file mode 100644 index d0d0d89..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/check-badge.svg b/assets/vendor/heroicons/optimized/24/outline/check-badge.svg deleted file mode 100644 index 8d6b79a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/check-badge.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/check-circle.svg b/assets/vendor/heroicons/optimized/24/outline/check-circle.svg deleted file mode 100644 index d4471d6..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/check-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/check.svg b/assets/vendor/heroicons/optimized/24/outline/check.svg deleted file mode 100644 index 7644e30..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg deleted file mode 100644 index d7e9370..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg deleted file mode 100644 index 95834af..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg deleted file mode 100644 index 37a809d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg deleted file mode 100644 index 5182691..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-down.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-down.svg deleted file mode 100644 index b38efa5..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chevron-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-left.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-left.svg deleted file mode 100644 index 73fe99a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chevron-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-right.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-right.svg deleted file mode 100644 index 1e31bfd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chevron-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg deleted file mode 100644 index 27b1d4f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-up.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-up.svg deleted file mode 100644 index 713a6f1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/chevron-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/circle-stack.svg b/assets/vendor/heroicons/optimized/24/outline/circle-stack.svg deleted file mode 100644 index b8fb769..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/circle-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg deleted file mode 100644 index 7bb03a1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg deleted file mode 100644 index 4670777..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg deleted file mode 100644 index 783a333..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard.svg deleted file mode 100644 index ad9b943..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/clipboard.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/clock.svg b/assets/vendor/heroicons/optimized/24/outline/clock.svg deleted file mode 100644 index 337196c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/clock.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg deleted file mode 100644 index 7074791..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg deleted file mode 100644 index 8b45081..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cloud.svg b/assets/vendor/heroicons/optimized/24/outline/cloud.svg deleted file mode 100644 index 55fd725..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cloud.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg b/assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg deleted file mode 100644 index 8308024..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/code-bracket.svg b/assets/vendor/heroicons/optimized/24/outline/code-bracket.svg deleted file mode 100644 index 3361add..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/code-bracket.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg b/assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg deleted file mode 100644 index d585645..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg b/assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg deleted file mode 100644 index 28f85f4..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cog.svg b/assets/vendor/heroicons/optimized/24/outline/cog.svg deleted file mode 100644 index f2bad9f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cog.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/command-line.svg b/assets/vendor/heroicons/optimized/24/outline/command-line.svg deleted file mode 100644 index baaf362..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/command-line.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg b/assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg deleted file mode 100644 index fb9a6e0..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg b/assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg deleted file mode 100644 index cabc435..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/credit-card.svg b/assets/vendor/heroicons/optimized/24/outline/credit-card.svg deleted file mode 100644 index 3c0c917..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/credit-card.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg b/assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg deleted file mode 100644 index 5a8adac..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cube.svg b/assets/vendor/heroicons/optimized/24/outline/cube.svg deleted file mode 100644 index 70b0091..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cube.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg b/assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg deleted file mode 100644 index 7f2fca3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg b/assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg deleted file mode 100644 index d376f4c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-euro.svg b/assets/vendor/heroicons/optimized/24/outline/currency-euro.svg deleted file mode 100644 index 8b9dd2e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/currency-euro.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-pound.svg b/assets/vendor/heroicons/optimized/24/outline/currency-pound.svg deleted file mode 100644 index 8e7c52d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/currency-pound.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg b/assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg deleted file mode 100644 index 078bf05..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-yen.svg b/assets/vendor/heroicons/optimized/24/outline/currency-yen.svg deleted file mode 100644 index 254011a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/currency-yen.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg deleted file mode 100644 index c29d0fd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg deleted file mode 100644 index 500a04c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg b/assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg deleted file mode 100644 index 1caf911..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/device-tablet.svg b/assets/vendor/heroicons/optimized/24/outline/device-tablet.svg deleted file mode 100644 index 7090ecb..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/device-tablet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg deleted file mode 100644 index 04f6e65..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg deleted file mode 100644 index c0ca80f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg b/assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg deleted file mode 100644 index 2ffa3fe..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document-check.svg b/assets/vendor/heroicons/optimized/24/outline/document-check.svg deleted file mode 100644 index 5ea7d9c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document-check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg b/assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg deleted file mode 100644 index acc6464..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg deleted file mode 100644 index f94eff6..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document-minus.svg b/assets/vendor/heroicons/optimized/24/outline/document-minus.svg deleted file mode 100644 index 173cb1f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document-plus.svg b/assets/vendor/heroicons/optimized/24/outline/document-plus.svg deleted file mode 100644 index 9ec31ad..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document-text.svg b/assets/vendor/heroicons/optimized/24/outline/document-text.svg deleted file mode 100644 index cd77136..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document-text.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/document.svg b/assets/vendor/heroicons/optimized/24/outline/document.svg deleted file mode 100644 index 863a8aa..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/document.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg deleted file mode 100644 index 09aac53..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg deleted file mode 100644 index 7541be5..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg b/assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg deleted file mode 100644 index 4676cf3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/envelope-open.svg b/assets/vendor/heroicons/optimized/24/outline/envelope-open.svg deleted file mode 100644 index ff9dccd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/envelope-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/envelope.svg b/assets/vendor/heroicons/optimized/24/outline/envelope.svg deleted file mode 100644 index ae8ff72..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/envelope.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg b/assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg deleted file mode 100644 index 25ef36f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg b/assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg deleted file mode 100644 index c9742f1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg b/assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg deleted file mode 100644 index c7263e1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/eye-slash.svg b/assets/vendor/heroicons/optimized/24/outline/eye-slash.svg deleted file mode 100644 index 072c9f2..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/eye-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/eye.svg b/assets/vendor/heroicons/optimized/24/outline/eye.svg deleted file mode 100644 index 2a54d63..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/eye.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/face-frown.svg b/assets/vendor/heroicons/optimized/24/outline/face-frown.svg deleted file mode 100644 index ba0cab3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/face-frown.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/face-smile.svg b/assets/vendor/heroicons/optimized/24/outline/face-smile.svg deleted file mode 100644 index 5246524..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/face-smile.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/film.svg b/assets/vendor/heroicons/optimized/24/outline/film.svg deleted file mode 100644 index d76e594..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/film.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/finger-print.svg b/assets/vendor/heroicons/optimized/24/outline/finger-print.svg deleted file mode 100644 index 0c1eeb2..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/finger-print.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/fire.svg b/assets/vendor/heroicons/optimized/24/outline/fire.svg deleted file mode 100644 index 54c9748..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/fire.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/flag.svg b/assets/vendor/heroicons/optimized/24/outline/flag.svg deleted file mode 100644 index dff4126..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/flag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg deleted file mode 100644 index 96290cd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-minus.svg b/assets/vendor/heroicons/optimized/24/outline/folder-minus.svg deleted file mode 100644 index 824cb0e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/folder-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-open.svg b/assets/vendor/heroicons/optimized/24/outline/folder-open.svg deleted file mode 100644 index 0721502..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/folder-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-plus.svg b/assets/vendor/heroicons/optimized/24/outline/folder-plus.svg deleted file mode 100644 index 3df62d2..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/folder-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/folder.svg b/assets/vendor/heroicons/optimized/24/outline/folder.svg deleted file mode 100644 index 3054819..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/folder.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/forward.svg b/assets/vendor/heroicons/optimized/24/outline/forward.svg deleted file mode 100644 index cc80dc9..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/forward.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/funnel.svg b/assets/vendor/heroicons/optimized/24/outline/funnel.svg deleted file mode 100644 index 338fa52..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/funnel.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/gif.svg b/assets/vendor/heroicons/optimized/24/outline/gif.svg deleted file mode 100644 index ba8a186..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/gif.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/gift-top.svg b/assets/vendor/heroicons/optimized/24/outline/gift-top.svg deleted file mode 100644 index 055b6d2..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/gift-top.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/gift.svg b/assets/vendor/heroicons/optimized/24/outline/gift.svg deleted file mode 100644 index 5445815..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/gift.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-alt.svg b/assets/vendor/heroicons/optimized/24/outline/globe-alt.svg deleted file mode 100644 index a605be0..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/globe-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-americas.svg b/assets/vendor/heroicons/optimized/24/outline/globe-americas.svg deleted file mode 100644 index 5d1a5cb..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/globe-americas.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg b/assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg deleted file mode 100644 index f4898fa..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg b/assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg deleted file mode 100644 index c8f797d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/hand-raised.svg b/assets/vendor/heroicons/optimized/24/outline/hand-raised.svg deleted file mode 100644 index 859f1ab..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/hand-raised.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg deleted file mode 100644 index c588a53..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg deleted file mode 100644 index 66ca9c3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/hashtag.svg b/assets/vendor/heroicons/optimized/24/outline/hashtag.svg deleted file mode 100644 index 3ae1060..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/hashtag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/heart.svg b/assets/vendor/heroicons/optimized/24/outline/heart.svg deleted file mode 100644 index 1084768..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/heart.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/home-modern.svg b/assets/vendor/heroicons/optimized/24/outline/home-modern.svg deleted file mode 100644 index 20f4e2c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/home-modern.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/home.svg b/assets/vendor/heroicons/optimized/24/outline/home.svg deleted file mode 100644 index 9543375..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/home.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/identification.svg b/assets/vendor/heroicons/optimized/24/outline/identification.svg deleted file mode 100644 index bfd302a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/identification.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg deleted file mode 100644 index db6ebda..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg b/assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg deleted file mode 100644 index 6c1e55c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/inbox.svg b/assets/vendor/heroicons/optimized/24/outline/inbox.svg deleted file mode 100644 index 56b35cb..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/inbox.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/information-circle.svg b/assets/vendor/heroicons/optimized/24/outline/information-circle.svg deleted file mode 100644 index c7fa9d7..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/information-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/key.svg b/assets/vendor/heroicons/optimized/24/outline/key.svg deleted file mode 100644 index e9684cd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/key.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/language.svg b/assets/vendor/heroicons/optimized/24/outline/language.svg deleted file mode 100644 index 0c606ef..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/language.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg b/assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg deleted file mode 100644 index 1660e99..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/light-bulb.svg b/assets/vendor/heroicons/optimized/24/outline/light-bulb.svg deleted file mode 100644 index e3f2d9a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/light-bulb.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/link.svg b/assets/vendor/heroicons/optimized/24/outline/link.svg deleted file mode 100644 index 916a703..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/link.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/list-bullet.svg b/assets/vendor/heroicons/optimized/24/outline/list-bullet.svg deleted file mode 100644 index 1474573..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/list-bullet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/lock-closed.svg b/assets/vendor/heroicons/optimized/24/outline/lock-closed.svg deleted file mode 100644 index 08b23c9..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/lock-closed.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/lock-open.svg b/assets/vendor/heroicons/optimized/24/outline/lock-open.svg deleted file mode 100644 index c5595dd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/lock-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg deleted file mode 100644 index e71f8bf..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg deleted file mode 100644 index 6bd11c1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg deleted file mode 100644 index 5dab7de..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg deleted file mode 100644 index 7cff88f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/map-pin.svg b/assets/vendor/heroicons/optimized/24/outline/map-pin.svg deleted file mode 100644 index 1f272f4..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/map-pin.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/map.svg b/assets/vendor/heroicons/optimized/24/outline/map.svg deleted file mode 100644 index f96c988..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/map.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/megaphone.svg b/assets/vendor/heroicons/optimized/24/outline/megaphone.svg deleted file mode 100644 index ec19508..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/megaphone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/microphone.svg b/assets/vendor/heroicons/optimized/24/outline/microphone.svg deleted file mode 100644 index 670b34f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/microphone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/minus-circle.svg b/assets/vendor/heroicons/optimized/24/outline/minus-circle.svg deleted file mode 100644 index b9630fc..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/minus-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/minus-small.svg b/assets/vendor/heroicons/optimized/24/outline/minus-small.svg deleted file mode 100644 index 3e1a8b7..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/minus-small.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/minus.svg b/assets/vendor/heroicons/optimized/24/outline/minus.svg deleted file mode 100644 index 781994c..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/moon.svg b/assets/vendor/heroicons/optimized/24/outline/moon.svg deleted file mode 100644 index 91501fd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/moon.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/musical-note.svg b/assets/vendor/heroicons/optimized/24/outline/musical-note.svg deleted file mode 100644 index c0667fc..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/musical-note.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/newspaper.svg b/assets/vendor/heroicons/optimized/24/outline/newspaper.svg deleted file mode 100644 index 0a4ac57..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/newspaper.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/no-symbol.svg b/assets/vendor/heroicons/optimized/24/outline/no-symbol.svg deleted file mode 100644 index 19b0bd0..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/no-symbol.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/paint-brush.svg b/assets/vendor/heroicons/optimized/24/outline/paint-brush.svg deleted file mode 100644 index b66098f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/paint-brush.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg b/assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg deleted file mode 100644 index 32da43e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/paper-clip.svg b/assets/vendor/heroicons/optimized/24/outline/paper-clip.svg deleted file mode 100644 index 1d78d81..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/paper-clip.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/pause-circle.svg b/assets/vendor/heroicons/optimized/24/outline/pause-circle.svg deleted file mode 100644 index a9a9e93..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/pause-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/pause.svg b/assets/vendor/heroicons/optimized/24/outline/pause.svg deleted file mode 100644 index 9843f7b..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/pause.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/pencil-square.svg b/assets/vendor/heroicons/optimized/24/outline/pencil-square.svg deleted file mode 100644 index 3de435b..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/pencil-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/pencil.svg b/assets/vendor/heroicons/optimized/24/outline/pencil.svg deleted file mode 100644 index 0c8759a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/pencil.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg deleted file mode 100644 index b1b2e61..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg deleted file mode 100644 index faaf659..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg deleted file mode 100644 index 0b8de6d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/phone.svg b/assets/vendor/heroicons/optimized/24/outline/phone.svg deleted file mode 100644 index 6f73149..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/phone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/photo.svg b/assets/vendor/heroicons/optimized/24/outline/photo.svg deleted file mode 100644 index 6982a11..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/photo.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/play-circle.svg b/assets/vendor/heroicons/optimized/24/outline/play-circle.svg deleted file mode 100644 index 3a2fa63..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/play-circle.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/play-pause.svg b/assets/vendor/heroicons/optimized/24/outline/play-pause.svg deleted file mode 100644 index 4ce4e55..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/play-pause.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/play.svg b/assets/vendor/heroicons/optimized/24/outline/play.svg deleted file mode 100644 index c0ae6de..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/play.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/plus-circle.svg b/assets/vendor/heroicons/optimized/24/outline/plus-circle.svg deleted file mode 100644 index 4da4d1f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/plus-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/plus-small.svg b/assets/vendor/heroicons/optimized/24/outline/plus-small.svg deleted file mode 100644 index 991ed59..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/plus-small.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/plus.svg b/assets/vendor/heroicons/optimized/24/outline/plus.svg deleted file mode 100644 index 0480817..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/power.svg b/assets/vendor/heroicons/optimized/24/outline/power.svg deleted file mode 100644 index c4b2706..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/power.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg deleted file mode 100644 index 87d8a6d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg deleted file mode 100644 index 2262e1f..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/printer.svg b/assets/vendor/heroicons/optimized/24/outline/printer.svg deleted file mode 100644 index 6f7c5fa..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/printer.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg b/assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg deleted file mode 100644 index 13aa1a5..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/qr-code.svg b/assets/vendor/heroicons/optimized/24/outline/qr-code.svg deleted file mode 100644 index 662a4bd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/qr-code.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg b/assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg deleted file mode 100644 index 9fb2542..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/queue-list.svg b/assets/vendor/heroicons/optimized/24/outline/queue-list.svg deleted file mode 100644 index 91c3f11..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/queue-list.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/radio.svg b/assets/vendor/heroicons/optimized/24/outline/radio.svg deleted file mode 100644 index f9c177a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/radio.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg b/assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg deleted file mode 100644 index 2d19255..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg b/assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg deleted file mode 100644 index dc569fc..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg b/assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg deleted file mode 100644 index b184964..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg b/assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg deleted file mode 100644 index e1c0272..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg b/assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg deleted file mode 100644 index 6400ee8..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/rss.svg b/assets/vendor/heroicons/optimized/24/outline/rss.svg deleted file mode 100644 index 1c36b21..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/rss.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/scale.svg b/assets/vendor/heroicons/optimized/24/outline/scale.svg deleted file mode 100644 index 500e3c6..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/scale.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/scissors.svg b/assets/vendor/heroicons/optimized/24/outline/scissors.svg deleted file mode 100644 index a23dc81..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/scissors.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/server-stack.svg b/assets/vendor/heroicons/optimized/24/outline/server-stack.svg deleted file mode 100644 index 3b7fe32..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/server-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/server.svg b/assets/vendor/heroicons/optimized/24/outline/server.svg deleted file mode 100644 index c1675f3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/server.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/share.svg b/assets/vendor/heroicons/optimized/24/outline/share.svg deleted file mode 100644 index 125b6d1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/share.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/shield-check.svg b/assets/vendor/heroicons/optimized/24/outline/shield-check.svg deleted file mode 100644 index f9fa2b9..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/shield-check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg b/assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg deleted file mode 100644 index b52a2ff..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg b/assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg deleted file mode 100644 index f5a51bd..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg b/assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg deleted file mode 100644 index 661477b..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/signal-slash.svg b/assets/vendor/heroicons/optimized/24/outline/signal-slash.svg deleted file mode 100644 index 62992c3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/signal-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/signal.svg b/assets/vendor/heroicons/optimized/24/outline/signal.svg deleted file mode 100644 index 56114d3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/signal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/sparkles.svg b/assets/vendor/heroicons/optimized/24/outline/sparkles.svg deleted file mode 100644 index 5a78b09..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/sparkles.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg b/assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg deleted file mode 100644 index 1b6dde7..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg deleted file mode 100644 index 427e21e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg b/assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg deleted file mode 100644 index bc5e253..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg b/assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg deleted file mode 100644 index 8af2704..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg b/assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg deleted file mode 100644 index 601366d..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/squares-plus.svg b/assets/vendor/heroicons/optimized/24/outline/squares-plus.svg deleted file mode 100644 index b8033c1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/squares-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/star.svg b/assets/vendor/heroicons/optimized/24/outline/star.svg deleted file mode 100644 index 98aa481..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/star.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/stop-circle.svg b/assets/vendor/heroicons/optimized/24/outline/stop-circle.svg deleted file mode 100644 index b570e8e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/stop-circle.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/stop.svg b/assets/vendor/heroicons/optimized/24/outline/stop.svg deleted file mode 100644 index 4ee917a..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/stop.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/sun.svg b/assets/vendor/heroicons/optimized/24/outline/sun.svg deleted file mode 100644 index 5667cb3..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/sun.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/swatch.svg b/assets/vendor/heroicons/optimized/24/outline/swatch.svg deleted file mode 100644 index 5b136eb..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/swatch.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/table-cells.svg b/assets/vendor/heroicons/optimized/24/outline/table-cells.svg deleted file mode 100644 index cb37937..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/table-cells.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/tag.svg b/assets/vendor/heroicons/optimized/24/outline/tag.svg deleted file mode 100644 index 9620545..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/tag.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/ticket.svg b/assets/vendor/heroicons/optimized/24/outline/ticket.svg deleted file mode 100644 index da2d69e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/ticket.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/trash.svg b/assets/vendor/heroicons/optimized/24/outline/trash.svg deleted file mode 100644 index 0d32d58..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/trash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/trophy.svg b/assets/vendor/heroicons/optimized/24/outline/trophy.svg deleted file mode 100644 index f846e52..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/trophy.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/truck.svg b/assets/vendor/heroicons/optimized/24/outline/truck.svg deleted file mode 100644 index 6e1ea69..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/truck.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/tv.svg b/assets/vendor/heroicons/optimized/24/outline/tv.svg deleted file mode 100644 index 7b8a706..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/tv.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/user-circle.svg b/assets/vendor/heroicons/optimized/24/outline/user-circle.svg deleted file mode 100644 index a177f26..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/user-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/user-group.svg b/assets/vendor/heroicons/optimized/24/outline/user-group.svg deleted file mode 100644 index 4e7089b..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/user-group.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/user-minus.svg b/assets/vendor/heroicons/optimized/24/outline/user-minus.svg deleted file mode 100644 index 703478e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/user-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/user-plus.svg b/assets/vendor/heroicons/optimized/24/outline/user-plus.svg deleted file mode 100644 index 24533d1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/user-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/user.svg b/assets/vendor/heroicons/optimized/24/outline/user.svg deleted file mode 100644 index e9b6c20..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/user.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/users.svg b/assets/vendor/heroicons/optimized/24/outline/users.svg deleted file mode 100644 index 87304a0..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/users.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/variable.svg b/assets/vendor/heroicons/optimized/24/outline/variable.svg deleted file mode 100644 index 81fab04..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/variable.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg b/assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg deleted file mode 100644 index d1de13e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/video-camera.svg b/assets/vendor/heroicons/optimized/24/outline/video-camera.svg deleted file mode 100644 index aae1a19..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/video-camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/view-columns.svg b/assets/vendor/heroicons/optimized/24/outline/view-columns.svg deleted file mode 100644 index 22a668e..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/view-columns.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg b/assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg deleted file mode 100644 index 0583eef..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/wallet.svg b/assets/vendor/heroicons/optimized/24/outline/wallet.svg deleted file mode 100644 index 8f19d64..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/wallet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/wifi.svg b/assets/vendor/heroicons/optimized/24/outline/wifi.svg deleted file mode 100644 index 084b3e1..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/wifi.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/window.svg b/assets/vendor/heroicons/optimized/24/outline/window.svg deleted file mode 100644 index 4ffea71..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/window.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg b/assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg deleted file mode 100644 index 1023ae9..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/wrench.svg b/assets/vendor/heroicons/optimized/24/outline/wrench.svg deleted file mode 100644 index de3a6e2..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/wrench.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/x-circle.svg b/assets/vendor/heroicons/optimized/24/outline/x-circle.svg deleted file mode 100644 index 294ba20..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/x-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/outline/x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/x-mark.svg deleted file mode 100644 index a6d9eb7..0000000 --- a/assets/vendor/heroicons/optimized/24/outline/x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/academic-cap.svg b/assets/vendor/heroicons/optimized/24/solid/academic-cap.svg deleted file mode 100644 index 2a13ef2..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/academic-cap.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg b/assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg deleted file mode 100644 index ed9b950..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg b/assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg deleted file mode 100644 index fc4b90c..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg deleted file mode 100644 index 5999b72..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg deleted file mode 100644 index e7dd0d6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/archive-box.svg b/assets/vendor/heroicons/optimized/24/solid/archive-box.svg deleted file mode 100644 index 74e0471..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/archive-box.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg deleted file mode 100644 index c85a4ff..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg deleted file mode 100644 index 5cd0d4d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg deleted file mode 100644 index d2ef0b3..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg deleted file mode 100644 index 35eab41..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg deleted file mode 100644 index 8c60942..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg deleted file mode 100644 index a18c62d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down.svg deleted file mode 100644 index 5cb396b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg deleted file mode 100644 index a937f8e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg deleted file mode 100644 index 972a85e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-left.svg deleted file mode 100644 index 51bef70..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg deleted file mode 100644 index 891774e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg deleted file mode 100644 index aa12c0c..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg deleted file mode 100644 index 0bcb6a0..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg deleted file mode 100644 index b36d8e0..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg deleted file mode 100644 index 0808a57..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-path.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-path.svg deleted file mode 100644 index 48a71fd..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-path.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg deleted file mode 100644 index 424f75a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg deleted file mode 100644 index 73a7a7e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-right.svg deleted file mode 100644 index 1b1bbd1..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg deleted file mode 100644 index 790993f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg deleted file mode 100644 index 231b1b2..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg deleted file mode 100644 index 5d91261..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg deleted file mode 100644 index 33b31cf..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg deleted file mode 100644 index ac1bc37..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg deleted file mode 100644 index f46b609..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg deleted file mode 100644 index f2ece6e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg deleted file mode 100644 index 0a9999f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg deleted file mode 100644 index b6f9c2e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg deleted file mode 100644 index b661da7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg deleted file mode 100644 index cba893e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg deleted file mode 100644 index 7554631..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg deleted file mode 100644 index 19093f6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up.svg deleted file mode 100644 index 16f6c79..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg deleted file mode 100644 index 6975024..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg deleted file mode 100644 index f0b679a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg deleted file mode 100644 index 2da0f98..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg deleted file mode 100644 index 8cfe23d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg deleted file mode 100644 index 604920f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg deleted file mode 100644 index 2399662..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg deleted file mode 100644 index 93fb7f1..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg deleted file mode 100644 index 356e9ca..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/at-symbol.svg b/assets/vendor/heroicons/optimized/24/solid/at-symbol.svg deleted file mode 100644 index a02c654..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/at-symbol.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/backspace.svg b/assets/vendor/heroicons/optimized/24/solid/backspace.svg deleted file mode 100644 index e5a79c2..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/backspace.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/backward.svg b/assets/vendor/heroicons/optimized/24/solid/backward.svg deleted file mode 100644 index bdf2a01..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/backward.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/banknotes.svg b/assets/vendor/heroicons/optimized/24/solid/banknotes.svg deleted file mode 100644 index 1cc1803..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/banknotes.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-2.svg b/assets/vendor/heroicons/optimized/24/solid/bars-2.svg deleted file mode 100644 index 6ee47ab..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bars-2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg deleted file mode 100644 index a804c11..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg deleted file mode 100644 index 2fd11ad..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg deleted file mode 100644 index 9a2c170..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3.svg deleted file mode 100644 index 85584e8..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bars-3.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-4.svg b/assets/vendor/heroicons/optimized/24/solid/bars-4.svg deleted file mode 100644 index e3591d1..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bars-4.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg deleted file mode 100644 index 10140b8..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg deleted file mode 100644 index 4b3d4a7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/battery-0.svg b/assets/vendor/heroicons/optimized/24/solid/battery-0.svg deleted file mode 100644 index f03a737..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/battery-0.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/battery-100.svg b/assets/vendor/heroicons/optimized/24/solid/battery-100.svg deleted file mode 100644 index 62e4ec9..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/battery-100.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/battery-50.svg b/assets/vendor/heroicons/optimized/24/solid/battery-50.svg deleted file mode 100644 index 63344d7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/battery-50.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/beaker.svg b/assets/vendor/heroicons/optimized/24/solid/beaker.svg deleted file mode 100644 index e0b73cc..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/beaker.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bell-alert.svg b/assets/vendor/heroicons/optimized/24/solid/bell-alert.svg deleted file mode 100644 index f280b00..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bell-alert.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bell-slash.svg b/assets/vendor/heroicons/optimized/24/solid/bell-slash.svg deleted file mode 100644 index 0ef076c..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bell-slash.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg b/assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg deleted file mode 100644 index cf93ae0..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bell.svg b/assets/vendor/heroicons/optimized/24/solid/bell.svg deleted file mode 100644 index 818496e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bell.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg b/assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg deleted file mode 100644 index 59d24f7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bolt.svg b/assets/vendor/heroicons/optimized/24/solid/bolt.svg deleted file mode 100644 index 596c47a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bolt.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/book-open.svg b/assets/vendor/heroicons/optimized/24/solid/book-open.svg deleted file mode 100644 index 2e0a181..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/book-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg b/assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg deleted file mode 100644 index 8435a02..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg b/assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg deleted file mode 100644 index a4d3ca5..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bookmark.svg b/assets/vendor/heroicons/optimized/24/solid/bookmark.svg deleted file mode 100644 index e9f3fb7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bookmark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/briefcase.svg b/assets/vendor/heroicons/optimized/24/solid/briefcase.svg deleted file mode 100644 index a66af56..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/briefcase.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/bug-ant.svg b/assets/vendor/heroicons/optimized/24/solid/bug-ant.svg deleted file mode 100644 index 3c16cbc..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/bug-ant.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/building-library.svg b/assets/vendor/heroicons/optimized/24/solid/building-library.svg deleted file mode 100644 index 90f8640..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/building-library.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/building-office-2.svg b/assets/vendor/heroicons/optimized/24/solid/building-office-2.svg deleted file mode 100644 index 240eedb..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/building-office-2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/building-office.svg b/assets/vendor/heroicons/optimized/24/solid/building-office.svg deleted file mode 100644 index 9883e33..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/building-office.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/building-storefront.svg b/assets/vendor/heroicons/optimized/24/solid/building-storefront.svg deleted file mode 100644 index f3b54ba..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/building-storefront.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cake.svg b/assets/vendor/heroicons/optimized/24/solid/cake.svg deleted file mode 100644 index f13b308..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cake.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/calculator.svg b/assets/vendor/heroicons/optimized/24/solid/calculator.svg deleted file mode 100644 index e058510..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/calculator.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/calendar-days.svg b/assets/vendor/heroicons/optimized/24/solid/calendar-days.svg deleted file mode 100644 index 0df9b16..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/calendar-days.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/calendar.svg b/assets/vendor/heroicons/optimized/24/solid/calendar.svg deleted file mode 100644 index 27e208c..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/calendar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/camera.svg b/assets/vendor/heroicons/optimized/24/solid/camera.svg deleted file mode 100644 index e58165d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/camera.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg b/assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg deleted file mode 100644 index d4af840..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chart-bar.svg b/assets/vendor/heroicons/optimized/24/solid/chart-bar.svg deleted file mode 100644 index abe5349..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chart-pie.svg b/assets/vendor/heroicons/optimized/24/solid/chart-pie.svg deleted file mode 100644 index 5aea729..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chart-pie.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg deleted file mode 100644 index bff24c4..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg deleted file mode 100644 index eab7a41..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg deleted file mode 100644 index 1ee6159..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg deleted file mode 100644 index 80ad26d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg deleted file mode 100644 index 3dd81b7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg deleted file mode 100644 index 815c6d7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg deleted file mode 100644 index 473b921..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/check-badge.svg b/assets/vendor/heroicons/optimized/24/solid/check-badge.svg deleted file mode 100644 index 058b329..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/check-badge.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/check-circle.svg b/assets/vendor/heroicons/optimized/24/solid/check-circle.svg deleted file mode 100644 index 2b90831..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/check-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/check.svg b/assets/vendor/heroicons/optimized/24/solid/check.svg deleted file mode 100644 index 2a6bc17..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg deleted file mode 100644 index ddbe304..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg deleted file mode 100644 index 5c6539d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg deleted file mode 100644 index 7e25238..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg deleted file mode 100644 index 029e687..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-down.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-down.svg deleted file mode 100644 index 4f9ce7e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chevron-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-left.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-left.svg deleted file mode 100644 index 2d89e8b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chevron-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-right.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-right.svg deleted file mode 100644 index 36e4859..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chevron-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg deleted file mode 100644 index 58edbc3..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-up.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-up.svg deleted file mode 100644 index 9abe9cd..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/chevron-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/circle-stack.svg b/assets/vendor/heroicons/optimized/24/solid/circle-stack.svg deleted file mode 100644 index 5a49d80..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/circle-stack.svg +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg deleted file mode 100644 index 21ec021..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg deleted file mode 100644 index d60bed5..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg deleted file mode 100644 index d70b708..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard.svg deleted file mode 100644 index c09970f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/clipboard.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/clock.svg b/assets/vendor/heroicons/optimized/24/solid/clock.svg deleted file mode 100644 index 1d6fb4a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/clock.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg deleted file mode 100644 index d6cf7c5..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg deleted file mode 100644 index 7e0dcee..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cloud.svg b/assets/vendor/heroicons/optimized/24/solid/cloud.svg deleted file mode 100644 index 95d0c73..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cloud.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg b/assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg deleted file mode 100644 index 103f73b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/code-bracket.svg b/assets/vendor/heroicons/optimized/24/solid/code-bracket.svg deleted file mode 100644 index 9f331ef..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/code-bracket.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg b/assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg deleted file mode 100644 index ba6fca5..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg b/assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg deleted file mode 100644 index 9b9b1a6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cog.svg b/assets/vendor/heroicons/optimized/24/solid/cog.svg deleted file mode 100644 index e854f73..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cog.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/command-line.svg b/assets/vendor/heroicons/optimized/24/solid/command-line.svg deleted file mode 100644 index e2a0af8..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/command-line.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg b/assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg deleted file mode 100644 index 5b7f2ef..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg b/assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg deleted file mode 100644 index e20f6fb..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/credit-card.svg b/assets/vendor/heroicons/optimized/24/solid/credit-card.svg deleted file mode 100644 index fe4dc14..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/credit-card.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg b/assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg deleted file mode 100644 index 5577f26..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cube.svg b/assets/vendor/heroicons/optimized/24/solid/cube.svg deleted file mode 100644 index b0029f2..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cube.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg b/assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg deleted file mode 100644 index ca13c68..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg b/assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg deleted file mode 100644 index e0155df..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-euro.svg b/assets/vendor/heroicons/optimized/24/solid/currency-euro.svg deleted file mode 100644 index 2926c25..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/currency-euro.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-pound.svg b/assets/vendor/heroicons/optimized/24/solid/currency-pound.svg deleted file mode 100644 index 547f725..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/currency-pound.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg b/assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg deleted file mode 100644 index 2ee9b46..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-yen.svg b/assets/vendor/heroicons/optimized/24/solid/currency-yen.svg deleted file mode 100644 index 65ef9bc..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/currency-yen.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg deleted file mode 100644 index c0e462b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg deleted file mode 100644 index 867faa4..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg b/assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg deleted file mode 100644 index eec0738..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/device-tablet.svg b/assets/vendor/heroicons/optimized/24/solid/device-tablet.svg deleted file mode 100644 index 88e2cc8..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/device-tablet.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg deleted file mode 100644 index 77ac19c..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg deleted file mode 100644 index bc26cb9..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg b/assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg deleted file mode 100644 index 83d0eac..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document-check.svg b/assets/vendor/heroicons/optimized/24/solid/document-check.svg deleted file mode 100644 index e827854..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document-check.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg b/assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg deleted file mode 100644 index fa7375d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg deleted file mode 100644 index ab165f7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document-minus.svg b/assets/vendor/heroicons/optimized/24/solid/document-minus.svg deleted file mode 100644 index 265c6eb..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document-minus.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document-plus.svg b/assets/vendor/heroicons/optimized/24/solid/document-plus.svg deleted file mode 100644 index 5e31459..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document-plus.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document-text.svg b/assets/vendor/heroicons/optimized/24/solid/document-text.svg deleted file mode 100644 index 73b30cd..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document-text.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/document.svg b/assets/vendor/heroicons/optimized/24/solid/document.svg deleted file mode 100644 index a05f20f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/document.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg deleted file mode 100644 index 6ec2b50..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg deleted file mode 100644 index ddb5a3f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg b/assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg deleted file mode 100644 index 792c0ae..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/envelope-open.svg b/assets/vendor/heroicons/optimized/24/solid/envelope-open.svg deleted file mode 100644 index e6bf97b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/envelope-open.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/envelope.svg b/assets/vendor/heroicons/optimized/24/solid/envelope.svg deleted file mode 100644 index 702341b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/envelope.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg b/assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg deleted file mode 100644 index fdaadc0..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg b/assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg deleted file mode 100644 index 627a712..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg b/assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg deleted file mode 100644 index 15b16d0..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/eye-slash.svg b/assets/vendor/heroicons/optimized/24/solid/eye-slash.svg deleted file mode 100644 index 11ef99b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/eye-slash.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/eye.svg b/assets/vendor/heroicons/optimized/24/solid/eye.svg deleted file mode 100644 index a648db3..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/eye.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/face-frown.svg b/assets/vendor/heroicons/optimized/24/solid/face-frown.svg deleted file mode 100644 index 7040d58..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/face-frown.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/face-smile.svg b/assets/vendor/heroicons/optimized/24/solid/face-smile.svg deleted file mode 100644 index d5e75a2..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/face-smile.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/film.svg b/assets/vendor/heroicons/optimized/24/solid/film.svg deleted file mode 100644 index fbd26cc..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/film.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/finger-print.svg b/assets/vendor/heroicons/optimized/24/solid/finger-print.svg deleted file mode 100644 index 68e72b4..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/finger-print.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/fire.svg b/assets/vendor/heroicons/optimized/24/solid/fire.svg deleted file mode 100644 index 93b1b1f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/fire.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/flag.svg b/assets/vendor/heroicons/optimized/24/solid/flag.svg deleted file mode 100644 index 8c67b01..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/flag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg deleted file mode 100644 index 5d963b4..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-minus.svg b/assets/vendor/heroicons/optimized/24/solid/folder-minus.svg deleted file mode 100644 index d0292b8..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/folder-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-open.svg b/assets/vendor/heroicons/optimized/24/solid/folder-open.svg deleted file mode 100644 index b9d80ba..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/folder-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-plus.svg b/assets/vendor/heroicons/optimized/24/solid/folder-plus.svg deleted file mode 100644 index efaf949..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/folder-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/folder.svg b/assets/vendor/heroicons/optimized/24/solid/folder.svg deleted file mode 100644 index a7847f8..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/folder.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/forward.svg b/assets/vendor/heroicons/optimized/24/solid/forward.svg deleted file mode 100644 index de90863..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/forward.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/funnel.svg b/assets/vendor/heroicons/optimized/24/solid/funnel.svg deleted file mode 100644 index fe5699f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/funnel.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/gif.svg b/assets/vendor/heroicons/optimized/24/solid/gif.svg deleted file mode 100644 index 283e6e5..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/gif.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/gift-top.svg b/assets/vendor/heroicons/optimized/24/solid/gift-top.svg deleted file mode 100644 index 4bd4e6f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/gift-top.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/gift.svg b/assets/vendor/heroicons/optimized/24/solid/gift.svg deleted file mode 100644 index 2ca6c92..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/gift.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-alt.svg b/assets/vendor/heroicons/optimized/24/solid/globe-alt.svg deleted file mode 100644 index 0cbacae..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/globe-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-americas.svg b/assets/vendor/heroicons/optimized/24/solid/globe-americas.svg deleted file mode 100644 index 5ae0d5d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/globe-americas.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg b/assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg deleted file mode 100644 index 14249d6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg b/assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg deleted file mode 100644 index 49a78fd..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/hand-raised.svg b/assets/vendor/heroicons/optimized/24/solid/hand-raised.svg deleted file mode 100644 index 1717d51..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/hand-raised.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg deleted file mode 100644 index 7a2b9a6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg deleted file mode 100644 index 4942d2d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/hashtag.svg b/assets/vendor/heroicons/optimized/24/solid/hashtag.svg deleted file mode 100644 index 29e677d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/hashtag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/heart.svg b/assets/vendor/heroicons/optimized/24/solid/heart.svg deleted file mode 100644 index b5f0d95..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/heart.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/home-modern.svg b/assets/vendor/heroicons/optimized/24/solid/home-modern.svg deleted file mode 100644 index 488685a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/home-modern.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/home.svg b/assets/vendor/heroicons/optimized/24/solid/home.svg deleted file mode 100644 index ec0bae1..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/home.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/identification.svg b/assets/vendor/heroicons/optimized/24/solid/identification.svg deleted file mode 100644 index 829b24d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/identification.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg deleted file mode 100644 index 4fd220b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg b/assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg deleted file mode 100644 index fffab99..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/inbox.svg b/assets/vendor/heroicons/optimized/24/solid/inbox.svg deleted file mode 100644 index b74380e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/inbox.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/information-circle.svg b/assets/vendor/heroicons/optimized/24/solid/information-circle.svg deleted file mode 100644 index bd2723b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/information-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/key.svg b/assets/vendor/heroicons/optimized/24/solid/key.svg deleted file mode 100644 index 6acee27..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/key.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/language.svg b/assets/vendor/heroicons/optimized/24/solid/language.svg deleted file mode 100644 index 60d1aee..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/language.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg b/assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg deleted file mode 100644 index 9ddc8d4..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/light-bulb.svg b/assets/vendor/heroicons/optimized/24/solid/light-bulb.svg deleted file mode 100644 index ff49cb3..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/light-bulb.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/link.svg b/assets/vendor/heroicons/optimized/24/solid/link.svg deleted file mode 100644 index a6dc093..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/link.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/list-bullet.svg b/assets/vendor/heroicons/optimized/24/solid/list-bullet.svg deleted file mode 100644 index 7983877..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/list-bullet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/lock-closed.svg b/assets/vendor/heroicons/optimized/24/solid/lock-closed.svg deleted file mode 100644 index 8a5a6d7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/lock-closed.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/lock-open.svg b/assets/vendor/heroicons/optimized/24/solid/lock-open.svg deleted file mode 100644 index 4562f7e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/lock-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg deleted file mode 100644 index 17a6f28..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg deleted file mode 100644 index 06ae161..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg deleted file mode 100644 index 92040d0..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg deleted file mode 100644 index b602e08..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/map-pin.svg b/assets/vendor/heroicons/optimized/24/solid/map-pin.svg deleted file mode 100644 index 92e6785..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/map-pin.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/map.svg b/assets/vendor/heroicons/optimized/24/solid/map.svg deleted file mode 100644 index 9d4f7dd..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/map.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/megaphone.svg b/assets/vendor/heroicons/optimized/24/solid/megaphone.svg deleted file mode 100644 index b1f1e10..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/megaphone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/microphone.svg b/assets/vendor/heroicons/optimized/24/solid/microphone.svg deleted file mode 100644 index a5f4cb6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/microphone.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/minus-circle.svg b/assets/vendor/heroicons/optimized/24/solid/minus-circle.svg deleted file mode 100644 index 8c981ab..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/minus-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/minus-small.svg b/assets/vendor/heroicons/optimized/24/solid/minus-small.svg deleted file mode 100644 index 782213e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/minus-small.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/minus.svg b/assets/vendor/heroicons/optimized/24/solid/minus.svg deleted file mode 100644 index 1fa7117..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/moon.svg b/assets/vendor/heroicons/optimized/24/solid/moon.svg deleted file mode 100644 index 97d5c5a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/moon.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/musical-note.svg b/assets/vendor/heroicons/optimized/24/solid/musical-note.svg deleted file mode 100644 index a9ab9b5..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/musical-note.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/newspaper.svg b/assets/vendor/heroicons/optimized/24/solid/newspaper.svg deleted file mode 100644 index d1f2c1e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/newspaper.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/no-symbol.svg b/assets/vendor/heroicons/optimized/24/solid/no-symbol.svg deleted file mode 100644 index 42eb771..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/no-symbol.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/paint-brush.svg b/assets/vendor/heroicons/optimized/24/solid/paint-brush.svg deleted file mode 100644 index 35fd5a6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/paint-brush.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg b/assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg deleted file mode 100644 index 9365a57..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/paper-clip.svg b/assets/vendor/heroicons/optimized/24/solid/paper-clip.svg deleted file mode 100644 index 0a0dcdd..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/paper-clip.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/pause-circle.svg b/assets/vendor/heroicons/optimized/24/solid/pause-circle.svg deleted file mode 100644 index 4fe4f2b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/pause-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/pause.svg b/assets/vendor/heroicons/optimized/24/solid/pause.svg deleted file mode 100644 index 2e121ac..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/pause.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/pencil-square.svg b/assets/vendor/heroicons/optimized/24/solid/pencil-square.svg deleted file mode 100644 index 5f4aaf8..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/pencil-square.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/pencil.svg b/assets/vendor/heroicons/optimized/24/solid/pencil.svg deleted file mode 100644 index 78ec61a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/pencil.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg deleted file mode 100644 index 06f3ba0..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg deleted file mode 100644 index 678c4f6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg deleted file mode 100644 index a017a7d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/phone.svg b/assets/vendor/heroicons/optimized/24/solid/phone.svg deleted file mode 100644 index ca2a6bc..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/phone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/photo.svg b/assets/vendor/heroicons/optimized/24/solid/photo.svg deleted file mode 100644 index 57e023d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/photo.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/play-circle.svg b/assets/vendor/heroicons/optimized/24/solid/play-circle.svg deleted file mode 100644 index 752273a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/play-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/play-pause.svg b/assets/vendor/heroicons/optimized/24/solid/play-pause.svg deleted file mode 100644 index e5bb17c..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/play-pause.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/play.svg b/assets/vendor/heroicons/optimized/24/solid/play.svg deleted file mode 100644 index da0e4e2..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/play.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/plus-circle.svg b/assets/vendor/heroicons/optimized/24/solid/plus-circle.svg deleted file mode 100644 index b45f965..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/plus-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/plus-small.svg b/assets/vendor/heroicons/optimized/24/solid/plus-small.svg deleted file mode 100644 index 0c4b744..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/plus-small.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/plus.svg b/assets/vendor/heroicons/optimized/24/solid/plus.svg deleted file mode 100644 index 85d3b14..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/power.svg b/assets/vendor/heroicons/optimized/24/solid/power.svg deleted file mode 100644 index 2bf830f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/power.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg deleted file mode 100644 index cb0bc9a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg deleted file mode 100644 index 54e10b2..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/printer.svg b/assets/vendor/heroicons/optimized/24/solid/printer.svg deleted file mode 100644 index 4fce791..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/printer.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg b/assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg deleted file mode 100644 index 4f85b37..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/qr-code.svg b/assets/vendor/heroicons/optimized/24/solid/qr-code.svg deleted file mode 100644 index 7f676ca..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/qr-code.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg b/assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg deleted file mode 100644 index 2ae51be..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/queue-list.svg b/assets/vendor/heroicons/optimized/24/solid/queue-list.svg deleted file mode 100644 index 536fd88..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/queue-list.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/radio.svg b/assets/vendor/heroicons/optimized/24/solid/radio.svg deleted file mode 100644 index 92ca514..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/radio.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg b/assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg deleted file mode 100644 index 5eb6371..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg b/assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg deleted file mode 100644 index 6a1a154..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg b/assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg deleted file mode 100644 index 289d198..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg b/assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg deleted file mode 100644 index 82a1334..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg b/assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg deleted file mode 100644 index 522fc64..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/rss.svg b/assets/vendor/heroicons/optimized/24/solid/rss.svg deleted file mode 100644 index b9a8ab2..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/rss.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/scale.svg b/assets/vendor/heroicons/optimized/24/solid/scale.svg deleted file mode 100644 index b7e57c7..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/scale.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/scissors.svg b/assets/vendor/heroicons/optimized/24/solid/scissors.svg deleted file mode 100644 index 9c971b3..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/scissors.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/server-stack.svg b/assets/vendor/heroicons/optimized/24/solid/server-stack.svg deleted file mode 100644 index c0d3074..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/server-stack.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/server.svg b/assets/vendor/heroicons/optimized/24/solid/server.svg deleted file mode 100644 index 55f9aed..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/server.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/share.svg b/assets/vendor/heroicons/optimized/24/solid/share.svg deleted file mode 100644 index 8f45dfc..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/share.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/shield-check.svg b/assets/vendor/heroicons/optimized/24/solid/shield-check.svg deleted file mode 100644 index 2596ace..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/shield-check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg b/assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg deleted file mode 100644 index ce53fcc..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg b/assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg deleted file mode 100644 index e6503ee..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg b/assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg deleted file mode 100644 index 931a12f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/signal-slash.svg b/assets/vendor/heroicons/optimized/24/solid/signal-slash.svg deleted file mode 100644 index 21c65cb..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/signal-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/signal.svg b/assets/vendor/heroicons/optimized/24/solid/signal.svg deleted file mode 100644 index 9027aef..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/signal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/sparkles.svg b/assets/vendor/heroicons/optimized/24/solid/sparkles.svg deleted file mode 100644 index 0d8d0c1..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/sparkles.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg b/assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg deleted file mode 100644 index bd84477..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg deleted file mode 100644 index e71f1b6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg b/assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg deleted file mode 100644 index c3726a5..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg b/assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg deleted file mode 100644 index 8ed638d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg b/assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg deleted file mode 100644 index 475f6c3..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/squares-plus.svg b/assets/vendor/heroicons/optimized/24/solid/squares-plus.svg deleted file mode 100644 index 88a2dda..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/squares-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/star.svg b/assets/vendor/heroicons/optimized/24/solid/star.svg deleted file mode 100644 index 8509819..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/star.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/stop-circle.svg b/assets/vendor/heroicons/optimized/24/solid/stop-circle.svg deleted file mode 100644 index 8e57a2c..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/stop-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/stop.svg b/assets/vendor/heroicons/optimized/24/solid/stop.svg deleted file mode 100644 index 1bf426f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/stop.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/sun.svg b/assets/vendor/heroicons/optimized/24/solid/sun.svg deleted file mode 100644 index 1b597fa..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/sun.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/swatch.svg b/assets/vendor/heroicons/optimized/24/solid/swatch.svg deleted file mode 100644 index 9b26c03..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/swatch.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/table-cells.svg b/assets/vendor/heroicons/optimized/24/solid/table-cells.svg deleted file mode 100644 index 151a30c..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/table-cells.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/tag.svg b/assets/vendor/heroicons/optimized/24/solid/tag.svg deleted file mode 100644 index efcd01b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/tag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/ticket.svg b/assets/vendor/heroicons/optimized/24/solid/ticket.svg deleted file mode 100644 index e947c41..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/ticket.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/trash.svg b/assets/vendor/heroicons/optimized/24/solid/trash.svg deleted file mode 100644 index ed7bf43..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/trash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/trophy.svg b/assets/vendor/heroicons/optimized/24/solid/trophy.svg deleted file mode 100644 index ed7ee15..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/trophy.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/truck.svg b/assets/vendor/heroicons/optimized/24/solid/truck.svg deleted file mode 100644 index c218da6..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/truck.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/tv.svg b/assets/vendor/heroicons/optimized/24/solid/tv.svg deleted file mode 100644 index 8f27026..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/tv.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/user-circle.svg b/assets/vendor/heroicons/optimized/24/solid/user-circle.svg deleted file mode 100644 index 978d0b8..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/user-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/user-group.svg b/assets/vendor/heroicons/optimized/24/solid/user-group.svg deleted file mode 100644 index 7ae7600..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/user-group.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/user-minus.svg b/assets/vendor/heroicons/optimized/24/solid/user-minus.svg deleted file mode 100644 index 062a7c9..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/user-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/user-plus.svg b/assets/vendor/heroicons/optimized/24/solid/user-plus.svg deleted file mode 100644 index ef313fa..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/user-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/user.svg b/assets/vendor/heroicons/optimized/24/solid/user.svg deleted file mode 100644 index 207213d..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/user.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/users.svg b/assets/vendor/heroicons/optimized/24/solid/users.svg deleted file mode 100644 index 2959115..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/users.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/variable.svg b/assets/vendor/heroicons/optimized/24/solid/variable.svg deleted file mode 100644 index 5601cac..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/variable.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg b/assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg deleted file mode 100644 index 2a344d5..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/video-camera.svg b/assets/vendor/heroicons/optimized/24/solid/video-camera.svg deleted file mode 100644 index 55bf7b4..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/video-camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/view-columns.svg b/assets/vendor/heroicons/optimized/24/solid/view-columns.svg deleted file mode 100644 index f7295e3..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/view-columns.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg b/assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg deleted file mode 100644 index e04b727..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/wallet.svg b/assets/vendor/heroicons/optimized/24/solid/wallet.svg deleted file mode 100644 index 001b38a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/wallet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/wifi.svg b/assets/vendor/heroicons/optimized/24/solid/wifi.svg deleted file mode 100644 index eb4fd4e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/wifi.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/window.svg b/assets/vendor/heroicons/optimized/24/solid/window.svg deleted file mode 100644 index 4de83b3..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/window.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg b/assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg deleted file mode 100644 index b7e0e9e..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/wrench.svg b/assets/vendor/heroicons/optimized/24/solid/wrench.svg deleted file mode 100644 index 3b61d5b..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/wrench.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/x-circle.svg b/assets/vendor/heroicons/optimized/24/solid/x-circle.svg deleted file mode 100644 index 913782a..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/x-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/heroicons/optimized/24/solid/x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/x-mark.svg deleted file mode 100644 index e525a8f..0000000 --- a/assets/vendor/heroicons/optimized/24/solid/x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/assets/vendor/topbar.js b/assets/vendor/topbar.js deleted file mode 100644 index 4195727..0000000 --- a/assets/vendor/topbar.js +++ /dev/null @@ -1,165 +0,0 @@ -/** - * @license MIT - * topbar 2.0.0, 2023-02-04 - * https://buunguyen.github.io/topbar - * Copyright (c) 2021 Buu Nguyen - */ -(function (window, document) { - "use strict"; - - // https://gist.github.com/paulirish/1579671 - (function () { - var lastTime = 0; - var vendors = ["ms", "moz", "webkit", "o"]; - for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { - window.requestAnimationFrame = - window[vendors[x] + "RequestAnimationFrame"]; - window.cancelAnimationFrame = - window[vendors[x] + "CancelAnimationFrame"] || - window[vendors[x] + "CancelRequestAnimationFrame"]; - } - if (!window.requestAnimationFrame) - window.requestAnimationFrame = function (callback, element) { - var currTime = new Date().getTime(); - var timeToCall = Math.max(0, 16 - (currTime - lastTime)); - var id = window.setTimeout(function () { - callback(currTime + timeToCall); - }, timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - if (!window.cancelAnimationFrame) - window.cancelAnimationFrame = function (id) { - clearTimeout(id); - }; - })(); - - var canvas, - currentProgress, - showing, - progressTimerId = null, - fadeTimerId = null, - delayTimerId = null, - addEvent = function (elem, type, handler) { - if (elem.addEventListener) elem.addEventListener(type, handler, false); - else if (elem.attachEvent) elem.attachEvent("on" + type, handler); - else elem["on" + type] = handler; - }, - options = { - autoRun: true, - barThickness: 3, - barColors: { - 0: "rgba(26, 188, 156, .9)", - ".25": "rgba(52, 152, 219, .9)", - ".50": "rgba(241, 196, 15, .9)", - ".75": "rgba(230, 126, 34, .9)", - "1.0": "rgba(211, 84, 0, .9)", - }, - shadowBlur: 10, - shadowColor: "rgba(0, 0, 0, .6)", - className: null, - }, - repaint = function () { - canvas.width = window.innerWidth; - canvas.height = options.barThickness * 5; // need space for shadow - - var ctx = canvas.getContext("2d"); - ctx.shadowBlur = options.shadowBlur; - ctx.shadowColor = options.shadowColor; - - var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); - for (var stop in options.barColors) - lineGradient.addColorStop(stop, options.barColors[stop]); - ctx.lineWidth = options.barThickness; - ctx.beginPath(); - ctx.moveTo(0, options.barThickness / 2); - ctx.lineTo( - Math.ceil(currentProgress * canvas.width), - options.barThickness / 2 - ); - ctx.strokeStyle = lineGradient; - ctx.stroke(); - }, - createCanvas = function () { - canvas = document.createElement("canvas"); - var style = canvas.style; - style.position = "fixed"; - style.top = style.left = style.right = style.margin = style.padding = 0; - style.zIndex = 100001; - style.display = "none"; - if (options.className) canvas.classList.add(options.className); - document.body.appendChild(canvas); - addEvent(window, "resize", repaint); - }, - topbar = { - config: function (opts) { - for (var key in opts) - if (options.hasOwnProperty(key)) options[key] = opts[key]; - }, - show: function (delay) { - if (showing) return; - if (delay) { - if (delayTimerId) return; - delayTimerId = setTimeout(() => topbar.show(), delay); - } else { - showing = true; - if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId); - if (!canvas) createCanvas(); - canvas.style.opacity = 1; - canvas.style.display = "block"; - topbar.progress(0); - if (options.autoRun) { - (function loop() { - progressTimerId = window.requestAnimationFrame(loop); - topbar.progress( - "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2) - ); - })(); - } - } - }, - progress: function (to) { - if (typeof to === "undefined") return currentProgress; - if (typeof to === "string") { - to = - (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 - ? currentProgress - : 0) + parseFloat(to); - } - currentProgress = to > 1 ? 1 : to; - repaint(); - return currentProgress; - }, - hide: function () { - clearTimeout(delayTimerId); - delayTimerId = null; - if (!showing) return; - showing = false; - if (progressTimerId != null) { - window.cancelAnimationFrame(progressTimerId); - progressTimerId = null; - } - (function loop() { - if (topbar.progress("+.1") >= 1) { - canvas.style.opacity -= 0.05; - if (canvas.style.opacity <= 0.05) { - canvas.style.display = "none"; - fadeTimerId = null; - return; - } - } - fadeTimerId = window.requestAnimationFrame(loop); - })(); - }, - }; - - if (typeof module === "object" && typeof module.exports === "object") { - module.exports = topbar; - } else if (typeof define === "function" && define.amd) { - define(function () { - return topbar; - }); - } else { - this.topbar = topbar; - } -}.call(this, window, document)); diff --git a/config/config.exs b/config/config.exs deleted file mode 100644 index 24ca796..0000000 --- a/config/config.exs +++ /dev/null @@ -1,71 +0,0 @@ -# This file is responsible for configuring your application -# and its dependencies with the aid of the Config module. -# -# This configuration file is loaded before any dependency and -# is restricted to this project. - -# General application configuration -import Config - -config :helldivers_2, - generators: [timestamp_type: :utc_datetime], - war_season: "801", - war_seasons: ["801", "805"], - # default language - language: :en, - # all available languages - languages: [ - en: "en-US", - de: "de-DE", - es: "es-ES", - ru: "ru-RU", - fr: "fr-FR", - it: "it-IT", - pl: "pl-PL", - zh: "zh-Hans" - ] - -# Configures the endpoint -config :helldivers_2, Helldivers2Web.Endpoint, - url: [host: "localhost"], - adapter: Bandit.PhoenixAdapter, - render_errors: [ - formats: [html: Helldivers2Web.ErrorHTML, json: Helldivers2Web.ErrorJSON], - layout: false - ], - pubsub_server: Helldivers2.PubSub, - live_view: [signing_salt: "zoUaShs4"] - -# Configure esbuild (the version is required) -config :esbuild, - version: "0.17.11", - default: [ - args: - ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*), - cd: Path.expand("../assets", __DIR__), - env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)} - ] - -# Configure tailwind (the version is required) -config :tailwind, - version: "3.3.2", - default: [ - args: ~w( - --config=tailwind.config.js - --input=css/app.css - --output=../priv/static/assets/app.css - ), - cd: Path.expand("../assets", __DIR__) - ] - -# Configures Elixir's Logger -config :logger, :console, - format: "$time $metadata[$level] $message\n", - metadata: [:request_id] - -# Use Jason for JSON parsing in Phoenix -config :phoenix, :json_library, Jason - -# Import environment specific config. This must remain at the bottom -# of this file so it overrides the configuration defined above. -import_config "#{config_env()}.exs" diff --git a/config/dev.exs b/config/dev.exs deleted file mode 100644 index 8c57315..0000000 --- a/config/dev.exs +++ /dev/null @@ -1,77 +0,0 @@ -import Config - -# For development, we disable any cache and enable -# debugging and code reloading. -# -# The watchers configuration can be used to run external -# watchers to your application. For example, we can use it -# to bundle .js and .css sources. -config :helldivers_2, Helldivers2Web.Endpoint, - # Binding to loopback ipv4 address prevents access from other machines. - # Change to `ip: {0, 0, 0, 0}` to allow access from other machines. - http: [ip: {127, 0, 0, 1}, port: 4000], - check_origin: false, - code_reloader: true, - debug_errors: true, - secret_key_base: "NKfD+wO98ETWmddutVPxXsYfQiZnDP8EUXb7p94o/nia+SHPkrnMjvrAci002ASU", - watchers: [ - esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}, - tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]} - ] - -# ## SSL Support -# -# In order to use HTTPS in development, a self-signed -# certificate can be generated by running the following -# Mix task: -# -# mix phx.gen.cert -# -# Run `mix help phx.gen.cert` for more information. -# -# The `http:` config above can be replaced with: -# -# https: [ -# port: 4001, -# cipher_suite: :strong, -# keyfile: "priv/cert/selfsigned_key.pem", -# certfile: "priv/cert/selfsigned.pem" -# ], -# -# If desired, both `http:` and `https:` keys can be -# configured to run both http and https servers on -# different ports. - -# Watch static and templates for browser reloading. -config :helldivers_2, Helldivers2Web.Endpoint, - live_reload: [ - patterns: [ - ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$", - ~r"lib/helldivers_2_web/(controllers|live|components)/.*(ex|heex)$" - ] - ] - -# Enable dev routes for dashboard and mailbox -config :helldivers_2, dev_routes: true - -# Do not include metadata nor timestamps in development logs -config :logger, :console, format: "[$level] $message\n" - -# Set a higher stacktrace during development. Avoid configuring such -# in production as building large stacktraces may be expensive. -config :phoenix, :stacktrace_depth, 20 - -# Initialize plugs at runtime for faster development compilation -config :phoenix, :plug_init_mode, :runtime - -# Include HEEx debug annotations as HTML comments in rendered markup -config :phoenix_live_view, :debug_heex_annotations, true - -# Ensures the OpenApi spec is refreshed during development and not cached -config :open_api_spex, :cache_adapter, OpenApiSpex.Plug.NoneCache - -# Configure rate limits, in development we'll just have none -config :helldivers_2, Helldivers2Web.Plugs.RateLimit, - max_requests: 0, - # 5 minutes - interval_seconds: 300 diff --git a/config/prod.exs b/config/prod.exs deleted file mode 100644 index 047a409..0000000 --- a/config/prod.exs +++ /dev/null @@ -1,15 +0,0 @@ -import Config - -# Note we also include the path to a cache manifest -# containing the digested version of static files. This -# manifest is generated by the `mix assets.deploy` task, -# which you should run after static files are built and -# before starting your production server. -config :helldivers_2, Helldivers2Web.Endpoint, - cache_static_manifest: "priv/static/cache_manifest.json" - -# Do not print debug messages in production -config :logger, level: :info - -# Runtime production configuration, including reading -# of environment variables, is done on config/runtime.exs. diff --git a/config/runtime.exs b/config/runtime.exs deleted file mode 100644 index 9bf05af..0000000 --- a/config/runtime.exs +++ /dev/null @@ -1,89 +0,0 @@ -import Config - -# config/runtime.exs is executed for all environments, including -# during releases. It is executed after compilation and before the -# system starts, so it is typically used to load production configuration -# and secrets from environment variables or elsewhere. Do not define -# any compile-time configuration in here, as it won't be applied. -# The block below contains prod specific runtime configuration. - -# ## Using releases -# -# If you use `mix release`, you need to explicitly enable the server -# by passing the PHX_SERVER=true when you start it: -# -# PHX_SERVER=true bin/helldivers_2 start -# -# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server` -# script that automatically sets the env var above. -if System.get_env("PHX_SERVER") do - config :helldivers_2, Helldivers2Web.Endpoint, server: true -end - -if config_env() == :prod do - # The secret key base is used to sign/encrypt cookies and other secrets. - # A default value is used in config/dev.exs and config/test.exs but you - # want to use a different value for prod and you most likely don't want - # to check this value into version control, so we use an environment - # variable instead. - secret_key_base = - System.get_env("SECRET_KEY_BASE") || - raise """ - environment variable SECRET_KEY_BASE is missing. - You can generate one by calling: mix phx.gen.secret - """ - - host = System.get_env("PHX_HOST") || "example.com" - port = String.to_integer(System.get_env("PORT") || "4000") - - config :helldivers_2, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY") - - config :helldivers_2, Helldivers2Web.Endpoint, - url: [host: host, port: 443, scheme: "https"], - http: [ - # Enable IPv6 and bind on all interfaces. - # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access. - # See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html - # for details about using IPv6 vs IPv4 and loopback vs public addresses. - ip: {0, 0, 0, 0, 0, 0, 0, 0}, - port: port - ], - secret_key_base: secret_key_base - - # Configure rate limits, in development we'll just have none - config :helldivers_2, Helldivers2Web.Plugs.RateLimit, - max_requests: String.to_integer(System.get_env("RATE_LIMIT_MAX_REQUESTS", "10")), - interval_seconds: String.to_integer(System.get_env("RATE_LIMIT_INTERVAL", "300")) - - # ## SSL Support - # - # To get SSL working, you will need to add the `https` key - # to your endpoint configuration: - # - # config :helldivers_2, Helldivers2Web.Endpoint, - # https: [ - # ..., - # port: 443, - # cipher_suite: :strong, - # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), - # certfile: System.get_env("SOME_APP_SSL_CERT_PATH") - # ] - # - # The `cipher_suite` is set to `:strong` to support only the - # latest and more secure SSL ciphers. This means old browsers - # and clients may not be supported. You can set it to - # `:compatible` for wider support. - # - # `:keyfile` and `:certfile` expect an absolute path to the key - # and cert in disk or a relative path inside priv, for example - # "priv/ssl/server.key". For all supported SSL configuration - # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1 - # - # We also recommend setting `force_ssl` in your endpoint, ensuring - # no data is ever sent via http, always redirecting to https: - # - # config :helldivers_2, Helldivers2Web.Endpoint, - # force_ssl: [hsts: true] - # - # Check `Plug.SSL` for all available options in `force_ssl`. -end diff --git a/config/test.exs b/config/test.exs deleted file mode 100644 index 4bde470..0000000 --- a/config/test.exs +++ /dev/null @@ -1,29 +0,0 @@ -import Config - -# We don't start up any Helldiver seasons during tests to avoid hitting the API -config :helldivers_2, - war_seasons: [], - # Limit languages available in testing - languages: [ - en: "en-US", - de: "de-DE" - ] - -# We don't run a server during test. If one is required, -# you can enable the server option below. -config :helldivers_2, Helldivers2Web.Endpoint, - http: [ip: {127, 0, 0, 1}, port: 4002], - secret_key_base: "mwKZIC3HNHU53eNFSSNUfW9fL/nwvWa3JbHUTU6LbPFzG+hHQItYHvE8zisTj3EO", - server: false - -# Print only warnings and errors during test -config :logger, level: :warning - -# Initialize plugs at runtime for faster test compilation -config :phoenix, :plug_init_mode, :runtime - -# Configure rate limits, in tests we'll just have none -config :helldivers_2, Helldivers2Web.Plugs.RateLimit, - max_requests: 0, - # 5 minutes - interval_seconds: 300 diff --git a/fly.toml b/fly.toml index 4010102..3dc6782 100644 --- a/fly.toml +++ b/fly.toml @@ -3,25 +3,22 @@ # See https://fly.io/docs/reference/configuration/ for information about how to use this file. # -app = 'helldivers-2' +app = 'helldivers-2-dotnet' primary_region = 'ams' kill_signal = 'SIGTERM' [build] + dockerfile = 'src/Helldivers-2-API/Dockerfile' + ignorefile = '.dockerignore' [env] - PHX_HOST = 'helldivers-2.fly.dev' - PORT = '8080' - RATE_LIMIT_MAX_REQUESTS = "500" - RATE_LIMIT_INTERVAL = "60" - ENABLE_IPV6 = 'true' [http_service] internal_port = 8080 force_https = true auto_stop_machines = true auto_start_machines = true - min_machines_running = 1 + min_machines_running = 0 processes = ['app'] [http_service.concurrency] @@ -30,11 +27,12 @@ kill_signal = 'SIGTERM' soft_limit = 1000 [[http_service.checks]] - grace_period = "1s" - interval = "60s" + grace_period = "2s" + interval = "120s" method = "GET" - timeout = "5s" - path = "/api/801/status" + timeout = "10s" + path = "/raw/api/WarSeason/current/WarID" + [[vm]] memory = "256mb" diff --git a/lib/helldivers_2.ex b/lib/helldivers_2.ex deleted file mode 100644 index 442e7b2..0000000 --- a/lib/helldivers_2.ex +++ /dev/null @@ -1,9 +0,0 @@ -defmodule Helldivers2 do - @moduledoc """ - Helldivers2 keeps the contexts that define your domain - and business logic. - - Contexts are also responsible for managing your data, regardless - if it comes from the database, an external API or others. - """ -end diff --git a/lib/helldivers_2/application.ex b/lib/helldivers_2/application.ex deleted file mode 100644 index c0d2560..0000000 --- a/lib/helldivers_2/application.ex +++ /dev/null @@ -1,44 +0,0 @@ -defmodule Helldivers2.Application do - # See https://hexdocs.pm/elixir/Application.html - # for more information on OTP Applications - @moduledoc false - - use Application - - @impl true - def start(_type, _args) do - season_syncs = - :helldivers_2 - |> Application.get_env(:war_seasons) - |> Enum.map(fn war_id -> {Helldivers2.WarSync, war_id: war_id} end) - - children = - [ - Helldivers2Web.Telemetry, - {DNSCluster, query: Application.get_env(:helldivers_2, :dns_cluster_query) || :ignore}, - {Phoenix.PubSub, name: Helldivers2.PubSub}, - {Registry, keys: :unique, name: Helldivers2.WarSync.Registry}, - {Registry, keys: :unique, name: Helldivers2.WarSeason.Registry} - ] ++ - season_syncs ++ - [ - # Start a worker by calling: Helldivers2.Worker.start_link(arg) - # {Helldivers2.Worker, arg}, - # Start to serve requests, typically the last entry - Helldivers2Web.Endpoint - ] - - # See https://hexdocs.pm/elixir/Supervisor.html - # for other strategies and supported options - opts = [strategy: :one_for_one, name: Helldivers2.Supervisor] - Supervisor.start_link(children, opts) - end - - # Tell Phoenix to update the endpoint configuration - # whenever the application is updated. - @impl true - def config_change(changed, _new, removed) do - Helldivers2Web.Endpoint.config_change(changed, removed) - :ok - end -end diff --git a/lib/helldivers_2/macros/from_json.ex b/lib/helldivers_2/macros/from_json.ex deleted file mode 100644 index 27c0d0c..0000000 --- a/lib/helldivers_2/macros/from_json.ex +++ /dev/null @@ -1,34 +0,0 @@ -defmodule Helldivers2.Macros.FromJson do - @moduledoc """ - Macro that generates mappings from JSON files. - - This method generates a `parse/1` method that returns the value. - This allows constant time lookups from the JSON. - """ - - defmacro __using__(filename) do - mappings = - :helldivers_2 - |> :code.priv_dir() - |> Path.join(filename) - |> File.read!() - |> Jason.decode!() - - for {key, value} <- mappings do - if String.length(value) > 0 do - quote do - defp lookup("#{unquote(key)}"), do: unquote(value) - end - else - quote do - defp lookup("#{unquote(key)}"), do: unquote(key) - end - end - end ++ - [ - quote do - def all(), do: unquote(Macro.escape(Map.values(mappings))) - end - ] - end -end diff --git a/lib/helldivers_2/models/news_feed.ex b/lib/helldivers_2/models/news_feed.ex deleted file mode 100644 index af106d2..0000000 --- a/lib/helldivers_2/models/news_feed.ex +++ /dev/null @@ -1,47 +0,0 @@ -defmodule Helldivers2.Models.NewsFeed do - alias Helldivers2.Models.NewsFeed.Message - - @type t :: list(Message.t()) - - @spec download(String.t()) :: {:error, any()} | {:ok, list(Message.t())} - def download(war_id) do - default_language = Application.get_env(:helldivers_2, :language) - - translations = :helldivers_2 - |> Application.get_env(:languages) - |> Task.async_stream(fn {key, lang} -> {key, download_language!(war_id, lang)} end, timeout: :infinity, zip_input_on_exit: true) - |> Enum.reduce(%{}, fn ({:ok, {key, payload}}, acc) -> - Map.put(acc, key, payload) - end) - - # Take the default language as 'base' response object. - base = Map.get(translations, default_language) - - {:ok, parse(base, translations)} - end - - @spec parse(list(map()), list(map())) :: list(Message.t()) - def parse(list, translations) when is_list(list) do - Enum.map(list, &Message.parse(&1, translations)) - end - - @spec download_language!(String.t(), String.t()) :: map() | no_return() - defp download_language!(war_id, language) do - response = - [ - url: "https://api.live.prod.thehelldiversgame.com/api/NewsFeed/#{war_id}?fromTimestamp=0", - retry: :transient - ] - |> Req.new() - |> Req.Request.put_header("accept-language", language) - |> Req.request!() - - case response do - %Req.Response{status: 200} -> - response.body - - %Req.Response{status: status} -> - raise "API returned an error #{status}" - end - end -end diff --git a/lib/helldivers_2/models/news_feed/message.ex b/lib/helldivers_2/models/news_feed/message.ex deleted file mode 100644 index 7706ab7..0000000 --- a/lib/helldivers_2/models/news_feed/message.ex +++ /dev/null @@ -1,39 +0,0 @@ -defmodule Helldivers2.Models.NewsFeed.Message do - @type t :: %__MODULE__{ - id: non_neg_integer(), - published_at: DateTime.t(), - type: non_neg_integer(), - tag_ids: list(non_neg_integer()), - messages: String.t() - } - - defstruct [ - :id, - :published_at, - :type, - :tag_ids, - :messages - ] - - def parse(map, translations) when is_map(map) do - # Get the ID of the base entity so we can fetch all matching entities from translations. - id = Map.get(map, "id") - published = Map.get(map, "published") - messages = translations - |> Map.new(fn {lang, events} -> - message = events - |> Enum.find(%{}, fn event -> Map.get(event, "id") == id end) - |> Map.get("message") - - {lang, message} - end) - - %__MODULE__{ - id: Map.get(map, "id"), - published_at: DateTime.add(DateTime.utc_now(), -published), - type: Map.get(map, "type"), - tag_ids: Map.get(map, "tagIds"), - messages: messages - } - end -end diff --git a/lib/helldivers_2/models/war_info.ex b/lib/helldivers_2/models/war_info.ex deleted file mode 100644 index 971e356..0000000 --- a/lib/helldivers_2/models/war_info.ex +++ /dev/null @@ -1,70 +0,0 @@ -defmodule Helldivers2.Models.WarInfo do - @moduledoc """ - Represents the information retrieved from the Helldivers 2 API. - """ - alias Helldivers2.Models.WarInfo.Planet - alias Helldivers2.Models.WarInfo.HomeWorld - - @type t :: %__MODULE__{ - war_id: String.t(), - start_date: DateTime.t(), - end_date: DateTime.t(), - minimum_client_version: String.t(), - planets: list(Planet.t()), - home_worlds: list(HomeWorld.t()), - capitals: [], - planet_permanent_effects: [] - } - - defstruct [ - :war_id, - :start_date, - :end_date, - :minimum_client_version, - :planets, - :home_worlds, - :capitals, - :planet_permanent_effects - ] - - @spec download(String.t()) :: {:ok, t()} | {:error, term()} - def download(war_id) do - with {:ok, response} <- - Req.get("https://api.live.prod.thehelldiversgame.com/api/WarSeason/#{war_id}/WarInfo"), - %Req.Response{status: 200, body: payload} <- response do - {:ok, parse(payload)} - else - %Req.Response{status: status} -> - {:error, "API error #{status}"} - end - end - - @doc """ - Attempts to parse as much information as possible from the given `map` into a struct. - """ - @spec parse(map()) :: t() - def parse(map) when is_map(map) do - planets = Enum.map(Map.get(map, "planetInfos"), &Planet.parse/1) - - %__MODULE__{ - war_id: Map.get(map, "warId"), - start_date: parse_datetime(map, "startDate"), - end_date: parse_datetime(map, "endDate"), - minimum_client_version: Map.get(map, "minimumClientVersion"), - planets: planets, - home_worlds: Enum.map(Map.get(map, "homeWorlds"), &HomeWorld.parse(&1, planets)), - capitals: [], - planet_permanent_effects: [] - } - end - - @spec parse_datetime(map(), String.t()) :: DateTime.t() - defp parse_datetime(map, key) do - with epoch when is_number(epoch) <- Map.get(map, key), - {:ok, datetime} <- DateTime.from_unix(epoch, :second) do - datetime - else - _ -> DateTime.from_unix!(0, :second) - end - end -end diff --git a/lib/helldivers_2/models/war_info/faction.ex b/lib/helldivers_2/models/war_info/faction.ex deleted file mode 100644 index aac367d..0000000 --- a/lib/helldivers_2/models/war_info/faction.ex +++ /dev/null @@ -1,15 +0,0 @@ -defmodule Helldivers2.Models.WarInfo.Faction do - @moduledoc """ - Wrapper module for fetching the faction from an index. - - See priv/factions.json for list - """ - use Helldivers2.Macros.FromJson, "factions.json" - - @type t :: String.t() - - @spec parse(non_neg_integer() | String.t()) :: t() - def parse(index) when is_number(index), do: parse(to_string(index)) - def parse(name), do: lookup(name) - defp lookup(_), do: "Unknown" -end diff --git a/lib/helldivers_2/models/war_info/home_world.ex b/lib/helldivers_2/models/war_info/home_world.ex deleted file mode 100644 index fb47aa2..0000000 --- a/lib/helldivers_2/models/war_info/home_world.ex +++ /dev/null @@ -1,40 +0,0 @@ -defmodule Helldivers2.Models.WarInfo.HomeWorld do - @moduledoc """ - Represents information about the homeworld of a given faction. - - There's currently 3 factions in Helldivers 2: - - Humans - - Automatons - - Terminid - """ - alias Helldivers2.Models.WarInfo.Planet - alias Helldivers2.Models.WarInfo.Faction - - @type t :: %__MODULE__{ - race: Faction.t(), - planets: list(Planet.t()) - } - - defstruct [ - :race, - :planets - ] - - @doc """ - Attempts to parse as much information as possible from the given `map` into a struct. - """ - @spec parse(map(), list(Planet.t())) :: t() - def parse(map, planets) when is_map(map) do - %__MODULE__{ - race: Faction.parse(Map.get(map, "race")), - planets: Enum.map(Map.get(map, "planetIndices"), &find_planet(&1, planets)) - } - end - - @spec find_planet(non_neg_integer(), list(Planet.t())) :: Planet.t() - defp find_planet(planet_index, planets) do - Enum.find(planets, fn planet -> - planet.index == planet_index - end) - end -end diff --git a/lib/helldivers_2/models/war_info/planet.ex b/lib/helldivers_2/models/war_info/planet.ex deleted file mode 100644 index b9daec7..0000000 --- a/lib/helldivers_2/models/war_info/planet.ex +++ /dev/null @@ -1,67 +0,0 @@ -defmodule Helldivers2.Models.WarInfo.Planet do - alias Helldivers2.Models.WarInfo.Sector - alias Helldivers2.Models.WarInfo.Faction - - use Helldivers2.Macros.FromJson, "planets.json" - - @type t() :: %__MODULE__{ - index: non_neg_integer(), - name: String.t(), - hash: non_neg_integer(), - position: {float(), float()}, - waypoints: list(non_neg_integer()), - sector: Sector.t(), - max_health: non_neg_integer(), - disabled: boolean(), - initial_owner: Faction.t() - } - - defstruct [ - :index, - :name, - :hash, - :position, - :waypoints, - :sector, - :max_health, - :disabled, - :initial_owner - ] - - @doc """ - Attempts to parse as much information as possible from the given `map` into a struct. - """ - @spec parse(map()) :: t() - def parse(map) when is_map(map) do - index = Map.get(map, "index") - - %__MODULE__{ - index: index, - name: lookup(to_string(index)), - hash: Map.get(map, "settingsHash"), - position: parse_position(map), - waypoints: parse_waypoints(map), - sector: Sector.parse(Map.get(map, "sector")), - max_health: Map.get(map, "maxHealth"), - disabled: Map.get(map, "disabled"), - initial_owner: Faction.parse(Map.get(map, "initialOwner")) - } - end - - defp parse_position(map) do - position = Map.get(map, "position", %{}) - - {round_coord(Map.get(position, "x") * 100), round_coord(Map.get(position, "y") * 100)} - end - - defp parse_waypoints(map) do - Map.get(map, "waypoints") - end - - # define a fallback for FromJson.lookup - defp lookup(_), do: "Unknown" - - defp round_coord(0), do: 0 - - defp round_coord(number), do: Float.round(number, 6) -end diff --git a/lib/helldivers_2/models/war_info/sector.ex b/lib/helldivers_2/models/war_info/sector.ex deleted file mode 100644 index adf06ef..0000000 --- a/lib/helldivers_2/models/war_info/sector.ex +++ /dev/null @@ -1,13 +0,0 @@ -defmodule Helldivers2.Models.WarInfo.Sector do - @moduledoc """ - Wrapper module for fetching the sector from an index. - """ - use Helldivers2.Macros.FromJson, "sectors.json" - - @type t :: String.t() - - @spec parse(non_neg_integer() | String.t()) :: t() - def parse(index) when is_number(index), do: parse(to_string(index)) - def parse(name), do: lookup(name) - defp lookup(index), do: index -end diff --git a/lib/helldivers_2/models/war_status.ex b/lib/helldivers_2/models/war_status.ex deleted file mode 100644 index ebbadaf..0000000 --- a/lib/helldivers_2/models/war_status.ex +++ /dev/null @@ -1,131 +0,0 @@ -defmodule Helldivers2.Models.WarStatus do - @moduledoc """ - Contains current information on the state of the galactic war. - Specifically, the progression of democracy per planet, - where attacks are taking place, ongoing campaigns, - community targets, joint operations, planet events, - and global events. - """ - require Logger - alias Helldivers2.WarSeason - alias Helldivers2.Models.WarInfo.Planet - alias Helldivers2.Models.WarStatus.PlanetEvent - alias Helldivers2.Models.WarStatus.JointOperation - alias Helldivers2.Models.WarStatus.GlobalEvent - alias Helldivers2.Models.WarStatus.Campaign - alias Helldivers2.Models.WarStatus.PlanetStatus - - @type t :: %__MODULE__{ - war_id: String.t(), - started_at: DateTime.t(), - snapshot_at: DateTime.t(), - impact_multiplier: float(), - planet_status: list(PlanetStatus.t()), - planet_attacks: {Planet.t(), Planet.t()}, - campaigns: list(Campaign.t()), - community_targets: list(), - joint_operations: list(JointOperation.t()), - planet_events: list(PlanetEvent.t()), - planet_active_effects: list(), - active_election_policy_effects: list(), - global_events: list(GlobalEvent.t()) - } - - defstruct [ - :war_id, - :started_at, - :snapshot_at, - :impact_multiplier, - :planet_status, - :planet_attacks, - :campaigns, - :community_targets, - :joint_operations, - :planet_events, - :planet_active_effects, - :active_election_policy_effects, - :global_events - ] - - @spec download(String.t()) :: {:ok, t()} | {:error, term()} - def download(war_id) do - default_language = Application.get_env(:helldivers_2, :language) - - translations = :helldivers_2 - |> Application.get_env(:languages) - |> Task.async_stream(fn {key, lang} -> {key, download_language!(war_id, lang)} end, timeout: :infinity, zip_input_on_exit: true) - |> Enum.reduce(%{}, fn ({:ok, {key, payload}}, acc) -> - Map.put(acc, key, payload) - end) - - # Take the default language as 'base' response object. - base = Map.get(translations, default_language) - - {:ok, parse(base, translations)} - end - - @doc """ - Attempts to parse as much information as possible from the given `map` into a struct. - """ - @spec parse(map(), %{atom() => map()}) :: t() - def parse(map, translations \\ %{}) when is_map(map) do - war_id = Map.get(map, "warId") - snapshot_at = DateTime.utc_now() - campaigns = Enum.map(Map.get(map, "campaigns"), &Campaign.parse(war_id, &1)) - - joint_operations = - Enum.map(Map.get(map, "jointOperations"), &JointOperation.parse(war_id, &1)) - - # We currently only translate global events - global_event_translations = translations - |> Map.new(fn {key, payload} -> {key, Map.get(payload, "globalEvents")} end) - - %__MODULE__{ - war_id: war_id, - started_at: DateTime.add(snapshot_at, - Map.get(map, "time")), - snapshot_at: snapshot_at, - impact_multiplier: Map.get(map, "impactMultiplier"), - planet_status: Enum.map(Map.get(map, "planetStatus"), &PlanetStatus.parse(war_id, &1)), - planet_attacks: - Enum.map(Map.get(map, "planetAttacks"), fn attack -> - { - WarSeason.get_planet!(war_id, Map.get(attack, "source")), - WarSeason.get_planet!(war_id, Map.get(attack, "target")) - } - end), - campaigns: campaigns, - community_targets: [], - joint_operations: joint_operations, - planet_events: - Enum.map( - Map.get(map, "planetEvents"), - &PlanetEvent.parse(war_id, campaigns, joint_operations, &1) - ), - planet_active_effects: [], - active_election_policy_effects: [], - global_events: map - |> Map.get("globalEvents") - |> Enum.map(&GlobalEvent.parse(war_id, &1, global_event_translations)) - |> Enum.sort(fn (event1, event2) -> event1.id > event2.id end) - } - end - - @spec download_language!(String.t(), String.t()) :: map() | no_return() - defp download_language!(war_id, language) do - Logger.debug("Fetching #{language} for #{war_id}") - - response = - [url: "https://api.live.prod.thehelldiversgame.com/api/WarSeason/#{war_id}/Status", retry: :transient] - |> Req.new() - |> Req.Request.put_header("accept-language", language) - |> Req.request!() - - case response do - %Req.Response{status: 200} -> - response.body - - %Req.Response{status: status} -> - raise "API returned an error #{status}" - end - end -end diff --git a/lib/helldivers_2/models/war_status/campaign.ex b/lib/helldivers_2/models/war_status/campaign.ex deleted file mode 100644 index b81f9bd..0000000 --- a/lib/helldivers_2/models/war_status/campaign.ex +++ /dev/null @@ -1,31 +0,0 @@ -defmodule Helldivers2.Models.WarStatus.Campaign do - alias Helldivers2.WarSeason - alias Helldivers2.Models.WarInfo.Planet - - @type t :: %__MODULE__{ - id: number(), - planet: Planet.t(), - type: non_neg_integer(), - count: non_neg_integer() - } - - defstruct [ - :id, - :planet, - :type, - :count - ] - - @doc """ - Attempts to parse as much information as possible from the given `map` into a struct. - """ - @spec parse(String.t(), map()) :: t() - def parse(war_id, map) when is_map(map) do - %__MODULE__{ - id: Map.get(map, "id"), - planet: WarSeason.get_planet!(war_id, Map.get(map, "planetIndex")), - type: Map.get(map, "type"), - count: Map.get(map, "count") - } - end -end diff --git a/lib/helldivers_2/models/war_status/effect.ex b/lib/helldivers_2/models/war_status/effect.ex deleted file mode 100644 index 35c1349..0000000 --- a/lib/helldivers_2/models/war_status/effect.ex +++ /dev/null @@ -1,14 +0,0 @@ -defmodule Helldivers2.Models.WarStatus.Effect do - @moduledoc """ - Describes a currently active effect, this is usually a buff or - strategem currently being granted globally for all helldivers. - """ - use Helldivers2.Macros.FromJson, "effects.json" - - @type t :: String.t() - - @spec parse(non_neg_integer() | String.t()) :: t() - def parse(index) when is_number(index), do: parse(to_string(index)) - def parse(name), do: lookup(name) - defp lookup(_), do: "Unknown" -end diff --git a/lib/helldivers_2/models/war_status/global_event.ex b/lib/helldivers_2/models/war_status/global_event.ex deleted file mode 100644 index 2642b20..0000000 --- a/lib/helldivers_2/models/war_status/global_event.ex +++ /dev/null @@ -1,83 +0,0 @@ -defmodule Helldivers2.Models.WarStatus.GlobalEvent do - alias Helldivers2.Models.WarStatus.Effect - alias Helldivers2.WarSeason - alias Helldivers2.Models.WarInfo.Planet - alias Helldivers2.Models.WarInfo.Faction - - @type t :: %__MODULE__{ - id: non_neg_integer(), - id_32: non_neg_integer(), - portrait_id_32: non_neg_integer(), - title: String.t(), - title_32: non_neg_integer(), - message: %{String.t() => String.t()}, - message_id_32: non_neg_integer(), - race: Faction.t(), - flag: non_neg_integer(), - assignment_id_32: non_neg_integer(), - effects: list(String.t()), - planets: list(Planet.t()) - } - - defstruct [ - :id, - :id_32, - :portrait_id_32, - :title, - :title_32, - :message, - :message_id_32, - :race, - :flag, - :assignment_id_32, - :effects, - :planets - ] - - @doc """ - Attempts to parse as much information as possible from the given `map` into a struct. - - Takes an optional map of translations, where each key is the language - and each value is the full list of all global events available. - """ - @spec parse(String.t(), map()) :: t() - def parse(war_id, map, translations \\ %{}) when is_map(map) do - # Get the ID of the base entity so we can fetch all matching entities from translations. - id = Map.get(map, "eventId") - {title, _message} = get_title_and_message(map) - - # Filter out our translations map to only include the currently being processed message. - translations = translations - |> Map.new(fn {lang, events} -> - {_title, event} = events - |> Enum.find(%{}, fn event -> Map.get(event, "eventId") == id end) - |> get_title_and_message() - - {lang, event} - end) - - %__MODULE__{ - id: id, - id_32: Map.get(map, "id32"), - portrait_id_32: Map.get(map, "portraitId32"), - title: title, - title_32: Map.get(map, "titleId32"), - message: translations, - message_id_32: Map.get(map, "messageId32"), - race: Faction.parse(Map.get(map, "race")), - flag: Map.get(map, "flag"), - assignment_id_32: Map.get(map, "assignmentId32"), - effects: Enum.map(Map.get(map, "effectIds"), &Effect.parse/1), - planets: Enum.map(Map.get(map, "planetIndices"), &WarSeason.get_planet!(war_id, &1)) - } - end - - @spec get_title_and_message(map()) :: {String.t(), String.t()} - defp get_title_and_message(%{"message" => "", "title" => title}) do - [title | message] = String.split(title, "\n") - - {title, Enum.join(message, "\n")} - end - - defp get_title_and_message(%{"message" => message, "title" => title}), do: {title, message} -end diff --git a/lib/helldivers_2/models/war_status/joint_operation.ex b/lib/helldivers_2/models/war_status/joint_operation.ex deleted file mode 100644 index 22018e9..0000000 --- a/lib/helldivers_2/models/war_status/joint_operation.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule Helldivers2.Models.WarStatus.JointOperation do - alias Helldivers2.WarSeason - alias Helldivers2.Models.WarInfo.Planet - - @type t :: %__MODULE__{ - id: non_neg_integer(), - planet: Planet.t(), - hq_node_index: non_neg_integer() - } - - defstruct [ - :id, - :planet, - :hq_node_index - ] - - @doc """ - Attempts to parse as much information as possible from the given `map` into a struct. - """ - @spec parse(String.t(), map()) :: t() - def parse(war_id, map) when is_map(map) do - %__MODULE__{ - id: Map.get(map, "id"), - planet: WarSeason.get_planet!(war_id, Map.get(map, "planetIndex")), - hq_node_index: Map.get(map, "hqNodeIndex") - } - end -end diff --git a/lib/helldivers_2/models/war_status/planet_event.ex b/lib/helldivers_2/models/war_status/planet_event.ex deleted file mode 100644 index e8575a4..0000000 --- a/lib/helldivers_2/models/war_status/planet_event.ex +++ /dev/null @@ -1,69 +0,0 @@ -defmodule Helldivers2.Models.WarStatus.PlanetEvent do - alias Helldivers2.WarSeason - alias Helldivers2.Models.WarStatus.JointOperation - alias Helldivers2.Models.WarStatus.Campaign - alias Helldivers2.Models.WarInfo.Faction - alias Helldivers2.Models.WarInfo.Planet - - @type t :: %__MODULE__{ - id: non_neg_integer(), - planet: Planet.t(), - event_type: non_neg_integer(), - race: Faction.t(), - health: non_neg_integer(), - max_health: non_neg_integer(), - start_time: DateTime.t(), - expire_time: DateTime.t(), - campaign: Campaign.t(), - joint_operations: list(JointOperation.t()) - } - - defstruct [ - :id, - :planet, - :event_type, - :race, - :health, - :max_health, - :start_time, - :expire_time, - :campaign, - :joint_operations - ] - - @doc """ - Attempts to parse as much information as possible from the given `map` into a struct. - """ - @spec parse(String.t(), list(Campaign.t()), list(JointOperation.t()), map()) :: t() - def parse(war_id, campaigns, joint_operations, map) when is_map(map) do - %__MODULE__{ - id: Map.get(map, "id"), - planet: WarSeason.get_planet!(war_id, Map.get(map, "planetIndex")), - event_type: Map.get(map, "eventType"), - race: Faction.parse(Map.get(map, "race")), - health: Map.get(map, "health"), - max_health: Map.get(map, "maxHealth"), - start_time: DateTime.from_unix!(Map.get(map, "startTime")), - expire_time: DateTime.from_unix!(Map.get(map, "expireTime")), - campaign: lookup_campaign(map, campaigns), - joint_operations: - Map.get(map, "jointOperationIds") - |> Enum.map(&lookup_joint_operation(joint_operations, &1)) - |> Enum.filter(fn operation -> !is_nil(operation) end) - } - end - - defp lookup_campaign(map, campaigns) do - campaign_id = Map.get(map, "campaignId") - - Enum.find(campaigns, fn campaign -> - campaign.id == campaign_id - end) - end - - defp lookup_joint_operation(joint_operations, joint_operation_id) do - Enum.find(joint_operations, fn joint_operation -> - joint_operation.id == joint_operation_id - end) - end -end diff --git a/lib/helldivers_2/models/war_status/planet_status.ex b/lib/helldivers_2/models/war_status/planet_status.ex deleted file mode 100644 index 7854fac..0000000 --- a/lib/helldivers_2/models/war_status/planet_status.ex +++ /dev/null @@ -1,57 +0,0 @@ -defmodule Helldivers2.Models.WarStatus.PlanetStatus do - @moduledoc """ - The current status of a planet in the galactic war. - - This contains the (current) owner, health, regen/second and - currently active Helldivers on this planet. - """ - alias Helldivers2.WarSeason - alias Helldivers2.Models.WarInfo.Faction - alias Helldivers2.Models.WarInfo.Planet - - @type t :: %__MODULE__{ - planet: Planet.t(), - owner: Faction.t(), - health: non_neg_integer(), - regen_per_second: float(), - players: non_neg_integer(), - liberation: float(), - } - - defstruct [ - :planet, - :owner, - :health, - :regen_per_second, - :players, - :liberation - ] - - @doc """ - Attempts to parse as much information as possible from the given `map` into a struct. - """ - @spec parse(String.t(), map()) :: t() - def parse(war_id, map) when is_map(map) do - health = Map.get(map, "health") - owner = Faction.parse(Map.get(map, "owner")) - planet = WarSeason.get_planet!(war_id, Map.get(map, "index")) - - # Calculate health as a percentage - health_percentage = ((health / planet.max_health) * 100) - - %__MODULE__{ - planet: planet, - owner: owner, - health: health, - regen_per_second: Map.get(map, "regenPerSecond"), - players: Map.get(map, "players"), - liberation: liberation(owner, health_percentage) - } - end - - # Liberation depends on which faction controls, if it's Humans it's X% liberated. - # If it's controlled by Automatons it's their control, so we deduct it from 100% - defp liberation("Humans", percentage), do: percentage - - defp liberation(_faction, percentage), do: 100 - percentage -end diff --git a/lib/helldivers_2/war_season.ex b/lib/helldivers_2/war_season.ex deleted file mode 100644 index 85d1c36..0000000 --- a/lib/helldivers_2/war_season.ex +++ /dev/null @@ -1,198 +0,0 @@ -defmodule Helldivers2.WarSeason do - @moduledoc """ - Represents a war season, currently there is only one active war season: 801. - - This module encapsulates the state for a given warseason and is responsible - for storing and retrieving this information. - """ - use GenServer - require Logger - - alias Helldivers2.Models.NewsFeed.Message - alias Helldivers2.Models.NewsFeed - alias Helldivers2.Models.WarStatus.PlanetStatus - alias Helldivers2.Models.WarInfo.Planet - alias Helldivers2.Models.WarStatus - alias Helldivers2.Models.WarInfo - - @options [ - war_id: [ - type: :string, - required: true - ] - ] - - @doc "Supported options:\n#{NimbleOptions.docs(@options)}" - def start_link(opts) do - with {:ok, options} <- NimbleOptions.validate(opts, @options) do - war_id = Keyword.get(opts, :war_id) - - GenServer.start_link(__MODULE__, options, - name: {:via, Registry, {__MODULE__.Registry, war_id}} - ) - end - end - - @doc """ - Checks if the given war ID actually exists. - """ - @spec exists?(String.t()) :: boolean() - def exists?(war_id) do - case Registry.lookup(__MODULE__.Registry, war_id) do - [{pid, _}] when is_pid(pid) -> - true - - _ -> - false - end - end - - @spec store(String.t(), WarInfo.t() | WarStatus.t() | NewsFeed.t()) :: :ok | :error - def store(war_id, data) do - GenServer.call({:via, Registry, {__MODULE__.Registry, war_id}}, {:store, data}) - end - - @doc """ - Lookup the `WarInfo` associated with the given `war_id`. - """ - @spec get_war_info(String.t()) :: {:ok, WarInfo.t()} | {:error, term()} - def get_war_info(war_id) do - case :ets.lookup(table_name(war_id), WarInfo) do - [] -> - {:error, :not_found} - - [{WarInfo, war_info}] -> - {:ok, war_info} - end - end - - @doc """ - Lookup the `Planet` associated with the given `war_id` and planet index. - """ - @spec get_planet(String.t(), non_neg_integer()) :: {:ok, Planet.t()} | {:error, term()} - def get_planet(war_id, planet_index) do - case :ets.lookup(table_name(war_id), {Planet, planet_index}) do - [] -> - {:error, :not_found} - - [{{Planet, _}, planet}] -> - {:ok, planet} - end - end - - @doc """ - Same as `get_planet/2` but raises on error. - """ - @spec get_planet!(String.t(), non_neg_integer()) :: Planet.t() | no_return() - def get_planet!(war_id, planet_index) do - case get_planet(war_id, planet_index) do - {:ok, planet} -> - planet - - {:error, reason} -> - raise reason - end - end - - @doc """ - Lookup all `Planet` associated with the given `war_id`. - """ - @spec get_planets(String.t()) :: {:ok, list(Planet.t())} | {:error, term()} - def get_planets(war_id) do - case :ets.lookup(table_name(war_id), Planet) do - [] -> - {:error, :not_found} - - [{_, planets}] -> - {:ok, planets} - end - end - - @doc """ - Lookup the `WarStatus` associated with the given `war_id`. - """ - @spec get_war_status(String.t()) :: {:ok, WarStatus.t()} | {:error, term()} - def get_war_status(war_id) do - case :ets.lookup(table_name(war_id), WarStatus) do - [] -> - {:error, :not_found} - - [{WarStatus, war_info}] -> - {:ok, war_info} - end - end - - @spec get_planet_status(String.t(), non_neg_integer()) :: - {:ok, PlanetStatus.t()} | {:error, term()} - def get_planet_status(war_id, planet_index) do - case :ets.lookup(table_name(war_id), {PlanetStatus, planet_index}) do - [] -> - {:error, :not_found} - - [{{PlanetStatus, _}, planet_status}] -> - {:ok, planet_status} - end - end - - def get_news_feed(war_id) do - case :ets.lookup(table_name(war_id), NewsFeed) do - [] -> - {:error, :not_found} - - [{NewsFeed, news_feed}] -> - {:ok, news_feed} - end - end - - @impl GenServer - def init(opts) do - war_id = Keyword.get(opts, :war_id) - Logger.info("Launching war season #{war_id}") - - # First time we have to 'create' the atom. - name = :"#{__MODULE__}.#{war_id}" - table = :ets.new(name, [:set, :protected, :named_table]) - {:ok, %{table: table}} - end - - @impl GenServer - def handle_call({:store, %WarInfo{} = info}, _from, %{table: table} = state) do - :ets.insert(table, {WarInfo, info}) - :ets.insert(table, {Planet, info.planets}) - - for planet <- info.planets do - :ets.insert(table, {{Planet, planet.index}, planet}) - end - - {:reply, :ok, state} - end - - @impl GenServer - def handle_call({:store, %WarStatus{} = status}, _from, %{table: table} = state) do - :ets.insert(table, {WarStatus, status}) - :ets.insert(table, {PlanetStatus, status.planet_status}) - - for planet_status <- status.planet_status do - :ets.insert(table, {{PlanetStatus, planet_status.planet.index}, planet_status}) - end - - {:reply, :ok, state} - end - - @impl GenServer - def handle_call({:store, news_feed}, _from, %{table: table} = state) when is_list(news_feed) do - :ets.insert(table, {NewsFeed, news_feed}) - - for message <- news_feed do - :ets.insert(table, {{Message, message.id}, message}) - end - - {:reply, :ok, state} - end - - # Get the table name for a given war id - def table_name(war_id) when is_number(war_id), do: table_name(to_string(war_id)) - - def table_name(war_id) when is_binary(war_id), - do: String.to_existing_atom("#{__MODULE__}.#{war_id}") -end diff --git a/lib/helldivers_2/war_sync.ex b/lib/helldivers_2/war_sync.ex deleted file mode 100644 index 27fdb8d..0000000 --- a/lib/helldivers_2/war_sync.ex +++ /dev/null @@ -1,79 +0,0 @@ -defmodule Helldivers2.WarSync do - @moduledoc """ - A GenServer responsible for periodically synchronizing Helldivers 2 API. - - It does this by requesting `Helldivers2.Models.WarInfo.download/1` - and `Helldivers2.Models.WarStatus.download/1`. - - The resulting information is then sent to the `Helldivers2.WarSeason` process - responsible for the season being synced. - """ - alias Helldivers2.Models.NewsFeed - alias Helldivers2.Models.WarStatus - alias Helldivers2.Models.WarInfo - alias Helldivers2.WarSeason - - use GenServer - require Logger - - @options [ - war_id: [ - type: :string, - required: true - ], - interval: [ - type: :non_neg_integer, - # 5 minutes - default: 300_000 - ] - ] - - def child_spec(options) do - Supervisor.child_spec(%{ - id: Keyword.get(options, :war_id), - start: {__MODULE__, :start_link, [options]} - }, []) - end - - @doc "Supported options:\n#{NimbleOptions.docs(@options)}" - def start_link(opts) do - with {:ok, options} <- NimbleOptions.validate(opts, @options) do - war_id = Keyword.get(opts, :war_id) - - GenServer.start_link(__MODULE__, options, - name: {:via, Registry, {__MODULE__.Registry, war_id}} - ) - end - end - - @impl GenServer - def init(opts) do - war_id = Keyword.get(opts, :war_id) - interval = Keyword.get(opts, :interval) - WarSeason.start_link(war_id: war_id) - - send(self(), :sync) - - {:ok, - %{ - war_id: war_id, - interval: interval - }} - end - - @impl GenServer - def handle_info(:sync, %{war_id: war_id, interval: interval} = state) do - Process.send_after(self(), :sync, interval) - - with {:ok, war_info} <- WarInfo.download(war_id), - :ok <- WarSeason.store(war_id, war_info), - {:ok, war_status} <- WarStatus.download(war_id), - :ok <- WarSeason.store(war_id, war_status), - {:ok, news_feed} <- NewsFeed.download(war_id), - :ok <- WarSeason.store(war_id, news_feed) do - Logger.info("Finished synchronizing API #{war_id}") - end - - {:noreply, state, :hibernate} - end -end diff --git a/lib/helldivers_2_web.ex b/lib/helldivers_2_web.ex deleted file mode 100644 index bd9ca1b..0000000 --- a/lib/helldivers_2_web.ex +++ /dev/null @@ -1,120 +0,0 @@ -defmodule Helldivers2Web do - @moduledoc """ - The entrypoint for defining your web interface, such - as controllers, components, channels, and so on. - - This can be used in your application as: - - use Helldivers2Web, :controller - use Helldivers2Web, :html - - The definitions below will be executed for every controller, - component, etc, so keep them short and clean, focused - on imports, uses and aliases. - - Do NOT define functions inside the quoted expressions - below. Instead, define additional modules and import - those modules here. - """ - - def static_paths, do: ~w(assets fonts images favicon.ico robots.txt) - - def router do - quote do - use Phoenix.Router, helpers: false - - # Import common connection and controller functions to use in pipelines - import Plug.Conn - import Phoenix.Controller - import Phoenix.LiveView.Router - import Helldivers2Web.Plugs.RateLimit, only: [rate_limit: 2] - import Helldivers2Web.Plugs.WarSeason, only: [check_war_id: 2] - end - end - - def channel do - quote do - use Phoenix.Channel - end - end - - def controller do - quote do - use Phoenix.Controller, - formats: [:html, :json], - layouts: [html: Helldivers2Web.Layouts] - - import Plug.Conn - - # OpenApi helpers - alias OpenApiSpex.Schema - alias OpenApiSpex.JsonErrorResponse - alias OpenApiSpex.Plug.CastAndValidate - alias Helldivers2Web.Schemas.NotFoundSchema - alias Helldivers2Web.Schemas.TooManyRequestsSchema - - unquote(verified_routes()) - end - end - - def live_view do - quote do - use Phoenix.LiveView, - layout: {Helldivers2Web.Layouts, :app} - - unquote(html_helpers()) - end - end - - def live_component do - quote do - use Phoenix.LiveComponent - - unquote(html_helpers()) - end - end - - def html do - quote do - use Phoenix.Component - - # Import convenience functions from controllers - import Phoenix.Controller, - only: [get_csrf_token: 0, view_module: 1, view_template: 1] - - # Include general helpers for rendering HTML - unquote(html_helpers()) - end - end - - defp html_helpers do - quote do - # HTML escaping functionality - import Phoenix.HTML - # Core UI components and translation - import Helldivers2Web.CoreComponents - - # Shortcut for generating JS commands - alias Phoenix.LiveView.JS - - # Routes generation with the ~p sigil - unquote(verified_routes()) - end - end - - def verified_routes do - quote do - use Phoenix.VerifiedRoutes, - endpoint: Helldivers2Web.Endpoint, - router: Helldivers2Web.Router, - statics: Helldivers2Web.static_paths() - end - end - - @doc """ - When used, dispatch to the appropriate controller/view/etc. - """ - defmacro __using__(which) when is_atom(which) do - apply(__MODULE__, which, []) - end -end diff --git a/lib/helldivers_2_web/api_spec.ex b/lib/helldivers_2_web/api_spec.ex deleted file mode 100644 index 18ba796..0000000 --- a/lib/helldivers_2_web/api_spec.ex +++ /dev/null @@ -1,44 +0,0 @@ -defmodule Helldivers2Web.ApiSpec do - alias OpenApiSpex.{Info, OpenApi, Paths, Server, Schema, Header} - alias Helldivers2Web.{Endpoint, Router} - @behaviour OpenApi - - @impl OpenApi - def spec do - %OpenApi{ - servers: [ - # Populate the Server info from a phoenix endpoint - Server.from_endpoint(Endpoint) - ], - info: %Info{ - title: "Helldivers 2", - version: "0.0.1" - }, - # Populate the paths from a phoenix router - paths: Paths.from_router(Router) - } - # Discover request/response schemas from path specs - |> OpenApiSpex.resolve_schema_modules() - end - - @doc "Generates the default options for responses, currently generates headers from `rate_limit_headers/1`." - def default_options(options \\ []), do: options ++ [headers: rate_limit_headers()] - - @doc "Generates the headers of rate limit added by `Helldivers2Web.Plugs.RateLimit`." - def rate_limit_headers(map \\ %{}) do - Enum.into(map, %{ - "x-ratelimit-limit" => %Header{ - schema: %Schema{type: :number}, - description: "The total amount of requests that can be made in the time window" - }, - "x-ratelimit-remaining" => %Header{ - schema: %Schema{type: :number}, - description: "The amount of requests remaining that can be made in the time window" - }, - "x-ratelimit-reset" => %Header{ - schema: %Schema{type: :number}, - description: "The unix epoch timestamp (in seconds) when more requests can be made" - } - }) - end -end diff --git a/lib/helldivers_2_web/components/core_components.ex b/lib/helldivers_2_web/components/core_components.ex deleted file mode 100644 index 562ca9d..0000000 --- a/lib/helldivers_2_web/components/core_components.ex +++ /dev/null @@ -1,670 +0,0 @@ -defmodule Helldivers2Web.CoreComponents do - @moduledoc """ - Provides core UI components. - - At first glance, this module may seem daunting, but its goal is to provide - core building blocks for your application, such as modals, tables, and - forms. The components consist mostly of markup and are well-documented - with doc strings and declarative assigns. You may customize and style - them in any way you want, based on your application growth and needs. - - The default components use Tailwind CSS, a utility-first CSS framework. - See the [Tailwind CSS documentation](https://tailwindcss.com) to learn - how to customize them or feel free to swap in another framework altogether. - - Icons are provided by [heroicons](https://heroicons.com). See `icon/1` for usage. - """ - use Phoenix.Component - - alias Phoenix.LiveView.JS - - @doc """ - Renders a modal. - - ## Examples - - <.modal id="confirm-modal"> - This is a modal. - - - JS commands may be passed to the `:on_cancel` to configure - the closing/cancel event, for example: - - <.modal id="confirm" on_cancel={JS.navigate(~p"/posts")}> - This is another modal. - - - """ - attr :id, :string, required: true - attr :show, :boolean, default: false - attr :on_cancel, JS, default: %JS{} - slot :inner_block, required: true - - def modal(assigns) do - ~H""" - - """ - end - - def input(%{type: "select"} = assigns) do - ~H""" -
- <.label for={@id}><%= @label %> - - <.error :for={msg <- @errors}><%= msg %> -
- """ - end - - def input(%{type: "textarea"} = assigns) do - ~H""" -
- <.label for={@id}><%= @label %> - - <.error :for={msg <- @errors}><%= msg %> -
- """ - end - - # All other inputs text, datetime-local, url, password, etc. are handled here... - def input(assigns) do - ~H""" -
- <.label for={@id}><%= @label %> - - <.error :for={msg <- @errors}><%= msg %> -
- """ - end - - @doc """ - Renders a label. - """ - attr :for, :string, default: nil - slot :inner_block, required: true - - def label(assigns) do - ~H""" - - """ - end - - @doc """ - Generates a generic error message. - """ - slot :inner_block, required: true - - def error(assigns) do - ~H""" -

- <.icon name="hero-exclamation-circle-mini" class="mt-0.5 h-5 w-5 flex-none" /> - <%= render_slot(@inner_block) %> -

- """ - end - - @doc """ - Renders a header with title. - """ - attr :class, :string, default: nil - - slot :inner_block, required: true - slot :subtitle - slot :actions - - def header(assigns) do - ~H""" -
-
-

- <%= render_slot(@inner_block) %> -

-

- <%= render_slot(@subtitle) %> -

-
-
<%= render_slot(@actions) %>
-
- """ - end - - @doc ~S""" - Renders a table with generic styling. - - ## Examples - - <.table id="users" rows={@users}> - <:col :let={user} label="id"><%= user.id %> - <:col :let={user} label="username"><%= user.username %> - - """ - attr :id, :string, required: true - attr :rows, :list, required: true - attr :row_id, :any, default: nil, doc: "the function for generating the row id" - attr :row_click, :any, default: nil, doc: "the function for handling phx-click on each row" - - attr :row_item, :any, - default: &Function.identity/1, - doc: "the function for mapping each row before calling the :col and :action slots" - - slot :col, required: true do - attr :label, :string - end - - slot :action, doc: "the slot for showing user actions in the last table column" - - def table(assigns) do - assigns = - with %{rows: %Phoenix.LiveView.LiveStream{}} <- assigns do - assign(assigns, row_id: assigns.row_id || fn {id, _item} -> id end) - end - - ~H""" -
- - - - - - - - - - - - - -
<%= col[:label] %> - Actions -
-
- - - <%= render_slot(col, @row_item.(row)) %> - -
-
-
- - - <%= render_slot(action, @row_item.(row)) %> - -
-
-
- """ - end - - @doc """ - Renders a data list. - - ## Examples - - <.list> - <:item title="Title"><%= @post.title %> - <:item title="Views"><%= @post.views %> - - """ - slot :item, required: true do - attr :title, :string, required: true - end - - def list(assigns) do - ~H""" -
-
-
-
<%= item.title %>
-
<%= render_slot(item) %>
-
-
-
- """ - end - - @doc """ - Renders a back navigation link. - - ## Examples - - <.back navigate={~p"/posts"}>Back to posts - """ - attr :navigate, :any, required: true - slot :inner_block, required: true - - def back(assigns) do - ~H""" -
- <.link - navigate={@navigate} - class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700" - > - <.icon name="hero-arrow-left-solid" class="h-3 w-3" /> - <%= render_slot(@inner_block) %> - -
- """ - end - - @doc """ - Renders a [Heroicon](https://heroicons.com). - - Heroicons come in three styles – outline, solid, and mini. - By default, the outline style is used, but solid and mini may - be applied by using the `-solid` and `-mini` suffix. - - You can customize the size and colors of the icons by setting - width, height, and background color classes. - - Icons are extracted from your `assets/vendor/heroicons` directory and bundled - within your compiled app.css by the plugin in your `assets/tailwind.config.js`. - - ## Examples - - <.icon name="hero-x-mark-solid" /> - <.icon name="hero-arrow-path" class="ml-1 w-3 h-3 animate-spin" /> - """ - attr :name, :string, required: true - attr :class, :string, default: nil - - def icon(%{name: "hero-" <> _} = assigns) do - ~H""" - - """ - end - - ## JS Commands - - def show(js \\ %JS{}, selector) do - JS.show(js, - to: selector, - transition: - {"transition-all transform ease-out duration-300", - "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95", - "opacity-100 translate-y-0 sm:scale-100"} - ) - end - - def hide(js \\ %JS{}, selector) do - JS.hide(js, - to: selector, - time: 200, - transition: - {"transition-all transform ease-in duration-200", - "opacity-100 translate-y-0 sm:scale-100", - "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"} - ) - end - - def show_modal(js \\ %JS{}, id) when is_binary(id) do - js - |> JS.show(to: "##{id}") - |> JS.show( - to: "##{id}-bg", - transition: {"transition-all transform ease-out duration-300", "opacity-0", "opacity-100"} - ) - |> show("##{id}-container") - |> JS.add_class("overflow-hidden", to: "body") - |> JS.focus_first(to: "##{id}-content") - end - - def hide_modal(js \\ %JS{}, id) do - js - |> JS.hide( - to: "##{id}-bg", - transition: {"transition-all transform ease-in duration-200", "opacity-100", "opacity-0"} - ) - |> hide("##{id}-container") - |> JS.hide(to: "##{id}", transition: {"block", "block", "hidden"}) - |> JS.remove_class("overflow-hidden", to: "body") - |> JS.pop_focus() - end - - @doc """ - Translates an error message using gettext. - """ - def translate_error({msg, opts}) do - # You can make use of gettext to translate error messages by - # uncommenting and adjusting the following code: - - # if count = opts[:count] do - # Gettext.dngettext(Helldivers2Web.Gettext, "errors", msg, msg, count, opts) - # else - # Gettext.dgettext(Helldivers2Web.Gettext, "errors", msg, opts) - # end - - Enum.reduce(opts, msg, fn {key, value}, acc -> - String.replace(acc, "%{#{key}}", fn _ -> to_string(value) end) - end) - end - - @doc """ - Translates the errors for a field from a keyword list of errors. - """ - def translate_errors(errors, field) when is_list(errors) do - for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts}) - end -end diff --git a/lib/helldivers_2_web/components/layouts.ex b/lib/helldivers_2_web/components/layouts.ex deleted file mode 100644 index e434081..0000000 --- a/lib/helldivers_2_web/components/layouts.ex +++ /dev/null @@ -1,5 +0,0 @@ -defmodule Helldivers2Web.Layouts do - use Helldivers2Web, :html - - embed_templates "layouts/*" -end diff --git a/lib/helldivers_2_web/components/layouts/app.html.heex b/lib/helldivers_2_web/components/layouts/app.html.heex deleted file mode 100644 index e23bfc8..0000000 --- a/lib/helldivers_2_web/components/layouts/app.html.heex +++ /dev/null @@ -1,32 +0,0 @@ -
-
-
- - - -

- v<%= Application.spec(:phoenix, :vsn) %> -

-
- -
-
-
-
- <.flash_group flash={@flash} /> - <%= @inner_content %> -
-
diff --git a/lib/helldivers_2_web/components/layouts/root.html.heex b/lib/helldivers_2_web/components/layouts/root.html.heex deleted file mode 100644 index 2fb6e89..0000000 --- a/lib/helldivers_2_web/components/layouts/root.html.heex +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - <.live_title suffix=" · Phoenix Framework"> - <%= assigns[:page_title] || "Helldivers2" %> - - - - - - <%= @inner_content %> - - diff --git a/lib/helldivers_2_web/controllers/api/campaign_json.ex b/lib/helldivers_2_web/controllers/api/campaign_json.ex deleted file mode 100644 index d27cb68..0000000 --- a/lib/helldivers_2_web/controllers/api/campaign_json.ex +++ /dev/null @@ -1,13 +0,0 @@ -defmodule Helldivers2Web.Api.CampaignJSON do - alias Helldivers2Web.Api.PlanetsJSON - alias Helldivers2.Models.WarStatus.Campaign - - def show(%Campaign{} = campaign) do - %{ - "id" => campaign.id, - "planet" => PlanetsJSON.show(campaign.planet), - "type" => campaign.type, - "count" => campaign.count - } - end -end diff --git a/lib/helldivers_2_web/controllers/api/global_events_controller.ex b/lib/helldivers_2_web/controllers/api/global_events_controller.ex deleted file mode 100644 index bd51014..0000000 --- a/lib/helldivers_2_web/controllers/api/global_events_controller.ex +++ /dev/null @@ -1,49 +0,0 @@ -defmodule Helldivers2Web.Api.GlobalEventsController do - alias Helldivers2.WarSeason - use Helldivers2Web, :controller - use OpenApiSpex.ControllerSpecs - - plug CastAndValidate, json_render_error_v2: true - action_fallback Helldivers2Web.FallbackController - - alias Helldivers2Web.Schemas.GlobalEventSchema - - operation :index, - summary: "Get an overview of all global events", - parameters: [ - war_id: [in: :path, description: "The war ID", type: :integer, example: 801] - ], - responses: [ - ok: GlobalEventSchema.responses(), - not_found: NotFoundSchema.response(), - too_many_requests: TooManyRequestsSchema.response() - ] - - def index(conn, %{war_id: war_id}) do - with {:ok, war_status} <- WarSeason.get_war_status(war_id) do - render(conn, :index, global_events: war_status.global_events) - end - end - - operation :latest, - summary: "Get the latest global event", - parameters: [ - war_id: [in: :path, description: "The war ID", type: :integer, example: 801] - ], - responses: [ - ok: GlobalEventSchema.response(), - not_found: NotFoundSchema.response(), - too_many_requests: TooManyRequestsSchema.response() - ] - def latest(conn, %{war_id: war_id}) do - with {:ok, war_status} <- WarSeason.get_war_status(war_id) do - case Enum.take(war_status.global_events, 1) do - [] -> - {:error, :not_found} - - [event] -> - render(conn, :show, global_event: event) - end - end - end -end diff --git a/lib/helldivers_2_web/controllers/api/global_events_json.ex b/lib/helldivers_2_web/controllers/api/global_events_json.ex deleted file mode 100644 index 3b567f5..0000000 --- a/lib/helldivers_2_web/controllers/api/global_events_json.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule Helldivers2Web.Api.GlobalEventsJSON do - alias Helldivers2Web.Api.PlanetsJSON - alias Helldivers2.Models.WarStatus.GlobalEvent - - def index(%{global_events: global_events}), do: index(global_events) - - def index(global_events), do: Enum.map(global_events, &show/1) - - def show(%{global_event: global_event}), do: show(global_event) - - def show(%GlobalEvent{} = global_event) do - %{ - "id" => global_event.id, - "id_32" => global_event.id_32, - "portrait_id_32" => global_event.portrait_id_32, - "title" => global_event.title, - "title_32" => global_event.title_32, - "message" => global_event.message, - "message_id_32" => global_event.message_id_32, - "race" => global_event.race, - "flag" => global_event.flag, - "assignment_id_32" => global_event.assignment_id_32, - "effects" => global_event.effects, - "planets" => Enum.map(global_event.planets, &PlanetsJSON.show/1) - } - end -end diff --git a/lib/helldivers_2_web/controllers/api/home_world_json.ex b/lib/helldivers_2_web/controllers/api/home_world_json.ex deleted file mode 100644 index f76f328..0000000 --- a/lib/helldivers_2_web/controllers/api/home_world_json.ex +++ /dev/null @@ -1,15 +0,0 @@ -defmodule Helldivers2Web.Api.HomeWorldJSON do - alias Helldivers2Web.Api.PlanetsJSON - alias Helldivers2.Models.WarInfo.HomeWorld - - def index(home_worlds) when is_list(home_worlds) do - Enum.map(home_worlds, &show/1) - end - - def show(%HomeWorld{} = home_world) do - %{ - "race" => home_world.race, - "planets" => PlanetsJSON.index(home_world.planets) - } - end -end diff --git a/lib/helldivers_2_web/controllers/api/joint_operations_json.ex b/lib/helldivers_2_web/controllers/api/joint_operations_json.ex deleted file mode 100644 index 9e73370..0000000 --- a/lib/helldivers_2_web/controllers/api/joint_operations_json.ex +++ /dev/null @@ -1,12 +0,0 @@ -defmodule Helldivers2Web.Api.JointOperationsJSON do - alias Helldivers2Web.Api.PlanetsJSON - alias Helldivers2.Models.WarStatus.JointOperation - - def show(%JointOperation{} = joint_operation) do - %{ - "id" => joint_operation.id, - "planet" => PlanetsJSON.show(joint_operation.planet), - "hq_node_index" => joint_operation.hq_node_index - } - end -end diff --git a/lib/helldivers_2_web/controllers/api/planets_controller.ex b/lib/helldivers_2_web/controllers/api/planets_controller.ex deleted file mode 100644 index 383b40a..0000000 --- a/lib/helldivers_2_web/controllers/api/planets_controller.ex +++ /dev/null @@ -1,76 +0,0 @@ -defmodule Helldivers2Web.Api.PlanetsController do - use Helldivers2Web, :controller - use OpenApiSpex.ControllerSpecs - - plug CastAndValidate, json_render_error_v2: true - action_fallback Helldivers2Web.FallbackController - - alias Helldivers2.WarSeason - alias Helldivers2Web.Schemas.PlanetSchema - alias Helldivers2Web.Schemas.PlanetStatusSchema - - operation :index, - summary: "Get an overview of all planets", - parameters: [ - war_id: [in: :path, description: "The war ID", type: :integer, example: 801] - ], - responses: [ - ok: PlanetSchema.responses(), - not_found: NotFoundSchema.response(), - too_many_requests: TooManyRequestsSchema.response() - ] - - def index(conn, %{war_id: war_id}) do - with {:ok, planets} <- WarSeason.get_planets(war_id) do - render(conn, :index, planets: planets) - end - end - - operation :show, - summary: "Get information on a specific planet", - parameters: [ - war_id: [in: :path, description: "The war ID", type: :integer, example: 801], - planet_index: [ - in: :path, - description: "The index of the planet", - type: :integer, - example: 0 - ] - ], - responses: [ - ok: PlanetSchema.response(), - not_found: NotFoundSchema.response(), - too_many_requests: TooManyRequestsSchema.response(), - unprocessable_entity: JsonErrorResponse.response() - ] - - def show(conn, %{war_id: war_id, planet_index: planet_index}) do - with {:ok, planets} <- WarSeason.get_planet(war_id, planet_index) do - render(conn, :show, planet: planets) - end - end - - operation :show_planet_status, - summary: "Get the current war status of a specific planet", - parameters: [ - war_id: [in: :path, description: "The war ID", type: :integer, example: 801], - planet_index: [ - in: :path, - description: "The index of the planet", - type: :integer, - example: 0 - ] - ], - responses: [ - ok: PlanetStatusSchema.response(), - not_found: NotFoundSchema.response(), - too_many_requests: TooManyRequestsSchema.response(), - unprocessable_entity: JsonErrorResponse.response() - ] - - def show_planet_status(conn, %{war_id: war_id, planet_index: planet_index}) do - with {:ok, planet_status} <- WarSeason.get_planet_status(war_id, planet_index) do - render(conn, :show_status, planet_status: planet_status) - end - end -end diff --git a/lib/helldivers_2_web/controllers/api/planets_json.ex b/lib/helldivers_2_web/controllers/api/planets_json.ex deleted file mode 100644 index b596c28..0000000 --- a/lib/helldivers_2_web/controllers/api/planets_json.ex +++ /dev/null @@ -1,62 +0,0 @@ -defmodule Helldivers2Web.Api.PlanetsJSON do - alias Helldivers2Web.Api.JointOperationsJSON - alias Helldivers2Web.Api.CampaignJSON - alias Helldivers2.Models.WarStatus.PlanetEvent - alias Helldivers2.Models.WarStatus.PlanetStatus - alias Helldivers2.Models.WarInfo.Planet - def index(%{planets: planets}), do: index(planets) - - def index(planets) when is_list(planets) do - Enum.map(planets, &show/1) - end - - def show(%{planet: planet}), do: show(planet) - - def show(%Planet{} = planet) do - {x, y} = planet.position - - %{ - "index" => planet.index, - "name" => planet.name, - "hash" => planet.hash, - "position" => %{ - "x" => x, - "y" => y - }, - "waypoints" => planet.waypoints, - "sector" => planet.sector, - "max_health" => planet.max_health, - "disabled" => planet.disabled, - "initial_owner" => planet.initial_owner - } - end - - @doc "Named separately from `show/1` to avoid pattern matching conflicts (`PlanetStatus` also matches for `%{planet: planet}`)" - def show_status(%{planet_status: planet_status}), do: show_status(planet_status) - - def show_status(%PlanetStatus{} = planet_status) do - %{ - "planet" => show(planet_status.planet), - "owner" => planet_status.owner, - "health" => planet_status.health, - "regen_per_second" => planet_status.regen_per_second, - "players" => planet_status.players, - "liberation" => planet_status.liberation - } - end - - def show_event(%PlanetEvent{} = planet_event) do - %{ - "id" => planet_event.id, - "planet" => show(planet_event.planet), - "event_type" => planet_event.event_type, - "race" => planet_event.race, - "health" => planet_event.health, - "max_health" => planet_event.max_health, - "start_time" => planet_event.start_time, - "expire_time" => planet_event.expire_time, - "campaign" => CampaignJSON.show(planet_event.campaign), - "joint_operations" => Enum.map(planet_event.joint_operations, &JointOperationsJSON.show/1) - } - end -end diff --git a/lib/helldivers_2_web/controllers/api/war_season_controller.ex b/lib/helldivers_2_web/controllers/api/war_season_controller.ex deleted file mode 100644 index 6e8ec8b..0000000 --- a/lib/helldivers_2_web/controllers/api/war_season_controller.ex +++ /dev/null @@ -1,94 +0,0 @@ -defmodule Helldivers2Web.Api.WarSeasonController do - use Helldivers2Web, :controller - use OpenApiSpex.ControllerSpecs - - plug CastAndValidate, json_render_error_v2: true - action_fallback Helldivers2Web.FallbackController - - alias Helldivers2.WarSeason - alias Helldivers2Web.Schemas.WarInfoSchema - alias Helldivers2Web.Schemas.WarStatusSchema - alias Helldivers2Web.Schemas.WarSeasonOverview - alias Helldivers2Web.Schemas.NewsFeedMessageSchema - - operation :index, - summary: "Get an overview of all available war seasons", - responses: [ - ok: - {"Warseason overview", "application/json", WarSeasonOverview, Helldivers2Web.ApiSpec.default_options()}, - too_many_requests: TooManyRequestsSchema.response() - ] - - def index(conn, _) do - json(conn, %{ - current: Application.get_env(:helldivers_2, :war_season), - seasons: Application.get_env(:helldivers_2, :war_seasons) - }) - end - - operation :show_info, - summary: "Get information on a war season", - externalDocs: %OpenApiSpex.ExternalDocumentation{ - description: "This is a mapped version of the official WarInfo object", - url: "https://api.live.prod.thehelldiversgame.com/api/WarSeason/801/WarInfo" - }, - parameters: [ - war_id: [in: :path, description: "The war ID", type: :integer, example: 801] - ], - responses: [ - ok: WarInfoSchema.response(), - not_found: NotFoundSchema.response(), - too_many_requests: TooManyRequestsSchema.response(), - unprocessable_entity: JsonErrorResponse.response() - ] - - def show_info(conn, %{war_id: war_id}) do - with {:ok, war_info} <- WarSeason.get_war_info(war_id) do - render(conn, :show, war_info: war_info) - end - end - - operation :show_status, - summary: "Get the current status of the Helldivers offensive", - externalDocs: %OpenApiSpex.ExternalDocumentation{ - description: "This is a mapped version of the official WarInfo object", - url: "https://api.live.prod.thehelldiversgame.com/api/WarSeason/801/Status" - }, - parameters: [ - war_id: [in: :path, description: "The war ID", type: :integer, example: 801] - ], - responses: [ - ok: WarStatusSchema.response(), - not_found: NotFoundSchema.response(), - too_many_requests: TooManyRequestsSchema.response(), - unprocessable_entity: JsonErrorResponse.response() - ] - - def show_status(conn, %{war_id: war_id}) do - with {:ok, war_status} <- WarSeason.get_war_status(war_id) do - render(conn, :show, war_status: war_status) - end - end - - operation :news_feed, - summary: "Gets the newsfeed shown in-game under 'Dispatch'", - externalDocs: %OpenApiSpex.ExternalDocumentation{ - description: "This is a mapped version of the official NewsFeed object", - url: "https://api.live.prod.thehelldiversgame.com/api/NewsFeed/801" - }, - parameters: [ - war_id: [in: :path, description: "The war ID", type: :integer, example: 801] - ], - responses: [ - ok: NewsFeedMessageSchema.responses(), - not_found: NotFoundSchema.response(), - too_many_requests: TooManyRequestsSchema.response(), - unprocessable_entity: JsonErrorResponse.response() - ] - - def news_feed(conn, %{war_id: war_id}) do - with {:ok, news_feed} <- WarSeason.get_news_feed(war_id) do - render(conn, :show, news_feed: news_feed) - end - end -end diff --git a/lib/helldivers_2_web/controllers/api/war_season_json.ex b/lib/helldivers_2_web/controllers/api/war_season_json.ex deleted file mode 100644 index 83a4b44..0000000 --- a/lib/helldivers_2_web/controllers/api/war_season_json.ex +++ /dev/null @@ -1,60 +0,0 @@ -defmodule Helldivers2Web.Api.WarSeasonJSON do - alias Helldivers2.Models.NewsFeed - alias Helldivers2Web.Api.GlobalEventsJSON - alias Helldivers2Web.Api.JointOperationsJSON - alias Helldivers2Web.Api.CampaignJSON - alias Helldivers2.Models.WarStatus - alias Helldivers2Web.Api.HomeWorldJSON - alias Helldivers2Web.Api.PlanetsJSON - alias Helldivers2.Models.WarInfo - - def show(%{war_info: war_info}), do: show(war_info) - def show(%{war_status: war_status}), do: show(war_status) - def show(%{news_feed: news_feed}), do: Enum.map(news_feed, &show/1) - - def show(%WarInfo{} = war_info) do - %{ - "war_id" => war_info.war_id, - "start_date" => war_info.start_date, - "end_date" => war_info.end_date, - "minimum_client_version" => war_info.minimum_client_version, - "planets" => PlanetsJSON.index(war_info.planets), - "home_worlds" => HomeWorldJSON.index(war_info.home_worlds), - "capitals" => war_info.capitals, - "planet_permanent_effects" => war_info.planet_permanent_effects - } - end - - def show(%WarStatus{} = war_status) do - %{ - "war_id" => war_status.war_id, - "started_at" => war_status.started_at, - "snapshot_at" => war_status.snapshot_at, - "impact_multiplier" => war_status.impact_multiplier, - "planet_status" => Enum.map(war_status.planet_status, &PlanetsJSON.show_status/1), - "planet_attacks" => - Enum.map(war_status.planet_attacks, fn {source, target} -> - %{ - "source" => PlanetsJSON.show(source), - "target" => PlanetsJSON.show(target) - } - end), - "campaigns" => Enum.map(war_status.campaigns, &CampaignJSON.show/1), - "community_targets" => [], - "joint_operations" => Enum.map(war_status.joint_operations, &JointOperationsJSON.show/1), - "planet_events" => Enum.map(war_status.planet_events, &PlanetsJSON.show_event/1), - "planet_active_effects" => [], - "active_election_policy_effects" => [], - "global_events" => Enum.map(war_status.global_events, &GlobalEventsJSON.show/1) - } - end - - def show(%NewsFeed.Message{} = message) do - %{ - "id" => message.id, - "type" => message.type, - "tag_ids" => message.tag_ids, - "message" => message.messages - } - end -end diff --git a/lib/helldivers_2_web/controllers/error_html.ex b/lib/helldivers_2_web/controllers/error_html.ex deleted file mode 100644 index 8b1cff3..0000000 --- a/lib/helldivers_2_web/controllers/error_html.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Helldivers2Web.ErrorHTML do - use Helldivers2Web, :html - - # If you want to customize your error pages, - # uncomment the embed_templates/1 call below - # and add pages to the error directory: - # - # * lib/helldivers_2_web/controllers/error_html/404.html.heex - # * lib/helldivers_2_web/controllers/error_html/500.html.heex - # - # embed_templates "error_html/*" - - # The default is to render a plain text page based on - # the template name. For example, "404.html" becomes - # "Not Found". - def render(template, _assigns) do - Phoenix.Controller.status_message_from_template(template) - end -end diff --git a/lib/helldivers_2_web/controllers/error_json.ex b/lib/helldivers_2_web/controllers/error_json.ex deleted file mode 100644 index 891a360..0000000 --- a/lib/helldivers_2_web/controllers/error_json.ex +++ /dev/null @@ -1,15 +0,0 @@ -defmodule Helldivers2Web.ErrorJSON do - # If you want to customize a particular status code, - # you may add your own clauses, such as: - # - # def render("500.json", _assigns) do - # %{errors: %{detail: "Internal Server Error"}} - # end - - # By default, Phoenix returns the status message from - # the template name. For example, "404.json" becomes - # "Not Found". - def render(template, _assigns) do - %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}} - end -end diff --git a/lib/helldivers_2_web/controllers/fallback_controller.ex b/lib/helldivers_2_web/controllers/fallback_controller.ex deleted file mode 100644 index c0bb52e..0000000 --- a/lib/helldivers_2_web/controllers/fallback_controller.ex +++ /dev/null @@ -1,32 +0,0 @@ -defmodule Helldivers2Web.FallbackController do - @moduledoc """ - Translates controller action results into valid `Plug.Conn` responses. - - See `Phoenix.Controller.action_fallback/1` for more details. - """ - - use Helldivers2Web, :controller - - # This clause handles errors returned by the `PaceVet.Accounts` domain - def call(conn, {:error, :unauthorized}) do - conn - |> put_resp_header("www-authorize", "Bearer") - |> send_resp(:unauthorized, "") - end - - # This clause is an example of how to handle requests that are malformed. - def call(conn, {:error, :unprocessable_entity}) do - conn - |> put_status(:unprocessable_entity) - |> put_view(html: Helldivers2Web.ErrorHTML, json: Helldivers2Web.ErrorJSON) - |> render(:"422") - end - - # This clause is an example of how to handle resources that cannot be found. - def call(conn, {:error, :not_found}) do - conn - |> put_status(:not_found) - |> put_view(html: Helldivers2Web.ErrorHTML, json: Helldivers2Web.ErrorJSON) - |> render(:"404") - end -end diff --git a/lib/helldivers_2_web/controllers/page_controller.ex b/lib/helldivers_2_web/controllers/page_controller.ex deleted file mode 100644 index 32cb2cd..0000000 --- a/lib/helldivers_2_web/controllers/page_controller.ex +++ /dev/null @@ -1,9 +0,0 @@ -defmodule Helldivers2Web.PageController do - use Helldivers2Web, :controller - - def home(conn, _params) do - # The home page is often custom made, - # so skip the default app layout. - render(conn, :home, layout: false) - end -end diff --git a/lib/helldivers_2_web/controllers/page_html.ex b/lib/helldivers_2_web/controllers/page_html.ex deleted file mode 100644 index 20518b5..0000000 --- a/lib/helldivers_2_web/controllers/page_html.ex +++ /dev/null @@ -1,5 +0,0 @@ -defmodule Helldivers2Web.PageHTML do - use Helldivers2Web, :html - - embed_templates "page_html/*" -end diff --git a/lib/helldivers_2_web/controllers/page_html/home.html.heex b/lib/helldivers_2_web/controllers/page_html/home.html.heex deleted file mode 100644 index e9fc48d..0000000 --- a/lib/helldivers_2_web/controllers/page_html/home.html.heex +++ /dev/null @@ -1,222 +0,0 @@ -<.flash_group flash={@flash} /> - -
-
- -

- Phoenix Framework - - v<%= Application.spec(:phoenix, :vsn) %> - -

-

- Peace of mind from prototype to production. -

-

- Build rich, interactive web applications quickly, with less code and fewer moving parts. Join our growing community of developers using Phoenix to craft APIs, HTML5 apps and more, for fun or at scale. -

- -
-
diff --git a/lib/helldivers_2_web/endpoint.ex b/lib/helldivers_2_web/endpoint.ex deleted file mode 100644 index 94e2cde..0000000 --- a/lib/helldivers_2_web/endpoint.ex +++ /dev/null @@ -1,52 +0,0 @@ -defmodule Helldivers2Web.Endpoint do - use Phoenix.Endpoint, otp_app: :helldivers_2 - - # The session will be stored in the cookie and signed, - # this means its contents can be read but not tampered with. - # Set :encryption_salt if you would also like to encrypt it. - @session_options [ - store: :cookie, - key: "_helldivers_2_key", - signing_salt: "40PtH+91", - same_site: "Lax" - ] - - plug Corsica, origins: "*" - - socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]] - - # Serve at "/" the static files from "priv/static" directory. - # - # You should set gzip to true if you are running phx.digest - # when deploying your static files in production. - plug Plug.Static, - at: "/", - from: :helldivers_2, - gzip: false, - only: Helldivers2Web.static_paths() - - # Code reloading can be explicitly enabled under the - # :code_reloader configuration of your endpoint. - if code_reloading? do - socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket - plug Phoenix.LiveReloader - plug Phoenix.CodeReloader - end - - plug Phoenix.LiveDashboard.RequestLogger, - param_key: "request_logger", - cookie_key: "request_logger" - - plug Plug.RequestId - plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] - - plug Plug.Parsers, - parsers: [:urlencoded, :multipart, :json], - pass: ["*/*"], - json_decoder: Phoenix.json_library() - - plug Plug.MethodOverride - plug Plug.Head - plug Plug.Session, @session_options - plug Helldivers2Web.Router -end diff --git a/lib/helldivers_2_web/plugs/rate_limit.ex b/lib/helldivers_2_web/plugs/rate_limit.ex deleted file mode 100644 index cdc2261..0000000 --- a/lib/helldivers_2_web/plugs/rate_limit.ex +++ /dev/null @@ -1,72 +0,0 @@ -defmodule Helldivers2Web.Plugs.RateLimit do - import Phoenix.Controller, only: [json: 2] - import Plug.Conn - - @doc """ - Checks if the current `Plug.Conn` is allowed to execute or if it hit it's rate limit. - """ - @spec rate_limit(Plug.Conn.t(), any()) :: Plug.Conn.t() - def rate_limit(conn, _) do - options = Application.get_env(:helldivers_2, Helldivers2Web.Plugs.RateLimit) - interval_milliseconds = Keyword.get(options, :interval_seconds, 1) * 1000 - max_requests = Keyword.get(options, :max_requests, 1) - - case check_rate(conn, interval_milliseconds, max_requests) do - {:ok, count, until_expire} -> - put_rate_limit_headers(conn, max_requests, count, until_expire) - - {:error, _count, until_expire} -> - render_error(conn, max_requests, until_expire) - end - end - - # If the limit is zero we simply return OK for all rate limits - @spec check_rate(Plug.Conn.t(), non_neg_integer(), non_neg_integer()) :: - {:ok, count :: non_neg_integer(), until_expiration :: non_neg_integer()} - | {:error, non_neg_integer(), non_neg_integer()} - defp check_rate(_, _, 0), do: {:ok, :infinity, 0} - - defp check_rate(conn, interval, limit) do - name = bucket_name(conn) - - # First check rate limit (which reduces the available count) - check = ExRated.check_rate(name, interval, limit) - - # Check how much we have left so we can return this information to the client - {_, _, until_expiration, _, _} = ExRated.inspect_bucket(name, interval, limit) - - case check do - {:ok, count} -> - # Count is amount of calls to this bucket, we just want to see the 'remaining' - {:ok, max(limit - count, 0), until_expiration} - - {:error, _} -> - {:error, limit, until_expiration} - end - end - - # Bucket name is an IP address - defp bucket_name(conn) do - conn.remote_ip |> Tuple.to_list() |> Enum.join(".") - end - - # Rate limit was hit, halt the conn and put response headers - defp render_error(conn, limit, until_expire) do - conn - |> put_rate_limit_headers(limit, 0, until_expire) - |> put_resp_header("retry-after", to_string(until_expire / 1_000)) - |> put_status(:too_many_requests) - |> json(%{error: "Rate limit exceeded."}) - |> halt() - end - - defp put_rate_limit_headers(conn, limit, remaining, until_expire) do - # Calculate when the bucket will expire (with 100ms buffer) - reset_at = :erlang.system_time(:millisecond) + until_expire + 100 - - conn - |> put_resp_header("x-ratelimit-limit", to_string(limit)) - |> put_resp_header("x-ratelimit-remaining", to_string(remaining)) - |> put_resp_header("x-ratelimit-reset", to_string(reset_at)) - end -end diff --git a/lib/helldivers_2_web/plugs/war_season.ex b/lib/helldivers_2_web/plugs/war_season.ex deleted file mode 100644 index 138a49d..0000000 --- a/lib/helldivers_2_web/plugs/war_season.ex +++ /dev/null @@ -1,35 +0,0 @@ -defmodule Helldivers2Web.Plugs.WarSeason do - import Plug.Conn - - alias Helldivers2Web.FallbackController - alias Helldivers2.WarSeason - - @doc """ - If the request contains a `war_id` it validates that it exists. - - This ensures that the rest of the application can assume any `war_id` passed exists. - """ - @spec check_war_id(Plug.Conn.t()) :: Plug.Conn.t() - def check_war_id(conn, _options \\ []) do - case Map.get(conn.params, "war_id") do - nil -> - conn - - war_id -> - validate_war_id(conn, war_id) - end - end - - # We have a war_id, validate it exists - defp validate_war_id(conn, war_id) do - case WarSeason.exists?(war_id) do - true -> - conn - - false -> - conn - |> FallbackController.call({:error, :not_found}) - |> halt() - end - end -end diff --git a/lib/helldivers_2_web/router.ex b/lib/helldivers_2_web/router.ex deleted file mode 100644 index e6ae63c..0000000 --- a/lib/helldivers_2_web/router.ex +++ /dev/null @@ -1,71 +0,0 @@ -defmodule Helldivers2Web.Router do - use Helldivers2Web, :router - - pipeline :browser do - plug :accepts, ["html"] - plug :fetch_session - plug :fetch_live_flash - plug :put_root_layout, html: {Helldivers2Web.Layouts, :root} - plug :protect_from_forgery - plug :put_secure_browser_headers - end - - pipeline :api do - plug :accepts, ["json"] - plug OpenApiSpex.Plug.PutApiSpec, module: Helldivers2Web.ApiSpec - plug :rate_limit - plug :check_war_id - end - - pipeline :openapi do - plug :accepts, ["json"] - plug OpenApiSpex.Plug.PutApiSpec, module: Helldivers2Web.ApiSpec - end - - # scope "/", Helldivers2Web do - # pipe_through :browser - - # get "/", PageController, :home - # end - - scope "/api" do - pipe_through :openapi - - get "/openapi", OpenApiSpex.Plug.RenderSpec, [] - get "/swaggerui", OpenApiSpex.Plug.SwaggerUI, path: "/api/openapi" - end - - # Other scopes may use custom stacks. - scope "/api", Helldivers2Web.Api do - pipe_through :api - - get "/", WarSeasonController, :index - get "/:war_id/info", WarSeasonController, :show_info - get "/:war_id/status", WarSeasonController, :show_status - - get "/:war_id/events", GlobalEventsController, :index - get "/:war_id/events/latest", GlobalEventsController, :latest - - get "/:war_id/planets", PlanetsController, :index - get "/:war_id/planets/:planet_index", PlanetsController, :show - get "/:war_id/planets/:planet_index/status", PlanetsController, :show_planet_status - - get "/:war_id/feed", WarSeasonController, :news_feed - end - - # Enable LiveDashboard in development - if Application.compile_env(:helldivers_2, :dev_routes) do - # If you want to use the LiveDashboard in production, you should put - # it behind authentication and allow only admins to access it. - # If your application does not have an admins-only section yet, - # you can use Plug.BasicAuth to set up some basic authentication - # as long as you are also using SSL (which you should anyway). - import Phoenix.LiveDashboard.Router - - scope "/dev" do - pipe_through :browser - - live_dashboard "/dashboard", metrics: Helldivers2Web.Telemetry - end - end -end diff --git a/lib/helldivers_2_web/schemas/campaign_schema.ex b/lib/helldivers_2_web/schemas/campaign_schema.ex deleted file mode 100644 index 1e984cb..0000000 --- a/lib/helldivers_2_web/schemas/campaign_schema.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule Helldivers2Web.Schemas.CampaignSchema do - alias Helldivers2Web.Schemas.PlanetSchema - alias OpenApiSpex.Schema - require OpenApiSpex - - @doc "Generates a schema for a single homeworld schema response" - def response(), do: {"Campaign response", "application/json", __MODULE__, Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "Contains information about a currently active campaign", - type: :object, - properties: %{ - id: %Schema{ - type: :integer, - description: "The identifier of this campaign" - }, - planet: PlanetSchema, - type: %Schema{ - type: :integer, - description: "The type of this campaign, haven't found out what they mean yet" - }, - count: %Schema{ - type: :integer, - description: "not sure what this counts, it's generally a low number" - } - } - }) -end diff --git a/lib/helldivers_2_web/schemas/global_event_schema.ex b/lib/helldivers_2_web/schemas/global_event_schema.ex deleted file mode 100644 index f922daa..0000000 --- a/lib/helldivers_2_web/schemas/global_event_schema.ex +++ /dev/null @@ -1,78 +0,0 @@ -defmodule Helldivers2Web.Schemas.GlobalEventSchema do - alias Helldivers2Web.Schemas.PlanetSchema - alias OpenApiSpex.Schema - require OpenApiSpex - - @languages Application.compile_env(:helldivers_2, :languages) - - @doc "Generates a schema for a single homeworld schema response" - def response(), - do: - {"Global event response", "application/json", __MODULE__, - Helldivers2Web.ApiSpec.default_options()} - - def responses(), - do: - {"Global events response", "application/json", %Schema{type: :array, items: __MODULE__}, - Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "Contains information about a global event, past and present", - type: :object, - properties: %{ - id: %Schema{ - type: :integer, - description: "The identifier of this campaign" - }, - id_32: %Schema{type: :number, description: "Internal identifier of this campaign, stable"}, - portrait_id_32: %Schema{ - type: :number, - description: "I suspect identifier of an in game image" - }, - title: %Schema{ - type: :string, - description: "The title of the global event, appears to be more a status than an actual title", - enum: ["BRIEFING", "SUCCESS", "FAILED"] - }, - title_32: %Schema{ - type: :number, - description: - "Internal identifier of the title, this always remains the same regardless of language" - }, - message: %Schema{ - type: :object, - properties: - Map.new(@languages, fn {key, lang} -> - {key, - %Schema{ - type: :string, - description: "The message from Super Earth about the global event in #{lang}" - }} - end) - }, - message_id_32: %Schema{ - type: :number, - description: - "Internal identifier of the message, this always remains the same regardless of language" - }, - race: %Schema{ - type: :string, - description: "The race involved in this campaign (so far seems to always be 'Human')" - }, - flag: %Schema{ - type: :integer, - description: "The identifier of the flag for this campaign (flags haven't been mapped)" - }, - assignment_id_32: %Schema{ - type: :number, - description: "Internal identifier, haven't figured this out" - }, - effects: %Schema{ - type: :array, - items: %Schema{type: :string}, - description: "A list of effects, usually strategems or bonuses" - }, - planets: %Schema{type: :array, items: PlanetSchema} - } - }) -end diff --git a/lib/helldivers_2_web/schemas/home_world_schema.ex b/lib/helldivers_2_web/schemas/home_world_schema.ex deleted file mode 100644 index 8d2b775..0000000 --- a/lib/helldivers_2_web/schemas/home_world_schema.ex +++ /dev/null @@ -1,24 +0,0 @@ -defmodule Helldivers2Web.Schemas.HomeWorldSchema do - alias Helldivers2Web.Schemas.PlanetSchema - alias OpenApiSpex.Schema - require OpenApiSpex - - @doc "Generates a schema for a single homeworld schema response" - def response(), do: {"Homeworld response", "application/json", __MODULE__, Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "Homeworld information of a given faction", - type: :object, - properties: %{ - race: %Schema{ - type: :string, - description: "The race that the planet is the homeworld of" - }, - planets: %Schema{ - type: :array, - items: PlanetSchema, - description: "The planets this race considers it's homeworlds" - } - } - }) -end diff --git a/lib/helldivers_2_web/schemas/joint_operation_schema.ex b/lib/helldivers_2_web/schemas/joint_operation_schema.ex deleted file mode 100644 index 2706dc7..0000000 --- a/lib/helldivers_2_web/schemas/joint_operation_schema.ex +++ /dev/null @@ -1,24 +0,0 @@ -defmodule Helldivers2Web.Schemas.JointOperationSchema do - alias Helldivers2Web.Schemas.PlanetSchema - alias OpenApiSpex.Schema - require OpenApiSpex - - @doc "Generates a schema for a single homeworld schema response" - def response(), do: {"Joint operation response", "application/json", __MODULE__, Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "Contains information about a currently joint operation", - type: :object, - properties: %{ - id: %Schema{ - type: :integer, - description: "The identifier of this campaign" - }, - planet: PlanetSchema, - hq_node_index: %Schema{ - type: :integer, - description: "Haven't figured out what exactly this means" - } - } - }) -end diff --git a/lib/helldivers_2_web/schemas/news_feed_message_schema.ex b/lib/helldivers_2_web/schemas/news_feed_message_schema.ex deleted file mode 100644 index 3ff3e43..0000000 --- a/lib/helldivers_2_web/schemas/news_feed_message_schema.ex +++ /dev/null @@ -1,57 +0,0 @@ -defmodule Helldivers2Web.Schemas.NewsFeedMessageSchema do - require OpenApiSpex - - alias OpenApiSpex.Schema - - @languages Application.compile_env(:helldivers_2, :languages) - - @doc "Generates a schema for a single newsfeed message response" - def response(), - do: - {"Newsfeed message response", "application/json", __MODULE__, - Helldivers2Web.ApiSpec.default_options()} - - def responses(), - do: - {"Newsfeed response", "application/json", %Schema{type: :array, items: __MODULE__}, - Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "Represents a message in the Helldivers 2 newsfeed", - type: :object, - properties: %{ - id: %Schema{ - type: :integer, - description: "The identifier of this campaign" - }, - published: %Schema{ - type: :string, - format: :"date-time", - description: "When this message was published" - }, - type: %Schema{ - type: :integer, - description: - "A type identifier, haven't figured out what they mean (seems to be 0 mostly)" - }, - tag_ids: %Schema{ - type: :array, - items: %Schema{ - type: :integer, - description: "Tag identifiers, always empty so no idea what they mean" - } - }, - message: %Schema{ - type: :object, - properties: - Map.new(@languages, fn {key, lang} -> - {key, - %Schema{ - type: :string, - description: "The message from Super Earth about the news in #{lang}" - }} - end) - } - } - }) -end diff --git a/lib/helldivers_2_web/schemas/not_found_schema.ex b/lib/helldivers_2_web/schemas/not_found_schema.ex deleted file mode 100644 index ca35286..0000000 --- a/lib/helldivers_2_web/schemas/not_found_schema.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Helldivers2Web.Schemas.NotFoundSchema do - alias OpenApiSpex.Schema - require OpenApiSpex - - def response(), do: {"Resource not found", "application/json", __MODULE__, Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "The resource you tried to retrieve could not be found", - type: :object, - properties: %{ - errors: %Schema{ - type: :object, - properties: %{ - detail: %Schema{type: :string, description: "Description of what went wrong"} - } - } - } - }) -end diff --git a/lib/helldivers_2_web/schemas/planet_event_schema.ex b/lib/helldivers_2_web/schemas/planet_event_schema.ex deleted file mode 100644 index b6dc493..0000000 --- a/lib/helldivers_2_web/schemas/planet_event_schema.ex +++ /dev/null @@ -1,48 +0,0 @@ -defmodule Helldivers2Web.Schemas.PlanetEventSchema do - require OpenApiSpex - - alias Helldivers2Web.Schemas.JointOperationSchema - alias Helldivers2Web.Schemas.CampaignSchema - alias Helldivers2Web.Schemas.PlanetSchema - alias OpenApiSpex.Schema - - @doc "Generates a schema for a single homeworld schema response" - def response(), do: {"Planet event response", "application/json", __MODULE__, Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "An event occuring on a specific planet for a limited time", - type: :object, - properties: %{ - id: %Schema{ - type: :integer, - description: "The identifier of this event" - }, - planet: PlanetSchema, - event_type: %Schema{ - type: :integer, - description: "Identifier of the type of event, haven't found an index for these yet" - }, - race: %Schema{type: :string, description: "The race active in this event"}, - health: %Schema{ - type: :integer, - description: "The current health of the planet in this event" - }, - max_health: %Schema{ - type: :integer, - description: "The max health pool of the planet in this event" - }, - start_time: %Schema{ - type: :string, - format: :"date-time", - description: "When the event started on this planet" - }, - expire_time: %Schema{ - type: :string, - format: :"date-time", - description: "When the event will end on this planet" - }, - campaign: CampaignSchema, - joint_operations: %Schema{type: :array, items: JointOperationSchema} - } - }) -end diff --git a/lib/helldivers_2_web/schemas/planet_schema.ex b/lib/helldivers_2_web/schemas/planet_schema.ex deleted file mode 100644 index eb144c3..0000000 --- a/lib/helldivers_2_web/schemas/planet_schema.ex +++ /dev/null @@ -1,57 +0,0 @@ -defmodule Helldivers2Web.Schemas.PlanetSchema do - alias OpenApiSpex.Schema - require OpenApiSpex - - @doc "Generates a schema for a single planet schema response" - def response(), do: {"Planet response", "application/json", __MODULE__, Helldivers2Web.ApiSpec.default_options()} - - @doc "Generates a schema for an array of planet schemas" - def responses(), - do: {"Planets response", "application/json", %Schema{type: :array, items: __MODULE__}, Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "Represents a planet in the galactic war that must receive Managed democracy", - type: :object, - properties: %{ - index: %Schema{ - type: :integer, - description: - "The index of this planet, for convenience kept the same as in the official API" - }, - name: %Schema{ - type: :string, - description: "The human readable name of the planet, or unknown if it's not a known name" - }, - hash: %Schema{ - type: :number, - description: "A hash retrieved from the official API, purpose unknown" - }, - position: %Schema{ - type: :object, - description: "The coordinates in the galaxy where this planet is located", - properties: %{ - x: %Schema{type: :number, description: "X coordinate"}, - y: %Schema{type: :number, description: "Y coordinate"} - } - }, - waypoints: %Schema{ - type: :array, - items: %Schema{type: :integer}, - description: "Waypoints, seems to link planets together but purpose unclear" - }, - sector: %Schema{type: :string, description: "The name of the sector this planet resides in (or the identifier as a string if it's not a known sector)"}, - max_health: %Schema{ - type: :integer, - description: "The maximum health of this planet, used in conflict stats" - }, - disabled: %Schema{ - type: :boolean, - description: "Whether or not this planet is currently playable (enabled)" - }, - initial_owner: %Schema{ - type: :string, - description: "Which faction originally claimed this planet" - } - } - }) -end diff --git a/lib/helldivers_2_web/schemas/planet_status_schema.ex b/lib/helldivers_2_web/schemas/planet_status_schema.ex deleted file mode 100644 index e3adf0f..0000000 --- a/lib/helldivers_2_web/schemas/planet_status_schema.ex +++ /dev/null @@ -1,34 +0,0 @@ -defmodule Helldivers2Web.Schemas.PlanetStatusSchema do - require OpenApiSpex - - alias OpenApiSpex.Schema - alias Helldivers2Web.Schemas.PlanetSchema - - @doc "Generates a schema for a single war info schema response" - def response(), do: {"Planet status response", "application/json", __MODULE__, Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "The current offense status of a planet (owner, health, regen, player count)", - type: :object, - properties: %{ - planet: PlanetSchema, - owner: %Schema{ - type: :string, - description: "The faction that owns the planet at this moment" - }, - health: %Schema{type: :number, description: "The current 'health' of this planet"}, - regen_per_second: %Schema{ - type: :number, - description: "At which rate this planet will regenerate it's health" - }, - players: %Schema{ - type: :integer, - description: "The amount of helldivers currently on this planet" - }, - liberation: %Schema{ - type: :number, - description: "The progression of liberation on this planet, presented as a %" - } - } - }) -end diff --git a/lib/helldivers_2_web/schemas/too_many_requests_schema.ex b/lib/helldivers_2_web/schemas/too_many_requests_schema.ex deleted file mode 100644 index 463e7f5..0000000 --- a/lib/helldivers_2_web/schemas/too_many_requests_schema.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule Helldivers2Web.Schemas.TooManyRequestsSchema do - alias Helldivers2Web.ApiSpec - alias OpenApiSpex.Header - alias OpenApiSpex.Schema - require OpenApiSpex - - def response() do - {"Rate limit exceeded", "application/json", __MODULE__, - [ - headers: - ApiSpec.rate_limit_headers(%{ - "retry-after" => %Header{ - schema: %Schema{type: :number}, - description: "The amount of seconds to wait before making new requests" - } - }) - ]} - end - - OpenApiSpex.schema(%{ - description: "You're making too many requests in a limited span of time", - type: :object, - properties: %{ - error: %Schema{type: :string, description: "Error message for rate limit being exceeded"} - } - }) -end diff --git a/lib/helldivers_2_web/schemas/war_info_schema.ex b/lib/helldivers_2_web/schemas/war_info_schema.ex deleted file mode 100644 index c6e7e70..0000000 --- a/lib/helldivers_2_web/schemas/war_info_schema.ex +++ /dev/null @@ -1,58 +0,0 @@ -defmodule Helldivers2Web.Schemas.WarInfoSchema do - require OpenApiSpex - - alias OpenApiSpex.Schema - alias Helldivers2Web.Schemas.{PlanetSchema, HomeWorldSchema} - - @doc "Generates a schema for a single war info schema response" - def response(), - do: - {"War info response", "application/json", __MODULE__, - Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "Global overview of the war, it's planets, capitals etc", - type: :object, - properties: %{ - war_id: %Schema{ - type: :integer, - description: - "The identifier for this war, this ID must be passed for all resources under this war" - }, - start_date: %Schema{ - type: :string, - format: :"date-time", - description: "When this war season was started" - }, - end_date: %Schema{ - type: :string, - format: :"date-time", - description: "When this war season is scheduled to end" - }, - minimum_client_version: %Schema{ - type: :string, - description: "Used by the Helldivers 2 game client" - }, - planets: %Schema{ - type: :array, - items: PlanetSchema, - description: "All planets present in this war season" - }, - home_worlds: %Schema{ - type: :array, - items: HomeWorldSchema, - description: "All homeworlds present in this war season" - }, - capitals: %Schema{ - type: :array, - items: %Schema{type: :integer}, - description: "Empty, not been mapped yet" - }, - planet_permanent_effects: %Schema{ - type: :array, - items: %Schema{type: :integer}, - description: "Empty, not been mapped yet" - } - } - }) -end diff --git a/lib/helldivers_2_web/schemas/war_season_overview.ex b/lib/helldivers_2_web/schemas/war_season_overview.ex deleted file mode 100644 index 225b81e..0000000 --- a/lib/helldivers_2_web/schemas/war_season_overview.ex +++ /dev/null @@ -1,15 +0,0 @@ -defmodule Helldivers2Web.Schemas.WarSeasonOverview do - alias OpenApiSpex.Schema - require OpenApiSpex - - def response(), do: {"Available war seasons", "application/json", __MODULE__, Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "An overview of the available war seasons (and the current)", - type: :object, - properties: %{ - seasons: %Schema{type: :array, items: %Schema{type: :string}}, - current: %Schema{type: :string, description: "The currently active war season"} - } - }) -end diff --git a/lib/helldivers_2_web/schemas/war_status_schema.ex b/lib/helldivers_2_web/schemas/war_status_schema.ex deleted file mode 100644 index 0b206e7..0000000 --- a/lib/helldivers_2_web/schemas/war_status_schema.ex +++ /dev/null @@ -1,80 +0,0 @@ -defmodule Helldivers2Web.Schemas.WarStatusSchema do - require OpenApiSpex - - alias Helldivers2Web.Schemas.GlobalEventSchema - alias Helldivers2Web.Schemas.PlanetEventSchema - alias Helldivers2Web.Schemas.JointOperationSchema - alias Helldivers2Web.Schemas.CampaignSchema - alias Helldivers2Web.Schemas.PlanetSchema - alias Helldivers2Web.Schemas.PlanetStatusSchema - alias OpenApiSpex.Schema - - @doc "Generates a schema for a single war info schema response" - def response(), - do: - {"War status response", "application/json", __MODULE__, - Helldivers2Web.ApiSpec.default_options()} - - OpenApiSpex.schema(%{ - description: "Current status of the Helldivers offensive in the galactic war", - type: :object, - properties: %{ - war_id: %Schema{ - type: :integer, - description: - "The identifier for this war, this ID must be passed for all resources under this war" - }, - started_at: %Schema{ - type: :string, - format: :"date-time", - description: - "The timestamp (UTC) this season was started, as returned by the Helldivers API" - }, - snapshot_at: %Schema{ - type: :string, - format: :"date-time", - description: - "The timestamp (UTC) this status was snapshotted" - }, - impact_multiplier: %Schema{ - type: :number, - description: "I don't fully understand what this does, feel free to ping me if you know" - }, - planet_status: %Schema{type: :array, items: PlanetStatusSchema}, - planet_attacks: %Schema{ - type: :array, - items: %Schema{ - type: :object, - properties: %{ - source: PlanetSchema, - target: PlanetSchema - } - }, - description: "An overview of attacks currently being carried out against Democracy" - }, - campaigns: %Schema{ - type: :array, - items: CampaignSchema, - description: "An overview of the campaigns active in the current offensive" - }, - community_targets: %Schema{ - type: :array, - items: %Schema{type: :integer}, - description: "Always empty AFAIK, haven't figured this out" - }, - joint_operations: %Schema{type: :array, items: JointOperationSchema}, - planet_events: %Schema{type: :array, items: PlanetEventSchema}, - planet_active_effects: %Schema{ - type: :array, - items: %Schema{type: :integer}, - description: "Always empty AFAIK, haven't figured this out" - }, - active_election_policy_effects: %Schema{ - type: :array, - items: %Schema{type: :integer}, - description: "Always empty AFAIK, haven't figured this out" - }, - global_events: %Schema{type: :array, items: GlobalEventSchema} - } - }) -end diff --git a/lib/helldivers_2_web/telemetry.ex b/lib/helldivers_2_web/telemetry.ex deleted file mode 100644 index 946c683..0000000 --- a/lib/helldivers_2_web/telemetry.ex +++ /dev/null @@ -1,69 +0,0 @@ -defmodule Helldivers2Web.Telemetry do - use Supervisor - import Telemetry.Metrics - - def start_link(arg) do - Supervisor.start_link(__MODULE__, arg, name: __MODULE__) - end - - @impl true - def init(_arg) do - children = [ - # Telemetry poller will execute the given period measurements - # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics - {:telemetry_poller, measurements: periodic_measurements(), period: 10_000} - # Add reporters as children of your supervision tree. - # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()} - ] - - Supervisor.init(children, strategy: :one_for_one) - end - - def metrics do - [ - # Phoenix Metrics - summary("phoenix.endpoint.start.system_time", - unit: {:native, :millisecond} - ), - summary("phoenix.endpoint.stop.duration", - unit: {:native, :millisecond} - ), - summary("phoenix.router_dispatch.start.system_time", - tags: [:route], - unit: {:native, :millisecond} - ), - summary("phoenix.router_dispatch.exception.duration", - tags: [:route], - unit: {:native, :millisecond} - ), - summary("phoenix.router_dispatch.stop.duration", - tags: [:route], - unit: {:native, :millisecond} - ), - summary("phoenix.socket_connected.duration", - unit: {:native, :millisecond} - ), - summary("phoenix.channel_joined.duration", - unit: {:native, :millisecond} - ), - summary("phoenix.channel_handled_in.duration", - tags: [:event], - unit: {:native, :millisecond} - ), - - # VM Metrics - summary("vm.memory.total", unit: {:byte, :kilobyte}), - summary("vm.total_run_queue_lengths.total"), - summary("vm.total_run_queue_lengths.cpu"), - summary("vm.total_run_queue_lengths.io") - ] - end - - defp periodic_measurements do - [ - # A module, function and arguments to be invoked periodically. - # This function must call :telemetry.execute/3 and a metric must be added above. - # {Helldivers2Web, :count_users, []} - ] - end -end diff --git a/mix.exs b/mix.exs deleted file mode 100644 index f0d84f5..0000000 --- a/mix.exs +++ /dev/null @@ -1,76 +0,0 @@ -defmodule Helldivers2.MixProject do - use Mix.Project - - def project do - [ - app: :helldivers_2, - version: "0.1.0", - elixir: "~> 1.14", - elixirc_paths: elixirc_paths(Mix.env()), - start_permanent: Mix.env() == :prod, - aliases: aliases(), - deps: deps() - ] - end - - # Configuration for the OTP application. - # - # Type `mix help compile.app` for more information. - def application do - [ - mod: {Helldivers2.Application, []}, - extra_applications: extra_apps(Mix.env()) - ] - end - - defp extra_apps(:dev), do: [:logger, :runtime_tools, :os_mon, :wx, :observer] - defp extra_apps(_), do: [:logger, :runtime_tools, :os_mon] - - # Specifies which paths to compile per environment. - defp elixirc_paths(:test), do: ["lib", "test/support"] - defp elixirc_paths(_), do: ["lib"] - - # Specifies your project dependencies. - # - # Type `mix help deps` for examples and options. - defp deps do - [ - {:phoenix, "~> 1.7.10"}, - {:phoenix_html, "~> 3.3"}, - {:phoenix_live_reload, "~> 1.2", only: :dev}, - {:phoenix_live_view, "~> 0.20.1"}, - {:floki, ">= 0.30.0", only: :test}, - {:phoenix_live_dashboard, "~> 0.8.2"}, - {:esbuild, "~> 0.8", runtime: Mix.env() == :dev}, - {:tailwind, "~> 0.2.0", runtime: Mix.env() == :dev}, - {:telemetry_metrics, "~> 0.6"}, - {:telemetry_poller, "~> 1.0"}, - {:jason, "~> 1.2"}, - {:dns_cluster, "~> 0.1.1"}, - {:bandit, ">= 0.0.0"}, - {:req, "~> 0.4.11"}, - {:nimble_options, "~> 1.1.0"}, - {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, - {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, - {:ex_rated, "~> 2.1.0"}, - {:open_api_spex, "~> 3.18"}, - {:ex_doc, "~> 0.31", only: :dev, runtime: false}, - {:corsica, "~> 2.1.3"} - ] - end - - # Aliases are shortcuts or tasks specific to the current project. - # For example, to install project dependencies and perform other setup tasks, run: - # - # $ mix setup - # - # See the documentation for `Mix` for more info on aliases. - defp aliases do - [ - setup: ["deps.get", "deps.compile", "assets.setup", "assets.build"], - "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"], - "assets.build": ["tailwind default", "esbuild default"], - "assets.deploy": ["tailwind default --minify", "esbuild default --minify", "phx.digest"] - ] - end -end diff --git a/mix.lock b/mix.lock deleted file mode 100644 index 5d5819d..0000000 --- a/mix.lock +++ /dev/null @@ -1,48 +0,0 @@ -%{ - "bandit": {:hex, :bandit, "1.2.3", "a98d664a96fec23b68e776062296d76a94b4459795b38209f4ae89cb4225709c", [:mix], [{:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "3e29150245a9b5f56944434e5240966e75c917dad248f689ab589b32187a81af"}, - "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, - "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"}, - "corsica": {:hex, :corsica, "2.1.3", "dccd094ffce38178acead9ae743180cdaffa388f35f0461ba1e8151d32e190e6", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "616c08f61a345780c2cf662ff226816f04d8868e12054e68963e95285b5be8bc"}, - "credo": {:hex, :credo, "1.7.5", "643213503b1c766ec0496d828c90c424471ea54da77c8a168c725686377b9545", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "f799e9b5cd1891577d8c773d245668aa74a2fcd15eb277f51a0131690ebfb3fd"}, - "dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"}, - "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, - "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, - "esbuild": {:hex, :esbuild, "0.8.1", "0cbf919f0eccb136d2eeef0df49c4acf55336de864e63594adcea3814f3edf41", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"}, - "ex2ms": {:hex, :ex2ms, "1.7.0", "45b9f523d0b777667ded60070d82d871a37e294f0b6c5b8eca86771f00f82ee1", [:mix], [], "hexpm", "2589eee51f81f1b1caa6d08c990b1ad409215fe6f64c73f73c67d36ed10be827"}, - "ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"}, - "ex_rated": {:hex, :ex_rated, "2.1.0", "d40e6fe35097b10222df2db7bb5dd801d57211bac65f29063de5f201c2a6aebc", [:mix], [{:ex2ms, "~> 1.5", [hex: :ex2ms, repo: "hexpm", optional: false]}], "hexpm", "936c155337253ed6474f06d941999dd3a9cf0fe767ec99a59f2d2989dc2cc13f"}, - "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, - "finch": {:hex, :finch, "0.18.0", "944ac7d34d0bd2ac8998f79f7a811b21d87d911e77a786bc5810adb75632ada4", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"}, - "floki": {:hex, :floki, "0.35.4", "cc947b446024732c07274ac656600c5c4dc014caa1f8fb2dfff93d275b83890d", [:mix], [], "hexpm", "27fa185d3469bd8fc5947ef0f8d5c4e47f0af02eb6b070b63c868f69e3af0204"}, - "gen_registry": {:hex, :gen_registry, "1.3.0", "4b9ee72ca0e5f7450d054cef122ed9c491edb3d35e81f5a823626b8b76f2a4e1", [:mix], [], "hexpm", "33064ccc3be5ab7ee2f6946184fcfddf564fed60ccb7a90542d77f72d807f5dd"}, - "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, - "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, - "makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"}, - "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, - "mint": {:hex, :mint, "1.5.2", "4805e059f96028948870d23d7783613b7e6b0e2fb4e98d720383852a760067fd", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "d77d9e9ce4eb35941907f1d3df38d8f750c357865353e21d335bdcdf6d892a02"}, - "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"}, - "nimble_ownership": {:hex, :nimble_ownership, "0.2.1", "3e44c72ebe8dd213db4e13aff4090aaa331d158e72ce1891d02e0ffb05a1eb2d", [:mix], [], "hexpm", "bf38d2ef4fb990521a4ecf112843063c1f58a5c602484af4c7977324042badee"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, - "nimble_pool": {:hex, :nimble_pool, "1.0.0", "5eb82705d138f4dd4423f69ceb19ac667b3b492ae570c9f5c900bb3d2f50a847", [:mix], [], "hexpm", "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a"}, - "open_api_spex": {:hex, :open_api_spex, "3.18.2", "8c855e83bfe8bf81603d919d6e892541eafece3720f34d1700b58024dadde247", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:ymlr, "~> 2.0 or ~> 3.0 or ~> 4.0", [hex: :ymlr, repo: "hexpm", optional: true]}], "hexpm", "aa3e6dcfc0ad6a02596b2172662da21c9dd848dac145ea9e603f54e3d81b8d2b"}, - "phoenix": {:hex, :phoenix, "1.7.11", "1d88fc6b05ab0c735b250932c4e6e33bfa1c186f76dcf623d8dd52f07d6379c7", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "b1ec57f2e40316b306708fe59b92a16b9f6f4bf50ccfa41aa8c7feb79e0ec02a"}, - "phoenix_html": {:hex, :phoenix_html, "3.3.3", "380b8fb45912b5638d2f1d925a3771b4516b9a78587249cabe394e0a5d579dc9", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "923ebe6fec6e2e3b3e569dfbdc6560de932cd54b000ada0208b5f45024bdd76c"}, - "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.3", "7ff51c9b6609470f681fbea20578dede0e548302b0c8bdf338b5a753a4f045bf", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"}, - "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"}, - "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.9", "46d5d436d3f8ff97f066b6c45528fd842a711fd3875b2d3f706b2e769ea07c51", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "694388615ece21b70c523910cba1c633132b08a270caaf60100dd4eaf331885d"}, - "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, - "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, - "plug": {:hex, :plug, "1.15.3", "712976f504418f6dff0a3e554c40d705a9bcf89a7ccef92fc6a5ef8f16a30a97", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cc4365a3c010a56af402e0809208873d113e9c38c401cabd88027ef4f5c01fd2"}, - "plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"}, - "req": {:hex, :req, "0.4.11", "cb19f87d5251e7de30cfc67d1899696b290711092207c6b2e8fc2294f237fcdc", [:mix], [{:aws_signature, "~> 0.3.2", [hex: :aws_signature, repo: "hexpm", optional: true]}, {:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:nimble_ownership, "~> 0.2.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bbf4f2393c649fa4146a3b8470e2a7e8c9b23e4100a16c75f5e7d1d3d33144f3"}, - "tailwind": {:hex, :tailwind, "0.2.2", "9e27288b568ede1d88517e8c61259bc214a12d7eed271e102db4c93fcca9b2cd", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "ccfb5025179ea307f7f899d1bb3905cd0ac9f687ed77feebc8f67bdca78565c4"}, - "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, - "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"}, - "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"}, - "thousand_island": {:hex, :thousand_island, "1.3.5", "6022b6338f1635b3d32406ff98d68b843ba73b3aa95cfc27154223244f3a6ca5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"}, - "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, - "websock_adapter": {:hex, :websock_adapter, "0.5.5", "9dfeee8269b27e958a65b3e235b7e447769f66b5b5925385f5a569269164a210", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "4b977ba4a01918acbf77045ff88de7f6972c2a009213c515a445c48f224ffce9"}, -} diff --git a/priv/effects.json b/priv/effects.json deleted file mode 100644 index 7a73a41..0000000 --- a/priv/effects.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file diff --git a/priv/factions.json b/priv/factions.json deleted file mode 100644 index bbf695b..0000000 --- a/priv/factions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "1": "Humans", - "2": "Terminids", - "3": "Automaton" -} \ No newline at end of file diff --git a/priv/planets.json b/priv/planets.json deleted file mode 100644 index 9fc414e..0000000 --- a/priv/planets.json +++ /dev/null @@ -1,263 +0,0 @@ -{ - "0": "Super Earth", - "1": "Klen Dahth II", - "2": "Pathfinder V", - "3": "Widow's Harbor", - "4": "New Haven", - "5": "Pilen V", - "6": "Hydrofall Prime", - "7": "Zea Rugosia", - "8": "Darrowsport", - "9": "Fornskogur II", - "10": "Midasburg", - "11": "Cerberus Iiic", - "12": "Prosperity Falls", - "13": "Okul VI", - "14": "Martyr's Bay", - "15": "Freedom Peak", - "16": "Fort Union", - "17": "Kelvinor", - "18": "Wraith", - "19": "Igla", - "20": "New Kiruna", - "21": "Fort Justice", - "22": "Zegema Paradise", - "23": "Providence", - "24": "Primordia", - "25": "Sulfura", - "26": "Nublaria I", - "27": "Krakatwo", - "28": "Volterra", - "29": "Crucible", - "30": "Veil", - "31": "Marre IV", - "32": "Fort Sanctuary", - "33": "Seyshel Beach", - "34": "Hellmire", - "35": "Effluvia", - "36": "Solghast", - "37": "Diluvia", - "38": "Viridia Prime", - "39": "Obari", - "40": "Myradesh", - "41": "Atrama", - "42": "Emeria", - "43": "Barabos", - "44": "Fenmire", - "45": "Mastia", - "46": "Shallus", - "47": "Krakabos", - "48": "Iridica", - "49": "Azterra", - "50": "Azur Secundus", - "51": "Ivis", - "52": "Slif", - "53": "Caramoor", - "54": "Kharst", - "55": "Eukoria", - "56": "Myrium", - "57": "Kerth Secundus", - "58": "Parsh", - "59": "Reaf", - "60": "Irulta", - "61": "Emorath", - "62": "Ilduna Prime", - "63": "Maw", - "64": "Meridia", - "65": "Borea", - "66": "Curia", - "67": "Tarsh", - "68": "Shelt", - "69": "Imber", - "70": "Blistica", - "71": "Ratch", - "72": "Julheim", - "73": "Valgaard", - "74": "Arkturus", - "75": "Esker", - "76": "Terrek", - "77": "Cirrus", - "78": "Crimsica", - "79": "Heeth", - "80": "Veld", - "81": "Alta V", - "82": "Ursica XI", - "83": "Inari", - "84": "Skaash", - "85": "Moradesh", - "86": "Rasp", - "87": "Bashyr", - "88": "Regnus", - "89": "Mog", - "90": "Valmox", - "91": "Iro", - "92": "Grafmere", - "93": "New Stockholm", - "94": "Oasis", - "95": "Genesis Prime", - "96": "Outpost 32", - "97": "Calypso", - "98": "Elysian Meadows", - "99": "Alderidge Cove", - "100": "Trandor", - "101": "East Iridium Trading Bay", - "102": "Liberty Ridge", - "103": "Baldrick Prime", - "104": "The Weir", - "105": "Kuper", - "106": "Oslo Station", - "107": "Pöpli IX", - "108": "Gunvald", - "109": "Dolph", - "110": "Bekvam III", - "111": "Duma Tyr", - "112": "Vernen Wells", - "113": "Aesir Pass", - "114": "Aurora Bay", - "115": "Penta", - "116": "Gaellivare", - "117": "Vog-sojoth", - "118": "Kirrik", - "119": "Mortax Prime", - "120": "Wilford Station", - "121": "Pioneer II", - "122": "Erson Sands", - "123": "Socorro III", - "124": "Bore Rock", - "125": "Fenrir III", - "126": "Turing", - "127": "Angel's Venture", - "128": "Darius II", - "129": "Acamar IV", - "130": "Achernar Secundus", - "131": "Achird III", - "132": "Acrab XI", - "133": "Acrux IX", - "134": "Acubens Prime", - "135": "Adhara", - "136": "Afoyay Bay", - "137": "Ain-5", - "138": "Alairt III", - "139": "Alamak VII", - "140": "Alaraph", - "141": "Alathfar XI", - "142": "Andar", - "143": "Asperoth Prime", - "144": "Bellatrix", - "145": "Botein", - "146": "Osupsam", - "147": "Brink-2", - "148": "Bunda Secundus", - "149": "Canopus", - "150": "Caph", - "151": "Castor", - "152": "Durgen", - "153": "Draupnir", - "154": "Mort", - "155": "Ingmar", - "156": "Charbal-VII", - "157": "Charon Prime", - "158": "Choepessa IV", - "159": "Choohe", - "160": "Chort Bay", - "161": "Claorell", - "162": "Clasa", - "163": "Demiurg", - "164": "Deneb Secundus", - "165": "Electra Bay", - "166": "Enuliale", - "167": "Epsilon Phoencis VI", - "168": "Erata Prime", - "169": "Estanu", - "170": "Fori Prime", - "171": "Gacrux", - "172": "Gar Haren", - "173": "Gatria", - "174": "Gemma", - "175": "Grand Errant", - "176": "Hadar", - "177": "Haka", - "178": "Haldus", - "179": "Halies Port", - "180": "Herthon Secundus", - "181": "Hesoe Prime", - "182": "Heze Bay", - "183": "Hort", - "184": "Hydrobius", - "185": "Karlia", - "186": "Keid", - "187": "Khandark", - "188": "Klaka 5", - "189": "Kneth Port", - "190": "Kraz", - "191": "Kuma", - "192": "Lastofe", - "193": "Leng Secundus", - "194": "Lesath", - "195": "Maia", - "196": "Malevelon Creek", - "197": "Mantes", - "198": "Marfark", - "199": "Martale", - "200": "Matar Bay", - "201": "Meissa", - "202": "Mekbuda", - "203": "Menkent", - "204": "Merak", - "205": "Merga IV", - "206": "Minchir", - "207": "Mintoria", - "208": "Mordia 9", - "209": "Nabatea Secundus", - "210": "Navi VII", - "211": "Nivel 43", - "212": "Oshaune", - "213": "Overgoe Prime", - "214": "Pandion-XXIV", - "215": "Partion", - "216": "Peacock", - "217": "Phact Bay", - "218": "Pherkad Secundus", - "219": "Polaris Prime", - "220": "Pollux 31", - "221": "Prasa", - "222": "Propus", - "223": "Ras Algethi", - "224": "Rd-4", - "225": "Rogue 5", - "226": "Rirga Bay", - "227": "Seasse", - "228": "Senge 23", - "229": "Setia", - "230": "Shete", - "231": "Siemnot", - "232": "Sirius", - "233": "Skat Bay", - "234": "Spherion", - "235": "Stor Tha Prime", - "236": "Stout", - "237": "Termadon", - "238": "Tibit", - "239": "Tien Kwan", - "240": "Troost", - "241": "Ubanea", - "242": "Ustotu", - "243": "Vandalon IV", - "244": "Varylia 5", - "245": "Wasat", - "246": "Vega Bay", - "247": "Wezen", - "248": "Vindemitarix Prime", - "249": "X-45", - "250": "Yed Prior", - "251": "Zefia", - "252": "Zosma", - "253": "Zzaniah Prime", - "254": "Skitter", - "255": "Euphoria III", - "256": "Diaspora X", - "257": "Gemstone Bluffs", - "258": "Zagon Prime", - "259": "Omicron", - "260": "Cyberstan" -} \ No newline at end of file diff --git a/priv/sectors.json b/priv/sectors.json deleted file mode 100644 index f75fc2c..0000000 --- a/priv/sectors.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "0": "Sol", - "1": "Altus", - "2": "Barnard", - "3": "Cancri", - "4": "Gothmar", - "5": "Cantolus" -} \ No newline at end of file diff --git a/priv/static/favicon.ico b/priv/static/favicon.ico deleted file mode 100644 index 7f372bfc21cdd8cb47585339d5fa4d9dd424402f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=@t!V@Ar*{oFEH`~d50E!_s``s q?{G*w(7?#d#v@^nKnY_HKaYb01EZMZjMqTJ89ZJ6T-G@yGywoKK_h|y diff --git a/priv/static/images/logo.svg b/priv/static/images/logo.svg deleted file mode 100644 index 9f26bab..0000000 --- a/priv/static/images/logo.svg +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/priv/static/robots.txt b/priv/static/robots.txt deleted file mode 100644 index 26e06b5..0000000 --- a/priv/static/robots.txt +++ /dev/null @@ -1,5 +0,0 @@ -# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file -# -# To ban all spiders from the entire site uncomment the next two lines: -# User-agent: * -# Disallow: / diff --git a/rel/env.sh.eex b/rel/env.sh.eex deleted file mode 100755 index 7322270..0000000 --- a/rel/env.sh.eex +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -# configure node for distributed erlang with IPV6 support, if -if [ "${ENABLE_IPV6}" = "true" ] -then - export ERL_AFLAGS="-proto_dist inet6_tcp" -else - export ERL_AFLAGS="-proto_dist inet_tcp" -fi - -export ECTO_IPV6="${ENABLE_IPV6}" -export DNS_CLUSTER_QUERY="${FLY_APP_NAME}.internal" -export RELEASE_DISTRIBUTION="name" -export RELEASE_NODE="${FLY_APP_NAME}-${FLY_IMAGE_REF##*-}@${FLY_PRIVATE_IP}" diff --git a/rel/overlays/bin/server b/rel/overlays/bin/server deleted file mode 100755 index 573d01d..0000000 --- a/rel/overlays/bin/server +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -set -eu - -cd -P -- "$(dirname -- "$0")" -PHX_SERVER=true exec ./helldivers_2 start diff --git a/rel/overlays/bin/server.bat b/rel/overlays/bin/server.bat deleted file mode 100755 index 6c3fe4b..0000000 --- a/rel/overlays/bin/server.bat +++ /dev/null @@ -1,2 +0,0 @@ -set PHX_SERVER=true -call "%~dp0\helldivers_2" start diff --git a/src/Helldivers-2-API/Controllers/ArrowHeadController.cs b/src/Helldivers-2-API/Controllers/ArrowHeadController.cs new file mode 100644 index 0000000..9889438 --- /dev/null +++ b/src/Helldivers-2-API/Controllers/ArrowHeadController.cs @@ -0,0 +1,79 @@ +using Helldivers.Core.Contracts; +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.ArrowHead; +using Microsoft.AspNetCore.Mvc; + +namespace Helldivers.API.Controllers; + +/// +/// Contains API endpoints to mimic the endpoints exposed by the official ArrowHead API. +/// +public static class ArrowHeadController +{ + /// + /// Returns the currently active war season ID. + /// + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task WarId(HttpContext context, IStore store) + { + var result = await store.Get(context.RequestAborted); + + return Results.Ok(result); + } + + /// + /// Get a snapshot of the current war status. + /// + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task Status(HttpContext context, IStore store) + { + var status = await store.Get(context.RequestAborted); + + return Results.Ok(status); + } + + /// + /// Gets the current war info. + /// + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task WarInfo(HttpContext context, IStore store) + { + var info = await store.Get(context.RequestAborted); + + return Results.Ok(info); + } + + /// + /// Gets the current war info. + /// + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task Summary(HttpContext context, IStore store) + { + var summary = await store.Get(context.RequestAborted); + + return Results.Ok(summary); + } + + /// + /// Retrieves a list of news messages from Super Earth. + /// + [ProducesResponseType>(StatusCodes.Status200OK)] + public static async Task NewsFeed(HttpContext context, IStore store) + { + var items = await store.AllAsync(context.RequestAborted); + + return Results.Ok(items); + } + + /// + /// Retrieves a list of currently active assignments (like Major Orders). + /// + [ProducesResponseType>(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status503ServiceUnavailable)] + public static async Task Assignments(HttpContext context, IStore store) + { + var assignments = await store.AllAsync(context.RequestAborted); + + return Results.Ok(assignments); + } +} diff --git a/src/Helldivers-2-API/Controllers/V1/AssignmentsController.cs b/src/Helldivers-2-API/Controllers/V1/AssignmentsController.cs new file mode 100644 index 0000000..2980aad --- /dev/null +++ b/src/Helldivers-2-API/Controllers/V1/AssignmentsController.cs @@ -0,0 +1,36 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; +using Microsoft.AspNetCore.Mvc; + +namespace Helldivers.API.Controllers.V1; + +/// +/// Contains API endpoints for . +/// +public static class AssignmentsController +{ + /// + /// Fetches a list of all available information available. + /// + [ProducesResponseType>(StatusCodes.Status200OK)] + public static async Task Index(HttpContext context, IStore store) + { + var assignments = await store.AllAsync(context.RequestAborted); + + return Results.Ok(assignments); + } + + + /// + /// Fetches a specific identified by . + /// + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task Show(HttpContext context, IStore store, [FromRoute] long index) + { + var assignment = await store.GetAsync(index, context.RequestAborted); + if (assignment is null) + return Results.NotFound(); + + return Results.Ok(assignment); + } +} diff --git a/src/Helldivers-2-API/Controllers/V1/CampaignsController.cs b/src/Helldivers-2-API/Controllers/V1/CampaignsController.cs new file mode 100644 index 0000000..2b0c3c8 --- /dev/null +++ b/src/Helldivers-2-API/Controllers/V1/CampaignsController.cs @@ -0,0 +1,36 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; +using Microsoft.AspNetCore.Mvc; + +namespace Helldivers.API.Controllers.V1; + +/// +/// Contains API endpoints for . +/// +public static class CampaignsController +{ + /// + /// Fetches a list of all available information available. + /// + [ProducesResponseType>(StatusCodes.Status200OK)] + public static async Task Index(HttpContext context, IStore store) + { + var campaigns = await store.AllAsync(context.RequestAborted); + + return Results.Ok(campaigns); + } + + + /// + /// Fetches a specific identified by . + /// + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task Show(HttpContext context, IStore store, [FromRoute] int index) + { + var campaign = await store.GetAsync(index, context.RequestAborted); + if (campaign is null) + return Results.NotFound(); + + return Results.Ok(campaign); + } +} diff --git a/src/Helldivers-2-API/Controllers/V1/DispatchController.cs b/src/Helldivers-2-API/Controllers/V1/DispatchController.cs new file mode 100644 index 0000000..ba09439 --- /dev/null +++ b/src/Helldivers-2-API/Controllers/V1/DispatchController.cs @@ -0,0 +1,36 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; +using Microsoft.AspNetCore.Mvc; + +namespace Helldivers.API.Controllers.V1; + +/// +/// Contains API endpoints for . +/// +public static class DispatchController +{ + /// + /// Fetches a list of all available information available. + /// + [ProducesResponseType>(StatusCodes.Status200OK)] + public static async Task Index(HttpContext context, IStore store) + { + var dispatches = await store.AllAsync(context.RequestAborted); + + return Results.Ok(dispatches); + } + + + /// + /// Fetches a specific identified by . + /// + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task Show(HttpContext context, IStore store, [FromRoute] int index) + { + var dispatch = await store.GetAsync(index, context.RequestAborted); + if (dispatch is null) + return Results.NotFound(); + + return Results.Ok(dispatch); + } +} diff --git a/src/Helldivers-2-API/Controllers/V1/PlanetController.cs b/src/Helldivers-2-API/Controllers/V1/PlanetController.cs new file mode 100644 index 0000000..4e422d6 --- /dev/null +++ b/src/Helldivers-2-API/Controllers/V1/PlanetController.cs @@ -0,0 +1,50 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; +using Microsoft.AspNetCore.Mvc; + +namespace Helldivers.API.Controllers.V1; + +/// +/// Contains API endpoints for . +/// +public static class PlanetController +{ + /// + /// Fetches a list of all available information available. + /// + [ProducesResponseType>(StatusCodes.Status200OK)] + public static async Task Index(HttpContext context, IStore store) + { + var planets = await store.AllAsync(context.RequestAborted); + + return Results.Ok(planets); + } + + + /// + /// Fetches a specific identified by . + /// + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task Show(HttpContext context, IStore store, [FromRoute] int index) + { + var planet = await store.GetAsync(index, context.RequestAborted); + if (planet is null) + return Results.NotFound(); + + return Results.Ok(planet); + } + + /// + /// Fetches all planets with an active . + /// + [ProducesResponseType>(StatusCodes.Status200OK)] + public static async Task WithEvents(HttpContext context, IStore store) + { + var planets = await store.AllAsync(context.RequestAborted); + var withEvents = planets + .Where(planet => planet.Event is not null) + .ToList(); + + return Results.Ok(withEvents); + } +} diff --git a/src/Helldivers-2-API/Controllers/V1/SteamController.cs b/src/Helldivers-2-API/Controllers/V1/SteamController.cs new file mode 100644 index 0000000..f2ed7b5 --- /dev/null +++ b/src/Helldivers-2-API/Controllers/V1/SteamController.cs @@ -0,0 +1,40 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; +using Microsoft.AspNetCore.Mvc; + +namespace Helldivers.API.Controllers.V1; + +/// +/// Contains API endpoints for . +/// +public static class SteamController +{ + /// + /// Fetches the Steam newsfeed for Helldivers 2. + /// + /// You can definitely get this yourself, however it's included for your convenience! + [ProducesResponseType>(StatusCodes.Status200OK)] + public static async Task Index(HttpContext context, IStore store) + { + var news = await store.AllAsync(context.RequestAborted); + + return Results.Ok(news); + } + + /// + /// Fetches a specific newsfeed item from the Helldivers 2 Steam newsfeed. + /// + /// You can definitely get this yourself, however it's included for your convenience! + /// Returned when the key is not recognized. + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType>(StatusCodes.Status200OK)] + public static async Task Show(HttpContext context, IStore store, [FromRoute] string gid) + { + var news = await store.GetAsync(gid, context.RequestAborted); + + if (news is null) + return Results.NotFound(); + + return Results.Ok(news); + } +} diff --git a/src/Helldivers-2-API/Controllers/V1/WarController.cs b/src/Helldivers-2-API/Controllers/V1/WarController.cs new file mode 100644 index 0000000..5a5b9b8 --- /dev/null +++ b/src/Helldivers-2-API/Controllers/V1/WarController.cs @@ -0,0 +1,22 @@ +using Helldivers.Core.Contracts; +using Helldivers.Models.V1; +using Microsoft.AspNetCore.Mvc; + +namespace Helldivers.API.Controllers.V1; + +/// +/// Contains API endpoints for . +/// +public static class WarController +{ + /// + /// Gets the current state. + /// + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task Show(HttpContext context, IStore store) + { + var war = await store.Get(context.RequestAborted); + + return Results.Ok(war); + } +} diff --git a/src/Helldivers-2-API/Dockerfile b/src/Helldivers-2-API/Dockerfile new file mode 100644 index 0000000..0df60af --- /dev/null +++ b/src/Helldivers-2-API/Dockerfile @@ -0,0 +1,34 @@ +FROM mcr.microsoft.com/dotnet/runtime-deps:8.0-alpine-extra AS base +USER $APP_UID +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build +RUN apk add --upgrade --no-cache \ + build-base \ + clang \ + zlib-dev +ARG BUILD_CONFIGURATION=Release +ARG BUILD_RUNTIME=linux-musl-x64 +WORKDIR /src + +COPY ["src/Helldivers-2-API/Helldivers-2-API.csproj", "Helldivers-2-API/"] +COPY ["src/Helldivers-2-Models/Helldivers-2-Models.csproj", "Helldivers-2-Models/"] +COPY ["src/Helldivers-2-Sync/Helldivers-2-Sync.csproj", "Helldivers-2-Sync/"] +COPY ["src/Helldivers-2-Core/Helldivers-2-Core.csproj", "Helldivers-2-Core/"] +COPY ["src/Helldivers-2-SourceGen/Helldivers-2-SourceGen.csproj", "Helldivers-2-SourceGen/"] +COPY ["Directory.Build.props", "."] + +RUN dotnet restore -r $BUILD_RUNTIME "Helldivers-2-API/Helldivers-2-API.csproj" +COPY ./src . +WORKDIR "/src/Helldivers-2-API" +RUN dotnet build "Helldivers-2-API.csproj" --no-restore -r $BUILD_RUNTIME -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "Helldivers-2-API.csproj" --no-restore --self-contained -r $BUILD_RUNTIME -c $BUILD_CONFIGURATION -o /app/publish + +FROM base AS final +WORKDIR /app +EXPOSE 8080 +COPY --from=publish /app/publish . +ENTRYPOINT ["./Helldivers-2-API"] diff --git a/src/Helldivers-2-API/Helldivers-2-API.csproj b/src/Helldivers-2-API/Helldivers-2-API.csproj new file mode 100644 index 0000000..a56cd73 --- /dev/null +++ b/src/Helldivers-2-API/Helldivers-2-API.csproj @@ -0,0 +1,45 @@ + + + + true + Helldivers.API + Linux + true + true + + + + + $(MSBuildProjectDirectory)/wwwroot + true + true + + + + + .dockerignore + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/src/Helldivers-2-API/Middlewares/RateLimitMiddleware.cs b/src/Helldivers-2-API/Middlewares/RateLimitMiddleware.cs new file mode 100644 index 0000000..d49b818 --- /dev/null +++ b/src/Helldivers-2-API/Middlewares/RateLimitMiddleware.cs @@ -0,0 +1,59 @@ +using Microsoft.Extensions.Caching.Memory; +using System.Net; +using System.Threading.RateLimiting; + +namespace Helldivers.API.Middlewares; + +/// +/// Handles applying rate limit logic to the API's requests. +/// +public sealed partial class RateLimitMiddleware(ILogger logger, IMemoryCache cache) : IMiddleware +{ + // TODO: move to configurable policies. + private const int DefaultRequestLimit = 5; + private const int DefaultRequestWindow = 10; + + [LoggerMessage(Level = LogLevel.Information, Message = "Retrieving rate limiter for {Key}")] + private static partial void LogRateLimitKey(ILogger logger, IPAddress key); + + /// + public async Task InvokeAsync(HttpContext context, RequestDelegate next) + { + var limiter = GetRateLimiter(context); + using var lease = await limiter.AcquireAsync(permitCount: 1, context.RequestAborted); + if (limiter.GetStatistics() is { } statistics) + { + context.Response.Headers["X-RateLimit-Limit"] = $"{DefaultRequestLimit}"; + context.Response.Headers["X-RateLimit-Remaining"] = $"{statistics.CurrentAvailablePermits}"; + if (lease.TryGetMetadata(MetadataName.RetryAfter, out var retryAfter)) + context.Response.Headers["Retry-After"] = $"{retryAfter.Seconds}"; + } + + if (lease.IsAcquired is false) + { + context.Response.StatusCode = StatusCodes.Status429TooManyRequests; + return; + } + + await next(context); + } + + private RateLimiter GetRateLimiter(HttpContext http) + { + var key = http.Connection.RemoteIpAddress ?? IPAddress.Loopback; + LogRateLimitKey(logger, key); + + return cache.GetOrCreate(key, entry => + { + entry.SlidingExpiration = TimeSpan.FromSeconds(DefaultRequestWindow); + return new TokenBucketRateLimiter(new() + { + AutoReplenishment = true, + TokenLimit = DefaultRequestLimit, + TokensPerPeriod = DefaultRequestLimit, + QueueLimit = 0, + ReplenishmentPeriod = TimeSpan.FromSeconds(DefaultRequestWindow) + }); + }) ?? throw new InvalidOperationException($"Creating rate limiter failed for {key}"); + } +} diff --git a/src/Helldivers-2-API/OpenApi/ArrowHeadDocumentProcessor.cs b/src/Helldivers-2-API/OpenApi/ArrowHeadDocumentProcessor.cs new file mode 100644 index 0000000..8a1e4df --- /dev/null +++ b/src/Helldivers-2-API/OpenApi/ArrowHeadDocumentProcessor.cs @@ -0,0 +1,49 @@ +#if DEBUG +using NSwag; +using NSwag.Generation.Processors; +using NSwag.Generation.Processors.Contexts; + +namespace Helldivers.API.OpenApi; + +/// +/// Handles processing of the OpenAPI specification of the ArrowHead studio API. +/// Specifically, it removes all community API specific aspects (like the '/raw' prefix). +/// +public class ArrowHeadDocumentProcessor : IDocumentProcessor +{ + // "/raw".length + private const int PrefixLength = 4; + + private const string ArrowHeadServer = "https://api.live.prod.thehelldiversgame.com/"; + + /// + public void Process(DocumentProcessorContext context) + { + // First we make a copy of the Paths, since C# doesn't like it when collections are modified during iteration. + var paths = context.Document.Paths.ToList(); + var server = new OpenApiServer + { + Description = "The official ArrowHead server", + Url = ArrowHeadServer + }; + + foreach (var (url, item) in paths) + { + // If it's a '/raw' prefixed URL, we strip the /raw prefix. + if (string.IsNullOrWhiteSpace(url) is false && url.StartsWith("/raw")) + { + item.Servers.Clear(); + item.Servers.Add(server); + + context.Document.Paths[url[PrefixLength..]] = item; + context.Document.Paths.Remove(url); + } + } + + foreach (var operation in context.Document.Operations) + { + operation.Operation.OperationId = operation.Operation.OperationId.Replace("Raw", string.Empty); + } + } +} +#endif diff --git a/src/Helldivers-2-API/Program.cs b/src/Helldivers-2-API/Program.cs new file mode 100644 index 0000000..03e2148 --- /dev/null +++ b/src/Helldivers-2-API/Program.cs @@ -0,0 +1,197 @@ +using Helldivers.API.Controllers; +using Helldivers.API.Controllers.V1; +using Helldivers.API.Middlewares; +using Helldivers.Core.Extensions; +using Helldivers.Models; +using Helldivers.Models.Domain.Localization; +using Helldivers.Sync.Configuration; +using Helldivers.Sync.Extensions; +using Microsoft.AspNetCore.Http.Timeouts; +using Microsoft.AspNetCore.Localization; +using System.Globalization; +using System.Text.Json.Serialization; + +#if DEBUG +// When generating an OpenAPI document, get-document runs with the "--applicationName" flag. +// While detecting it this way isn't the 'prettiest' way, we *need* this information for following reasons: +// We don't want to start background services for sync etc when this flag is active +// And we *only* want to include OpenAPI generation stuff when this flag is active. +var isRunningAsTool = args.FirstOrDefault(arg => arg.StartsWith("--applicationName")) is not null; +#endif + +var builder = WebApplication.CreateSlimBuilder(args); + +// Registers the core services in the container. +builder.Services.AddHelldivers(); + +// Have ASP.NET Core generate problemdetails for failed requests. +builder.Services.AddProblemDetails(); + +// Register the rate limiting middleware. +builder.Services.AddTransient(); + +// Register the memory cache, used in the rate limiting middleware. +builder.Services.AddMemoryCache(); + +// Add services for response compression. +builder.Services.AddResponseCompression(); + +// Automatically set the CultureInfo based on the incoming request. +builder.Services.AddRequestLocalization(options => +{ + var defaultLanguage = builder + .Configuration + .GetSection("Helldivers:Synchronization:DefaultLanguage") + .Get(); + + var languages = builder + .Configuration + .GetSection("Helldivers:Synchronization:Languages") + .Get>()!; + + // Set the configured default language to be used by the LocalizedMessage class. + LocalizedMessage.FallbackCulture = new CultureInfo(defaultLanguage ?? "en-US"); + + options.ApplyCurrentCultureToResponseHeaders = true; + options.DefaultRequestCulture = new RequestCulture(LocalizedMessage.FallbackCulture); + options.SupportedCultures = languages.Select(iso => new CultureInfo(iso)).ToList(); +}); +// Set CORS headers for websites directly accessing the API. +builder.Services.AddCors(options => +{ + options.AddDefaultPolicy(policy => policy + .AllowAnyOrigin() + .AllowAnyMethod() + ); +}); + +// Add and configure forwarded headers middleware +builder.Services.Configure(_ => { }); + +// This configuration is bound here so that source generators kick in. +builder.Services.Configure(builder.Configuration.GetSection("Helldivers:Synchronization")); + +// If a request takes over 10s to complete, abort it. +builder.Services.AddRequestTimeouts(options => +{ + options.DefaultPolicy = new RequestTimeoutPolicy + { + Timeout = TimeSpan.FromSeconds(10), + TimeoutStatusCode = StatusCodes.Status408RequestTimeout, + }; +}); + +// Setup source generated JSON type information so the API knows how to serialize models. +builder.Services.ConfigureHttpJsonOptions(options => +{ + options.SerializerOptions.TypeInfoResolverChain.Add(ArrowHeadSerializerContext.Default); + options.SerializerOptions.TypeInfoResolverChain.Add(SteamSerializerContext.Default); + options.SerializerOptions.TypeInfoResolverChain.Add(V1SerializerContext.Default); + + options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; +}); + +// Swagger is generated at compile time, so we don't include Swagger dependencies in Release builds. +#if DEBUG +// Only add OpenApi dependencies when generating +if (isRunningAsTool) +{ + builder.Services.AddOpenApiDocument(document => + { + document.Title = "Helldivers 2"; + document.Description = "Helldivers 2 Unofficial API"; + + document.SchemaSettings.TypeMappers.Add( + new NJsonSchema.Generation.TypeMappers.PrimitiveTypeMapper( + typeof(Helldivers.Models.Domain.Localization.LocalizedMessage), + schema => schema.Type = NJsonSchema.JsonObjectType.String + ) + ); + }); + builder.Services.AddOpenApiDocument(document => + { + document.Title = "ArrowHead API"; + document.Description = "An OpenAPI mapping of the official Helldivers API"; + document.DocumentName = "arrowhead"; + document.ApiGroupNames = ["arrowhead"]; + + document.DocumentProcessors.Add(new Helldivers.API.OpenApi.ArrowHeadDocumentProcessor()); + }); + builder.Services.AddEndpointsApiExplorer(); +} +else +{ + builder.Services.AddHelldiversSync(); +} +#else +// in Release builds we *always* run the sync services +builder.Services.AddHelldiversSync(); +#endif + +var app = builder.Build(); + +// Use response compression for smaller payload sizes +app.UseResponseCompression(); + +// We host our OpenAPI spec and preview files from wwwroot/ +app.UseStaticFiles(); + +// select the correct culture for incoming requests +app.UseRequestLocalization(); + +// Ensure web applications can access the API by setting CORS headers. +app.UseCors(); + +// Handles rate limiting so everyone plays nice +app.UseMiddleware(); + +// Make sure ASP.NET Core uses the correct addresses internally rather than Fly's proxy +app.UseForwardedHeaders(); + +// Add middleware to timeout requests if they take too long. +app.UseRequestTimeouts(); + +#region ArrowHead API endpoints ('raw' API) + +var raw = app + .MapGroup("/raw") + .WithGroupName("arrowhead") + .WithTags("raw"); + +raw.MapGet("/api/WarSeason/current/WarID", ArrowHeadController.WarId); +raw.MapGet("/api/WarSeason/801/Status", ArrowHeadController.Status); +raw.MapGet("/api/WarSeason/801/WarInfo", ArrowHeadController.WarInfo); +raw.MapGet("/api/Stats/war/801/summary", ArrowHeadController.Summary); +raw.MapGet("/api/NewsFeed/801", ArrowHeadController.NewsFeed); +raw.MapGet("/api/v2/Assignment/War/801", ArrowHeadController.Assignments); + +#endregion + +#region API v1 + +var v1 = app + .MapGroup("/api/v1") + .WithGroupName("community") + .WithTags("v1"); + +v1.MapGet("/war", WarController.Show); + +v1.MapGet("/assignments", AssignmentsController.Index); +v1.MapGet("/assignments/{index:long}", AssignmentsController.Show); + +v1.MapGet("/campaigns", CampaignsController.Index); +v1.MapGet("/campaigns/{index:int}", CampaignsController.Show); + +v1.MapGet("/dispatches", DispatchController.Index); +v1.MapGet("/dispatches/{index:int}", DispatchController.Show); + +v1.MapGet("/planets", PlanetController.Index); +v1.MapGet("/planets/{index:int}", PlanetController.Show); +v1.MapGet("/planet-events", PlanetController.WithEvents); + +v1.MapGet("/steam", SteamController.Index); +v1.MapGet("/steam/{gid}", SteamController.Show); + +#endregion + +await app.RunAsync(); diff --git a/src/Helldivers-2-API/Properties/launchSettings.json b/src/Helldivers-2-API/Properties/launchSettings.json new file mode 100644 index 0000000..5c67c5b --- /dev/null +++ b/src/Helldivers-2-API/Properties/launchSettings.json @@ -0,0 +1,15 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger-ui.html", + "applicationUrl": "http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/Helldivers-2-API/appsettings.Development.json b/src/Helldivers-2-API/appsettings.Development.json new file mode 100644 index 0000000..9ea8d83 --- /dev/null +++ b/src/Helldivers-2-API/appsettings.Development.json @@ -0,0 +1,20 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Helldivers": "Trace", + "Microsoft.AspNetCore": "Warning", + "System.Net.Http.HttpClient.ApiService": "Warning" + } + }, + "Helldivers": { + "Synchronization": { + "IntervalSeconds": 300, + "DefaultLanguage": "en-US", + "Languages": [ + "en-US", + "de-DE" + ] + } + } +} diff --git a/src/Helldivers-2-API/appsettings.json b/src/Helldivers-2-API/appsettings.json new file mode 100644 index 0000000..01eaac8 --- /dev/null +++ b/src/Helldivers-2-API/appsettings.json @@ -0,0 +1,28 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Helldivers": "Trace", + "System.Net.Http.HttpClient": "Warning", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Helldivers": { + "Synchronization": { + "IntervalSeconds": 300, + "DefaultLanguage": "en-US", + "Languages": [ + "en-US", + "de-DE", + "es-ES", + "ru-RU", + "fr-FR", + "it-IT", + "pl-PL", + "zh-Hans", + "zh-Hant" + ] + } + } +} diff --git a/src/Helldivers-2-API/wwwroot/Helldivers-2-API.json b/src/Helldivers-2-API/wwwroot/Helldivers-2-API.json new file mode 100644 index 0000000..46ead5a --- /dev/null +++ b/src/Helldivers-2-API/wwwroot/Helldivers-2-API.json @@ -0,0 +1,1624 @@ +{ + "x-generator": "NSwag v14.0.4.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))", + "openapi": "3.0.0", + "info": { + "title": "Helldivers 2", + "description": "Helldivers 2 Unofficial API", + "version": "1.0.0" + }, + "paths": { + "/raw/api/WarSeason/current/WarID": { + "get": { + "tags": [ + "raw" + ], + "summary": "Returns the currently active war season ID.", + "operationId": "GetRawApiWarSeasonCurrentWarID", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WarId" + } + } + } + } + } + } + }, + "/raw/api/WarSeason/801/Status": { + "get": { + "tags": [ + "raw" + ], + "summary": "Get a snapshot of the current war status.", + "operationId": "GetRawApiWarSeason801Status", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WarStatus" + } + } + } + } + } + } + }, + "/raw/api/WarSeason/801/WarInfo": { + "get": { + "tags": [ + "raw" + ], + "summary": "Gets the current war info.", + "operationId": "GetRawApiWarSeason801WarInfo", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WarInfo" + } + } + } + } + } + } + }, + "/raw/api/Stats/war/801/summary": { + "get": { + "tags": [ + "raw" + ], + "summary": "Gets the current war info.", + "operationId": "GetRawApiStatsWar801Summary", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WarSummary" + } + } + } + } + } + } + }, + "/raw/api/NewsFeed/801": { + "get": { + "tags": [ + "raw" + ], + "summary": "Retrieves a list of news messages from Super Earth.", + "operationId": "GetRawApiNewsFeed801", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NewsFeedItem" + } + } + } + } + } + } + } + }, + "/raw/api/v2/Assignment/War/801": { + "get": { + "tags": [ + "raw" + ], + "summary": "Retrieves a list of currently active assignments (like Major Orders).", + "operationId": "GetRawApiV2AssignmentWar801", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Assignment" + } + } + } + } + }, + "503": { + "description": "" + } + } + } + }, + "/api/v1/war": { + "get": { + "tags": [ + "v1" + ], + "summary": "Gets the current War state.", + "operationId": "GetApiV1War", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/War" + } + } + } + } + } + } + }, + "/api/v1/assignments": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches a list of all available Assignment information available.", + "operationId": "GetApiV1AssignmentsAll", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Assignment2" + } + } + } + } + } + } + } + }, + "/api/v1/assignments/{index}": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches a specific Assignment identified by index.", + "operationId": "GetApiV1Assignments", + "parameters": [ + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Assignment2" + } + } + } + } + } + } + }, + "/api/v1/campaigns": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches a list of all available Campaign information available.", + "operationId": "GetApiV1CampaignsAll", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Campaign2" + } + } + } + } + } + } + } + }, + "/api/v1/campaigns/{index}": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches a specific Campaign identified by index.", + "operationId": "GetApiV1Campaigns", + "parameters": [ + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Campaign2" + } + } + } + } + } + } + }, + "/api/v1/dispatches": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches a list of all available Dispatch information available.", + "operationId": "GetApiV1DispatchesAll", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Dispatch" + } + } + } + } + } + } + } + }, + "/api/v1/dispatches/{index}": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches a specific Dispatch identified by index.", + "operationId": "GetApiV1Dispatches", + "parameters": [ + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Dispatch" + } + } + } + } + } + } + }, + "/api/v1/planets": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches a list of all available Planet information available.", + "operationId": "GetApiV1PlanetsAll", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Planet" + } + } + } + } + } + } + } + }, + "/api/v1/planets/{index}": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches a specific Planet identified by index.", + "operationId": "GetApiV1Planets", + "parameters": [ + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Planet" + } + } + } + } + } + } + }, + "/api/v1/planet-events": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches all planets with an active Event.", + "operationId": "GetApiV1PlanetEvents", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Planet" + } + } + } + } + } + } + } + }, + "/api/v1/steam": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches the Steam newsfeed for Helldivers 2.", + "description": "You can definitely get this yourself, however it's included for your convenience!", + "operationId": "GetApiV1Steam", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SteamNews" + } + } + } + } + } + } + } + }, + "/api/v1/steam/{gid}": { + "get": { + "tags": [ + "v1" + ], + "summary": "Fetches a specific newsfeed item from the Helldivers 2 Steam newsfeed.", + "description": "You can definitely get this yourself, however it's included for your convenience!", + "operationId": "GetApiV1Steam2", + "parameters": [ + { + "name": "gid", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "x-position": 1 + } + ], + "responses": { + "404": { + "description": "Returned when the key is not recognized." + }, + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SteamNews" + } + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "WarId": { + "type": "object", + "description": "Represents the ID returned from the WarID endpoint.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "format": "int32" + } + } + }, + "WarStatus": { + "type": "object", + "description": "Represents a snapshot of the current status of the galactic war.", + "additionalProperties": false, + "properties": { + "warId": { + "type": "integer", + "description": "The war season this snapshot refers to.", + "format": "int32" + }, + "time": { + "type": "integer", + "description": "The time this snapshot was taken.", + "format": "int64" + }, + "impactMultiplier": { + "type": "number", + "description": "This is the factor by which XP at the end of a mission is multiplied to calculate the impact on liberation", + "format": "double" + }, + "storyBeatId32": { + "type": "integer", + "description": "Internal identifier, purpose unknown.", + "format": "int64" + }, + "planetStatus": { + "type": "array", + "description": "A list of statuses for planets.", + "items": { + "$ref": "#/components/schemas/PlanetStatus" + } + }, + "planetAttacks": { + "type": "array", + "description": "A list of attacks currently ongoing.", + "items": { + "$ref": "#/components/schemas/PlanetAttack" + } + }, + "campaigns": { + "type": "array", + "description": "A list of ongoing campaigns in the galactic war.", + "items": { + "$ref": "#/components/schemas/Campaign" + } + }, + "jointOperations": { + "type": "array", + "description": "A list of JointOperations.", + "items": { + "$ref": "#/components/schemas/JointOperation" + } + }, + "planetEvents": { + "type": "array", + "description": "A list of ongoing PlanetEvents.", + "items": { + "$ref": "#/components/schemas/PlanetEvent" + } + } + } + }, + "PlanetStatus": { + "type": "object", + "description": "Represents the 'current' status of a planet in the galactic war.", + "additionalProperties": false, + "properties": { + "index": { + "type": "integer", + "description": "The identifier of the PlanetInfo this status refers to.", + "format": "int32" + }, + "owner": { + "type": "integer", + "description": "The faction currently owning the planet.", + "format": "int32" + }, + "health": { + "type": "integer", + "description": "The current health / liberation of a planet.", + "format": "int64" + }, + "regenPerSecond": { + "type": "number", + "description": "If left alone, how much the health of the planet would regenerate.", + "format": "double" + }, + "players": { + "type": "integer", + "description": "The amount of helldivers currently active on this planet.", + "format": "uint64" + } + } + }, + "PlanetAttack": { + "type": "object", + "description": "Represents an attack on a PlanetInfo.", + "additionalProperties": false, + "properties": { + "source": { + "type": "integer", + "description": "Where the attack originates from.", + "format": "int32" + }, + "target": { + "type": "integer", + "description": "The planet under attack.", + "format": "int32" + } + } + }, + "Campaign": { + "type": "object", + "description": "Contains information of ongoing campaigns.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The identifier of this campaign.", + "format": "int32" + }, + "planetIndex": { + "type": "integer", + "description": "The Index of the planet this campaign refers to.", + "format": "int32" + }, + "type": { + "type": "integer", + "description": "A numerical type, indicates the type of campaign (see helldivers-2/json).", + "format": "int32" + }, + "count": { + "type": "integer", + "description": "A numerical count, the amount of campaigns the planet has seen.", + "format": "int32" + } + } + }, + "JointOperation": { + "type": "object", + "description": "Represents a joint operation.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "planetIndex": { + "type": "integer", + "format": "int32" + }, + "hqNodeIndex": { + "type": "integer", + "format": "int32" + } + } + }, + "PlanetEvent": { + "type": "object", + "description": "An ongoing event on a planet.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The unique identifier of this event.", + "format": "int32" + }, + "planetIndex": { + "type": "integer", + "description": "The index of the planet.", + "format": "int32" + }, + "eventType": { + "type": "integer", + "description": "A numerical identifier that indicates what type of event this is.", + "format": "int32" + }, + "race": { + "type": "integer", + "description": "The identifier of the faction that owns the planet currently.", + "format": "int32" + }, + "health": { + "type": "integer", + "description": "The current health of the planet.", + "format": "int64" + }, + "startTime": { + "type": "integer", + "description": "When this event started.", + "format": "int64" + }, + "expireTime": { + "type": "integer", + "description": "When the event will end.", + "format": "int64" + }, + "campaignId": { + "type": "integer", + "description": "The unique identifier of a related campaign.", + "format": "int64" + }, + "jointOperationIds": { + "type": "array", + "description": "A list of identifiers of related joint operations.", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "WarInfo": { + "type": "object", + "description": "Represents mostly static information of the current galactic war.", + "additionalProperties": false, + "properties": { + "warId": { + "type": "integer", + "description": "The identifier of the war season this WarInfo represents.", + "format": "int32" + }, + "startDate": { + "type": "integer", + "description": "A unix timestamp (in seconds) when this season started.", + "format": "int64" + }, + "endDate": { + "type": "integer", + "description": "A unix timestamp (in seconds) when this season will end.", + "format": "int64" + }, + "minimumClientVersion": { + "type": "string", + "description": "A version string indicating the minimum game client version the API supports." + }, + "planetInfos": { + "type": "array", + "description": "A list of planets involved in this season's war.", + "items": { + "$ref": "#/components/schemas/PlanetInfo" + } + }, + "homeWorlds": { + "type": "array", + "description": "A list of homeworlds for the races (factions) involved in this war.", + "items": { + "$ref": "#/components/schemas/HomeWorld" + } + } + } + }, + "PlanetInfo": { + "type": "object", + "description": "Represents information of a planet from the 'WarInfo' endpoint returned by ArrowHead's API.", + "additionalProperties": false, + "properties": { + "index": { + "type": "integer", + "description": "The numerical identifier for this planet, used as reference by other properties throughout the API (like Waypoints).", + "format": "int32" + }, + "settingsHash": { + "type": "integer", + "description": "Purpose unknown at this time.", + "format": "int64" + }, + "position": { + "description": "A set of X/Y coordinates specifying the position of this planet on the galaxy map.", + "oneOf": [ + { + "$ref": "#/components/schemas/PlanetCoordinates" + } + ] + }, + "waypoints": { + "type": "array", + "description": "A list of links to other planets (supply lines).", + "items": { + "type": "integer", + "format": "int32" + } + }, + "sector": { + "type": "integer", + "description": "The identifier of the sector this planet is located in.", + "format": "int32" + }, + "maxHealth": { + "type": "integer", + "description": "The 'health' of this planet, indicates how much liberation it needs to switch sides.", + "format": "int64" + }, + "disabled": { + "type": "boolean", + "description": "Whether this planet is currently considered active in the galactic war." + }, + "initialOwner": { + "type": "integer", + "description": "The identifier of the faction that initially owned this planet.", + "format": "int32" + } + } + }, + "PlanetCoordinates": { + "type": "object", + "description": "Represents a set of coordinates returned by ArrowHead's API.", + "additionalProperties": false, + "properties": { + "x": { + "type": "number", + "description": "The X coordinate", + "format": "double" + }, + "y": { + "type": "number", + "description": "The Y coordinate", + "format": "double" + } + } + }, + "HomeWorld": { + "type": "object", + "description": "Represents information about the homeworld(s) of a given race.", + "additionalProperties": false, + "properties": { + "race": { + "type": "integer", + "description": "The identifier of the race (faction) this describes the homeworld of.", + "format": "int32" + }, + "planetIndices": { + "type": "array", + "description": "A list of Index identifiers.", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "WarSummary": { + "type": "object", + "description": "Gets general statistics about the galaxy and specific planets.", + "additionalProperties": false, + "properties": { + "galaxy_stats": { + "description": "Contains galaxy wide statistics aggregated from all planets.", + "oneOf": [ + { + "$ref": "#/components/schemas/GalaxyStats" + } + ] + }, + "planets_stats": { + "type": "array", + "description": "Contains statistics for specific planets.", + "items": { + "$ref": "#/components/schemas/PlanetStats" + } + } + } + }, + "GalaxyStats": { + "type": "object", + "description": "Represents galaxy wide statistics.", + "additionalProperties": false, + "properties": { + "missionsWon": { + "type": "integer", + "description": "The amount of missions won.", + "format": "uint64" + }, + "missionsLost": { + "type": "integer", + "description": "The amount of missions lost.", + "format": "uint64" + }, + "missionTime": { + "type": "integer", + "description": "The total amount of time spent planetside (in seconds).", + "format": "uint64" + }, + "bugKills": { + "type": "integer", + "description": "The total amount of bugs killed since start of the season.", + "format": "uint64" + }, + "automatonKills": { + "type": "integer", + "description": "The total amount of automatons killed since start of the season.", + "format": "uint64" + }, + "illuminateKills": { + "type": "integer", + "description": "The total amount of Illuminate killed since start of the season.", + "format": "uint64" + }, + "bulletsFired": { + "type": "integer", + "description": "The total amount of bullets fired", + "format": "uint64" + }, + "bulletsHit": { + "type": "integer", + "description": "The total amount of bullets hit", + "format": "uint64" + }, + "timePlayed": { + "type": "integer", + "description": "The total amount of time played (including off-planet) in seconds.", + "format": "uint64" + }, + "deaths": { + "type": "integer", + "description": "The amount of casualties on the side of humanity.", + "format": "uint64" + }, + "revives": { + "type": "integer", + "description": "The amount of revives(?).", + "format": "uint64" + }, + "friendlies": { + "type": "integer", + "description": "The amount of friendly fire casualties.", + "format": "uint64" + }, + "missionSuccessRate": { + "type": "integer", + "description": "A percentage indicating how many started missions end in success.", + "format": "uint64" + }, + "accurracy": { + "type": "integer", + "description": "A percentage indicating average accuracy of Helldivers.", + "format": "uint64" + } + } + }, + "PlanetStats": { + "type": "object", + "description": "Similar to GalaxyStats, but scoped to a specific planet.", + "additionalProperties": false, + "properties": { + "planetIndex": { + "type": "integer", + "description": "The Index for which planet these stats are.", + "format": "int32" + }, + "missionsWon": { + "type": "integer", + "description": "The amount of missions won.", + "format": "uint64" + }, + "missionsLost": { + "type": "integer", + "description": "The amount of missions lost.", + "format": "uint64" + }, + "missionTime": { + "type": "integer", + "description": "The total amount of time spent planetside (in seconds).", + "format": "uint64" + }, + "bugKills": { + "type": "integer", + "description": "The total amount of bugs killed since start of the season.", + "format": "uint64" + }, + "automatonKills": { + "type": "integer", + "description": "The total amount of automatons killed since start of the season.", + "format": "uint64" + }, + "illuminateKills": { + "type": "integer", + "description": "The total amount of Illuminate killed since start of the season.", + "format": "uint64" + }, + "bulletsFired": { + "type": "integer", + "description": "The total amount of bullets fired", + "format": "uint64" + }, + "bulletsHit": { + "type": "integer", + "description": "The total amount of bullets hit", + "format": "uint64" + }, + "timePlayed": { + "type": "integer", + "description": "The total amount of time played (including off-planet) in seconds.", + "format": "uint64" + }, + "deaths": { + "type": "integer", + "description": "The amount of casualties on the side of humanity.", + "format": "uint64" + }, + "revives": { + "type": "integer", + "description": "The amount of revives(?).", + "format": "uint64" + }, + "friendlies": { + "type": "integer", + "description": "The amount of friendly fire casualties.", + "format": "uint64" + }, + "missionSuccessRate": { + "type": "integer", + "description": "A percentage indicating how many started missions end in success.", + "format": "uint64" + }, + "accurracy": { + "type": "integer", + "description": "A percentage indicating average accuracy of Helldivers.", + "format": "uint64" + } + } + }, + "NewsFeedItem": { + "type": "object", + "description": "Represents an item in the newsfeed of Super Earth.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The identifier of this newsfeed item.", + "format": "int32" + }, + "published": { + "type": "integer", + "description": "A unix timestamp (in seconds) when this item was published.", + "format": "int64" + }, + "type": { + "type": "integer", + "description": "A numerical type, purpose unknown.", + "format": "int32" + }, + "message": { + "type": "string", + "description": "The message containing a human readable text." + } + } + }, + "Assignment": { + "type": "object", + "description": "Represents an assignment given from Super Earth to the Helldivers.", + "additionalProperties": false, + "properties": { + "id32": { + "type": "integer", + "description": "Internal identifier of this assignment.", + "format": "int64" + }, + "progress": { + "type": "array", + "description": "A list of numbers, how they represent progress is unknown.", + "items": { + "type": "integer", + "format": "int32" + } + }, + "expiresIn": { + "type": "integer", + "description": "The amount of seconds until this assignment expires.", + "format": "int64" + }, + "setting": { + "description": "Contains detailed information on this assignment like briefing, rewards, ...", + "oneOf": [ + { + "$ref": "#/components/schemas/Setting" + } + ] + } + } + }, + "Setting": { + "type": "object", + "description": "Contains the details of an Assignment like reward and requirements.", + "additionalProperties": false, + "properties": { + "type": { + "type": "integer", + "description": "The type of assignment, values unknown at the moment.", + "format": "int32" + }, + "overrideTitle": { + "type": "string", + "description": "The title of this assignment." + }, + "overrideBrief": { + "type": "string", + "description": "The briefing (description) of this assignment." + }, + "taskDescription": { + "type": "string", + "description": "A description of what is expected of Helldivers to complete the assignment." + }, + "tasks": { + "type": "array", + "description": "A list of Tasks describing the assignment requirements.", + "items": { + "$ref": "#/components/schemas/Task" + } + }, + "reward": { + "description": "Contains information on the rewards players willr eceive upon completion.", + "oneOf": [ + { + "$ref": "#/components/schemas/Reward" + } + ] + }, + "flags": { + "type": "integer", + "description": "Flags, suspected to be a binary OR'd value, purpose unknown.", + "format": "int32" + } + } + }, + "Task": { + "type": "object", + "description": "Represents a task in an Assignment.\nIt's exact values are not known, therefor little of it's purpose is clear.", + "additionalProperties": false, + "properties": { + "type": { + "type": "integer", + "description": "A numerical value, purpose unknown.", + "format": "int32" + }, + "values": { + "type": "array", + "description": "A list of numerical values, purpose unknown.", + "items": { + "type": "integer", + "format": "int32" + } + }, + "valueTypes": { + "type": "array", + "description": "A list of numerical values, purpose unknown.", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "Reward": { + "type": "object", + "description": "Represents the reward of an Assignment.", + "additionalProperties": false, + "properties": { + "type": { + "type": "integer", + "description": "The type of reward, currently only one value is known: 1 which represents Medals", + "format": "int32" + }, + "id32": { + "type": "integer", + "description": "Internal identifier of this Reward.", + "format": "int32" + }, + "amount": { + "type": "integer", + "description": "The amount of Type the players will receive upon completion.", + "format": "int32" + } + } + }, + "War": { + "type": "object", + "description": "Global information of the ongoing war.", + "additionalProperties": false, + "properties": { + "started": { + "type": "string", + "description": "When this war was started.", + "format": "date-time" + }, + "ended": { + "type": "string", + "description": "When this war will end (or has ended).", + "format": "date-time" + }, + "now": { + "type": "string", + "description": "The time the snapshot of the war was taken, also doubles as the timestamp of which all other data dates from.", + "format": "date-time" + }, + "clientVersion": { + "type": "string", + "description": "The minimum game client version required to play in this war." + }, + "factions": { + "type": "array", + "description": "A list of factions currently involved in the war.", + "items": { + "type": "string" + } + }, + "impactMultiplier": { + "type": "number", + "description": "A fraction used to calculate the impact of a mission on the war effort.", + "format": "double" + }, + "statistics": { + "description": "The statistics available for the galaxy wide war effort.", + "oneOf": [ + { + "$ref": "#/components/schemas/Statistics" + } + ] + } + } + }, + "Statistics": { + "type": "object", + "description": "Contains statistics of missions, kills, success rate etc.", + "additionalProperties": false, + "properties": { + "missionsWon": { + "type": "integer", + "description": "The amount of missions won.", + "format": "uint64" + }, + "missionsLost": { + "type": "integer", + "description": "The amount of missions lost.", + "format": "uint64" + }, + "missionTime": { + "type": "integer", + "description": "The total amount of time spent planetside (in seconds).", + "format": "uint64" + }, + "terminidKills": { + "type": "integer", + "description": "The total amount of bugs killed since start of the season.", + "format": "uint64" + }, + "automatonKills": { + "type": "integer", + "description": "The total amount of automatons killed since start of the season.", + "format": "uint64" + }, + "illuminateKills": { + "type": "integer", + "description": "The total amount of Illuminate killed since start of the season.", + "format": "uint64" + }, + "bulletsFired": { + "type": "integer", + "description": "The total amount of bullets fired", + "format": "uint64" + }, + "bulletsHit": { + "type": "integer", + "description": "The total amount of bullets hit", + "format": "uint64" + }, + "timePlayed": { + "type": "integer", + "description": "The total amount of time played (including off-planet) in seconds.", + "format": "uint64" + }, + "deaths": { + "type": "integer", + "description": "The amount of casualties on the side of humanity.", + "format": "uint64" + }, + "revives": { + "type": "integer", + "description": "The amount of revives(?).", + "format": "uint64" + }, + "friendlies": { + "type": "integer", + "description": "The amount of friendly fire casualties.", + "format": "uint64" + }, + "missionSuccessRate": { + "type": "integer", + "description": "A percentage indicating how many started missions end in success.", + "format": "uint64" + }, + "accuracy": { + "type": "integer", + "description": "A percentage indicating average accuracy of Helldivers.", + "format": "uint64" + }, + "playerCount": { + "type": "integer", + "description": "The total amount of players present (at the time of the snapshot).", + "format": "uint64" + } + } + }, + "Assignment2": { + "type": "object", + "description": "Represents an assignment given by Super Earth to the community.\nThis is also known as 'Major Order's in the game.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The unique identifier of this assignment.", + "format": "int64" + }, + "title": { + "type": "string", + "description": "The title of the assignment." + }, + "briefing": { + "type": "string", + "description": "A long form description of the assignment, usually contains context." + }, + "description": { + "type": "string", + "description": "A very short summary of the description." + }, + "tasks": { + "type": "array", + "description": "A list of tasks that need to be completed for this assignment.", + "items": { + "$ref": "#/components/schemas/Task2" + } + }, + "reward": { + "description": "The reward for completing the assignment.", + "oneOf": [ + { + "$ref": "#/components/schemas/Reward2" + } + ] + } + } + }, + "Task2": { + "type": "object", + "description": "Represents a task in an Assignment that needs to be completed\nto finish the assignment. ", + "additionalProperties": false, + "properties": { + "type": { + "type": "integer", + "description": "The type of task this represents.", + "format": "int32" + }, + "values": { + "type": "array", + "description": "A list of numbers, purpose unknown.", + "items": { + "type": "integer", + "format": "int32" + } + }, + "valueTypes": { + "type": "array", + "description": "A list of numbers, purpose unknown", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "Reward2": { + "type": "object", + "description": "The reward for completing an Assignment.", + "additionalProperties": false, + "properties": { + "type": { + "type": "integer", + "description": "The type of reward (medals, super credits, ...).", + "format": "int32" + }, + "amount": { + "type": "integer", + "description": "The amount of Type that will be awarded.", + "format": "int32" + } + } + }, + "Campaign2": { + "type": "object", + "description": "Represents an ongoing campaign on a planet.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The unique identifier of this Campaign.", + "format": "int32" + }, + "planet": { + "description": "The planet on which this campaign is being fought.", + "oneOf": [ + { + "$ref": "#/components/schemas/Planet" + } + ] + }, + "type": { + "type": "integer", + "description": "The type of campaign, this should be mapped onto an enum.", + "format": "int32" + }, + "count": { + "type": "integer", + "description": "Indicates how many campaigns have already been fought on this Planet.", + "format": "int32" + } + } + }, + "Planet": { + "type": "object", + "description": "Contains all aggregated information AH has about a planet.", + "additionalProperties": false, + "properties": { + "index": { + "type": "integer", + "description": "The unique identifier ArrowHead assigned to this planet.", + "format": "int32" + }, + "name": { + "type": "string", + "description": "The name of the planet, as shown in game." + }, + "sector": { + "type": "string", + "description": "The name of the sector the planet is in, as shown in game." + }, + "hash": { + "type": "integer", + "description": "A hash assigned to the planet by ArrowHead, purpose unknown.", + "format": "int64" + }, + "position": { + "description": "The coordinates of this planet on the galactic war map.", + "oneOf": [ + { + "$ref": "#/components/schemas/Position" + } + ] + }, + "waypoints": { + "type": "array", + "description": "A list of Index of all the planets to which this planet is connected.", + "items": { + "type": "integer", + "format": "int32" + } + }, + "maxHealth": { + "type": "integer", + "description": "The maximum health pool of this planet.", + "format": "int64" + }, + "health": { + "type": "integer", + "description": "The current planet this planet has.", + "format": "int64" + }, + "disabled": { + "type": "boolean", + "description": "Whether or not this planet is disabled, as assigned by ArrowHead." + }, + "initialOwner": { + "type": "string", + "description": "The faction that originally owned the planet." + }, + "currentOwner": { + "type": "string", + "description": "The faction that currently controls the planet." + }, + "regenPerSecond": { + "type": "number", + "description": "How much the planet regenerates per second if left alone.", + "format": "double" + }, + "event": { + "description": "Information on the active event ongoing on this planet, if one is active.", + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Event" + } + ] + }, + "statistics": { + "description": "A set of statistics scoped to this planet.", + "oneOf": [ + { + "$ref": "#/components/schemas/Statistics" + } + ] + } + } + }, + "Position": { + "type": "object", + "description": "Represents a position on the galactic war map.", + "additionalProperties": false, + "properties": { + "x": { + "type": "number", + "description": "The X coordinate.", + "format": "double" + }, + "y": { + "type": "number", + "description": "The Y coordinate.", + "format": "double" + } + } + }, + "Event": { + "type": "object", + "description": "An ongoing event on a Planet.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The unique identifier of this event.", + "format": "int32" + }, + "eventType": { + "type": "integer", + "description": "The type of event.", + "format": "int32" + }, + "faction": { + "type": "string", + "description": "The faction that initiated the event." + }, + "health": { + "type": "integer", + "description": "The health of the Planet at the time of snapshot.", + "format": "int64" + }, + "startTime": { + "type": "string", + "description": "When the event started.", + "format": "date-time" + }, + "endTime": { + "type": "string", + "description": "When the event will end.", + "format": "date-time" + }, + "campaignId": { + "type": "integer", + "description": "The identifier of the Campaign linked to this event.", + "format": "int64" + }, + "jointOperationIds": { + "type": "array", + "description": "A list of joint operation identifier linked to this event.", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "Dispatch": { + "type": "object", + "description": "A message from high command to the players, usually updates on the status of the war effort.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The unique identifier of this dispatch.", + "format": "int32" + }, + "published": { + "type": "string", + "description": "When the dispatch was published.", + "format": "date-time" + }, + "type": { + "type": "integer", + "description": "The type of dispatch, purpose unknown.", + "format": "int32" + }, + "message": { + "type": "string", + "description": "The message this dispatch represents." + } + } + }, + "SteamNews": { + "type": "object", + "description": "Represents a new article from Steam's news feed.", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "The identifier assigned by Steam to this news item." + }, + "title": { + "type": "string", + "description": "The title of the Steam news item." + }, + "url": { + "type": "string", + "description": "The URL to Steam where this news item was posted." + }, + "author": { + "type": "string", + "description": "The author who posted this message on Steam." + }, + "content": { + "type": "string", + "description": "The message posted by Steam, currently in Steam's weird markdown format." + }, + "publishedAt": { + "type": "string", + "description": "When this message was posted.", + "format": "date-time" + } + } + } + } + } +} \ No newline at end of file diff --git a/src/Helldivers-2-API/wwwroot/Helldivers-2-API_arrowhead.json b/src/Helldivers-2-API/wwwroot/Helldivers-2-API_arrowhead.json new file mode 100644 index 0000000..3f51213 --- /dev/null +++ b/src/Helldivers-2-API/wwwroot/Helldivers-2-API_arrowhead.json @@ -0,0 +1,872 @@ +{ + "x-generator": "NSwag v14.0.4.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0))", + "openapi": "3.0.0", + "info": { + "title": "ArrowHead API", + "description": "An OpenAPI mapping of the official Helldivers API", + "version": "1.0.0" + }, + "paths": { + "/api/WarSeason/801/Status": { + "servers": [ + { + "url": "https://api.live.prod.thehelldiversgame.com/", + "description": "The official ArrowHead server" + } + ], + "get": { + "tags": [ + "raw" + ], + "summary": "Get a snapshot of the current war status.", + "operationId": "GetApiWarSeason801Status", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WarStatus" + } + } + } + } + } + } + }, + "/api/WarSeason/801/WarInfo": { + "servers": [ + { + "url": "https://api.live.prod.thehelldiversgame.com/", + "description": "The official ArrowHead server" + } + ], + "get": { + "tags": [ + "raw" + ], + "summary": "Gets the current war info.", + "operationId": "GetApiWarSeason801WarInfo", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WarInfo" + } + } + } + } + } + } + }, + "/api/Stats/war/801/summary": { + "servers": [ + { + "url": "https://api.live.prod.thehelldiversgame.com/", + "description": "The official ArrowHead server" + } + ], + "get": { + "tags": [ + "raw" + ], + "summary": "Gets the current war info.", + "operationId": "GetApiStatsWar801Summary", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WarSummary" + } + } + } + } + } + } + }, + "/api/NewsFeed/801": { + "servers": [ + { + "url": "https://api.live.prod.thehelldiversgame.com/", + "description": "The official ArrowHead server" + } + ], + "get": { + "tags": [ + "raw" + ], + "summary": "Retrieves a list of news messages from Super Earth.", + "operationId": "GetApiNewsFeed801", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NewsFeedItem" + } + } + } + } + } + } + } + }, + "/api/v2/Assignment/War/801": { + "servers": [ + { + "url": "https://api.live.prod.thehelldiversgame.com/", + "description": "The official ArrowHead server" + } + ], + "get": { + "tags": [ + "raw" + ], + "summary": "Retrieves a list of currently active assignments (like Major Orders).", + "operationId": "GetApiV2AssignmentWar801", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Assignment" + } + } + } + } + }, + "503": { + "description": "" + } + } + } + }, + "/api/WarSeason/current/WarID": { + "servers": [ + { + "url": "https://api.live.prod.thehelldiversgame.com/", + "description": "The official ArrowHead server" + } + ], + "get": { + "tags": [ + "raw" + ], + "summary": "Returns the currently active war season ID.", + "operationId": "GetApiWarSeasonCurrentWarID", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WarId" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "WarId": { + "type": "object", + "description": "Represents the ID returned from the WarID endpoint.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "format": "int32" + } + } + }, + "WarStatus": { + "type": "object", + "description": "Represents a snapshot of the current status of the galactic war.", + "additionalProperties": false, + "properties": { + "warId": { + "type": "integer", + "description": "The war season this snapshot refers to.", + "format": "int32" + }, + "time": { + "type": "integer", + "description": "The time this snapshot was taken.", + "format": "int64" + }, + "impactMultiplier": { + "type": "number", + "description": "This is the factor by which XP at the end of a mission is multiplied to calculate the impact on liberation", + "format": "double" + }, + "storyBeatId32": { + "type": "integer", + "description": "Internal identifier, purpose unknown.", + "format": "int64" + }, + "planetStatus": { + "type": "array", + "description": "A list of statuses for planets.", + "items": { + "$ref": "#/components/schemas/PlanetStatus" + } + }, + "planetAttacks": { + "type": "array", + "description": "A list of attacks currently ongoing.", + "items": { + "$ref": "#/components/schemas/PlanetAttack" + } + }, + "campaigns": { + "type": "array", + "description": "A list of ongoing campaigns in the galactic war.", + "items": { + "$ref": "#/components/schemas/Campaign" + } + }, + "jointOperations": { + "type": "array", + "description": "A list of JointOperations.", + "items": { + "$ref": "#/components/schemas/JointOperation" + } + }, + "planetEvents": { + "type": "array", + "description": "A list of ongoing PlanetEvents.", + "items": { + "$ref": "#/components/schemas/PlanetEvent" + } + } + } + }, + "PlanetStatus": { + "type": "object", + "description": "Represents the 'current' status of a planet in the galactic war.", + "additionalProperties": false, + "properties": { + "index": { + "type": "integer", + "description": "The identifier of the PlanetInfo this status refers to.", + "format": "int32" + }, + "owner": { + "type": "integer", + "description": "The faction currently owning the planet.", + "format": "int32" + }, + "health": { + "type": "integer", + "description": "The current health / liberation of a planet.", + "format": "int64" + }, + "regenPerSecond": { + "type": "number", + "description": "If left alone, how much the health of the planet would regenerate.", + "format": "double" + }, + "players": { + "type": "integer", + "description": "The amount of helldivers currently active on this planet.", + "format": "uint64" + } + } + }, + "PlanetAttack": { + "type": "object", + "description": "Represents an attack on a PlanetInfo.", + "additionalProperties": false, + "properties": { + "source": { + "type": "integer", + "description": "Where the attack originates from.", + "format": "int32" + }, + "target": { + "type": "integer", + "description": "The planet under attack.", + "format": "int32" + } + } + }, + "Campaign": { + "type": "object", + "description": "Contains information of ongoing campaigns.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The identifier of this campaign.", + "format": "int32" + }, + "planetIndex": { + "type": "integer", + "description": "The Index of the planet this campaign refers to.", + "format": "int32" + }, + "type": { + "type": "integer", + "description": "A numerical type, indicates the type of campaign (see helldivers-2/json).", + "format": "int32" + }, + "count": { + "type": "integer", + "description": "A numerical count, the amount of campaigns the planet has seen.", + "format": "int32" + } + } + }, + "JointOperation": { + "type": "object", + "description": "Represents a joint operation.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "planetIndex": { + "type": "integer", + "format": "int32" + }, + "hqNodeIndex": { + "type": "integer", + "format": "int32" + } + } + }, + "PlanetEvent": { + "type": "object", + "description": "An ongoing event on a planet.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The unique identifier of this event.", + "format": "int32" + }, + "planetIndex": { + "type": "integer", + "description": "The index of the planet.", + "format": "int32" + }, + "eventType": { + "type": "integer", + "description": "A numerical identifier that indicates what type of event this is.", + "format": "int32" + }, + "race": { + "type": "integer", + "description": "The identifier of the faction that owns the planet currently.", + "format": "int32" + }, + "health": { + "type": "integer", + "description": "The current health of the planet.", + "format": "int64" + }, + "startTime": { + "type": "integer", + "description": "When this event started.", + "format": "int64" + }, + "expireTime": { + "type": "integer", + "description": "When the event will end.", + "format": "int64" + }, + "campaignId": { + "type": "integer", + "description": "The unique identifier of a related campaign.", + "format": "int64" + }, + "jointOperationIds": { + "type": "array", + "description": "A list of identifiers of related joint operations.", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "WarInfo": { + "type": "object", + "description": "Represents mostly static information of the current galactic war.", + "additionalProperties": false, + "properties": { + "warId": { + "type": "integer", + "description": "The identifier of the war season this WarInfo represents.", + "format": "int32" + }, + "startDate": { + "type": "integer", + "description": "A unix timestamp (in seconds) when this season started.", + "format": "int64" + }, + "endDate": { + "type": "integer", + "description": "A unix timestamp (in seconds) when this season will end.", + "format": "int64" + }, + "minimumClientVersion": { + "type": "string", + "description": "A version string indicating the minimum game client version the API supports." + }, + "planetInfos": { + "type": "array", + "description": "A list of planets involved in this season's war.", + "items": { + "$ref": "#/components/schemas/PlanetInfo" + } + }, + "homeWorlds": { + "type": "array", + "description": "A list of homeworlds for the races (factions) involved in this war.", + "items": { + "$ref": "#/components/schemas/HomeWorld" + } + } + } + }, + "PlanetInfo": { + "type": "object", + "description": "Represents information of a planet from the 'WarInfo' endpoint returned by ArrowHead's API.", + "additionalProperties": false, + "properties": { + "index": { + "type": "integer", + "description": "The numerical identifier for this planet, used as reference by other properties throughout the API (like Waypoints).", + "format": "int32" + }, + "settingsHash": { + "type": "integer", + "description": "Purpose unknown at this time.", + "format": "int64" + }, + "position": { + "description": "A set of X/Y coordinates specifying the position of this planet on the galaxy map.", + "oneOf": [ + { + "$ref": "#/components/schemas/PlanetCoordinates" + } + ] + }, + "waypoints": { + "type": "array", + "description": "A list of links to other planets (supply lines).", + "items": { + "type": "integer", + "format": "int32" + } + }, + "sector": { + "type": "integer", + "description": "The identifier of the sector this planet is located in.", + "format": "int32" + }, + "maxHealth": { + "type": "integer", + "description": "The 'health' of this planet, indicates how much liberation it needs to switch sides.", + "format": "int64" + }, + "disabled": { + "type": "boolean", + "description": "Whether this planet is currently considered active in the galactic war." + }, + "initialOwner": { + "type": "integer", + "description": "The identifier of the faction that initially owned this planet.", + "format": "int32" + } + } + }, + "PlanetCoordinates": { + "type": "object", + "description": "Represents a set of coordinates returned by ArrowHead's API.", + "additionalProperties": false, + "properties": { + "x": { + "type": "number", + "description": "The X coordinate", + "format": "double" + }, + "y": { + "type": "number", + "description": "The Y coordinate", + "format": "double" + } + } + }, + "HomeWorld": { + "type": "object", + "description": "Represents information about the homeworld(s) of a given race.", + "additionalProperties": false, + "properties": { + "race": { + "type": "integer", + "description": "The identifier of the race (faction) this describes the homeworld of.", + "format": "int32" + }, + "planetIndices": { + "type": "array", + "description": "A list of Index identifiers.", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "WarSummary": { + "type": "object", + "description": "Gets general statistics about the galaxy and specific planets.", + "additionalProperties": false, + "properties": { + "galaxy_stats": { + "description": "Contains galaxy wide statistics aggregated from all planets.", + "oneOf": [ + { + "$ref": "#/components/schemas/GalaxyStats" + } + ] + }, + "planets_stats": { + "type": "array", + "description": "Contains statistics for specific planets.", + "items": { + "$ref": "#/components/schemas/PlanetStats" + } + } + } + }, + "GalaxyStats": { + "type": "object", + "description": "Represents galaxy wide statistics.", + "additionalProperties": false, + "properties": { + "missionsWon": { + "type": "integer", + "description": "The amount of missions won.", + "format": "uint64" + }, + "missionsLost": { + "type": "integer", + "description": "The amount of missions lost.", + "format": "uint64" + }, + "missionTime": { + "type": "integer", + "description": "The total amount of time spent planetside (in seconds).", + "format": "uint64" + }, + "bugKills": { + "type": "integer", + "description": "The total amount of bugs killed since start of the season.", + "format": "uint64" + }, + "automatonKills": { + "type": "integer", + "description": "The total amount of automatons killed since start of the season.", + "format": "uint64" + }, + "illuminateKills": { + "type": "integer", + "description": "The total amount of Illuminate killed since start of the season.", + "format": "uint64" + }, + "bulletsFired": { + "type": "integer", + "description": "The total amount of bullets fired", + "format": "uint64" + }, + "bulletsHit": { + "type": "integer", + "description": "The total amount of bullets hit", + "format": "uint64" + }, + "timePlayed": { + "type": "integer", + "description": "The total amount of time played (including off-planet) in seconds.", + "format": "uint64" + }, + "deaths": { + "type": "integer", + "description": "The amount of casualties on the side of humanity.", + "format": "uint64" + }, + "revives": { + "type": "integer", + "description": "The amount of revives(?).", + "format": "uint64" + }, + "friendlies": { + "type": "integer", + "description": "The amount of friendly fire casualties.", + "format": "uint64" + }, + "missionSuccessRate": { + "type": "integer", + "description": "A percentage indicating how many started missions end in success.", + "format": "uint64" + }, + "accurracy": { + "type": "integer", + "description": "A percentage indicating average accuracy of Helldivers.", + "format": "uint64" + } + } + }, + "PlanetStats": { + "type": "object", + "description": "Similar to GalaxyStats, but scoped to a specific planet.", + "additionalProperties": false, + "properties": { + "planetIndex": { + "type": "integer", + "description": "The Index for which planet these stats are.", + "format": "int32" + }, + "missionsWon": { + "type": "integer", + "description": "The amount of missions won.", + "format": "uint64" + }, + "missionsLost": { + "type": "integer", + "description": "The amount of missions lost.", + "format": "uint64" + }, + "missionTime": { + "type": "integer", + "description": "The total amount of time spent planetside (in seconds).", + "format": "uint64" + }, + "bugKills": { + "type": "integer", + "description": "The total amount of bugs killed since start of the season.", + "format": "uint64" + }, + "automatonKills": { + "type": "integer", + "description": "The total amount of automatons killed since start of the season.", + "format": "uint64" + }, + "illuminateKills": { + "type": "integer", + "description": "The total amount of Illuminate killed since start of the season.", + "format": "uint64" + }, + "bulletsFired": { + "type": "integer", + "description": "The total amount of bullets fired", + "format": "uint64" + }, + "bulletsHit": { + "type": "integer", + "description": "The total amount of bullets hit", + "format": "uint64" + }, + "timePlayed": { + "type": "integer", + "description": "The total amount of time played (including off-planet) in seconds.", + "format": "uint64" + }, + "deaths": { + "type": "integer", + "description": "The amount of casualties on the side of humanity.", + "format": "uint64" + }, + "revives": { + "type": "integer", + "description": "The amount of revives(?).", + "format": "uint64" + }, + "friendlies": { + "type": "integer", + "description": "The amount of friendly fire casualties.", + "format": "uint64" + }, + "missionSuccessRate": { + "type": "integer", + "description": "A percentage indicating how many started missions end in success.", + "format": "uint64" + }, + "accurracy": { + "type": "integer", + "description": "A percentage indicating average accuracy of Helldivers.", + "format": "uint64" + } + } + }, + "NewsFeedItem": { + "type": "object", + "description": "Represents an item in the newsfeed of Super Earth.", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "The identifier of this newsfeed item.", + "format": "int32" + }, + "published": { + "type": "integer", + "description": "A unix timestamp (in seconds) when this item was published.", + "format": "int64" + }, + "type": { + "type": "integer", + "description": "A numerical type, purpose unknown.", + "format": "int32" + }, + "message": { + "type": "string", + "description": "The message containing a human readable text." + } + } + }, + "Assignment": { + "type": "object", + "description": "Represents an assignment given from Super Earth to the Helldivers.", + "additionalProperties": false, + "properties": { + "id32": { + "type": "integer", + "description": "Internal identifier of this assignment.", + "format": "int64" + }, + "progress": { + "type": "array", + "description": "A list of numbers, how they represent progress is unknown.", + "items": { + "type": "integer", + "format": "int32" + } + }, + "expiresIn": { + "type": "integer", + "description": "The amount of seconds until this assignment expires.", + "format": "int64" + }, + "setting": { + "description": "Contains detailed information on this assignment like briefing, rewards, ...", + "oneOf": [ + { + "$ref": "#/components/schemas/Setting" + } + ] + } + } + }, + "Setting": { + "type": "object", + "description": "Contains the details of an Assignment like reward and requirements.", + "additionalProperties": false, + "properties": { + "type": { + "type": "integer", + "description": "The type of assignment, values unknown at the moment.", + "format": "int32" + }, + "overrideTitle": { + "type": "string", + "description": "The title of this assignment." + }, + "overrideBrief": { + "type": "string", + "description": "The briefing (description) of this assignment." + }, + "taskDescription": { + "type": "string", + "description": "A description of what is expected of Helldivers to complete the assignment." + }, + "tasks": { + "type": "array", + "description": "A list of Tasks describing the assignment requirements.", + "items": { + "$ref": "#/components/schemas/Task" + } + }, + "reward": { + "description": "Contains information on the rewards players willr eceive upon completion.", + "oneOf": [ + { + "$ref": "#/components/schemas/Reward" + } + ] + }, + "flags": { + "type": "integer", + "description": "Flags, suspected to be a binary OR'd value, purpose unknown.", + "format": "int32" + } + } + }, + "Task": { + "type": "object", + "description": "Represents a task in an Assignment.\nIt's exact values are not known, therefor little of it's purpose is clear.", + "additionalProperties": false, + "properties": { + "type": { + "type": "integer", + "description": "A numerical value, purpose unknown.", + "format": "int32" + }, + "values": { + "type": "array", + "description": "A list of numerical values, purpose unknown.", + "items": { + "type": "integer", + "format": "int32" + } + }, + "valueTypes": { + "type": "array", + "description": "A list of numerical values, purpose unknown.", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "Reward": { + "type": "object", + "description": "Represents the reward of an Assignment.", + "additionalProperties": false, + "properties": { + "type": { + "type": "integer", + "description": "The type of reward, currently only one value is known: 1 which represents Medals", + "format": "int32" + }, + "id32": { + "type": "integer", + "description": "Internal identifier of this Reward.", + "format": "int32" + }, + "amount": { + "type": "integer", + "description": "The amount of Type the players will receive upon completion.", + "format": "int32" + } + } + } + } + } +} \ No newline at end of file diff --git a/src/Helldivers-2-API/wwwroot/redoc.html b/src/Helldivers-2-API/wwwroot/redoc.html new file mode 100644 index 0000000..b434c7e --- /dev/null +++ b/src/Helldivers-2-API/wwwroot/redoc.html @@ -0,0 +1,3 @@ + + + diff --git a/src/Helldivers-2-API/wwwroot/swagger-ui.html b/src/Helldivers-2-API/wwwroot/swagger-ui.html new file mode 100644 index 0000000..fbb4f55 --- /dev/null +++ b/src/Helldivers-2-API/wwwroot/swagger-ui.html @@ -0,0 +1,11 @@ + +
+ + diff --git a/src/Helldivers-2-Core/Contracts/Collections/IStore.cs b/src/Helldivers-2-Core/Contracts/Collections/IStore.cs new file mode 100644 index 0000000..f1539a7 --- /dev/null +++ b/src/Helldivers-2-Core/Contracts/Collections/IStore.cs @@ -0,0 +1,32 @@ +using System.Globalization; + +namespace Helldivers.Core.Contracts.Collections; + +/// +/// Provides access to the current version of . +/// +/// +/// If multiple variants per exist, the underlying +/// implementation is responsible for selecting the correct variant +/// based on . +/// +public interface IStore where T : class +{ + /// + /// Updates the state of the store with the given . + /// + ValueTask SetStore(List values); + + /// + /// Fetches all instances available. + /// + Task> AllAsync(CancellationToken cancellationToken = default); + + /// + /// Attempts to fetch a single by . + /// + /// + /// An instance of if found, or null if no instance associated with exists. + /// + Task GetAsync(TKey key, CancellationToken cancellationToken = default); +} diff --git a/src/Helldivers-2-Core/Contracts/IStore.cs b/src/Helldivers-2-Core/Contracts/IStore.cs new file mode 100644 index 0000000..47aa7d2 --- /dev/null +++ b/src/Helldivers-2-Core/Contracts/IStore.cs @@ -0,0 +1,24 @@ +using System.Globalization; + +namespace Helldivers.Core.Contracts; + +/// +/// Provides access to the current version of . +/// +/// +/// If multiple variants per exist, the underlying +/// implementation is responsible for selecting the correct variant +/// based on . +/// +public interface IStore where T : class +{ + /// + /// Updates the state of the store with the given . + /// + ValueTask SetStore(T value); + + /// + /// Gets the current snapshot of . + /// + Task Get(CancellationToken cancellationToken = default); +} diff --git a/src/Helldivers-2-Core/Extensions/ServiceCollectionExtensions.cs b/src/Helldivers-2-Core/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..e24cf43 --- /dev/null +++ b/src/Helldivers-2-Core/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,98 @@ +using Helldivers.Core.Contracts; +using Helldivers.Core.Contracts.Collections; +using Helldivers.Core.Facades; +using Helldivers.Core.Mapping.Steam; +using Helldivers.Core.Mapping.V1; +using Helldivers.Core.Storage.ArrowHead; +using Helldivers.Core.Storage.Steam; +using Helldivers.Core.Storage.V1; +using Helldivers.Models.ArrowHead; +using Helldivers.Models.V1; +using Microsoft.Extensions.DependencyInjection; + +namespace Helldivers.Core.Extensions; + +/// +/// Contains extension methods for . +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds all services related to the Helldivers API to the service container. + /// + public static IServiceCollection AddHelldivers(this IServiceCollection services) + { + services.AddSingleton(); + + return services + .AddArrowHeadStores() + .AddSteamStores() + .AddV1Stores(); + } + + /// + /// Registers all & for ArrowHead models. + /// + public static IServiceCollection AddArrowHeadStores(this IServiceCollection services) + { + // Register facade for all stores below + services.AddSingleton(); + + // Register all stores + services.AddSingleton, WarInfoStore>(); + services.AddSingleton(); + services.AddSingleton>(provider => provider.GetRequiredService()); + services.AddSingleton, WarSummaryStore>(); + services.AddSingleton(); + services.AddSingleton>(provider => + provider.GetRequiredService()); + services.AddSingleton(); + services.AddSingleton>(provider => provider.GetRequiredService()); + services.AddSingleton, WarIdStore>(); + + return services; + } + + /// + /// Registers all & for Steam models. + /// + public static IServiceCollection AddSteamStores(this IServiceCollection services) + { + // Register facade for all stores below + services.AddSingleton(); + + // Register stores + services.AddSingleton, SteamNewsStore>(); + + // Register mappers + services.AddSingleton(); + + return services; + } + + /// + /// Registers all & for V1 models. + /// + public static IServiceCollection AddV1Stores(this IServiceCollection services) + { + // Register facade for all stores below + services.AddSingleton(); + + // Register stores + services.AddSingleton, PlanetStore>(); + services.AddSingleton, WarStore>(); + services.AddSingleton, CampaignStore>(); + services.AddSingleton, Storage.V1.AssignmentStore>(); + services.AddSingleton, DispatchStore>(); + + // Register mappers + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + return services; + } +} diff --git a/src/Helldivers-2-Core/Facades/ArrowHeadFacade.cs b/src/Helldivers-2-Core/Facades/ArrowHeadFacade.cs new file mode 100644 index 0000000..3967392 --- /dev/null +++ b/src/Helldivers-2-Core/Facades/ArrowHeadFacade.cs @@ -0,0 +1,29 @@ +using Helldivers.Core.Contracts; +using Helldivers.Core.Storage.ArrowHead; +using Helldivers.Models.ArrowHead; + +namespace Helldivers.Core.Facades; + +/// +/// Handles dispatching incoming data to all stores for ArrowHead. +/// +public sealed class ArrowHeadFacade( + IStore warIdStore, + IStore warInfoStore, + WarStatusStore warStatusStore, + IStore warSummaryStore, + NewsFeedStore newsFeedStore, + AssignmentStore assignmentStore +) +{ + /// + public async ValueTask UpdateStores(WarId warId, WarInfo warInfo, Dictionary warStatuses, WarSummary warSummary, Dictionary> newsFeeds, Dictionary> assignments) + { + await warIdStore.SetStore(warId); + await warInfoStore.SetStore(warInfo); + await warStatusStore.SetStore(warStatuses); + await warSummaryStore.SetStore(warSummary); + await newsFeedStore.SetStore(newsFeeds); + await assignmentStore.SetStore(assignments); + } +} diff --git a/src/Helldivers-2-Core/Facades/SteamFacade.cs b/src/Helldivers-2-Core/Facades/SteamFacade.cs new file mode 100644 index 0000000..541db8f --- /dev/null +++ b/src/Helldivers-2-Core/Facades/SteamFacade.cs @@ -0,0 +1,22 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Core.Mapping.Steam; +using Helldivers.Core.Mapping.V1; +using Helldivers.Models.Steam; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Facades; + +/// +/// Handles dispatching incoming data to all stores for Steam. +/// +public sealed class SteamFacade(IStore store, SteamNewsMapper mapper) +{ + /// + public async ValueTask UpdateStores(SteamNewsFeed feed) + { + if (feed is { AppNews.NewsItems: var items }) + { + await store.SetStore(items.Select(mapper.MapToDomain).ToList()); + } + } +} diff --git a/src/Helldivers-2-Core/Facades/V1Facade.cs b/src/Helldivers-2-Core/Facades/V1Facade.cs new file mode 100644 index 0000000..d51b95e --- /dev/null +++ b/src/Helldivers-2-Core/Facades/V1Facade.cs @@ -0,0 +1,83 @@ +using Helldivers.Core.Contracts; +using Helldivers.Core.Contracts.Collections; +using Helldivers.Core.Mapping.V1; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Facades; + +/// +/// Handles dispatching incoming data to all stores for V1. +/// +public sealed class V1Facade( + IStore warStore, + WarMapper warMapper, + IStore planetStore, + PlanetMapper planetMapper, + IStore campaignStore, + CampaignMapper campaignMapper, + IStore assignmentStore, + AssignmentMapper assignmentMapper, + IStore dispatchStore, + DispatchMapper dispatchMapper +) +{ + /// + public async ValueTask UpdateStores(Models.ArrowHead.WarId warId, Models.ArrowHead.WarInfo warInfo, Dictionary warStatuses, Models.ArrowHead.WarSummary warSummary, Dictionary> newsFeeds, Dictionary> assignments) + { + // TODO: map warId + + // Fetch a WarStatus for mapping that don't need localized data. + var invariantStatus = warStatuses.FirstOrDefault().Value; + + await UpdatePlanetStore(warInfo, invariantStatus, warSummary); + // Some mappers need access to the list of planets, so we fetch it from the freshly-mapped store. + var planets = await planetStore.AllAsync(); + + await UpdateWarStore(warInfo, invariantStatus, warSummary, planets); + await UpdateCampaignStore(invariantStatus, planets); + await UpdateAssignmentsStore(assignments); + await UpdateDispatchStore(warInfo, newsFeeds); + } + + private async ValueTask UpdateWarStore(Models.ArrowHead.WarInfo info, Models.ArrowHead.WarStatus status, Models.ArrowHead.WarSummary summary, List planets) + { + var war = warMapper.MapToV1(info, status, summary, planets); + + await warStore.SetStore(war); + } + + private async ValueTask UpdatePlanetStore(Models.ArrowHead.WarInfo warInfo, Models.ArrowHead.WarStatus warStatus, Models.ArrowHead.WarSummary summary) + { + var planets = planetMapper.MapToV1(warInfo, warStatus, summary).ToList(); + + await planetStore.SetStore(planets); + } + + private async ValueTask UpdateCampaignStore(Models.ArrowHead.WarStatus status, List planets) + { + var campaigns = status + .Campaigns + .Select(campaign => campaignMapper.MapToV1(campaign, planets)) + .ToList(); + + await campaignStore.SetStore(campaigns); + } + + private async ValueTask UpdateAssignmentsStore(Dictionary> translations) + { + var assignments = assignmentMapper + .MapToV1(translations) + .ToList(); + + await assignmentStore.SetStore(assignments); + } + + private async ValueTask UpdateDispatchStore(Models.ArrowHead.WarInfo info, Dictionary> translations) + { + var dispatches = dispatchMapper + .MapToV1(info, translations) + .ToList(); + + await dispatchStore.SetStore(dispatches); + } +} diff --git a/src/Helldivers-2-Core/Helldivers-2-Core.csproj b/src/Helldivers-2-Core/Helldivers-2-Core.csproj new file mode 100644 index 0000000..35ca7b9 --- /dev/null +++ b/src/Helldivers-2-Core/Helldivers-2-Core.csproj @@ -0,0 +1,13 @@ + + + + true + Helldivers.Core + + + + + + + + diff --git a/src/Helldivers-2-Core/Localization/CultureDictionary.cs b/src/Helldivers-2-Core/Localization/CultureDictionary.cs new file mode 100644 index 0000000..b17b106 --- /dev/null +++ b/src/Helldivers-2-Core/Localization/CultureDictionary.cs @@ -0,0 +1,36 @@ +using System.Globalization; + +namespace Helldivers.Core.Localization; + +/// +/// Specialized version of that intelligently maps as +/// keys (eg, if "en-UK" does not exist but "en-US" it'll match). +/// +public class CultureDictionary where T : class +{ + private readonly Dictionary _items; + + /// Creates a new instance of , + public CultureDictionary(IEnumerable> items) + { + _items = items + .Select(pair => new KeyValuePair(new CultureInfo(pair.Key), pair.Value)) + .SelectMany(pair => new List>([ + new KeyValuePair(pair.Key, pair.Value), + new KeyValuePair(pair.Key.Parent, pair.Value) + ])) + .DistinctBy(pair => pair.Key) + .ToDictionary(pair => pair.Key, pair => pair.Value); + } + + /// + /// Attempts to resolve a by it's closest common value or parent. + /// + public T? Get(CultureInfo? cultureInfo = default) + { + cultureInfo ??= CultureInfo.CurrentCulture; + + return _items.GetValueOrDefault(cultureInfo) + ?? _items.GetValueOrDefault(cultureInfo.Parent); + } +} diff --git a/src/Helldivers-2-Core/Mapping/Steam/SteamNewsMapper.cs b/src/Helldivers-2-Core/Mapping/Steam/SteamNewsMapper.cs new file mode 100644 index 0000000..801f311 --- /dev/null +++ b/src/Helldivers-2-Core/Mapping/Steam/SteamNewsMapper.cs @@ -0,0 +1,25 @@ +using Helldivers.Models.Steam; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Mapping.Steam; + +/// +/// Maps from Steam's models. +/// +public sealed class SteamNewsMapper +{ + /// + /// Maps information from Steam's API into a V1 . + /// + public SteamNews MapToDomain(SteamNewsFeedItem item) + { + return new SteamNews( + Id: item.Gid, + Title: item.Title, + Url: item.Url, + Author: item.Author, + Content: item.Contents, + PublishedAt: DateTime.UnixEpoch.AddSeconds(item.Date) + ); + } +} diff --git a/src/Helldivers-2-Core/Mapping/V1/AssignmentMapper.cs b/src/Helldivers-2-Core/Mapping/V1/AssignmentMapper.cs new file mode 100644 index 0000000..220fcfb --- /dev/null +++ b/src/Helldivers-2-Core/Mapping/V1/AssignmentMapper.cs @@ -0,0 +1,74 @@ +using Helldivers.Models.Domain.Localization; +using Helldivers.Models.V1; +using Helldivers.Models.V1.Assignments; +using Task = Helldivers.Models.V1.Assignments.Task; + +namespace Helldivers.Core.Mapping.V1; + +/// +/// Handles mapping for . +/// +public sealed class AssignmentMapper +{ + /// + /// Maps a set of multi-language s into a list of . + /// + public IEnumerable MapToV1(Dictionary> assignments) + { + // Get a list of all assignments across all translations. + var invariants = assignments + .SelectMany(pair => pair.Value) + .DistinctBy(assignment => assignment.Id32); + + foreach (var assignment in invariants) + { + // Build a dictionary of all translations for this assignment + var translations = assignments.Select(pair => + new KeyValuePair( + pair.Key, + pair.Value.FirstOrDefault(a => a.Id32 == assignment.Id32) + ) + ).Where(pair => pair.Value is not null) + .ToDictionary(pair => pair.Key, pair => pair.Value!); + + yield return MapToV1(translations); + } + } + + /// + /// Maps all translations of an into one assignment. + /// + private Assignment MapToV1(Dictionary translations) + { + var invariant = translations.First().Value; + var titles = translations.Select(assignment => new KeyValuePair(assignment.Key, assignment.Value.Setting.OverrideTitle)); + var briefings = translations.Select(assignment => new KeyValuePair(assignment.Key, assignment.Value.Setting.OverrideBrief)); + var descriptions = translations.Select(assignment => new KeyValuePair(assignment.Key, assignment.Value.Setting.TaskDescription)); + + return new Assignment( + Id: invariant.Id32, + Title: LocalizedMessage.FromStrings(titles), + Briefing: LocalizedMessage.FromStrings(briefings), + Description: LocalizedMessage.FromStrings(descriptions), + Tasks: invariant.Setting.Tasks.Select(MapToV1).ToList(), + Reward: MapToV1(invariant.Setting.Reward) + ); + } + + private Task MapToV1(Models.ArrowHead.Assignments.Task task) + { + return new Task( + Type: task.Type, + Values: task.Values, + ValueTypes: task.ValueTypes + ); + } + + private Reward MapToV1(Models.ArrowHead.Assignments.Reward reward) + { + return new Reward( + Type: reward.Type, + Amount: reward.Amount + ); + } +} diff --git a/src/Helldivers-2-Core/Mapping/V1/CampaignMapper.cs b/src/Helldivers-2-Core/Mapping/V1/CampaignMapper.cs new file mode 100644 index 0000000..bc890ea --- /dev/null +++ b/src/Helldivers-2-Core/Mapping/V1/CampaignMapper.cs @@ -0,0 +1,24 @@ +using Helldivers.Models.V1; + +namespace Helldivers.Core.Mapping.V1; + +/// +/// Handles mapping for . +/// +public class CampaignMapper +{ + /// + /// Maps ArrowHead's onto V1's. + /// + public Campaign MapToV1(Models.ArrowHead.Status.Campaign campaign, List planets) + { + var planet = planets.First(p => p.Index == campaign.PlanetIndex); + + return new Campaign( + Id: campaign.Id, + Planet: planet, + Type: campaign.Type, + Count: campaign.Count + ); + } +} diff --git a/src/Helldivers-2-Core/Mapping/V1/DispatchMapper.cs b/src/Helldivers-2-Core/Mapping/V1/DispatchMapper.cs new file mode 100644 index 0000000..1102019 --- /dev/null +++ b/src/Helldivers-2-Core/Mapping/V1/DispatchMapper.cs @@ -0,0 +1,49 @@ +using Helldivers.Models.ArrowHead; +using Helldivers.Models.Domain.Localization; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Mapping.V1; + +/// +/// Handles mapping for . +/// +public sealed class DispatchMapper +{ + /// + /// Maps ArrowHead's onto V1's es. + /// + public IEnumerable MapToV1(WarInfo info, Dictionary> items) + { + // Get a list of all items across all translations. + var invariants = items + .SelectMany(pair => pair.Value) + .DistinctBy(assignment => assignment.Id); + + foreach (var item in invariants) + { + // Build a dictionary of all translations for this item + var translations = items.Select(pair => + new KeyValuePair( + pair.Key, + pair.Value.FirstOrDefault(a => a.Id == item.Id) + ) + ).Where(pair => pair.Value is not null) + .ToDictionary(pair => pair.Key, pair => pair.Value!); + + yield return MapToV1(info, translations); + } + } + + private Dispatch MapToV1(WarInfo info, Dictionary translations) + { + var invariant = translations.Values.First(); + var messages = translations.Select(pair => new KeyValuePair(pair.Key, pair.Value.Message)); + + return new Dispatch( + Id: invariant.Id, + Published: DateTime.UnixEpoch.AddSeconds(info.StartDate + invariant.Published), + Type: invariant.Type, + Message: LocalizedMessage.FromStrings(messages) + ); + } +} diff --git a/src/Helldivers-2-Core/Mapping/V1/PlanetMapper.cs b/src/Helldivers-2-Core/Mapping/V1/PlanetMapper.cs new file mode 100644 index 0000000..a0b1ed1 --- /dev/null +++ b/src/Helldivers-2-Core/Mapping/V1/PlanetMapper.cs @@ -0,0 +1,77 @@ +using Helldivers.Models; +using Helldivers.Models.ArrowHead; +using Helldivers.Models.ArrowHead.Info; +using Helldivers.Models.ArrowHead.Status; +using Helldivers.Models.ArrowHead.Summary; +using Helldivers.Models.V1; +using Helldivers.Models.V1.Planets; + +namespace Helldivers.Core.Mapping.V1; + +/// +/// Handles mapping for . +/// +public sealed class PlanetMapper(StatisticsMapper statisticsMapper) +{ + /// + /// Maps all planet information into a list of objects. + /// see + /// + public IEnumerable MapToV1(WarInfo warInfo, WarStatus warStatus, WarSummary summary) + { + foreach (var info in warInfo.PlanetInfos) + { + var status = warStatus.PlanetStatus.First(status => status.Index == info.Index); + var stats = summary.PlanetsStats.FirstOrDefault(stats => stats.PlanetIndex == info.Index); + var @event = warStatus.PlanetEvents.FirstOrDefault(@event => @event.PlanetIndex == info.Index); + + yield return MapToV1(info, status, @event, stats); + } + } + + /// + /// Merges all ArrowHead data points on planets into a single object. + /// + public Planet MapToV1(PlanetInfo info, PlanetStatus status, PlanetEvent? @event, PlanetStats? stats) + { + Static.Planets.TryGetValue(info.Index, out var name); + Static.Factions.TryGetValue(info.InitialOwner, out var initialOwner); + Static.Factions.TryGetValue(status.Owner, out var currentOwner); + + return new Planet( + Index: info.Index, + Name: name ?? string.Empty, + Sector: Static.Sectors.First(sector => sector.Value.Contains(info.Index)).Key, + Hash: info.SettingsHash, + Position: new Position(info.Position.X, info.Position.Y), + Waypoints: info.Waypoints.ToList(), + MaxHealth: info.MaxHealth, + Health: status.Health, + Disabled: info.Disabled, + InitialOwner: initialOwner ?? string.Empty, + CurrentOwner: currentOwner ?? string.Empty, + RegenPerSecond: status.RegenPerSecond, + Event: MapToV1(@event), + Statistics: statisticsMapper.MapToV1(stats, status) + ); + } + + private Event? MapToV1(PlanetEvent? @event) + { + if (@event is null) + return null; + + Static.Factions.TryGetValue(@event.Race, out var faction); + + return new Event( + Id: @event.Id, + EventType: @event.EventType, + Faction: faction ?? string.Empty, + Health: @event.Health, + StartTime: DateTime.UnixEpoch.AddSeconds(@event.StartTime), + EndTime: DateTime.UnixEpoch.AddSeconds(@event.ExpireTime), + CampaignId: @event.CampaignId, + JointOperationIds: @event.JointOperationIds + ); + } +} diff --git a/src/Helldivers-2-Core/Mapping/V1/StatisticsMapper.cs b/src/Helldivers-2-Core/Mapping/V1/StatisticsMapper.cs new file mode 100644 index 0000000..651fbd9 --- /dev/null +++ b/src/Helldivers-2-Core/Mapping/V1/StatisticsMapper.cs @@ -0,0 +1,59 @@ +using Helldivers.Models.V1; + +namespace Helldivers.Core.Mapping.V1; + +/// +/// Handles mapping for . +/// +public sealed class StatisticsMapper +{ + /// + /// Maps galaxy wide statistics onto V1's statistics. + /// + public Statistics MapToV1(Models.ArrowHead.Summary.GalaxyStats statistics, List planets) + { + var playerCount = planets.Aggregate(0ul, (total, planet) => total + planet.Statistics.PlayerCount); + + return new Statistics( + MissionsWon: statistics.MissionsWon, + MissionsLost: statistics.MissionsLost, + MissionTime: statistics.MissionTime, + TerminidKills: statistics.BugKills, + AutomatonKills: statistics.AutomatonKills, + IlluminateKills: statistics.IlluminateKills, + BulletsFired: statistics.BulletsFired, + BulletsHit: statistics.BulletsHit, + TimePlayed: statistics.TimePlayed, + Deaths: statistics.Deaths, + Revives: statistics.Revives, + Friendlies: statistics.Friendlies, + MissionSuccessRate: statistics.MissionSuccessRate, + Accuracy: statistics.Accurracy, + PlayerCount: playerCount + ); + } + + /// + /// Maps statistics of a specific planet onto V1's statistics. + /// + public Statistics MapToV1(Models.ArrowHead.Summary.PlanetStats? statistics, Models.ArrowHead.Status.PlanetStatus status) + { + return new Statistics( + MissionsWon: statistics?.MissionsWon ?? 0, + MissionsLost: statistics?.MissionsLost ?? 0, + MissionTime: statistics?.MissionTime ?? 0, + TerminidKills: statistics?.BugKills ?? 0, + AutomatonKills: statistics?.AutomatonKills ?? 0, + IlluminateKills: statistics?.IlluminateKills ?? 0, + BulletsFired: statistics?.BulletsFired ?? 0, + BulletsHit: statistics?.BulletsHit ?? 0, + TimePlayed: statistics?.TimePlayed ?? 0, + Deaths: statistics?.Deaths ?? 0, + Revives: statistics?.Revives ?? 0, + Friendlies: statistics?.Friendlies ?? 0, + MissionSuccessRate: statistics?.MissionSuccessRate ?? 0, + Accuracy: statistics?.Accurracy ?? 0, + PlayerCount: status.Players + ); + } +} diff --git a/src/Helldivers-2-Core/Mapping/V1/WarMapper.cs b/src/Helldivers-2-Core/Mapping/V1/WarMapper.cs new file mode 100644 index 0000000..f6998f8 --- /dev/null +++ b/src/Helldivers-2-Core/Mapping/V1/WarMapper.cs @@ -0,0 +1,26 @@ +using Helldivers.Models.ArrowHead; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Mapping.V1; + +/// +/// Handles mapping for . +/// +public sealed class WarMapper(StatisticsMapper statisticsMapper) +{ + /// + /// Handles mapping to V1. + /// + public War MapToV1(WarInfo info, WarStatus status, WarSummary summary, List planets) + { + return new War( + Started: DateTime.UnixEpoch.AddSeconds(info.StartDate), + Ended: DateTime.UnixEpoch.AddSeconds(info.EndDate), + Now: DateTime.UnixEpoch.AddSeconds(status.Time), + ClientVersion: info.MinimumClientVersion, + Factions: [], + ImpactMultiplier: status.ImpactMultiplier, + Statistics: statisticsMapper.MapToV1(summary.GalaxyStats, planets) + ); + } +} diff --git a/src/Helldivers-2-Core/Storage/ArrowHead/AssignmentStore.cs b/src/Helldivers-2-Core/Storage/ArrowHead/AssignmentStore.cs new file mode 100644 index 0000000..72e4a2c --- /dev/null +++ b/src/Helldivers-2-Core/Storage/ArrowHead/AssignmentStore.cs @@ -0,0 +1,39 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Core.Localization; +using Helldivers.Models.ArrowHead; + +namespace Helldivers.Core.Storage.ArrowHead; + +/// +public class AssignmentStore : StoreBase +{ + private CultureDictionary> _translations = null!; + + /// + public ValueTask SetStore(IEnumerable>> assignments) + { + _translations = new(assignments); + + return SetStore(_translations.Get()!); + } + + /// + public override async Task> AllAsync(CancellationToken cancellationToken = default) + { + await base.AllAsync(cancellationToken); + + return _translations.Get()!; + } + + /// + public override async Task GetAsync(int key, CancellationToken cancellationToken = default) + { + await base.GetAsync(key, cancellationToken); + + return _translations.Get()?.FirstOrDefault(item => GetAsyncPredicate(item, key)); + } + + /// + protected override bool GetAsyncPredicate(Assignment assignment, int key) + => assignment.Id32 == key; +} diff --git a/src/Helldivers-2-Core/Storage/ArrowHead/NewsFeedStore.cs b/src/Helldivers-2-Core/Storage/ArrowHead/NewsFeedStore.cs new file mode 100644 index 0000000..00a94c7 --- /dev/null +++ b/src/Helldivers-2-Core/Storage/ArrowHead/NewsFeedStore.cs @@ -0,0 +1,39 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Core.Localization; +using Helldivers.Models.ArrowHead; + +namespace Helldivers.Core.Storage.ArrowHead; + +/// +public class NewsFeedStore : StoreBase +{ + private CultureDictionary> _translations = null!; + + /// + public ValueTask SetStore(IEnumerable>> translations) + { + _translations = new(translations); + + return SetStore(_translations.Get()!); + } + + /// + public override async Task> AllAsync(CancellationToken cancellationToken = default) + { + await base.AllAsync(cancellationToken); + + return _translations.Get()!; + } + + /// + public override async Task GetAsync(int key, CancellationToken cancellationToken = default) + { + await base.GetAsync(key, cancellationToken); + + return _translations.Get()?.FirstOrDefault(item => GetAsyncPredicate(item, key)); + } + + /// + protected override bool GetAsyncPredicate(NewsFeedItem item, int key) + => item.Id == key; +} diff --git a/src/Helldivers-2-Core/Storage/ArrowHead/WarIdStore.cs b/src/Helldivers-2-Core/Storage/ArrowHead/WarIdStore.cs new file mode 100644 index 0000000..ac16321 --- /dev/null +++ b/src/Helldivers-2-Core/Storage/ArrowHead/WarIdStore.cs @@ -0,0 +1,10 @@ +using Helldivers.Core.Contracts; +using Helldivers.Models.ArrowHead; + +namespace Helldivers.Core.Storage.ArrowHead; + +/// +public class WarIdStore : StoreBase +{ + // +} diff --git a/src/Helldivers-2-Core/Storage/ArrowHead/WarInfoStore.cs b/src/Helldivers-2-Core/Storage/ArrowHead/WarInfoStore.cs new file mode 100644 index 0000000..0947e3d --- /dev/null +++ b/src/Helldivers-2-Core/Storage/ArrowHead/WarInfoStore.cs @@ -0,0 +1,10 @@ +using Helldivers.Core.Contracts; +using Helldivers.Models.ArrowHead; + +namespace Helldivers.Core.Storage.ArrowHead; + +/// +public sealed class WarInfoStore : StoreBase +{ + // +} diff --git a/src/Helldivers-2-Core/Storage/ArrowHead/WarStatusStore.cs b/src/Helldivers-2-Core/Storage/ArrowHead/WarStatusStore.cs new file mode 100644 index 0000000..b0df3eb --- /dev/null +++ b/src/Helldivers-2-Core/Storage/ArrowHead/WarStatusStore.cs @@ -0,0 +1,27 @@ +using Helldivers.Core.Contracts; +using Helldivers.Core.Localization; +using Helldivers.Models.ArrowHead; + +namespace Helldivers.Core.Storage.ArrowHead; + +/// +public sealed class WarStatusStore : StoreBase +{ + private CultureDictionary _translations = null!; + + /// + public ValueTask SetStore(IEnumerable> translations) + { + _translations = new(translations); + + return SetStore(_translations.Get()!); + } + + /// + public override async Task Get(CancellationToken cancellationToken = default) + { + await base.Get(cancellationToken); + + return _translations.Get()!; + } +} diff --git a/src/Helldivers-2-Core/Storage/ArrowHead/WarSummaryStore.cs b/src/Helldivers-2-Core/Storage/ArrowHead/WarSummaryStore.cs new file mode 100644 index 0000000..f424198 --- /dev/null +++ b/src/Helldivers-2-Core/Storage/ArrowHead/WarSummaryStore.cs @@ -0,0 +1,10 @@ +using Helldivers.Core.Contracts; +using Helldivers.Models.ArrowHead; + +namespace Helldivers.Core.Storage.ArrowHead; + +/// +public class WarSummaryStore : StoreBase +{ + // +} diff --git a/src/Helldivers-2-Core/Storage/Steam/SteamNewsStore.cs b/src/Helldivers-2-Core/Storage/Steam/SteamNewsStore.cs new file mode 100644 index 0000000..12e70d2 --- /dev/null +++ b/src/Helldivers-2-Core/Storage/Steam/SteamNewsStore.cs @@ -0,0 +1,12 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Storage.Steam; + +/// +public class SteamNewsStore : StoreBase +{ + /// + protected override bool GetAsyncPredicate(SteamNews item, string key) + => string.Equals(item.Id, key, StringComparison.InvariantCultureIgnoreCase); +} diff --git a/src/Helldivers-2-Core/Storage/StoreBase.cs b/src/Helldivers-2-Core/Storage/StoreBase.cs new file mode 100644 index 0000000..8f17ff4 --- /dev/null +++ b/src/Helldivers-2-Core/Storage/StoreBase.cs @@ -0,0 +1,73 @@ +using Helldivers.Core.Contracts; +using Helldivers.Core.Contracts.Collections; + +namespace Helldivers.Core.Storage; + +/// +/// Base class for +/// +public abstract class StoreBase : IStore where T : class +{ + private T _state = null!; + private readonly TaskCompletionSource _syncState = new(); + + /// + /// Updates the state of the store with the new value. + /// + public virtual ValueTask SetStore(T value) + { + _state = value; + _syncState.TrySetResult(); + + return ValueTask.CompletedTask; + } + + /// + public virtual async Task Get(CancellationToken cancellationToken = default) + { + await _syncState.Task.WaitAsync(cancellationToken); + + return _state; + } +} + +/// +/// Base class for +/// +public abstract class StoreBase : IStore where T : class +{ + private List _state = null!; + private readonly TaskCompletionSource _syncState = new(); + + /// + /// Updates the state of the store with the new value. + /// + public virtual ValueTask SetStore(List value) + { + _state = value; + _syncState.TrySetResult(); + + return ValueTask.CompletedTask; + } + + /// + public virtual async Task> AllAsync(CancellationToken cancellationToken = default) + { + await _syncState.Task.WaitAsync(cancellationToken); + + return _state; + } + + /// + public virtual async Task GetAsync(TKey key, CancellationToken cancellationToken = default) + { + await _syncState.Task.WaitAsync(cancellationToken); + + return _state.FirstOrDefault(value => GetAsyncPredicate(value, key)); + } + + /// + /// Handles the filter for + /// + protected abstract bool GetAsyncPredicate(T item, TKey key); +} diff --git a/src/Helldivers-2-Core/Storage/V1/AssignmentStore.cs b/src/Helldivers-2-Core/Storage/V1/AssignmentStore.cs new file mode 100644 index 0000000..c620568 --- /dev/null +++ b/src/Helldivers-2-Core/Storage/V1/AssignmentStore.cs @@ -0,0 +1,12 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Storage.V1; + +/// +public sealed class AssignmentStore : StoreBase +{ + /// + protected override bool GetAsyncPredicate(Assignment assignment, long key) + => assignment.Id == key; +} diff --git a/src/Helldivers-2-Core/Storage/V1/CampaignStore.cs b/src/Helldivers-2-Core/Storage/V1/CampaignStore.cs new file mode 100644 index 0000000..1f9c107 --- /dev/null +++ b/src/Helldivers-2-Core/Storage/V1/CampaignStore.cs @@ -0,0 +1,12 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Storage.V1; + +/// +public sealed class CampaignStore : StoreBase +{ + /// + protected override bool GetAsyncPredicate(Campaign campaign, int key) + => campaign.Id == key; +} diff --git a/src/Helldivers-2-Core/Storage/V1/DispatchStore.cs b/src/Helldivers-2-Core/Storage/V1/DispatchStore.cs new file mode 100644 index 0000000..904c19c --- /dev/null +++ b/src/Helldivers-2-Core/Storage/V1/DispatchStore.cs @@ -0,0 +1,12 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Storage.V1; + +/// +public sealed class DispatchStore : StoreBase +{ + /// + protected override bool GetAsyncPredicate(Dispatch dispatch, int key) + => dispatch.Id == key; +} diff --git a/src/Helldivers-2-Core/Storage/V1/PlanetStore.cs b/src/Helldivers-2-Core/Storage/V1/PlanetStore.cs new file mode 100644 index 0000000..51b590e --- /dev/null +++ b/src/Helldivers-2-Core/Storage/V1/PlanetStore.cs @@ -0,0 +1,11 @@ +using Helldivers.Core.Contracts.Collections; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Storage.V1; + +/// +public class PlanetStore : StoreBase +{ + /// + protected override bool GetAsyncPredicate(Planet planet, int index) => planet.Index == index; +} diff --git a/src/Helldivers-2-Core/Storage/V1/WarStore.cs b/src/Helldivers-2-Core/Storage/V1/WarStore.cs new file mode 100644 index 0000000..82eaace --- /dev/null +++ b/src/Helldivers-2-Core/Storage/V1/WarStore.cs @@ -0,0 +1,10 @@ +using Helldivers.Core.Contracts; +using Helldivers.Models.V1; + +namespace Helldivers.Core.Storage.V1; + +/// +public sealed class WarStore : StoreBase +{ + // +} diff --git a/src/Helldivers-2-Core/StorageFacade.cs b/src/Helldivers-2-Core/StorageFacade.cs new file mode 100644 index 0000000..41f5cf4 --- /dev/null +++ b/src/Helldivers-2-Core/StorageFacade.cs @@ -0,0 +1,27 @@ +using Helldivers.Core.Facades; +using Helldivers.Models.ArrowHead; +using Helldivers.Models.Steam; + +namespace Helldivers.Core; + +/// +/// Rather than having the sync service be aware of all mappings and storage versions, +/// this facade class handles dispatching incoming data to the correct underlying stores. +/// +public sealed class StorageFacade(ArrowHeadFacade arrowHead, SteamFacade steam, V1Facade v1) +{ + /// + /// Updates all stores that rely on . + /// + public ValueTask UpdateStores(SteamNewsFeed feed) + => steam.UpdateStores(feed); + + /// + /// Updates all stores that rely on ArrowHead's models. + /// + public async ValueTask UpdateStores(WarId warId, WarInfo warInfo, Dictionary warStatuses, WarSummary warSummary, Dictionary> newsFeeds, Dictionary> assignments) + { + await arrowHead.UpdateStores(warId, warInfo, warStatuses, warSummary, newsFeeds, assignments); + await v1.UpdateStores(warId, warInfo, warStatuses, warSummary, newsFeeds, assignments); + } +} diff --git a/src/Helldivers-2-Models/ArrowHead/Assignment.cs b/src/Helldivers-2-Models/ArrowHead/Assignment.cs new file mode 100644 index 0000000..6266884 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Assignment.cs @@ -0,0 +1,17 @@ +using Helldivers.Models.ArrowHead.Assignments; + +namespace Helldivers.Models.ArrowHead; + +/// +/// Represents an assignment given from Super Earth to the Helldivers. +/// +/// Internal identifier of this assignment. +/// A list of numbers, how they represent progress is unknown. +/// The amount of seconds until this assignment expires. +/// Contains detailed information on this assignment like briefing, rewards, ... +public sealed record Assignment( + long Id32, + List Progress, + long ExpiresIn, + Setting Setting +); diff --git a/src/Helldivers-2-Models/ArrowHead/Assignments/Reward.cs b/src/Helldivers-2-Models/ArrowHead/Assignments/Reward.cs new file mode 100644 index 0000000..6582855 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Assignments/Reward.cs @@ -0,0 +1,13 @@ +namespace Helldivers.Models.ArrowHead.Assignments; + +/// +/// Represents the reward of an . +/// +/// The type of reward, currently only one value is known: 1 which represents Medals +/// Internal identifier of this . +/// The amount of the players will receive upon completion. +public sealed record Reward( + int Type, + int Id32, + int Amount +); diff --git a/src/Helldivers-2-Models/ArrowHead/Assignments/Setting.cs b/src/Helldivers-2-Models/ArrowHead/Assignments/Setting.cs new file mode 100644 index 0000000..882bd76 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Assignments/Setting.cs @@ -0,0 +1,21 @@ +namespace Helldivers.Models.ArrowHead.Assignments; + +/// +/// Contains the details of an like reward and requirements. +/// +/// The type of assignment, values unknown at the moment. +/// The title of this assignment. +/// The briefing (description) of this assignment. +/// A description of what is expected of Helldivers to complete the assignment. +/// A list of s describing the assignment requirements. +/// Contains information on the rewards players willr eceive upon completion. +/// Flags, suspected to be a binary OR'd value, purpose unknown. +public sealed record Setting( + int Type, + string OverrideTitle, + string OverrideBrief, + string TaskDescription, + List Tasks, + Reward Reward, + int Flags +); diff --git a/src/Helldivers-2-Models/ArrowHead/Assignments/Task.cs b/src/Helldivers-2-Models/ArrowHead/Assignments/Task.cs new file mode 100644 index 0000000..7e969c2 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Assignments/Task.cs @@ -0,0 +1,14 @@ +namespace Helldivers.Models.ArrowHead.Assignments; + +/// +/// Represents a task in an . +/// It's exact values are not known, therefor little of it's purpose is clear. +/// +/// A numerical value, purpose unknown. +/// A list of numerical values, purpose unknown. +/// A list of numerical values, purpose unknown. +public sealed record Task( + int Type, + List Values, + List ValueTypes +); diff --git a/src/Helldivers-2-Models/ArrowHead/Info/HomeWorld.cs b/src/Helldivers-2-Models/ArrowHead/Info/HomeWorld.cs new file mode 100644 index 0000000..8f291c7 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Info/HomeWorld.cs @@ -0,0 +1,8 @@ +namespace Helldivers.Models.ArrowHead.Info; + +/// +/// Represents information about the homeworld(s) of a given race. +/// +/// The identifier of the race (faction) this describes the homeworld of. +/// A list of identifiers. +public sealed record HomeWorld(int Race, List PlanetIndices); diff --git a/src/Helldivers-2-Models/ArrowHead/Info/PlanetCoordinates.cs b/src/Helldivers-2-Models/ArrowHead/Info/PlanetCoordinates.cs new file mode 100644 index 0000000..042fa45 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Info/PlanetCoordinates.cs @@ -0,0 +1,8 @@ +namespace Helldivers.Models.ArrowHead.Info; + +/// +/// Represents a set of coordinates returned by ArrowHead's API. +/// +/// The X coordinate +/// The Y coordinate +public sealed record PlanetCoordinates(double X, double Y); diff --git a/src/Helldivers-2-Models/ArrowHead/Info/PlanetInfo.cs b/src/Helldivers-2-Models/ArrowHead/Info/PlanetInfo.cs new file mode 100644 index 0000000..f49074c --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Info/PlanetInfo.cs @@ -0,0 +1,23 @@ +namespace Helldivers.Models.ArrowHead.Info; + +/// +/// Represents information of a planet from the 'WarInfo' endpoint returned by ArrowHead's API. +/// +/// The numerical identifier for this planet, used as reference by other properties throughout the API (like ). +/// Purpose unknown at this time. +/// A set of X/Y coordinates specifying the position of this planet on the galaxy map. +/// A list of links to other planets (supply lines). +/// The identifier of the sector this planet is located in. +/// The 'health' of this planet, indicates how much liberation it needs to switch sides. +/// Whether this planet is currently considered active in the galactic war. +/// The identifier of the faction that initially owned this planet. +public sealed record PlanetInfo( + int Index, + long SettingsHash, + PlanetCoordinates Position, + List Waypoints, + int Sector, + long MaxHealth, + bool Disabled, + int InitialOwner +); diff --git a/src/Helldivers-2-Models/ArrowHead/NewsFeedItem.cs b/src/Helldivers-2-Models/ArrowHead/NewsFeedItem.cs new file mode 100644 index 0000000..6efb221 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/NewsFeedItem.cs @@ -0,0 +1,15 @@ +namespace Helldivers.Models.ArrowHead; + +/// +/// Represents an item in the newsfeed of Super Earth. +/// +/// The identifier of this newsfeed item. +/// A unix timestamp (in seconds) when this item was published. +/// A numerical type, purpose unknown. +/// The message containing a human readable text. +public sealed record NewsFeedItem( + int Id, + long Published, + int Type, + string Message +); diff --git a/src/Helldivers-2-Models/ArrowHead/Status/Campaign.cs b/src/Helldivers-2-Models/ArrowHead/Status/Campaign.cs new file mode 100644 index 0000000..fb63048 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Status/Campaign.cs @@ -0,0 +1,15 @@ +namespace Helldivers.Models.ArrowHead.Status; + +/// +/// Contains information of ongoing campaigns. +/// +/// The identifier of this campaign. +/// The of the planet this campaign refers to. +/// A numerical type, indicates the type of campaign (see helldivers-2/json). +/// A numerical count, the amount of campaigns the planet has seen. +public sealed record Campaign( + int Id, + int PlanetIndex, + int Type, + int Count +); diff --git a/src/Helldivers-2-Models/ArrowHead/Status/JointOperation.cs b/src/Helldivers-2-Models/ArrowHead/Status/JointOperation.cs new file mode 100644 index 0000000..3805d80 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Status/JointOperation.cs @@ -0,0 +1,13 @@ +namespace Helldivers.Models.ArrowHead.Status; + +/// +/// Represents a joint operation. +/// +/// +/// +/// +public sealed record JointOperation( + int Id, + int PlanetIndex, + int HqNodeIndex +); diff --git a/src/Helldivers-2-Models/ArrowHead/Status/PlanetAttack.cs b/src/Helldivers-2-Models/ArrowHead/Status/PlanetAttack.cs new file mode 100644 index 0000000..717077e --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Status/PlanetAttack.cs @@ -0,0 +1,13 @@ +using Helldivers.Models.ArrowHead.Info; + +namespace Helldivers.Models.ArrowHead.Status; + +/// +/// Represents an attack on a . +/// +/// Where the attack originates from. +/// The planet under attack. +public sealed record PlanetAttack( + int Source, + int Target +); diff --git a/src/Helldivers-2-Models/ArrowHead/Status/PlanetEvent.cs b/src/Helldivers-2-Models/ArrowHead/Status/PlanetEvent.cs new file mode 100644 index 0000000..4661afe --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Status/PlanetEvent.cs @@ -0,0 +1,27 @@ +using Helldivers.Models.ArrowHead.Info; + +namespace Helldivers.Models.ArrowHead.Status; + +/// +/// An ongoing event on a planet. +/// +/// The unique identifier of this event. +/// The index of the planet. +/// A numerical identifier that indicates what type of event this is. +/// The identifier of the faction that owns the planet currently. +/// The current health of the planet. +/// When this event started. +/// When the event will end. +/// The unique identifier of a related campaign. +/// A list of identifiers of related joint operations. +public sealed record PlanetEvent( + int Id, + int PlanetIndex, + int EventType, + int Race, + long Health, + long StartTime, + long ExpireTime, + long CampaignId, + List JointOperationIds +); diff --git a/src/Helldivers-2-Models/ArrowHead/Status/PlanetStatus.cs b/src/Helldivers-2-Models/ArrowHead/Status/PlanetStatus.cs new file mode 100644 index 0000000..670d1e5 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Status/PlanetStatus.cs @@ -0,0 +1,19 @@ +using Helldivers.Models.ArrowHead.Info; + +namespace Helldivers.Models.ArrowHead.Status; + +/// +/// Represents the 'current' status of a planet in the galactic war. +/// +/// The identifier of the this status refers to. +/// The faction currently owning the planet. +/// The current health / liberation of a planet. +/// If left alone, how much the health of the planet would regenerate. +/// The amount of helldivers currently active on this planet. +public sealed record PlanetStatus( + int Index, + int Owner, + long Health, + double RegenPerSecond, + ulong Players +); diff --git a/src/Helldivers-2-Models/ArrowHead/Summary/GalaxyStats.cs b/src/Helldivers-2-Models/ArrowHead/Summary/GalaxyStats.cs new file mode 100644 index 0000000..e6fedb4 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Summary/GalaxyStats.cs @@ -0,0 +1,35 @@ +namespace Helldivers.Models.ArrowHead.Summary; + +/// +/// Represents galaxy wide statistics. +/// +/// The amount of missions won. +/// The amount of missions lost. +/// The total amount of time spent planetside (in seconds). +/// The total amount of bugs killed since start of the season. +/// The total amount of automatons killed since start of the season. +/// The total amount of Illuminate killed since start of the season. +/// The total amount of bullets fired +/// The total amount of bullets hit +/// The total amount of time played (including off-planet) in seconds. +/// The amount of casualties on the side of humanity. +/// The amount of revives(?). +/// The amount of friendly fire casualties. +/// A percentage indicating how many started missions end in success. +/// A percentage indicating average accuracy of Helldivers. +public sealed record GalaxyStats( + ulong MissionsWon, + ulong MissionsLost, + ulong MissionTime, + ulong BugKills, + ulong AutomatonKills, + ulong IlluminateKills, + ulong BulletsFired, + ulong BulletsHit, + ulong TimePlayed, + ulong Deaths, + ulong Revives, + ulong Friendlies, + ulong MissionSuccessRate, + ulong Accurracy +); diff --git a/src/Helldivers-2-Models/ArrowHead/Summary/PlanetStats.cs b/src/Helldivers-2-Models/ArrowHead/Summary/PlanetStats.cs new file mode 100644 index 0000000..f0048c5 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/Summary/PlanetStats.cs @@ -0,0 +1,39 @@ +using Helldivers.Models.ArrowHead.Info; + +namespace Helldivers.Models.ArrowHead.Summary; + +/// +/// Similar to , but scoped to a specific planet. +/// +/// The for which planet these stats are. +/// The amount of missions won. +/// The amount of missions lost. +/// The total amount of time spent planetside (in seconds). +/// The total amount of bugs killed since start of the season. +/// The total amount of automatons killed since start of the season. +/// The total amount of Illuminate killed since start of the season. +/// The total amount of bullets fired +/// The total amount of bullets hit +/// The total amount of time played (including off-planet) in seconds. +/// The amount of casualties on the side of humanity. +/// The amount of revives(?). +/// The amount of friendly fire casualties. +/// A percentage indicating how many started missions end in success. +/// A percentage indicating average accuracy of Helldivers. +public sealed record PlanetStats( + int PlanetIndex, + ulong MissionsWon, + ulong MissionsLost, + ulong MissionTime, + ulong BugKills, + ulong AutomatonKills, + ulong IlluminateKills, + ulong BulletsFired, + ulong BulletsHit, + ulong TimePlayed, + ulong Deaths, + ulong Revives, + ulong Friendlies, + ulong MissionSuccessRate, + ulong Accurracy +); diff --git a/src/Helldivers-2-Models/ArrowHead/WarId.cs b/src/Helldivers-2-Models/ArrowHead/WarId.cs new file mode 100644 index 0000000..df8dc9d --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/WarId.cs @@ -0,0 +1,6 @@ +namespace Helldivers.Models.ArrowHead; + +/// +/// Represents the ID returned from the WarID endpoint. +/// +public sealed record WarId(int Id); diff --git a/src/Helldivers-2-Models/ArrowHead/WarInfo.cs b/src/Helldivers-2-Models/ArrowHead/WarInfo.cs new file mode 100644 index 0000000..4695a66 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/WarInfo.cs @@ -0,0 +1,23 @@ +using Helldivers.Models.ArrowHead.Info; + +namespace Helldivers.Models.ArrowHead; + +/// +/// Represents mostly static information of the current galactic war. +/// +/// The identifier of the war season this represents. +/// A unix timestamp (in seconds) when this season started. +/// A unix timestamp (in seconds) when this season will end. +/// A version string indicating the minimum game client version the API supports. +/// A list of planets involved in this season's war. +/// A list of homeworlds for the races (factions) involved in this war. +public sealed record WarInfo( + int WarId, + long StartDate, + long EndDate, + string MinimumClientVersion, + List PlanetInfos, + List HomeWorlds +// TODO: capitalInfo's +// TODO planetPermanentEffects +); diff --git a/src/Helldivers-2-Models/ArrowHead/WarStatus.cs b/src/Helldivers-2-Models/ArrowHead/WarStatus.cs new file mode 100644 index 0000000..5b46e83 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/WarStatus.cs @@ -0,0 +1,32 @@ +using Helldivers.Models.ArrowHead.Status; + +namespace Helldivers.Models.ArrowHead; + +/// +/// Represents a snapshot of the current status of the galactic war. +/// +/// The war season this snapshot refers to. +/// The time this snapshot was taken. +/// This is the factor by which XP at the end of a mission is multiplied to calculate the impact on liberation +/// Internal identifier, purpose unknown. +/// A list of statuses for planets. +/// A list of attacks currently ongoing. +/// A list of ongoing campaigns in the galactic war. +/// A list of s. +/// A list of ongoing s. +public sealed record WarStatus( + int WarId, + long Time, + double ImpactMultiplier, + long StoryBeatId32, + List PlanetStatus, + List PlanetAttacks, + List Campaigns, + // TODO CommunityTargets + List JointOperations, + List PlanetEvents +// TODO PlanetActiveEffects +// TODO activeElectionPolicyEffects +// TODO globalEvents +// TODO superEarthWarResults +); diff --git a/src/Helldivers-2-Models/ArrowHead/WarSummary.cs b/src/Helldivers-2-Models/ArrowHead/WarSummary.cs new file mode 100644 index 0000000..9ca8073 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHead/WarSummary.cs @@ -0,0 +1,22 @@ +using Helldivers.Models.ArrowHead.Summary; +using System.Text.Json.Serialization; + +namespace Helldivers.Models.ArrowHead; + +/// +/// Gets general statistics about the galaxy and specific planets. +/// +public sealed record WarSummary +{ + /// + /// Contains galaxy wide statistics aggregated from all planets. + /// + [JsonPropertyName("galaxy_stats")] + public GalaxyStats GalaxyStats { get; set; } = null!; + + /// + /// Contains statistics for specific planets. + /// + [JsonPropertyName("planets_stats")] + public List PlanetsStats { get; set; } = null!; +} diff --git a/src/Helldivers-2-Models/ArrowHeadSerializerContext.cs b/src/Helldivers-2-Models/ArrowHeadSerializerContext.cs new file mode 100644 index 0000000..008c0e5 --- /dev/null +++ b/src/Helldivers-2-Models/ArrowHeadSerializerContext.cs @@ -0,0 +1,20 @@ +using Helldivers.Models.ArrowHead; +using System.Text.Json.Serialization; + +namespace Helldivers.Models; + +/// +/// Source generated for ArrowHead models. +/// +[JsonSerializable(typeof(WarId))] +[JsonSerializable(typeof(WarInfo))] +[JsonSerializable(typeof(WarStatus))] +[JsonSerializable(typeof(NewsFeedItem))] +[JsonSerializable(typeof(WarSummary))] +[JsonSerializable(typeof(List))] +[JsonSerializable(typeof(List))] +[JsonSourceGenerationOptions(PropertyNameCaseInsensitive = true)] +public sealed partial class ArrowHeadSerializerContext : JsonSerializerContext +{ + +} diff --git a/src/Helldivers-2-Models/Domain/Localization/LocalizedMessage.cs b/src/Helldivers-2-Models/Domain/Localization/LocalizedMessage.cs new file mode 100644 index 0000000..9098199 --- /dev/null +++ b/src/Helldivers-2-Models/Domain/Localization/LocalizedMessage.cs @@ -0,0 +1,40 @@ +using System.Globalization; +using System.Text.Json.Serialization; + +namespace Helldivers.Models.Domain.Localization; + +/// +/// Represents a string that is available in multiple languages. +/// +/// A list of all messages and the in which they are available. +[JsonConverter(typeof(LocalizedMessageConverter))] +public sealed record LocalizedMessage(IReadOnlyDictionary Messages) +{ + /// + /// The culture to retrieve when the is not available. + /// + public static CultureInfo FallbackCulture { get; set; } = null!; + + /// + /// Factory method for creating a from a list of {language, value} pairs. + /// + public static LocalizedMessage FromStrings(IEnumerable> values) + { + var messages = values.SelectMany(pair => + { + var (key, value) = pair; + var culture = new CultureInfo(key); + var parent = culture.Parent; + + return new[] + { + new KeyValuePair(culture, value), + new KeyValuePair(parent, value) + }; + }) + .DistinctBy(pair => pair.Key) + .ToDictionary(pair => pair.Key, pair => pair.Value); + + return new LocalizedMessage(messages); + } +} diff --git a/src/Helldivers-2-Models/Domain/Localization/LocalizedMessageConverter.cs b/src/Helldivers-2-Models/Domain/Localization/LocalizedMessageConverter.cs new file mode 100644 index 0000000..e1d5618 --- /dev/null +++ b/src/Helldivers-2-Models/Domain/Localization/LocalizedMessageConverter.cs @@ -0,0 +1,32 @@ +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Helldivers.Models.Domain.Localization; + +internal sealed class LocalizedMessageConverter : JsonConverter +{ + /// + public override LocalizedMessage? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + throw new InvalidOperationException($"Unable to deserialize {nameof(LocalizedMessage)} from JSON"); + } + + /// + public override void Write(Utf8JsonWriter writer, LocalizedMessage value, JsonSerializerOptions options) + { + if (value.Messages.TryGetValue(CultureInfo.CurrentCulture, out var result) is false) + { + if (value.Messages.TryGetValue(CultureInfo.CurrentCulture.Parent, out result) is false) + { + // Fall back to the configured default culture if one is available + value.Messages.TryGetValue(LocalizedMessage.FallbackCulture, out result); + } + } + + if (string.IsNullOrWhiteSpace(result) is false) + writer.WriteStringValue(result); + + else writer.WriteNullValue(); + } +} diff --git a/src/Helldivers-2-Models/Helldivers-2-Models.csproj b/src/Helldivers-2-Models/Helldivers-2-Models.csproj new file mode 100644 index 0000000..541b6e2 --- /dev/null +++ b/src/Helldivers-2-Models/Helldivers-2-Models.csproj @@ -0,0 +1,17 @@ + + + + true + Helldivers.Models + + + + + + + + + + + + diff --git a/src/Helldivers-2-Models/Steam/SteamAppNews.cs b/src/Helldivers-2-Models/Steam/SteamAppNews.cs new file mode 100644 index 0000000..5ed452f --- /dev/null +++ b/src/Helldivers-2-Models/Steam/SteamAppNews.cs @@ -0,0 +1,11 @@ +namespace Helldivers.Models.Steam; + +/// +/// Represents the response of the Steam news feed API call. +/// +/// The appid of Helldivers 2 on Steam. +/// A list of newsfeed items. +public sealed record SteamAppNews( + long AppId, + List NewsItems +); diff --git a/src/Helldivers-2-Models/Steam/SteamNewsFeed.cs b/src/Helldivers-2-Models/Steam/SteamNewsFeed.cs new file mode 100644 index 0000000..cb6f903 --- /dev/null +++ b/src/Helldivers-2-Models/Steam/SteamNewsFeed.cs @@ -0,0 +1,9 @@ +namespace Helldivers.Models.Steam; + +/// +/// Represents the response of the Steam news feed API call. +/// +/// Contains the object. +public sealed record SteamNewsFeed( + SteamAppNews AppNews +); diff --git a/src/Helldivers-2-Models/Steam/SteamNewsFeedItem.cs b/src/Helldivers-2-Models/Steam/SteamNewsFeedItem.cs new file mode 100644 index 0000000..9f0656c --- /dev/null +++ b/src/Helldivers-2-Models/Steam/SteamNewsFeedItem.cs @@ -0,0 +1,19 @@ +namespace Helldivers.Models.Steam; + +/// +/// Represents a single item in the Steam news feed response. +/// +/// A unique identifier assigned by Steam. +/// The title of the news article. +/// The URL to the full article on Steam +/// The name of the author that released the news item. +/// The contents of the news item. +/// When the news item was published. +public sealed record SteamNewsFeedItem( + string Gid, + string Title, + string Url, + string Author, + string Contents, + long Date +); diff --git a/src/Helldivers-2-Models/SteamSerializerContext.cs b/src/Helldivers-2-Models/SteamSerializerContext.cs new file mode 100644 index 0000000..09744f5 --- /dev/null +++ b/src/Helldivers-2-Models/SteamSerializerContext.cs @@ -0,0 +1,16 @@ +using Helldivers.Models.Steam; +using Helldivers.Models.V1; +using System.Text.Json.Serialization; + +namespace Helldivers.Models; + +/// +/// Source generated for Steam models. +/// +[JsonSerializable(typeof(SteamNewsFeed))] +[JsonSerializable(typeof(List))] +[JsonSourceGenerationOptions(PropertyNameCaseInsensitive = true)] +public sealed partial class SteamSerializerContext : JsonSerializerContext +{ + // +} diff --git a/src/Helldivers-2-Models/V1/Assignment.cs b/src/Helldivers-2-Models/V1/Assignment.cs new file mode 100644 index 0000000..a2105f2 --- /dev/null +++ b/src/Helldivers-2-Models/V1/Assignment.cs @@ -0,0 +1,24 @@ +using Helldivers.Models.Domain.Localization; +using Helldivers.Models.V1.Assignments; +using Task = Helldivers.Models.V1.Assignments.Task; + +namespace Helldivers.Models.V1; + +/// +/// Represents an assignment given by Super Earth to the community. +/// This is also known as 'Major Order's in the game. +/// +/// The unique identifier of this assignment. +/// The title of the assignment. +/// A long form description of the assignment, usually contains context. +/// A very short summary of the description. +/// A list of tasks that need to be completed for this assignment. +/// The reward for completing the assignment. +public sealed record Assignment( + long Id, + LocalizedMessage Title, + LocalizedMessage Briefing, + LocalizedMessage Description, + List Tasks, + Reward Reward +); diff --git a/src/Helldivers-2-Models/V1/Assignments/Reward.cs b/src/Helldivers-2-Models/V1/Assignments/Reward.cs new file mode 100644 index 0000000..e0337da --- /dev/null +++ b/src/Helldivers-2-Models/V1/Assignments/Reward.cs @@ -0,0 +1,11 @@ +namespace Helldivers.Models.V1.Assignments; + +/// +/// The reward for completing an . +/// +/// The type of reward (medals, super credits, ...). +/// The amount of that will be awarded. +public sealed record Reward( + int Type, // TODO: map to enum + int Amount +); diff --git a/src/Helldivers-2-Models/V1/Assignments/Task.cs b/src/Helldivers-2-Models/V1/Assignments/Task.cs new file mode 100644 index 0000000..eed61ce --- /dev/null +++ b/src/Helldivers-2-Models/V1/Assignments/Task.cs @@ -0,0 +1,14 @@ +namespace Helldivers.Models.V1.Assignments; + +/// +/// Represents a task in an that needs to be completed +/// to finish the assignment. +/// +/// The type of task this represents. +/// A list of numbers, purpose unknown. +/// A list of numbers, purpose unknown +public sealed record Task( + int Type, + List Values, + List ValueTypes +); diff --git a/src/Helldivers-2-Models/V1/Campaign.cs b/src/Helldivers-2-Models/V1/Campaign.cs new file mode 100644 index 0000000..086da7a --- /dev/null +++ b/src/Helldivers-2-Models/V1/Campaign.cs @@ -0,0 +1,15 @@ +namespace Helldivers.Models.V1; + +/// +/// Represents an ongoing campaign on a planet. +/// +/// The unique identifier of this . +/// The planet on which this campaign is being fought. +/// The type of campaign, this should be mapped onto an enum. +/// Indicates how many campaigns have already been fought on this . +public record Campaign( + int Id, + Planet Planet, + int Type, // TODO: map to enum + int Count +); diff --git a/src/Helldivers-2-Models/V1/Dispatch.cs b/src/Helldivers-2-Models/V1/Dispatch.cs new file mode 100644 index 0000000..4d73ac3 --- /dev/null +++ b/src/Helldivers-2-Models/V1/Dispatch.cs @@ -0,0 +1,17 @@ +using Helldivers.Models.Domain.Localization; + +namespace Helldivers.Models.V1; + +/// +/// A message from high command to the players, usually updates on the status of the war effort. +/// +/// The unique identifier of this dispatch. +/// When the dispatch was published. +/// The type of dispatch, purpose unknown. +/// The message this dispatch represents. +public sealed record Dispatch( + int Id, + DateTime Published, + int Type, + LocalizedMessage Message +); diff --git a/src/Helldivers-2-Models/V1/Planet.cs b/src/Helldivers-2-Models/V1/Planet.cs new file mode 100644 index 0000000..6799247 --- /dev/null +++ b/src/Helldivers-2-Models/V1/Planet.cs @@ -0,0 +1,37 @@ +using Helldivers.Models.V1.Planets; + +namespace Helldivers.Models.V1; + +/// +/// Contains all aggregated information AH has about a planet. +/// +/// The unique identifier ArrowHead assigned to this planet. +/// The name of the planet, as shown in game. +/// The name of the sector the planet is in, as shown in game. +/// A hash assigned to the planet by ArrowHead, purpose unknown. +/// The coordinates of this planet on the galactic war map. +/// A list of of all the planets to which this planet is connected. +/// The maximum health pool of this planet. +/// The current planet this planet has. +/// Whether or not this planet is disabled, as assigned by ArrowHead. +/// The faction that originally owned the planet. +/// The faction that currently controls the planet. +/// How much the planet regenerates per second if left alone. +/// Information on the active event ongoing on this planet, if one is active. +/// A set of statistics scoped to this planet. +public record Planet( + int Index, + string Name, + string Sector, + long Hash, + Position Position, + List Waypoints, + long MaxHealth, + long Health, + bool Disabled, + string InitialOwner, + string CurrentOwner, + double RegenPerSecond, + Event? Event, + Statistics Statistics +); diff --git a/src/Helldivers-2-Models/V1/Planets/Event.cs b/src/Helldivers-2-Models/V1/Planets/Event.cs new file mode 100644 index 0000000..2da773c --- /dev/null +++ b/src/Helldivers-2-Models/V1/Planets/Event.cs @@ -0,0 +1,23 @@ +namespace Helldivers.Models.V1.Planets; + +/// +/// An ongoing event on a . +/// +/// The unique identifier of this event. +/// The type of event. +/// The faction that initiated the event. +/// The health of the at the time of snapshot. +/// When the event started. +/// When the event will end. +/// The identifier of the linked to this event. +/// A list of joint operation identifier linked to this event. +public sealed record Event( + int Id, + int EventType, + string Faction, + long Health, + DateTime StartTime, + DateTime EndTime, + long CampaignId, + List JointOperationIds +); diff --git a/src/Helldivers-2-Models/V1/Planets/Position.cs b/src/Helldivers-2-Models/V1/Planets/Position.cs new file mode 100644 index 0000000..305118e --- /dev/null +++ b/src/Helldivers-2-Models/V1/Planets/Position.cs @@ -0,0 +1,11 @@ +namespace Helldivers.Models.V1; + +/// +/// Represents a position on the galactic war map. +/// +/// The X coordinate. +/// The Y coordinate. +public record struct Position( + double X, + double Y +); diff --git a/src/Helldivers-2-Models/V1/Statistics.cs b/src/Helldivers-2-Models/V1/Statistics.cs new file mode 100644 index 0000000..7b86f4f --- /dev/null +++ b/src/Helldivers-2-Models/V1/Statistics.cs @@ -0,0 +1,37 @@ +namespace Helldivers.Models.V1; + +/// +/// Contains statistics of missions, kills, success rate etc. +/// +/// The amount of missions won. +/// The amount of missions lost. +/// The total amount of time spent planetside (in seconds). +/// The total amount of bugs killed since start of the season. +/// The total amount of automatons killed since start of the season. +/// The total amount of Illuminate killed since start of the season. +/// The total amount of bullets fired +/// The total amount of bullets hit +/// The total amount of time played (including off-planet) in seconds. +/// The amount of casualties on the side of humanity. +/// The amount of revives(?). +/// The amount of friendly fire casualties. +/// A percentage indicating how many started missions end in success. +/// A percentage indicating average accuracy of Helldivers. +/// The total amount of players present (at the time of the snapshot). +public sealed record Statistics( + ulong MissionsWon, + ulong MissionsLost, + ulong MissionTime, + ulong TerminidKills, + ulong AutomatonKills, + ulong IlluminateKills, + ulong BulletsFired, + ulong BulletsHit, + ulong TimePlayed, + ulong Deaths, + ulong Revives, + ulong Friendlies, + ulong MissionSuccessRate, + ulong Accuracy, + ulong PlayerCount +); diff --git a/src/Helldivers-2-Models/V1/SteamNews.cs b/src/Helldivers-2-Models/V1/SteamNews.cs new file mode 100644 index 0000000..ba6f7ae --- /dev/null +++ b/src/Helldivers-2-Models/V1/SteamNews.cs @@ -0,0 +1,19 @@ +namespace Helldivers.Models.V1; + +/// +/// Represents a new article from Steam's news feed. +/// +/// The identifier assigned by Steam to this news item. +/// The title of the Steam news item. +/// The URL to Steam where this news item was posted. +/// The author who posted this message on Steam. +/// The message posted by Steam, currently in Steam's weird markdown format. +/// When this message was posted. +public sealed record SteamNews( + string Id, + string Title, + string Url, + string Author, + string Content, + DateTime PublishedAt +); diff --git a/src/Helldivers-2-Models/V1/War.cs b/src/Helldivers-2-Models/V1/War.cs new file mode 100644 index 0000000..761c98c --- /dev/null +++ b/src/Helldivers-2-Models/V1/War.cs @@ -0,0 +1,21 @@ +namespace Helldivers.Models.V1; + +/// +/// Global information of the ongoing war. +/// +/// When this war was started. +/// When this war will end (or has ended). +/// The time the snapshot of the war was taken, also doubles as the timestamp of which all other data dates from. +/// The minimum game client version required to play in this war. +/// A list of factions currently involved in the war. +/// A fraction used to calculate the impact of a mission on the war effort. +/// The statistics available for the galaxy wide war effort. +public record War( + DateTime Started, + DateTime Ended, + DateTime Now, + string ClientVersion, + List Factions, + double ImpactMultiplier, + Statistics Statistics +); diff --git a/src/Helldivers-2-Models/V1SerializerContext.cs b/src/Helldivers-2-Models/V1SerializerContext.cs new file mode 100644 index 0000000..291dcfa --- /dev/null +++ b/src/Helldivers-2-Models/V1SerializerContext.cs @@ -0,0 +1,25 @@ +using Helldivers.Models.V1; +using System.Text.Json.Serialization; + +namespace Helldivers.Models; + +/// +/// Source generated for V1's models. +/// +[JsonSerializable(typeof(Assignment))] +[JsonSerializable(typeof(List))] +[JsonSerializable(typeof(Campaign))] +[JsonSerializable(typeof(List))] +[JsonSerializable(typeof(Dispatch))] +[JsonSerializable(typeof(List))] +[JsonSerializable(typeof(Planet))] +[JsonSerializable(typeof(List))] +[JsonSerializable(typeof(Statistics))] +[JsonSerializable(typeof(SteamNews))] +[JsonSerializable(typeof(List))] +[JsonSerializable(typeof(War))] +[JsonSourceGenerationOptions(PropertyNameCaseInsensitive = true, UseStringEnumConverter = true)] +public sealed partial class V1SerializerContext : JsonSerializerContext +{ + +} diff --git a/src/Helldivers-2-Models/json b/src/Helldivers-2-Models/json new file mode 160000 index 0000000..982fa0b --- /dev/null +++ b/src/Helldivers-2-Models/json @@ -0,0 +1 @@ +Subproject commit 982fa0b0d090f7d57b860e07655591864d5334cd diff --git a/src/Helldivers-2-SourceGen/Helldivers-2-SourceGen.csproj b/src/Helldivers-2-SourceGen/Helldivers-2-SourceGen.csproj new file mode 100644 index 0000000..218e9a4 --- /dev/null +++ b/src/Helldivers-2-SourceGen/Helldivers-2-SourceGen.csproj @@ -0,0 +1,59 @@ + + + + netstandard2.0 + false + enable + latest + + true + true + + Helldivers.SourceGen + Helldivers.SourceGen + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + @(NuGetPackageId -> Distinct()) + + + + + + + + @(PackageReferenceDependency -> '%(LocalSourceGenerators)') + + + + + + + + diff --git a/src/Helldivers-2-SourceGen/Properties/launchSettings.json b/src/Helldivers-2-SourceGen/Properties/launchSettings.json new file mode 100644 index 0000000..d36bdfc --- /dev/null +++ b/src/Helldivers-2-SourceGen/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "DebugRoslynSourceGenerator": { + "commandName": "DebugRoslynComponent", + "targetProject": "../Helldivers_2_SourceGen.Sample/Helldivers_2_SourceGen.Sample.csproj" + } + } +} \ No newline at end of file diff --git a/src/Helldivers-2-SourceGen/Readme.md b/src/Helldivers-2-SourceGen/Readme.md new file mode 100644 index 0000000..5da4e80 --- /dev/null +++ b/src/Helldivers-2-SourceGen/Readme.md @@ -0,0 +1,29 @@ +# Roslyn Source Generators Sample + +A set of three projects that illustrates Roslyn source generators. Enjoy this template to learn from and modify source generators for your own needs. + +## Content +### Helldivers_2_SourceGen +A .NET Standard project with implementations of sample source generators. +**You must build this project to see the result (generated code) in the IDE.** + +- [SampleSourceGenerator.cs](SampleSourceGenerator.cs): A source generator that creates C# classes based on a text file (in this case, Domain Driven Design ubiquitous language registry). +- [SampleIncrementalSourceGenerator.cs](SampleIncrementalSourceGenerator.cs): A source generator that creates a custom report based on class properties. The target class should be annotated with the `Generators.ReportAttribute` attribute. + +### Helldivers_2_SourceGen.Sample +A project that references source generators. Note the parameters of `ProjectReference` in [Helldivers_2_SourceGen.Sample.csproj](../Helldivers_2_SourceGen.Sample/Helldivers_2_SourceGen.Sample.csproj), they make sure that the project is referenced as a set of source generators. + +### Helldivers_2_SourceGen.Tests +Unit tests for source generators. The easiest way to develop language-related features is to start with unit tests. + +## How To? +### How to debug? +- Use the [launchSettings.json](Properties/launchSettings.json) profile. +- Debug tests. + +### How can I determine which syntax nodes I should expect? +Consider installing the Roslyn syntax tree viewer plugin [Rossynt](https://plugins.jetbrains.com/plugin/16902-rossynt/). + +### How to learn more about wiring source generators? +Watch the walkthrough video: [Let’s Build an Incremental Source Generator With Roslyn, by Stefan Pölz](https://youtu.be/azJm_Y2nbAI) +The complete set of information is available in [Source Generators Cookbook](https://github.com/dotnet/roslyn/blob/main/docs/features/source-generators.cookbook.md). \ No newline at end of file diff --git a/src/Helldivers-2-SourceGen/StaticJsonSourceGenerator.cs b/src/Helldivers-2-SourceGen/StaticJsonSourceGenerator.cs new file mode 100644 index 0000000..46ee0bc --- /dev/null +++ b/src/Helldivers-2-SourceGen/StaticJsonSourceGenerator.cs @@ -0,0 +1,108 @@ +using Microsoft.CodeAnalysis; +using System.Text; +using System.Text.Json; + +namespace Helldivers.SourceGen; + +/// +/// A sample source generator that creates C# classes based on the text file (in this case, Domain Driven Design ubiquitous language registry). +/// When using a simple text file as a baseline, we can create a non-incremental source generator. +/// +[Generator] +public class StaticJsonSourceGenerator : ISourceGenerator +{ + /// + public void Initialize(GeneratorInitializationContext context) + { + // No initialization required for this generator. + } + + /// + public void Execute(GeneratorExecutionContext context) + { + foreach (var file in context.AdditionalFiles) + { + if (file is null) + continue; + + var name = Path.GetFileNameWithoutExtension(file.Path); + name = $"{char.ToUpper(name[0])}{name.Substring(1)}"; + + try + { + var json = file.GetText(context.CancellationToken)?.ToString() ?? throw new InvalidOperationException($"Cannot generate C# from missing JSON file {file.Path}"); + + var (type, value) = name.ToLowerInvariant() switch + { + "planets" => ParseNumericDictionary(json), + "factions" => ParseNumericDictionary(json), + "sectors" => ParseNumericListDictionary(json), + _ => throw new Exception($"Generator does not know how to parse {name}") + }; + + var source = $@"// +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +using global::System.Collections.Generic; + +namespace Helldivers.Models; + +public static partial class Static +{{ + /// Public list of {name} entries from {Path.GetFileName(file.Path)} + public static {type} {name} = {value}; +}} +"; + + context.AddSource($"{name}.g.cs", source); + } + catch (Exception exception) + { + context.AddSource($"{name}.g.cs", $"// An exception was thrown processing {name}.json\n{exception.ToString()}"); + context.ReportDiagnostic( + Diagnostic.Create( + new DiagnosticDescriptor( + id: "HDJSON", // Unique ID for your error + title: "JSON source generator failed", // Title of the error + messageFormat: $"An error occured generating C# code from JSON files: {exception}", // Message format + category: "HD2", // Category of the error + DiagnosticSeverity.Error, // Severity of the error + isEnabledByDefault: true // Whether the error is enabled by default + ), + Location.None // No specific location provided for simplicity + ) + ); + } + } + } + + /// + /// Parses a JSON file that's an object where keys are numerical and values are names (strings). + /// + private (string Type, string Source) ParseNumericDictionary(string json) + { + var builder = new StringBuilder("new Dictionary()\n\t{\n"); + var entries = JsonSerializer.Deserialize>(json)!; + foreach (var pair in entries) + builder.AppendLine($@"{'\t'}{'\t'}{{ {pair.Key}, ""{pair.Value}"" }},"); + + builder.Append("\t}"); + return ("IReadOnlyDictionary", builder.ToString()); + } + + /// + /// Parses a JSON file that's an object where keys are strings and values are lists of integers. + /// + private (string Type, string Source) ParseNumericListDictionary(string json) + { + var builder = new StringBuilder("new Dictionary>()\n\t{\n"); + var entries = JsonSerializer.Deserialize>>(json, new JsonSerializerOptions())!; + foreach (var pair in entries) + { + var values = string.Join(", ", pair.Value); + builder.AppendLine($@"{'\t'}{'\t'}{{ ""{pair.Key}"", [{values}] }},"); + } + + builder.Append("\t}"); + return ("IReadOnlyDictionary>", builder.ToString()); + } +} diff --git a/src/Helldivers-2-Sync/Configuration/HelldiversSyncConfiguration.cs b/src/Helldivers-2-Sync/Configuration/HelldiversSyncConfiguration.cs new file mode 100644 index 0000000..9662923 --- /dev/null +++ b/src/Helldivers-2-Sync/Configuration/HelldiversSyncConfiguration.cs @@ -0,0 +1,22 @@ +namespace Helldivers.Sync.Configuration; + +/// +/// Represents configuration for the synchronization system of the Helldivers 2 API. +/// +public sealed class HelldiversSyncConfiguration +{ + /// + /// The interval (in seconds) at which the sync services will fetch information from the API. + /// + public int IntervalSeconds { get; set; } = 10; + + /// + /// The default language which the API will use. + /// + public string DefaultLanguage { get; set; } = "en-US"; + + /// + /// A list of language codes for which translations will be provided. + /// + public List Languages { get; set; } = new(0); +} diff --git a/src/Helldivers-2-Sync/Extensions/ServiceCollectionExtensions.cs b/src/Helldivers-2-Sync/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..701aa36 --- /dev/null +++ b/src/Helldivers-2-Sync/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,27 @@ +using Helldivers.Sync.Hosted; +using Helldivers.Sync.Services; +using Microsoft.Extensions.DependencyInjection; + +namespace Helldivers.Sync.Extensions; + +/// +/// Contains extension methods for . +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds all services related to the Helldivers API to the service container. + /// + public static IServiceCollection AddHelldiversSync(this IServiceCollection services) + { + services.AddHostedService(); + services.AddHostedService(); + services.AddHttpClient(); + services.AddHttpClient(http => + { + http.BaseAddress = new Uri("https://api.live.prod.thehelldiversgame.com"); + }); + + return services; + } +} diff --git a/src/Helldivers-2-Sync/Helldivers-2-Sync.csproj b/src/Helldivers-2-Sync/Helldivers-2-Sync.csproj new file mode 100644 index 0000000..67c2d7c --- /dev/null +++ b/src/Helldivers-2-Sync/Helldivers-2-Sync.csproj @@ -0,0 +1,18 @@ + + + + true + Helldivers.Sync + + + + + + + + + + + + + diff --git a/src/Helldivers-2-Sync/Hosted/ArrowHeadSyncService.cs b/src/Helldivers-2-Sync/Hosted/ArrowHeadSyncService.cs new file mode 100644 index 0000000..4b2b8e7 --- /dev/null +++ b/src/Helldivers-2-Sync/Hosted/ArrowHeadSyncService.cs @@ -0,0 +1,167 @@ +using Helldivers.Core; +using Helldivers.Models.ArrowHead; +using Helldivers.Sync.Configuration; +using Helldivers.Sync.Services; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System.Diagnostics; +using System.Globalization; + +namespace Helldivers.Sync.Hosted; + +/// +/// The background synchronization service that pulls information from ArrowHead's API (through ) +/// and updates the . +/// +public sealed partial class ArrowHeadSyncService( + ILogger logger, + IServiceScopeFactory scopeFactory, + IOptions configuration, + StorageFacade storage +) : BackgroundService +{ + #region Source generated logging + + [LoggerMessage(Level = LogLevel.Information, Message = "sync will run every {Interval}")] + private static partial void LogRunAtInterval(ILogger logger, TimeSpan interval); + + [LoggerMessage(Level = LogLevel.Error, Message = "An exception was thrown when synchronizing from ArrowHead API")] + private static partial void LogSyncThrewAnError(ILogger logger, Exception exception); + + [LoggerMessage(LogLevel.Information, Message = "Finished synchronizing from ArrowHead API in {Duration}")] + private static partial void LogFinishedSynchronize(ILogger logger, TimeSpan duration); + + [LoggerMessage(LogLevel.Warning, Message = "Failed to download translations for {Language} of {Type}")] + private static partial void LogFailedToLoadTranslation(ILogger logger, Exception exception, string language, + string type); + + #endregion + + /// + protected override async Task ExecuteAsync(CancellationToken cancellationToken) + { + var delay = TimeSpan.FromSeconds(configuration.Value.IntervalSeconds); + + LogRunAtInterval(logger, delay); + while (cancellationToken.IsCancellationRequested is false) + { + try + { + var stopwatch = new Stopwatch(); + await using var scope = scopeFactory.CreateAsyncScope(); + + stopwatch.Start(); + await SynchronizeAsync(scope.ServiceProvider, cancellationToken); + stopwatch.Stop(); + + LogFinishedSynchronize(logger, stopwatch.Elapsed); + } + catch (Exception exception) + { + LogSyncThrewAnError(logger, exception); + } + + await Task.Delay(delay, cancellationToken); + } + } + + private async Task SynchronizeAsync(IServiceProvider services, CancellationToken cancellationToken) + { + var api = services.GetRequiredService(); + + var warId = await api.GetCurrentSeason(cancellationToken); + var season = warId.Id.ToString(CultureInfo.InvariantCulture); + var warInfo = await api.GetWarInfo(season, cancellationToken); + var warSummary = await api.GetSummary(season, cancellationToken); + + // For each language, load war status. + var statuses = await DownloadTranslations( + language => api.GetWarStatus(season, language, cancellationToken), + cancellationToken + ); + + // For each language, load news feed. + var feeds = await DownloadTranslations( + async language => await api.LoadFeed(season, language, cancellationToken).ToListAsync(cancellationToken), + cancellationToken + ); + + // For each language, load assignments + var assignments = await DownloadTranslations( + async language => await api.LoadAssignments(season, language, cancellationToken).ToListAsync(cancellationToken), + cancellationToken + ); + + await storage.UpdateStores( + warId, + warInfo, + statuses, + warSummary, + feeds, + assignments + ); + } + + private async Task> DownloadTranslations(Func> func, CancellationToken cancellationToken) where T : class + { + return await configuration.Value.Languages + .ToAsyncEnumerable() + .Select(async language => + { + try + { + var result = await func(language); + + return new KeyValuePair(language, result); + } + catch (Exception exception) + { + LogFailedToLoadTranslation(logger, exception, language, typeof(T).Name); + + return new KeyValuePair(language, null); + } + }) + .SelectAwait(async task => await task) + .Where(pair => pair.Value is not null) + .ToDictionaryAsync(pair => pair.Key, pair => pair.Value!, cancellationToken: cancellationToken); + } + + /// Helper function to download the war status or return null if anything fails. + private async ValueTask> AttemptToLoadWarStatus(ArrowHeadApiService arrowHeadApi, string season, + string language, CancellationToken cancellationToken) + { + try + { + var status = await arrowHeadApi.GetWarStatus(season, language, cancellationToken); + + return new(language, status); + } + catch (Exception exception) + { + LogFailedToLoadTranslation(logger, exception, language, nameof(WarStatus)); + + return new(language, null); + } + } + + /// Helper function to download a list of or return null if anything fails. + private async ValueTask?>> AttemptToLoadTranslations( + Func> api, string season, string language, + CancellationToken cancellationToken) + { + try + { + var items = await api(season, language, cancellationToken).ToListAsync(cancellationToken); + + return new(language, items); + } + catch (Exception exception) + { + LogFailedToLoadTranslation(logger, exception, language, typeof(T).Name); + + return new(language, null); + } + } +} diff --git a/src/Helldivers-2-Sync/Hosted/SteamSyncService.cs b/src/Helldivers-2-Sync/Hosted/SteamSyncService.cs new file mode 100644 index 0000000..17d3631 --- /dev/null +++ b/src/Helldivers-2-Sync/Hosted/SteamSyncService.cs @@ -0,0 +1,61 @@ +using Helldivers.Core; +using Helldivers.Sync.Services; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System.Diagnostics; + +namespace Helldivers.Sync.Hosted; + +/// +/// Handles synchronization of Steam API information. +/// +public sealed partial class SteamSyncService( + ILogger logger, + StorageFacade storage, + IServiceScopeFactory scopeFactory +) : BackgroundService +{ + #region Source generated logging + + [LoggerMessage(Level = LogLevel.Error, Message = "An exception was thrown when synchronizing from Steam API")] + private static partial void LogSyncThrewAnError(ILogger logger, Exception exception); + + [LoggerMessage(LogLevel.Information, Message = "Finished synchronizing from Steam API in {Duration}")] + private static partial void LogFinishedSynchronize(ILogger logger, TimeSpan duration); + + #endregion + + /// + protected override async Task ExecuteAsync(CancellationToken cancellationToken) + { + var delay = TimeSpan.FromHours(1); + + while (cancellationToken.IsCancellationRequested is false) + { + try + { + var stopwatch = new Stopwatch(); + await using var scope = scopeFactory.CreateAsyncScope(); + + stopwatch.Start(); + + var feed = await scope + .ServiceProvider + .GetRequiredService() + .GetLatest(); + + await storage.UpdateStores(feed); + + stopwatch.Stop(); + LogFinishedSynchronize(logger, stopwatch.Elapsed); + } + catch (Exception exception) + { + LogSyncThrewAnError(logger, exception); + } + + await Task.Delay(delay, cancellationToken); + } + } +} diff --git a/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs b/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs new file mode 100644 index 0000000..6fa2413 --- /dev/null +++ b/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs @@ -0,0 +1,128 @@ +using Helldivers.Models; +using Helldivers.Models.ArrowHead; +using Helldivers.Sync.Configuration; +using Microsoft.Extensions.Options; +using System.Net.Http.Headers; +using System.Runtime.CompilerServices; +using System.Text.Json; + +namespace Helldivers.Sync.Services; + +/// +/// Handles communication with the ArrowHead API. +/// +public sealed class ArrowHeadApiService( + IOptions options, + HttpClient http +) +{ + /// + /// Gets the identifier of the current war season from ArrowHead's API. + /// + public async Task GetCurrentSeason(CancellationToken cancellationToken) + { + var request = BuildRequest("/api/WarSeason/current/WarID"); + using var response = await http.SendAsync(request, cancellationToken); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); + var warId = await JsonSerializer + .DeserializeAsync(stream, ArrowHeadSerializerContext.Default.WarId, cancellationToken) + ?? throw new InvalidOperationException(); + + return warId; + } + + /// + /// Fetch from ArrowHead's API. + /// + public async Task GetWarInfo(string season, CancellationToken cancellationToken) + { + var request = BuildRequest($"/api/WarSeason/{season}/WarInfo"); + using var response = await http.SendAsync(request, cancellationToken); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); + + return await JsonSerializer + .DeserializeAsync(stream, ArrowHeadSerializerContext.Default.WarInfo, cancellationToken) + ?? throw new InvalidOperationException(); + } + + /// + /// Fetch from ArrowHead's API. + /// + public async Task GetWarStatus(string season, string language, CancellationToken cancellationToken) + { + var request = BuildRequest($"/api/WarSeason/{season}/Status", language); + using var response = await http.SendAsync(request, cancellationToken); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); + + return await JsonSerializer + .DeserializeAsync(stream, ArrowHeadSerializerContext.Default.WarStatus, cancellationToken) + ?? throw new InvalidOperationException(); + } + + /// + /// Fetch the newsfeed of a given in . + /// + public async IAsyncEnumerable LoadFeed(string season, string language, + [EnumeratorCancellation] CancellationToken cancellationToken) + { + var request = BuildRequest($"/api/NewsFeed/{season}", language); + using var response = await http.SendAsync(request, cancellationToken); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); + + var items = JsonSerializer.DeserializeAsyncEnumerable( + stream, + ArrowHeadSerializerContext.Default.NewsFeedItem, + cancellationToken + ); + + // Unfortunately C# doesn't allow directly returning IAsyncEnumerable. + await foreach (var item in items) + yield return item ?? throw new InvalidOperationException("Failed to deserialize newsfeed item"); + } + + /// + /// Loads assignments of a given in . + /// + public async IAsyncEnumerable LoadAssignments(string season, string language, + [EnumeratorCancellation] CancellationToken cancellationToken) + { + var request = BuildRequest($"/api/v2/Assignment/War/{season}", language); + using var response = await http.SendAsync(request, cancellationToken); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); + + var assignments = JsonSerializer.DeserializeAsyncEnumerable( + stream, + ArrowHeadSerializerContext.Default.Assignment, + cancellationToken + ); + + // Unfortunately C# doesn't allow directly returning IAsyncEnumerable. + await foreach (var assignment in assignments) + yield return assignment ?? throw new InvalidOperationException("Failed to deserialize assignment"); + } + + /// + /// Fetch from ArrowHead's API. + /// + public async Task GetSummary(string season, CancellationToken cancellationToken) + { + var request = BuildRequest($"/api/Stats/war/{season}/summary"); + using var response = await http.SendAsync(request, cancellationToken); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); + + return await JsonSerializer + .DeserializeAsync(stream, ArrowHeadSerializerContext.Default.WarSummary, cancellationToken) + ?? throw new InvalidOperationException(); + } + + private HttpRequestMessage BuildRequest(string url, string? language = null) + { + if (string.IsNullOrWhiteSpace(language)) + language = options.Value.Languages.First(); + + return new HttpRequestMessage(HttpMethod.Get, url) + { + Headers = { AcceptLanguage = { StringWithQualityHeaderValue.Parse(language) } } + }; + } +} diff --git a/src/Helldivers-2-Sync/Services/SteamApiService.cs b/src/Helldivers-2-Sync/Services/SteamApiService.cs new file mode 100644 index 0000000..52f0ea3 --- /dev/null +++ b/src/Helldivers-2-Sync/Services/SteamApiService.cs @@ -0,0 +1,27 @@ +using Helldivers.Models; +using Helldivers.Models.Steam; +using System.Text.Json; + +namespace Helldivers.Sync.Services; + +/// +/// Handles communication with the Steam API for fetching information. +/// +public sealed class SteamApiService(HttpClient http) +{ + /// + /// Fetches the latest from Steam's news feed for Helldivers 2. + /// + public async Task GetLatest(int count = 20) + { + var url = $"https://api.steampowered.com/ISteamNews/GetNewsForApp/v2/?appid=553850&count={count}&feeds=steam_community_announcements"; + await using var response = await http.GetStreamAsync(url); + + var feed = await JsonSerializer.DeserializeAsync( + response, + SteamSerializerContext.Default.SteamNewsFeed + ); + + return feed!; + } +} diff --git a/test/helldivers_2_web/controllers/api/planets_controller_test.exs b/test/helldivers_2_web/controllers/api/planets_controller_test.exs deleted file mode 100644 index b545204..0000000 --- a/test/helldivers_2_web/controllers/api/planets_controller_test.exs +++ /dev/null @@ -1,109 +0,0 @@ -defmodule Helldivers2Web.Api.PlanetsControllerTest do - use Helldivers2Web.ConnCase - - import OpenApiSpex.TestAssertions - import Helldivers2.WarSeasonFixtures - - alias Helldivers2.WarSeason - - @war_id "1" - - setup _ do - # Start up an internal war season - {:ok, _} = WarSeason.start_link(war_id: @war_id) - - # Store a few planets in the given war season - WarSeason.store(@war_id, war_info_fixture()) - - :ok - end - - describe "GET /api/:war_id/planets" do - test "returns a list of all available planets", %{conn: conn} do - response = - conn - |> get(~p"/api/#{@war_id}/planets") - |> json_response(200) - - assert [%{"index" => 0}] = Enum.take(response, 1) - end - - test "conforms to it's schema", %{conn: conn} do - response = - conn - |> get(~p"/api/#{@war_id}/planets") - |> json_response(200) - - spec = Helldivers2Web.ApiSpec.spec() - - for planet <- response do - assert_schema(planet, "PlanetSchema", spec) - end - end - end - - describe "GET /api/:war_id/planets/:planet_index" do - test "returns 404 for unknown planets", %{conn: conn} do - conn - |> get(~p"/api/#{@war_id}/planets/5") - |> json_response(404) - end - - test "returns 422 for invalid planet indices", %{conn: conn} do - conn - |> get(~p"/api/#{@war_id}/planets/invalid") - |> json_response(422) - end - - test "returns 200 for a valid planet index", %{conn: conn} do - conn - |> get(~p"/api/#{@war_id}/planets/0") - |> json_response(200) - end - - test "response conforms to schema", %{conn: conn} do - response = - conn - |> get(~p"/api/#{@war_id}/planets/0") - |> json_response(200) - - spec = Helldivers2Web.ApiSpec.spec() - assert_schema(response, "PlanetSchema", spec) - end - end - - describe "GET /api/:war_id/planets/:planet_index/status" do - setup _ do - # We need war status for these endpoints - WarSeason.store(@war_id, war_status_fixture()) - end - - test "returns 404 for unknown planets", %{conn: conn} do - conn - |> get(~p"/api/#{@war_id}/planets/5/status") - |> json_response(404) - end - - test "returns 422 for invalid planet indices", %{conn: conn} do - conn - |> get(~p"/api/#{@war_id}/planets/invalid/status") - |> json_response(422) - end - - test "returns 200 for a valid planet index", %{conn: conn} do - conn - |> get(~p"/api/#{@war_id}/planets/0/status") - |> json_response(200) - end - - test "response conforms to schema", %{conn: conn} do - response = - conn - |> get(~p"/api/#{@war_id}/planets/0/status") - |> json_response(200) - - spec = Helldivers2Web.ApiSpec.spec() - assert_schema(response, "PlanetStatusSchema", spec) - end - end -end diff --git a/test/helldivers_2_web/controllers/api/war_season_controller_test.exs b/test/helldivers_2_web/controllers/api/war_season_controller_test.exs deleted file mode 100644 index 5ae5d99..0000000 --- a/test/helldivers_2_web/controllers/api/war_season_controller_test.exs +++ /dev/null @@ -1,69 +0,0 @@ -defmodule Helldivers2Web.Api.WarSeasonControllerTest do - use Helldivers2Web.ConnCase - - import OpenApiSpex.TestAssertions - import Helldivers2.WarSeasonFixtures - - alias Helldivers2.WarSeason - - @war_id "1" - - setup _ do - # Start up an internal war season - {:ok, _} = WarSeason.start_link(war_id: @war_id) - - WarSeason.store(@war_id, war_info_fixture()) - WarSeason.store(@war_id, war_status_fixture()) - - :ok - end - - describe "GET /api/:war_id/info" do - test "returns the current war info", %{conn: conn} do - response = - conn - |> get(~p"/api/#{@war_id}/info") - |> json_response(200) - - assert %{ - "war_id" => _, - "start_date" => _, - "end_date" => _, - "minimum_client_version" => _, - "planets" => _, - "home_worlds" => _, - "capitals" => _, - "planet_permanent_effects" => _ - } = response - end - - test "conforms to the schema", %{conn: conn} do - response = - conn - |> get(~p"/api/#{@war_id}/info") - |> json_response(200) - - spec = Helldivers2Web.ApiSpec.spec() - assert_schema(response, "WarInfoSchema", spec) - end - end - - describe "GET /api/:war_id/status" do - test "returns the current war status", %{conn: conn} do - assert %{"war_id" => _} = - conn - |> get(~p"/api/#{@war_id}/status") - |> json_response(200) - end - - test "conforms to the schema", %{conn: conn} do - response = - conn - |> get(~p"/api/#{@war_id}/status") - |> json_response(200) - - spec = Helldivers2Web.ApiSpec.spec() - assert_schema(response, "WarStatusSchema", spec) - end - end -end diff --git a/test/helldivers_2_web/controllers/error_html_test.exs b/test/helldivers_2_web/controllers/error_html_test.exs deleted file mode 100644 index acf3647..0000000 --- a/test/helldivers_2_web/controllers/error_html_test.exs +++ /dev/null @@ -1,15 +0,0 @@ -defmodule Helldivers2Web.ErrorHTMLTest do - use Helldivers2Web.ConnCase, async: true - - # Bring render_to_string/4 for testing custom views - import Phoenix.Template - - test "renders 404.html" do - assert render_to_string(Helldivers2Web.ErrorHTML, "404", "html", []) == "Not Found" - end - - test "renders 500.html" do - assert render_to_string(Helldivers2Web.ErrorHTML, "500", "html", []) == - "Internal Server Error" - end -end diff --git a/test/helldivers_2_web/controllers/error_json_test.exs b/test/helldivers_2_web/controllers/error_json_test.exs deleted file mode 100644 index f681063..0000000 --- a/test/helldivers_2_web/controllers/error_json_test.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule Helldivers2Web.ErrorJSONTest do - use Helldivers2Web.ConnCase, async: true - - test "renders 404" do - assert Helldivers2Web.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}} - end - - test "renders 500" do - assert Helldivers2Web.ErrorJSON.render("500.json", %{}) == - %{errors: %{detail: "Internal Server Error"}} - end -end diff --git a/test/helldivers_2_web/controllers/page_controller_test.exs b/test/helldivers_2_web/controllers/page_controller_test.exs deleted file mode 100644 index 7c56d4e..0000000 --- a/test/helldivers_2_web/controllers/page_controller_test.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule Helldivers2Web.PageControllerTest do - use Helldivers2Web.ConnCase - - # test "GET /", %{conn: conn} do - # conn = get(conn, ~p"/") - # assert html_response(conn, 200) =~ "Peace of mind from prototype to production" - # end -end diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex deleted file mode 100644 index 03e335c..0000000 --- a/test/support/conn_case.ex +++ /dev/null @@ -1,40 +0,0 @@ -defmodule Helldivers2Web.ConnCase do - @moduledoc """ - This module defines the test case to be used by - tests that require setting up a connection. - - Such tests rely on `Phoenix.ConnTest` and also - import other functionality to make it easier - to build common data structures and query the data layer. - - Finally, if the test case interacts with the database, - we enable the SQL sandbox, so changes done to the database - are reverted at the end of every test. If you are using - PostgreSQL, you can even run database tests asynchronously - by setting `use Helldivers2Web.ConnCase, async: true`, although - this option is not recommended for other databases. - """ - - use ExUnit.CaseTemplate - - using do - quote do - # The default endpoint for testing - @endpoint Helldivers2Web.Endpoint - - use Helldivers2Web, :verified_routes - - # Import conveniences for testing with connections - import Plug.Conn - import Phoenix.ConnTest - import Helldivers2Web.ConnCase - end - end - - setup _tags do - # Ensure the rate limit bucket is cleared before every test. - ExRated.delete_bucket("127.0.0.1") - - {:ok, conn: Phoenix.ConnTest.build_conn()} - end -end diff --git a/test/support/fixtures/war_season_fixtures.ex b/test/support/fixtures/war_season_fixtures.ex deleted file mode 100644 index ebc8ee2..0000000 --- a/test/support/fixtures/war_season_fixtures.ex +++ /dev/null @@ -1,183 +0,0 @@ -defmodule Helldivers2.WarSeasonFixtures do - alias Helldivers2.Models.WarStatus.Campaign - alias Helldivers2.Models.WarStatus.PlanetStatus - alias Helldivers2.Models.WarInfo.HomeWorld - alias Helldivers2.Models.WarInfo - alias Helldivers2.Models.WarInfo.Planet - - def war_info_fixture do - %WarInfo{ - war_id: 801, - start_date: ~U[2024-01-23 20:05:13Z], - end_date: ~U[2028-02-08 20:04:55Z], - minimum_client_version: "0.3.0", - planets: [ - planet_super_earth_fixture(), - planet_klen_dath_fixture() - ], - home_worlds: [ - %HomeWorld{ - race: "Humans", - planets: [ - planet_super_earth_fixture() - ] - }, - %HomeWorld{ - race: "Automaton", - planets: [ - planet_klen_dath_fixture() - ] - } - ], - capitals: [], - planet_permanent_effects: [] - } - end - - def planet_super_earth_fixture do - %Planet{ - index: 0, - name: "Super Earth", - hash: 897_386_910, - position: {0, 0}, - waypoints: [1], - sector: "Sol", - max_health: 1_000_000, - disabled: false, - initial_owner: "Humans" - } - end - - def planet_klen_dath_fixture do - %Planet{ - index: 1, - name: "Klen Dahth II", - hash: 3_621_417_917, - position: {0.05373042, 0.10565466}, - waypoints: [2], - sector: "Altus", - max_health: 1_000_000, - disabled: false, - initial_owner: "Humans" - } - end - - def war_status_fixture do - %Helldivers2.Models.WarStatus{ - war_id: 801, - started_at: ~U[1970-01-22 10:22:30Z], - snapshot_at: ~U[1970-01-22 10:22:30Z], - impact_multiplier: 9.453553e-4, - planet_status: [ - %PlanetStatus{ - planet: planet_super_earth_fixture(), - owner: "Humans", - health: 1_000_000, - regen_per_second: 138.88889, - players: 1728, - liberation: 100 - }, - %PlanetStatus{ - planet: planet_klen_dath_fixture(), - owner: "Humans", - health: 1_000_000, - regen_per_second: 138.88889, - players: 0, - liberation: 100 - } - ], - planet_attacks: [ - {planet_klen_dath_fixture(), planet_super_earth_fixture()} - ], - campaigns: [ - %Campaign{ - id: 49_961, - planet: planet_super_earth_fixture(), - type: 0, - count: 1 - }, - %Helldivers2.Models.WarStatus.Campaign{ - id: 49_985, - planet: planet_klen_dath_fixture(), - type: 0, - count: 1 - } - ], - community_targets: [], - joint_operations: [ - %Helldivers2.Models.WarStatus.JointOperation{ - id: 4292, - planet: planet_klen_dath_fixture(), - hq_node_index: 1 - } - ], - planet_events: [ - %Helldivers2.Models.WarStatus.PlanetEvent{ - id: 4292, - planet: planet_klen_dath_fixture(), - event_type: 1, - race: "Automaton", - health: 1_017_958, - max_health: 2_000_000, - start_time: ~U[1970-01-21 09:11:00Z], - expire_time: ~U[1970-01-23 01:11:00Z], - campaign: %Helldivers2.Models.WarStatus.Campaign{ - id: 49_985, - planet: planet_super_earth_fixture(), - type: 0, - count: 6 - }, - joint_operations: [ - %Helldivers2.Models.WarStatus.JointOperation{ - id: 4292, - planet: planet_klen_dath_fixture(), - hq_node_index: 1 - } - ] - } - ], - planet_active_effects: [], - active_election_policy_effects: [], - global_events: [ - %Helldivers2.Models.WarStatus.GlobalEvent{ - id: 1_499_071, - id_32: 0, - portrait_id_32: 0, - title: "SUCCESS", - title_32: 2_998_873_950, - message: %{ - "en" => - "Well done, Helldivers. SEAF Containment Teams will take over cleanup and inoculation operations from here. Colonists have been advised that there is absolutely zero threat of further Terminid violence, and to settle their families with total peace of mind.\n\nAdditionally, the pilots allocated to spore clearance on Veld have now been redirected to Helldiver support operations. \nExtraction will be faster on all operations. ", - "de" => - "Gut gemacht, Helldivers. S.E.A.F.-Sicherungsteams übernehmen ab hier die Säuberungs- und Impfaufgaben. Die Kolonisten wurden darüber informiert, dass absolut keine Gefahr weiterer Bedrohungen durch Terminiden besteht und dass sie sich in aller Ruhe mit ihren Familien niederlassen können.\n\nDarüber hinaus wurden die Piloten, die die Sporen auf Veld beseitigen sollten, nun angewiesen, die Helldivers bei ihren Bemühungen zu unterstützen.\nDie Evakuierung geht bei allen Operationen schneller vonstatten." - }, - message_id_32: 2_450_763_514, - race: "Humans", - flag: 2, - assignment_id_32: 0, - effects: [], - planets: [] - }, - %Helldivers2.Models.WarStatus.GlobalEvent{ - id: 1_499_072, - id_32: 0, - portrait_id_32: 0, - title: "BRIEFING", - title_32: 2_908_633_975, - message: %{ - "en" => - "Despite the valorous efforts of the Helldivers, Automaton marauders have invaded Super Earth territory. Patriotic citizens mourn as their sufficiently-sized homes burn to the ground.\n\nSuper Earth citizens demand justice, and they will receive it.", - "de" => - "Trotz der mutigen Anstrengungen der Helldivers konnten Roboter-Marodeure in Über-Erde-Gebiete eindringen. Patriotische Bürger verfallen in tiefe Trauer, während ihre ausreichend großen Behausungen niederbrennen.\n\nDie Bürger von Über-Erde verlangen Gerechtigkeit und sie werden sie bekommen." - }, - message_id_32: 2_667_498_758, - race: "Humans", - flag: 1, - assignment_id_32: 4_098_053_760, - effects: [], - planets: [] - } - ] - } - end -end diff --git a/test/test_helper.exs b/test/test_helper.exs deleted file mode 100644 index 869559e..0000000 --- a/test/test_helper.exs +++ /dev/null @@ -1 +0,0 @@ -ExUnit.start()