Gustavo Mantovani hai 2 días
achega
378a2d4479
Modificáronse 100 ficheiros con 18870 adicións e 0 borrados
  1. 41 0
      README.md
  2. 21 0
      index.html
  3. 39 0
      jsconfig.json
  4. 9735 0
      package-lock.json
  5. 49 0
      package.json
  6. BIN=BIN
      public/icons/favicon-128x128.png
  7. BIN=BIN
      public/icons/favicon-16x16.png
  8. BIN=BIN
      public/icons/favicon-32x32.png
  9. BIN=BIN
      public/icons/favicon-96x96.png
  10. BIN=BIN
      public/icons/favicon.ico
  11. 14 0
      public/icons/icon.svg
  12. BIN=BIN
      public/images/barcode.png
  13. 6 0
      public/images/bg-login.svg
  14. BIN=BIN
      public/images/checkin-success.png
  15. 203 0
      public/images/checkin-success.svg
  16. BIN=BIN
      public/images/default-image-card-checkin.png
  17. BIN=BIN
      public/images/kizzo_expanded_logo.png
  18. BIN=BIN
      public/images/kizzo_left_logo.png
  19. BIN=BIN
      public/images/kizzo_logo.png
  20. 6 0
      public/images/kizzo_logo.svg
  21. 6 0
      public/images/kizzo_logo_secondary.svg
  22. BIN=BIN
      public/images/left-expanded-logo.png
  23. BIN=BIN
      public/images/left-logo-layout.png
  24. BIN=BIN
      public/images/no-checkin.png
  25. 193 0
      public/images/no-checkin.svg
  26. 246 0
      quasar.config.js
  27. 28 0
      src/App.vue
  28. 172 0
      src/api/cacheService.js
  29. 38 0
      src/api/city.js
  30. 28 0
      src/api/country.js
  31. 11 0
      src/api/ownerDashboard.js
  32. 29 0
      src/api/permission.js
  33. 33 0
      src/api/state.js
  34. 48 0
      src/api/user.js
  35. BIN=BIN
      src/assets/alugap-logo.png
  36. BIN=BIN
      src/assets/logo.png
  37. 0 0
      src/assets/softpar_logo_dark.svg
  38. 0 0
      src/assets/softpar_logo_light.svg
  39. 1 0
      src/assets/softpar_logo_mini.svg
  40. 0 0
      src/boot/.gitkeep
  41. 125 0
      src/boot/axios.js
  42. 48 0
      src/boot/defaultPropsComponents.js
  43. 20 0
      src/boot/i18n.js
  44. 6 0
      src/boot/setPermissions.js
  45. 71 0
      src/boot/socket.io.js
  46. 97 0
      src/components/charts/CardIconChart.vue
  47. 57 0
      src/components/charts/DefaultCard.vue
  48. 91 0
      src/components/charts/DonutChart.vue
  49. 113 0
      src/components/charts/mini/MiniBarChart.vue
  50. 123 0
      src/components/charts/mini/MiniLineChart.vue
  51. 81 0
      src/components/defaults/ActionsDropdownDefault.vue
  52. 87 0
      src/components/defaults/DefaultAvatarPicker.vue
  53. 95 0
      src/components/defaults/DefaultCepInput.vue
  54. 71 0
      src/components/defaults/DefaultCurrencyInput.vue
  55. 61 0
      src/components/defaults/DefaultDialogHeader.vue
  56. 226 0
      src/components/defaults/DefaultFilePicker.vue
  57. 139 0
      src/components/defaults/DefaultInputDatePicker.vue
  58. 112 0
      src/components/defaults/DefaultMultiSelect.vue
  59. 29 0
      src/components/defaults/DefaultPasswordInput.vue
  60. 101 0
      src/components/defaults/DefaultSelect.vue
  61. 241 0
      src/components/defaults/DefaultTable.vue
  62. 373 0
      src/components/defaults/DefaultTableServerSide.vue
  63. 34 0
      src/components/defaults/DefaultTabs.vue
  64. 72 0
      src/components/defaults/DefaultTextEditor.vue
  65. 19 0
      src/components/layout/DefaultHeaderPage.vue
  66. 298 0
      src/components/layout/LeftMenuLayout.vue
  67. 126 0
      src/components/layout/LeftMenuLayoutMobile.vue
  68. 149 0
      src/components/payments/ServiceRatingView.vue
  69. 174 0
      src/components/regions/CitySelect.vue
  70. 107 0
      src/components/regions/CountrySelect.vue
  71. 178 0
      src/components/regions/StateSelect.vue
  72. 42 0
      src/components/selects/BusinessSelect.vue
  73. 49 0
      src/components/selects/OwnersSelect.vue
  74. 38 0
      src/components/selects/ServicesSelect.vue
  75. 99 0
      src/composables/useAuth.js
  76. 60 0
      src/composables/useInputRules.js
  77. 64 0
      src/composables/useScroll.js
  78. 43 0
      src/composables/useSubmitHandler.js
  79. 124 0
      src/css/app.scss
  80. 92 0
      src/css/editor.scss
  81. 118 0
      src/css/quasar.variables.scss
  82. 206 0
      src/css/table.scss
  83. 59 0
      src/helpers/convertBase64Image.js
  84. 29 0
      src/helpers/masks.js
  85. 286 0
      src/helpers/utils.js
  86. 33 0
      src/i18n/index.js
  87. 351 0
      src/i18n/locales/en.json
  88. 351 0
      src/i18n/locales/es.json
  89. 351 0
      src/i18n/locales/pt.json
  90. 14 0
      src/layouts/LoginLayout.vue
  91. 145 0
      src/layouts/MainLayout.vue
  92. 30 0
      src/pages/ErrorNotFound.vue
  93. 118 0
      src/pages/LoginPage.vue
  94. 97 0
      src/pages/VersionPage.vue
  95. 8 0
      src/pages/WelcomePage.vue
  96. 1199 0
      src/pages/dashboard/DashboardPage.vue
  97. 65 0
      src/pages/dashboard/components/DashboardMetricCard.vue
  98. 97 0
      src/pages/dashboard/components/DashboardPayoutTable.vue
  99. 42 0
      src/pages/settings/SettingsPage.vue
  100. 189 0
      src/pages/settings/SettingsUserActionPage.vue

+ 41 - 0
README.md

@@ -0,0 +1,41 @@
+# Quasar App (quasar-skeleton)
+
+A skeleton for future projects
+
+## Install the dependencies
+```bash
+yarn
+# or
+npm install
+```
+
+### Start the app in development mode (hot-code reloading, error reporting, etc.)
+```bash
+quasar dev
+```
+
+
+### Lint the files
+```bash
+yarn lint
+# or
+npm run lint
+```
+
+
+### Format the files
+```bash
+yarn format
+# or
+npm run format
+```
+
+
+
+### Build the app for production
+```bash
+quasar build
+```
+
+### Customize the configuration
+See [Configuring quasar.config.js](https://v2.quasar.dev/quasar-cli-vite/quasar-config-js).

+ 21 - 0
index.html

@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Kizzo - Backoffice</title>
+
+    <meta charset="utf-8">
+    <meta name="description" content="<%= productDescription %>">
+    <meta name="format-detection" content="telephone=no">
+    <meta name="msapplication-tap-highlight" content="no">
+    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width<% if (ctx.mode.cordova || ctx.mode.capacitor) { %>, viewport-fit=cover<% } %>">
+
+    <link rel="icon" type="image/png" sizes="128x128" href="icons/favicon-128x128.png">
+    <link rel="icon" type="image/png" sizes="96x96" href="icons/favicon-96x96.png">
+    <link rel="icon" type="image/png" sizes="32x32" href="icons/favicon-32x32.png">
+    <link rel="icon" type="image/png" sizes="16x16" href="icons/favicon-16x16.png">
+    <link rel="icon" type="image/icon" href="icons/favicon.ico">
+  </head>
+  <body>
+    <!-- quasar:entry-point -->
+  </body>
+</html>

+ 39 - 0
jsconfig.json

@@ -0,0 +1,39 @@
+{
+  "compilerOptions": {
+    "baseUrl": ".",
+    "paths": {
+      "src/*": [
+        "src/*"
+      ],
+      "app/*": [
+        "*"
+      ],
+      "components/*": [
+        "src/components/*"
+      ],
+      "layouts/*": [
+        "src/layouts/*"
+      ],
+      "pages/*": [
+        "src/pages/*"
+      ],
+      "assets/*": [
+        "src/assets/*"
+      ],
+      "boot/*": [
+        "src/boot/*"
+      ],
+      "stores/*": [
+        "src/stores/*"
+      ],
+      "vue$": [
+        "node_modules/vue/dist/vue.runtime.esm-bundler.js"
+      ]
+    }
+  },
+  "exclude": [
+    "dist",
+    ".quasar",
+    "node_modules"
+  ]
+}

+ 9735 - 0
package-lock.json

@@ -0,0 +1,9735 @@
+{
+  "name": "alugap",
+  "version": "0.5.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "alugap",
+      "version": "0.5.0",
+      "dependencies": {
+        "@quasar/extras": "^1.16.17",
+        "axios": "^1.8.4",
+        "chart.js": "^4.4.8",
+        "date-fns": "^4.1.0",
+        "pinia": "^3.0.1",
+        "quasar": "^2.18.1",
+        "socket.io-client": "^4.8.1",
+        "vue": "^3.5",
+        "vue-chartjs": "^5.3.2",
+        "vue-currency-input": "^3.2.1",
+        "vue-i18n": "^9.14.5",
+        "vue-router": "^4.5.0"
+      },
+      "devDependencies": {
+        "@intlify/eslint-plugin-vue-i18n": "^3.2.0",
+        "@intlify/unplugin-vue-i18n": "^11.0.7",
+        "@intlify/vue-i18n-loader": "^4.2.0",
+        "@quasar/app-vite": "^2.2.0",
+        "autoprefixer": "^10.4.21",
+        "eslint": "^8.57.1",
+        "eslint-config-prettier": "^9.1.0",
+        "eslint-plugin-vue": "^9.32.0",
+        "postcss": "^8.5.3",
+        "prettier": "^3.5.3",
+        "vite-plugin-checker": "^0.9.1"
+      },
+      "engines": {
+        "node": "^24 || ^22 || ^20 || ^18",
+        "npm": ">= 6.13.4",
+        "yarn": ">= 1.21.1"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.26.2",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+      "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.28.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+      "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+      "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.29.0"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
+      "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "regenerator-runtime": "^0.14.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+      "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.27.1",
+        "@babel/helper-validator-identifier": "^7.28.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@bufbuild/protobuf": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.11.0.tgz",
+      "integrity": "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==",
+      "dev": true,
+      "license": "(Apache-2.0 AND BSD-3-Clause)"
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+      "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+      "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+      "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+      "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+      "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+      "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+      "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+      "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+      "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+      "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+      "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+      "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+      "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+      "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+      "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+      "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+      "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+      "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+      "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+      "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+      "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz",
+      "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+      "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+      "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+      "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+      "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.5.1",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz",
+      "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-visitor-keys": "^3.4.3"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+      }
+    },
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@eslint/eslintrc": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+      "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^10.0.1",
+        "globals": "^14.0.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/globals": {
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+      "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/ignore": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/@eslint/js": {
+      "version": "8.57.1",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+      "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@humanwhocodes/config-array": {
+      "version": "0.13.0",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+      "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+      "deprecated": "Use @eslint/config-array instead",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@humanwhocodes/object-schema": "^2.0.3",
+        "debug": "^4.3.1",
+        "minimatch": "^3.0.5"
+      },
+      "engines": {
+        "node": ">=10.10.0"
+      }
+    },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/object-schema": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+      "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+      "deprecated": "Use @eslint/object-schema instead",
+      "dev": true,
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@inquirer/external-editor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
+      "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "chardet": "^2.1.1",
+        "iconv-lite": "^0.7.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@types/node": ">=18"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@inquirer/external-editor/node_modules/iconv-lite": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
+      "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/@inquirer/figures": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz",
+      "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@intlify/bundle-utils": {
+      "version": "11.0.7",
+      "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-11.0.7.tgz",
+      "integrity": "sha512-fEO3CJGPymxieGh8BHox7d6stgajDQae7wgpH6YYw7WX+cdW6jTTXyljZqz7OV3JcwlS9M9UHSoO+YwiO56IhA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/message-compiler": "^11.1.12",
+        "@intlify/shared": "^11.1.12",
+        "acorn": "^8.8.2",
+        "esbuild": "^0.25.4",
+        "escodegen": "^2.1.0",
+        "estree-walker": "^2.0.2",
+        "jsonc-eslint-parser": "^2.3.0",
+        "source-map-js": "^1.2.1",
+        "yaml-eslint-parser": "^1.2.2"
+      },
+      "engines": {
+        "node": ">= 20"
+      },
+      "peerDependenciesMeta": {
+        "petite-vue-i18n": {
+          "optional": true
+        },
+        "vue-i18n": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@intlify/bundle-utils/node_modules/@intlify/message-compiler": {
+      "version": "11.3.0",
+      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.3.0.tgz",
+      "integrity": "sha512-RAJp3TMsqohg/Wa7bVF3cChRhecSYBLrTCQSj7j0UtWVFLP+6iEJoE2zb7GU5fp+fmG5kCbUdzhmlAUCWXiUJw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/shared": "11.3.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/bundle-utils/node_modules/@intlify/shared": {
+      "version": "11.3.0",
+      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.3.0.tgz",
+      "integrity": "sha512-LC6P/uay7rXL5zZ5+5iRJfLs/iUN8apu9tm8YqQVmW3Uq3X4A0dOFUIDuAmB7gAC29wTHOS3EiN/IosNSz0eNQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/core-base": {
+      "version": "9.14.5",
+      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.5.tgz",
+      "integrity": "sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==",
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/message-compiler": "9.14.5",
+        "@intlify/shared": "9.14.5"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/eslint-plugin-vue-i18n": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@intlify/eslint-plugin-vue-i18n/-/eslint-plugin-vue-i18n-3.2.0.tgz",
+      "integrity": "sha512-TOIrD4tJE48WMyVIB8bNeQJJPYo1Prpqnm9Xpn1UZmcqlELhm8hmP8QyJnkgesfbG7hyiX/kvo63W7ClEQmhpg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint/eslintrc": "^3.0.0",
+        "@intlify/core-base": "^9.12.0",
+        "@intlify/message-compiler": "^9.12.0",
+        "debug": "^4.3.4",
+        "eslint-compat-utils": "^0.6.0",
+        "glob": "^10.3.3",
+        "globals": "^15.0.0",
+        "ignore": "^6.0.0",
+        "import-fresh": "^3.3.0",
+        "is-language-code": "^3.1.0",
+        "js-yaml": "^4.1.0",
+        "json5": "^2.2.3",
+        "jsonc-eslint-parser": "^2.3.0",
+        "lodash": "^4.17.21",
+        "parse5": "^7.1.2",
+        "semver": "^7.5.4",
+        "synckit": "^0.9.0",
+        "vue-eslint-parser": "^9.3.1",
+        "yaml-eslint-parser": "^1.2.2"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^8.0.0 || ^9.0.0-0"
+      }
+    },
+    "node_modules/@intlify/message-compiler": {
+      "version": "9.14.5",
+      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.5.tgz",
+      "integrity": "sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/shared": "9.14.5",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/shared": {
+      "version": "9.14.5",
+      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.5.tgz",
+      "integrity": "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/unplugin-vue-i18n": {
+      "version": "11.0.7",
+      "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-11.0.7.tgz",
+      "integrity": "sha512-wswKprS1D8VfnxxVhKxug5wa3MbDSOcCoXOBjnzhMK+6NfP6h6UI8pFqSBIvcW8nPDuzweTc0Sk3PeBCcubfoQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "@intlify/bundle-utils": "11.0.7",
+        "@intlify/shared": "^11.1.12",
+        "@intlify/vue-i18n-extensions": "^8.0.0",
+        "@rollup/pluginutils": "^5.1.0",
+        "@typescript-eslint/scope-manager": "^8.13.0",
+        "@typescript-eslint/typescript-estree": "^8.13.0",
+        "debug": "^4.3.3",
+        "fast-glob": "^3.2.12",
+        "pathe": "^2.0.3",
+        "picocolors": "^1.0.0",
+        "unplugin": "^2.3.4",
+        "vue": "^3.5.21"
+      },
+      "engines": {
+        "node": ">= 20"
+      },
+      "peerDependencies": {
+        "petite-vue-i18n": "*",
+        "vue": "^3.2.25",
+        "vue-i18n": "*"
+      },
+      "peerDependenciesMeta": {
+        "petite-vue-i18n": {
+          "optional": true
+        },
+        "vue-i18n": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@intlify/unplugin-vue-i18n/node_modules/@intlify/shared": {
+      "version": "11.3.0",
+      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.3.0.tgz",
+      "integrity": "sha512-LC6P/uay7rXL5zZ5+5iRJfLs/iUN8apu9tm8YqQVmW3Uq3X4A0dOFUIDuAmB7gAC29wTHOS3EiN/IosNSz0eNQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-extensions": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-extensions/-/vue-i18n-extensions-8.0.0.tgz",
+      "integrity": "sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.24.6",
+        "@intlify/shared": "^10.0.0",
+        "@vue/compiler-dom": "^3.2.45",
+        "vue-i18n": "^10.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@intlify/shared": "^9.0.0 || ^10.0.0 || ^11.0.0",
+        "@vue/compiler-dom": "^3.0.0",
+        "vue": "^3.0.0",
+        "vue-i18n": "^9.0.0 || ^10.0.0 || ^11.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@intlify/shared": {
+          "optional": true
+        },
+        "@vue/compiler-dom": {
+          "optional": true
+        },
+        "vue": {
+          "optional": true
+        },
+        "vue-i18n": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@intlify/vue-i18n-extensions/node_modules/@intlify/core-base": {
+      "version": "10.0.8",
+      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.8.tgz",
+      "integrity": "sha512-FoHslNWSoHjdUBLy35bpm9PV/0LVI/DSv9L6Km6J2ad8r/mm0VaGg06C40FqlE8u2ADcGUM60lyoU7Myo4WNZQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/message-compiler": "10.0.8",
+        "@intlify/shared": "10.0.8"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-extensions/node_modules/@intlify/message-compiler": {
+      "version": "10.0.8",
+      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.8.tgz",
+      "integrity": "sha512-DV+sYXIkHVd5yVb2mL7br/NEUwzUoLBsMkV3H0InefWgmYa34NLZUvMCGi5oWX+Hqr2Y2qUxnVrnOWF4aBlgWg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/shared": "10.0.8",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-extensions/node_modules/@intlify/shared": {
+      "version": "10.0.8",
+      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.8.tgz",
+      "integrity": "sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-extensions/node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@intlify/vue-i18n-extensions/node_modules/vue-i18n": {
+      "version": "10.0.8",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-10.0.8.tgz",
+      "integrity": "sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ==",
+      "deprecated": "v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/core-base": "10.0.8",
+        "@intlify/shared": "10.0.8",
+        "@vue/devtools-api": "^6.5.0"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-loader": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-loader/-/vue-i18n-loader-4.2.0.tgz",
+      "integrity": "sha512-d7aBmMNWJskcZPT5rJH4h2XHe/PwNoJUaY0PGla9g+NSD4B0UR8LBKrp126nlaUfA74Xt0FEGvzCfG9KdC9KoA==",
+      "deprecated": "This package no longer supported. About maintenance status, see https://github.com/intlify/bundle-tools?tab=readme-ov-file#-packages",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/bundle-utils": "^2.2.2",
+        "@intlify/shared": "^9.1.0",
+        "js-yaml": "^4.1.0",
+        "json5": "^2.2.0",
+        "loader-utils": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 12"
+      },
+      "peerDependencies": {
+        "petite-vue-i18n": "^9.1.0",
+        "vue": "^3.0.0",
+        "vue-i18n": "^9.1.0"
+      },
+      "peerDependenciesMeta": {
+        "petite-vue-i18n": {
+          "optional": true
+        },
+        "vue-i18n": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@intlify/vue-i18n-loader/node_modules/@intlify/bundle-utils": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-2.2.2.tgz",
+      "integrity": "sha512-vngkvlIVV8ZJoyC5VqMvqJd2nvsx+qMN7pQjPiPjOrVndeiR7Dlue0k86Q8FsFUzyksW3HJZZi833ldxwbFzTA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/message-compiler": "^9.1.0",
+        "@intlify/shared": "^9.1.0",
+        "jsonc-eslint-parser": "^1.0.1",
+        "source-map": "^0.6.1",
+        "yaml-eslint-parser": "^0.3.2"
+      },
+      "engines": {
+        "node": ">= 12"
+      },
+      "peerDependenciesMeta": {
+        "petite-vue-i18n": {
+          "optional": true
+        },
+        "vue-i18n": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@intlify/vue-i18n-loader/node_modules/acorn": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-loader/node_modules/eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-loader/node_modules/espree": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^7.1.1",
+        "acorn-jsx": "^5.2.0",
+        "eslint-visitor-keys": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-loader/node_modules/jsonc-eslint-parser": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz",
+      "integrity": "sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "acorn": "^7.4.1",
+        "eslint-utils": "^2.1.0",
+        "eslint-visitor-keys": "^1.3.0",
+        "espree": "^6.0.0",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-loader/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-loader/node_modules/yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/@intlify/vue-i18n-loader/node_modules/yaml-eslint-parser": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.3.2.tgz",
+      "integrity": "sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-visitor-keys": "^1.3.0",
+        "lodash": "^4.17.20",
+        "yaml": "^1.10.0"
+      }
+    },
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@isaacs/cliui/node_modules/string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/remapping": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+      "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/source-map": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+      "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+      "license": "MIT"
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@kurkle/color": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz",
+      "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==",
+      "license": "MIT"
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@parcel/watcher": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz",
+      "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "detect-libc": "^2.0.3",
+        "is-glob": "^4.0.3",
+        "node-addon-api": "^7.0.0",
+        "picomatch": "^4.0.3"
+      },
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher-android-arm64": "2.5.6",
+        "@parcel/watcher-darwin-arm64": "2.5.6",
+        "@parcel/watcher-darwin-x64": "2.5.6",
+        "@parcel/watcher-freebsd-x64": "2.5.6",
+        "@parcel/watcher-linux-arm-glibc": "2.5.6",
+        "@parcel/watcher-linux-arm-musl": "2.5.6",
+        "@parcel/watcher-linux-arm64-glibc": "2.5.6",
+        "@parcel/watcher-linux-arm64-musl": "2.5.6",
+        "@parcel/watcher-linux-x64-glibc": "2.5.6",
+        "@parcel/watcher-linux-x64-musl": "2.5.6",
+        "@parcel/watcher-win32-arm64": "2.5.6",
+        "@parcel/watcher-win32-ia32": "2.5.6",
+        "@parcel/watcher-win32-x64": "2.5.6"
+      }
+    },
+    "node_modules/@parcel/watcher-android-arm64": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz",
+      "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-arm64": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz",
+      "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-x64": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz",
+      "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-freebsd-x64": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz",
+      "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-glibc": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz",
+      "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-musl": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz",
+      "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-glibc": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz",
+      "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-musl": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz",
+      "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-glibc": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz",
+      "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-musl": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz",
+      "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-arm64": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz",
+      "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-ia32": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz",
+      "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-x64": {
+      "version": "2.5.6",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz",
+      "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@pkgr/core": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz",
+      "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/unts"
+      }
+    },
+    "node_modules/@quasar/app-vite": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@quasar/app-vite/-/app-vite-2.4.1.tgz",
+      "integrity": "sha512-JLRXHKjZCZM9qQlxyjtinusVh+UMBQqM5TEc+Zo3i5y+dBffZiyUcdYN2DCmL0U/eoVulc2n5ve7qR0JwaQu6g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@quasar/render-ssr-error": "^1.0.3",
+        "@quasar/ssl-certificate": "^1.0.0",
+        "@quasar/vite-plugin": "^1.10.0",
+        "@types/chrome": "^0.0.262",
+        "@types/compression": "^1.7.5",
+        "@types/cordova": "^11.0.3",
+        "@types/express": "^4.17.21",
+        "@vitejs/plugin-vue": "^6.0.1",
+        "archiver": "^7.0.1",
+        "chokidar": "^3.6.0",
+        "ci-info": "^4.0.0",
+        "compression": "^1.7.5",
+        "confbox": "^0.1.8",
+        "cross-spawn": "^7.0.6",
+        "dot-prop": "9.0.0",
+        "dotenv": "^16.4.5",
+        "dotenv-expand": "^11.0.6",
+        "elementtree": "0.1.7",
+        "esbuild": "^0.25.0",
+        "express": "^4.21.2",
+        "fs-extra": "^11.2.0",
+        "html-minifier-terser": "^7.2.0",
+        "inquirer": "^9.3.7",
+        "isbinaryfile": "^5.0.4",
+        "kolorist": "^1.8.0",
+        "lodash": "^4.17.21",
+        "minimist": "^1.2.8",
+        "mlly": "^1.7.4",
+        "open": "^10.1.0",
+        "rollup-plugin-visualizer": "^5.13.1",
+        "sass-embedded": "^1.93.2",
+        "semver": "^7.6.3",
+        "serialize-javascript": "^6.0.2",
+        "tinyglobby": "^0.2.10",
+        "ts-essentials": "^9.4.2",
+        "vite": "^7.1.6",
+        "webpack-merge": "^6.0.1"
+      },
+      "bin": {
+        "quasar": "bin/quasar.js"
+      },
+      "engines": {
+        "node": "^30 || ^28 || ^26 || ^24 || ^22 || ^20",
+        "npm": ">= 6.14.12",
+        "yarn": ">= 1.17.3"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://donate.quasar.dev"
+      },
+      "peerDependencies": {
+        "@electron/packager": ">= 18",
+        "electron-builder": ">= 22",
+        "pinia": "^2.0.0 || ^3.0.0",
+        "quasar": "^2.16.0",
+        "typescript": ">= 5.4",
+        "vue": "^3.2.29",
+        "vue-router": "^4.0.12 || ^5.0.0",
+        "workbox-build": ">= 6"
+      },
+      "peerDependenciesMeta": {
+        "@electron/packager": {
+          "optional": true
+        },
+        "electron-builder": {
+          "optional": true
+        },
+        "eslint": {
+          "optional": true
+        },
+        "pinia": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        },
+        "workbox-build": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@quasar/extras": {
+      "version": "1.16.17",
+      "resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.16.17.tgz",
+      "integrity": "sha512-4aX9XU/oj1+8O2C7LQCgywmoIw7suyUEZMPFFLWI61f21mF55VOsMdLCBhjeFgL5U4EWy079mfOR6/J8thi/ag==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://donate.quasar.dev"
+      }
+    },
+    "node_modules/@quasar/render-ssr-error": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@quasar/render-ssr-error/-/render-ssr-error-1.0.3.tgz",
+      "integrity": "sha512-A8RF99q6/sOSe1Ighnh5syEIbliD3qUYEJd2HyfFyBPSMF+WYGXon5dmzg4nUoK662NgOggInevkDyBDJcZugg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "stack-trace": "^1.0.0-pre2"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://donate.quasar.dev"
+      }
+    },
+    "node_modules/@quasar/ssl-certificate": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@quasar/ssl-certificate/-/ssl-certificate-1.0.0.tgz",
+      "integrity": "sha512-RhZF7rO76T7Ywer1/5lCe7xl3CIiXxSAH1xgwOj0wcHTityDxJqIN/5YIj6BxMvlFw8XkJDoB1udEQafoVFA4g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fs-extra": "^11.1.1",
+        "selfsigned": "^2.1.1"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://donate.quasar.dev"
+      }
+    },
+    "node_modules/@quasar/vite-plugin": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/@quasar/vite-plugin/-/vite-plugin-1.10.0.tgz",
+      "integrity": "sha512-4PJoTclz4ZjAfyqe0+hlkKcFJt0e2NX3Ac3hy8ILqUPdtZ24nCo5/xEHvTxZGBQMKRPwwePbO8CVs4n9EKJEug==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=20"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://donate.quasar.dev"
+      },
+      "peerDependencies": {
+        "@vitejs/plugin-vue": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0",
+        "quasar": "^2.16.0",
+        "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/@rolldown/pluginutils": {
+      "version": "1.0.0-rc.2",
+      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz",
+      "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@rollup/pluginutils": {
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
+      "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz",
+      "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz",
+      "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz",
+      "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz",
+      "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz",
+      "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz",
+      "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz",
+      "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz",
+      "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz",
+      "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz",
+      "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loong64-gnu": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz",
+      "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loong64-musl": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz",
+      "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz",
+      "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-ppc64-musl": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz",
+      "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz",
+      "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-musl": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz",
+      "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz",
+      "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
+      "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz",
+      "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-openbsd-x64": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz",
+      "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-openharmony-arm64": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz",
+      "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz",
+      "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz",
+      "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-gnu": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz",
+      "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz",
+      "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@socket.io/component-emitter": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+      "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/body-parser": {
+      "version": "1.19.5",
+      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
+      "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/connect": "*",
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/chrome": {
+      "version": "0.0.262",
+      "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.262.tgz",
+      "integrity": "sha512-TOoj3dqSYE13PD2fRuMQ6X6pggEvL9rRk/yOYOyWE6sfqRWxsJm4VoVm+wr9pkr4Sht/M5t7FFL4vXato8d1gA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/filesystem": "*",
+        "@types/har-format": "*"
+      }
+    },
+    "node_modules/@types/compression": {
+      "version": "1.7.5",
+      "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.5.tgz",
+      "integrity": "sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/express": "*"
+      }
+    },
+    "node_modules/@types/connect": {
+      "version": "3.4.38",
+      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+      "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/cordova": {
+      "version": "11.0.3",
+      "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-11.0.3.tgz",
+      "integrity": "sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/express": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+      "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/body-parser": "*",
+        "@types/express-serve-static-core": "^4.17.33",
+        "@types/qs": "*",
+        "@types/serve-static": "*"
+      }
+    },
+    "node_modules/@types/express-serve-static-core": {
+      "version": "4.19.6",
+      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+      "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*",
+        "@types/qs": "*",
+        "@types/range-parser": "*",
+        "@types/send": "*"
+      }
+    },
+    "node_modules/@types/filesystem": {
+      "version": "0.0.36",
+      "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.36.tgz",
+      "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/filewriter": "*"
+      }
+    },
+    "node_modules/@types/filewriter": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.33.tgz",
+      "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/har-format": {
+      "version": "1.2.16",
+      "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz",
+      "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/http-errors": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
+      "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/mime": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/node": {
+      "version": "22.14.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz",
+      "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": "~6.21.0"
+      }
+    },
+    "node_modules/@types/node-forge": {
+      "version": "1.3.11",
+      "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
+      "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/qs": {
+      "version": "6.9.18",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
+      "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/range-parser": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+      "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/send": {
+      "version": "0.17.4",
+      "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
+      "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/mime": "^1",
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/serve-static": {
+      "version": "1.15.7",
+      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+      "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/http-errors": "*",
+        "@types/node": "*",
+        "@types/send": "*"
+      }
+    },
+    "node_modules/@typescript-eslint/project-service": {
+      "version": "8.56.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz",
+      "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/tsconfig-utils": "^8.56.1",
+        "@typescript-eslint/types": "^8.56.1",
+        "debug": "^4.4.3"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "8.56.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz",
+      "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.56.1",
+        "@typescript-eslint/visitor-keys": "8.56.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/tsconfig-utils": {
+      "version": "8.56.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz",
+      "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/types": {
+      "version": "8.56.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz",
+      "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "8.56.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz",
+      "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/project-service": "8.56.1",
+        "@typescript-eslint/tsconfig-utils": "8.56.1",
+        "@typescript-eslint/types": "8.56.1",
+        "@typescript-eslint/visitor-keys": "8.56.1",
+        "debug": "^4.4.3",
+        "minimatch": "^10.2.2",
+        "semver": "^7.7.3",
+        "tinyglobby": "^0.2.15",
+        "ts-api-utils": "^2.4.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+      "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "18 || 20 || >=22"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
+      "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^4.0.2"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+      "version": "10.2.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
+      "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "brace-expansion": "^5.0.2"
+      },
+      "engines": {
+        "node": "18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys": {
+      "version": "8.56.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz",
+      "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.56.1",
+        "eslint-visitor-keys": "^5.0.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+      "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^20.19.0 || ^22.13.0 || >=24"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@ungap/structured-clone": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+      "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/@vitejs/plugin-vue": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.4.tgz",
+      "integrity": "sha512-uM5iXipgYIn13UUQCZNdWkYk+sysBeA97d5mHsAoAt1u/wpN3+zxOmsVJWosuzX+IMGRzeYUNytztrYznboIkQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@rolldown/pluginutils": "1.0.0-rc.2"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "peerDependencies": {
+        "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0",
+        "vue": "^3.2.25"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.29.tgz",
+      "integrity": "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.29.0",
+        "@vue/shared": "3.5.29",
+        "entities": "^7.0.1",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "node_modules/@vue/compiler-core/node_modules/entities": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+      "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz",
+      "integrity": "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-core": "3.5.29",
+        "@vue/shared": "3.5.29"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz",
+      "integrity": "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.29.0",
+        "@vue/compiler-core": "3.5.29",
+        "@vue/compiler-dom": "3.5.29",
+        "@vue/compiler-ssr": "3.5.29",
+        "@vue/shared": "3.5.29",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.21",
+        "postcss": "^8.5.6",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz",
+      "integrity": "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.29",
+        "@vue/shared": "3.5.29"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.2.tgz",
+      "integrity": "sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-kit": "^7.7.2"
+      }
+    },
+    "node_modules/@vue/devtools-kit": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz",
+      "integrity": "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-shared": "^7.7.2",
+        "birpc": "^0.2.19",
+        "hookable": "^5.5.3",
+        "mitt": "^3.0.1",
+        "perfect-debounce": "^1.0.0",
+        "speakingurl": "^14.0.1",
+        "superjson": "^2.2.1"
+      }
+    },
+    "node_modules/@vue/devtools-shared": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz",
+      "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==",
+      "license": "MIT",
+      "dependencies": {
+        "rfdc": "^1.4.1"
+      }
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.29.tgz",
+      "integrity": "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/shared": "3.5.29"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.29.tgz",
+      "integrity": "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.29",
+        "@vue/shared": "3.5.29"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.29.tgz",
+      "integrity": "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.29",
+        "@vue/runtime-core": "3.5.29",
+        "@vue/shared": "3.5.29",
+        "csstype": "^3.2.3"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.29.tgz",
+      "integrity": "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.5.29",
+        "@vue/shared": "3.5.29"
+      },
+      "peerDependencies": {
+        "vue": "3.5.29"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz",
+      "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==",
+      "license": "MIT"
+    },
+    "node_modules/abort-controller": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "event-target-shim": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=6.5"
+      }
+    },
+    "node_modules/accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/accepts/node_modules/negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+      "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.14.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+      "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^0.21.3"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ansi-escapes/node_modules/type-fest": {
+      "version": "0.21.3",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/anymatch/node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/archiver": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz",
+      "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "archiver-utils": "^5.0.2",
+        "async": "^3.2.4",
+        "buffer-crc32": "^1.0.0",
+        "readable-stream": "^4.0.0",
+        "readdir-glob": "^1.1.2",
+        "tar-stream": "^3.0.0",
+        "zip-stream": "^6.0.1"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/archiver-utils": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz",
+      "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "glob": "^10.0.0",
+        "graceful-fs": "^4.2.0",
+        "is-stream": "^2.0.1",
+        "lazystream": "^1.0.0",
+        "lodash": "^4.17.15",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true,
+      "license": "Python-2.0"
+    },
+    "node_modules/array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/async": {
+      "version": "3.2.6",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "license": "MIT"
+    },
+    "node_modules/autoprefixer": {
+      "version": "10.4.21",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+      "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.24.4",
+        "caniuse-lite": "^1.0.30001702",
+        "fraction.js": "^4.3.7",
+        "normalize-range": "^0.1.2",
+        "picocolors": "^1.1.1",
+        "postcss-value-parser": "^4.2.0"
+      },
+      "bin": {
+        "autoprefixer": "bin/autoprefixer"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/axios": {
+      "version": "1.13.5",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
+      "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
+      "license": "MIT",
+      "dependencies": {
+        "follow-redirects": "^1.15.11",
+        "form-data": "^4.0.5",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/b4a": {
+      "version": "1.6.7",
+      "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
+      "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/bare-events": {
+      "version": "2.5.4",
+      "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz",
+      "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/birpc": {
+      "version": "0.2.19",
+      "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz",
+      "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "node_modules/bl/node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/body-parser": {
+      "version": "1.20.4",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
+      "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "~3.1.2",
+        "content-type": "~1.0.5",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "~1.2.0",
+        "http-errors": "~2.0.1",
+        "iconv-lite": "~0.4.24",
+        "on-finished": "~2.4.1",
+        "qs": "~6.14.0",
+        "raw-body": "~2.5.3",
+        "type-is": "~1.6.18",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/body-parser/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/body-parser/node_modules/http-errors": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+      "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "depd": "~2.0.0",
+        "inherits": "~2.0.4",
+        "setprototypeof": "~1.2.0",
+        "statuses": "~2.0.2",
+        "toidentifier": "~1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/body-parser/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/body-parser/node_modules/statuses": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+      "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+      "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001688",
+        "electron-to-chromium": "^1.5.73",
+        "node-releases": "^2.0.19",
+        "update-browserslist-db": "^1.1.1"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "node_modules/buffer-crc32": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
+      "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/bundle-name": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+      "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "run-applescript": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/camel-case": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+      "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "pascal-case": "^3.1.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001712",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001712.tgz",
+      "integrity": "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "CC-BY-4.0"
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/chardet": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
+      "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/chart.js": {
+      "version": "4.4.8",
+      "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz",
+      "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==",
+      "license": "MIT",
+      "dependencies": {
+        "@kurkle/color": "^0.3.0"
+      },
+      "engines": {
+        "pnpm": ">=8"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/ci-info": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
+      "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/sibiraj-s"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/clean-css": {
+      "version": "5.3.3",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+      "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "source-map": "~0.6.0"
+      },
+      "engines": {
+        "node": ">= 10.0"
+      }
+    },
+    "node_modules/cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "restore-cursor": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cli-spinners": {
+      "version": "2.9.2",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+      "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/cli-width": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+      "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/cliui/node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/colorjs.io": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz",
+      "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "license": "MIT",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/commander": {
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+      "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/compress-commons": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz",
+      "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "crc-32": "^1.2.0",
+        "crc32-stream": "^6.0.0",
+        "is-stream": "^2.0.1",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": ">= 1.43.0 < 2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/compression": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
+      "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "3.1.2",
+        "compressible": "~2.0.18",
+        "debug": "2.6.9",
+        "negotiator": "~0.6.4",
+        "on-headers": "~1.1.0",
+        "safe-buffer": "5.2.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/compression/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/compression/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/confbox": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+      "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/content-disposition": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+      "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/copy-anything": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
+      "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+      "license": "MIT",
+      "dependencies": {
+        "is-what": "^4.1.8"
+      },
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "crc32": "bin/crc32.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/crc32-stream": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz",
+      "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "crc-32": "^1.2.0",
+        "readable-stream": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+      "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+      "license": "MIT"
+    },
+    "node_modules/date-fns": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
+      "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/kossnocorp"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/default-browser": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
+      "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "bundle-name": "^4.1.0",
+        "default-browser-id": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/default-browser-id": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
+      "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/defaults": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+      "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "clone": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/define-lazy-prop": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+      "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/destroy": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+      "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/dot-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+      "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/dot-prop": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz",
+      "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^4.18.2"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/dotenv": {
+      "version": "16.4.7",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+      "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://dotenvx.com"
+      }
+    },
+    "node_modules/dotenv-expand": {
+      "version": "11.0.7",
+      "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
+      "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "dotenv": "^16.4.5"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://dotenvx.com"
+      }
+    },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.5.132",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.132.tgz",
+      "integrity": "sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/elementtree": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz",
+      "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "sax": "1.1.4"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/encodeurl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+      "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/engine.io-client": {
+      "version": "6.6.3",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz",
+      "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==",
+      "license": "MIT",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1",
+        "engine.io-parser": "~5.2.1",
+        "ws": "~8.17.1",
+        "xmlhttprequest-ssl": "~2.1.1"
+      }
+    },
+    "node_modules/engine.io-client/node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/engine.io-parser": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+      "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+      "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.25.12",
+        "@esbuild/android-arm": "0.25.12",
+        "@esbuild/android-arm64": "0.25.12",
+        "@esbuild/android-x64": "0.25.12",
+        "@esbuild/darwin-arm64": "0.25.12",
+        "@esbuild/darwin-x64": "0.25.12",
+        "@esbuild/freebsd-arm64": "0.25.12",
+        "@esbuild/freebsd-x64": "0.25.12",
+        "@esbuild/linux-arm": "0.25.12",
+        "@esbuild/linux-arm64": "0.25.12",
+        "@esbuild/linux-ia32": "0.25.12",
+        "@esbuild/linux-loong64": "0.25.12",
+        "@esbuild/linux-mips64el": "0.25.12",
+        "@esbuild/linux-ppc64": "0.25.12",
+        "@esbuild/linux-riscv64": "0.25.12",
+        "@esbuild/linux-s390x": "0.25.12",
+        "@esbuild/linux-x64": "0.25.12",
+        "@esbuild/netbsd-arm64": "0.25.12",
+        "@esbuild/netbsd-x64": "0.25.12",
+        "@esbuild/openbsd-arm64": "0.25.12",
+        "@esbuild/openbsd-x64": "0.25.12",
+        "@esbuild/openharmony-arm64": "0.25.12",
+        "@esbuild/sunos-x64": "0.25.12",
+        "@esbuild/win32-arm64": "0.25.12",
+        "@esbuild/win32-ia32": "0.25.12",
+        "@esbuild/win32-x64": "0.25.12"
+      }
+    },
+    "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+      "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/escodegen": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+      "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esprima": "^4.0.1",
+        "estraverse": "^5.2.0",
+        "esutils": "^2.0.2"
+      },
+      "bin": {
+        "escodegen": "bin/escodegen.js",
+        "esgenerate": "bin/esgenerate.js"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "optionalDependencies": {
+        "source-map": "~0.6.1"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "8.57.1",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+      "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+      "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/regexpp": "^4.6.1",
+        "@eslint/eslintrc": "^2.1.4",
+        "@eslint/js": "8.57.1",
+        "@humanwhocodes/config-array": "^0.13.0",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@nodelib/fs.walk": "^1.2.8",
+        "@ungap/structured-clone": "^1.2.0",
+        "ajv": "^6.12.4",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.3.2",
+        "doctrine": "^3.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^7.2.2",
+        "eslint-visitor-keys": "^3.4.3",
+        "espree": "^9.6.1",
+        "esquery": "^1.4.2",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "globals": "^13.19.0",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "is-path-inside": "^3.0.3",
+        "js-yaml": "^4.1.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3",
+        "strip-ansi": "^6.0.1",
+        "text-table": "^0.2.0"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-compat-utils": {
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+      "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "semver": "^7.5.4"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "eslint": ">=6.0.0"
+      }
+    },
+    "node_modules/eslint-config-prettier": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
+      "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "eslint-config-prettier": "bin/cli.js"
+      },
+      "peerDependencies": {
+        "eslint": ">=7.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-vue": {
+      "version": "9.33.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+      "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "globals": "^13.24.0",
+        "natural-compare": "^1.4.0",
+        "nth-check": "^2.1.1",
+        "postcss-selector-parser": "^6.0.15",
+        "semver": "^7.6.3",
+        "vue-eslint-parser": "^9.4.3",
+        "xml-name-validator": "^4.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-vue/node_modules/globals": {
+      "version": "13.24.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint-plugin-vue/node_modules/type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-visitor-keys": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mysticatea"
+      }
+    },
+    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/node_modules/@eslint/eslintrc": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+      "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.6.0",
+        "globals": "^13.19.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/node_modules/espree": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.9.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/eslint/node_modules/globals": {
+      "version": "13.24.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/ignore": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/eslint/node_modules/type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/espree": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+      "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.14.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^4.2.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/espree/node_modules/eslint-visitor-keys": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/esquery": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "license": "MIT"
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/event-target-shim": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/express": {
+      "version": "4.22.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
+      "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "~1.20.3",
+        "content-disposition": "~0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "~0.7.1",
+        "cookie-signature": "~1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~2.0.0",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.3.1",
+        "fresh": "~0.5.2",
+        "http-errors": "~2.0.0",
+        "merge-descriptors": "1.0.3",
+        "methods": "~1.1.2",
+        "on-finished": "~2.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "~0.1.12",
+        "proxy-addr": "~2.0.7",
+        "qs": "~6.14.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "~0.19.0",
+        "serve-static": "~1.16.2",
+        "setprototypeof": "1.2.0",
+        "statuses": "~2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/express/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/express/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-fifo": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+      "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.8"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fastq": {
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/fdir": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flat-cache": "^3.0.4"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+      "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~2.0.0",
+        "escape-html": "~1.0.3",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "statuses": "2.0.1",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/finalhandler/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/finalhandler/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/flat": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "bin": {
+        "flat": "cli.js"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.3",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.11",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+      "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/foreground-child": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+      "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "cross-spawn": "^7.0.6",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+      "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+      "license": "MIT",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "es-set-tostringtag": "^2.1.0",
+        "hasown": "^2.0.2",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fraction.js": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+      "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "type": "patreon",
+        "url": "https://github.com/sponsors/rawify"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fs-extra": {
+      "version": "11.3.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
+      "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=14.14"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/glob": {
+      "version": "10.5.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+      "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/glob/node_modules/brace-expansion": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/glob/node_modules/minimatch": {
+      "version": "9.0.9",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+      "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/globals": {
+      "version": "15.15.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+      "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "license": "MIT",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/hookable": {
+      "version": "5.5.3",
+      "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+      "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+      "license": "MIT"
+    },
+    "node_modules/html-minifier-terser": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
+      "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "camel-case": "^4.1.2",
+        "clean-css": "~5.3.2",
+        "commander": "^10.0.0",
+        "entities": "^4.4.0",
+        "param-case": "^3.0.4",
+        "relateurl": "^0.2.7",
+        "terser": "^5.15.1"
+      },
+      "bin": {
+        "html-minifier-terser": "cli.js"
+      },
+      "engines": {
+        "node": "^14.13.1 || >=16.0.0"
+      }
+    },
+    "node_modules/http-errors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "depd": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/ignore": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
+      "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/immutable": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
+      "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/inquirer": {
+      "version": "9.3.8",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz",
+      "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@inquirer/external-editor": "^1.0.2",
+        "@inquirer/figures": "^1.0.3",
+        "ansi-escapes": "^4.3.2",
+        "cli-width": "^4.1.0",
+        "mute-stream": "1.0.0",
+        "ora": "^5.4.1",
+        "run-async": "^3.0.0",
+        "rxjs": "^7.8.1",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^6.2.0",
+        "yoctocolors-cjs": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-docker": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+      "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-inside-container": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+      "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^3.0.0"
+      },
+      "bin": {
+        "is-inside-container": "cli.js"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-interactive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-language-code": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-language-code/-/is-language-code-3.1.0.tgz",
+      "integrity": "sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.14.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-what": {
+      "version": "4.1.16",
+      "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
+      "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+      "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-inside-container": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/isbinaryfile": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.4.tgz",
+      "integrity": "sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/gjtorikian/"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/jackspeak": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/js-yaml": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+      "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/jsonc-eslint-parser": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz",
+      "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "acorn": "^8.5.0",
+        "eslint-visitor-keys": "^3.0.0",
+        "espree": "^9.0.0",
+        "semver": "^7.3.5"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ota-meshi"
+      }
+    },
+    "node_modules/jsonc-eslint-parser/node_modules/espree": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.9.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/kolorist": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
+      "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lazystream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
+      "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "readable-stream": "^2.0.5"
+      },
+      "engines": {
+        "node": ">= 0.6.3"
+      }
+    },
+    "node_modules/lazystream/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/lazystream/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lazystream/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/loader-utils": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.23",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+      "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/log-symbols": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lower-case": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+      "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.21",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+      "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.5"
+      }
+    },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/merge-descriptors": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+      "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/micromatch/node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.54.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+      "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types/node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+      "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/mitt": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+      "license": "MIT"
+    },
+    "node_modules/mlly": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
+      "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "acorn": "^8.14.0",
+        "pathe": "^2.0.1",
+        "pkg-types": "^1.3.0",
+        "ufo": "^1.5.4"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "license": "MIT"
+    },
+    "node_modules/mute-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
+      "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.11",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.4",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+      "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/no-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+      "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "lower-case": "^2.0.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/node-addon-api": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+      "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/node-forge": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz",
+      "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==",
+      "dev": true,
+      "license": "(BSD-3-Clause OR GPL-2.0)",
+      "engines": {
+        "node": ">= 6.13.0"
+      }
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
+      "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^4.0.0",
+        "unicorn-magic": "^0.3.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/npm-run-path/node_modules/path-key": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.4",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/on-headers": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+      "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/open": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
+      "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "default-browser": "^5.2.1",
+        "define-lazy-prop": "^3.0.0",
+        "is-inside-container": "^1.0.0",
+        "is-wsl": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.5"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/ora": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "bl": "^4.1.0",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.5.0",
+        "is-interactive": "^1.0.0",
+        "is-unicode-supported": "^0.1.0",
+        "log-symbols": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/package-json-from-dist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+      "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+      "dev": true,
+      "license": "BlueOak-1.0.0"
+    },
+    "node_modules/param-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+      "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "dot-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse5": {
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
+      "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "entities": "^4.5.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/pascal-case": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+      "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-scurry": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-to-regexp": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+      "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/pathe": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/perfect-debounce": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+      "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+      "license": "MIT"
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "license": "ISC"
+    },
+    "node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pinia": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.1.tgz",
+      "integrity": "sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-api": "^7.7.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.4.4",
+        "vue": "^2.7.0 || ^3.5.11"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pkg-types": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+      "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "confbox": "^0.1.8",
+        "mlly": "^1.7.4",
+        "pathe": "^2.0.1"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.5.8",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
+      "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.11",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/postcss-selector-parser": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+      "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/prettier": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
+      "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "license": "MIT"
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.14.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+      "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "side-channel": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/quasar": {
+      "version": "2.18.1",
+      "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.18.1.tgz",
+      "integrity": "sha512-db/P64Mzpt1uXJ0MapaG+IYJQ9hHDb5KtTCoszwC78DR7sA+Uoj7nBW2EytwYykIExEmqavOvKrdasTvqhkgEg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10.18.1",
+        "npm": ">= 6.13.4",
+        "yarn": ">= 1.21.1"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://donate.quasar.dev"
+      }
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "2.5.3",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+      "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "~3.1.2",
+        "http-errors": "~2.0.1",
+        "iconv-lite": "~0.4.24",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/raw-body/node_modules/http-errors": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+      "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "depd": "~2.0.0",
+        "inherits": "~2.0.4",
+        "setprototypeof": "~1.2.0",
+        "statuses": "~2.0.2",
+        "toidentifier": "~1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/raw-body/node_modules/statuses": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+      "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+      "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "abort-controller": "^3.0.0",
+        "buffer": "^6.0.3",
+        "events": "^3.3.0",
+        "process": "^0.11.10",
+        "string_decoder": "^1.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/readable-stream/node_modules/buffer": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.2.1"
+      }
+    },
+    "node_modules/readdir-glob": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
+      "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "minimatch": "^5.1.0"
+      }
+    },
+    "node_modules/readdir-glob/node_modules/brace-expansion": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/readdir-glob/node_modules/minimatch": {
+      "version": "5.1.9",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+      "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/readdirp/node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.14.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/restore-cursor/node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/reusify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rfdc": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+      "license": "MIT"
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "4.59.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz",
+      "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "1.0.8"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.59.0",
+        "@rollup/rollup-android-arm64": "4.59.0",
+        "@rollup/rollup-darwin-arm64": "4.59.0",
+        "@rollup/rollup-darwin-x64": "4.59.0",
+        "@rollup/rollup-freebsd-arm64": "4.59.0",
+        "@rollup/rollup-freebsd-x64": "4.59.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.59.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.59.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.59.0",
+        "@rollup/rollup-linux-arm64-musl": "4.59.0",
+        "@rollup/rollup-linux-loong64-gnu": "4.59.0",
+        "@rollup/rollup-linux-loong64-musl": "4.59.0",
+        "@rollup/rollup-linux-ppc64-gnu": "4.59.0",
+        "@rollup/rollup-linux-ppc64-musl": "4.59.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.59.0",
+        "@rollup/rollup-linux-riscv64-musl": "4.59.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.59.0",
+        "@rollup/rollup-linux-x64-gnu": "4.59.0",
+        "@rollup/rollup-linux-x64-musl": "4.59.0",
+        "@rollup/rollup-openbsd-x64": "4.59.0",
+        "@rollup/rollup-openharmony-arm64": "4.59.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.59.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.59.0",
+        "@rollup/rollup-win32-x64-gnu": "4.59.0",
+        "@rollup/rollup-win32-x64-msvc": "4.59.0",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer": {
+      "version": "5.14.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz",
+      "integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "open": "^8.4.0",
+        "picomatch": "^4.0.2",
+        "source-map": "^0.7.4",
+        "yargs": "^17.5.1"
+      },
+      "bin": {
+        "rollup-plugin-visualizer": "dist/bin/cli.js"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "rolldown": "1.x",
+        "rollup": "2.x || 3.x || 4.x"
+      },
+      "peerDependenciesMeta": {
+        "rolldown": {
+          "optional": true
+        },
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/define-lazy-prop": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+      "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/open": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-lazy-prop": "^2.0.0",
+        "is-docker": "^2.1.1",
+        "is-wsl": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/source-map": {
+      "version": "0.7.4",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/run-applescript": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
+      "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/run-async": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz",
+      "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/rxjs": {
+      "version": "7.8.2",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+      "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/sass": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz",
+      "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "chokidar": "^4.0.0",
+        "immutable": "^5.0.2",
+        "source-map-js": ">=0.6.2 <2.0.0"
+      },
+      "bin": {
+        "sass": "sass.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher": "^2.4.1"
+      }
+    },
+    "node_modules/sass-embedded": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.97.3.tgz",
+      "integrity": "sha512-eKzFy13Nk+IRHhlAwP3sfuv+PzOrvzUkwJK2hdoCKYcWGSdmwFpeGpWmyewdw8EgBnsKaSBtgf/0b2K635ecSA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@bufbuild/protobuf": "^2.5.0",
+        "colorjs.io": "^0.5.0",
+        "immutable": "^5.0.2",
+        "rxjs": "^7.4.0",
+        "supports-color": "^8.1.1",
+        "sync-child-process": "^1.0.2",
+        "varint": "^6.0.0"
+      },
+      "bin": {
+        "sass": "dist/bin/sass.js"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      },
+      "optionalDependencies": {
+        "sass-embedded-all-unknown": "1.97.3",
+        "sass-embedded-android-arm": "1.97.3",
+        "sass-embedded-android-arm64": "1.97.3",
+        "sass-embedded-android-riscv64": "1.97.3",
+        "sass-embedded-android-x64": "1.97.3",
+        "sass-embedded-darwin-arm64": "1.97.3",
+        "sass-embedded-darwin-x64": "1.97.3",
+        "sass-embedded-linux-arm": "1.97.3",
+        "sass-embedded-linux-arm64": "1.97.3",
+        "sass-embedded-linux-musl-arm": "1.97.3",
+        "sass-embedded-linux-musl-arm64": "1.97.3",
+        "sass-embedded-linux-musl-riscv64": "1.97.3",
+        "sass-embedded-linux-musl-x64": "1.97.3",
+        "sass-embedded-linux-riscv64": "1.97.3",
+        "sass-embedded-linux-x64": "1.97.3",
+        "sass-embedded-unknown-all": "1.97.3",
+        "sass-embedded-win32-arm64": "1.97.3",
+        "sass-embedded-win32-x64": "1.97.3"
+      }
+    },
+    "node_modules/sass-embedded-all-unknown": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.97.3.tgz",
+      "integrity": "sha512-t6N46NlPuXiY3rlmG6/+1nwebOBOaLFOOVqNQOC2cJhghOD4hh2kHNQQTorCsbY9S1Kir2la1/XLBwOJfui0xg==",
+      "cpu": [
+        "!arm",
+        "!arm64",
+        "!riscv64",
+        "!x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "sass": "1.97.3"
+      }
+    },
+    "node_modules/sass-embedded-android-arm": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.97.3.tgz",
+      "integrity": "sha512-cRTtf/KV/q0nzGZoUzVkeIVVFv3L/tS1w4WnlHapphsjTXF/duTxI8JOU1c/9GhRPiMdfeXH7vYNcMmtjwX7jg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-arm64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.97.3.tgz",
+      "integrity": "sha512-aiZ6iqiHsUsaDx0EFbbmmA0QgxicSxVVN3lnJJ0f1RStY0DthUkquGT5RJ4TPdaZ6ebeJWkboV4bra+CP766eA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-riscv64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.97.3.tgz",
+      "integrity": "sha512-zVEDgl9JJodofGHobaM/q6pNETG69uuBIGQHRo789jloESxxZe82lI3AWJQuPmYCOG5ElfRthqgv89h3gTeLYA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-x64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.97.3.tgz",
+      "integrity": "sha512-3ke0le7ZKepyXn/dKKspYkpBC0zUk/BMciyP5ajQUDy4qJwobd8zXdAq6kOkdiMB+d9UFJOmEkvgFJHl3lqwcw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-darwin-arm64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.97.3.tgz",
+      "integrity": "sha512-fuqMTqO4gbOmA/kC5b9y9xxNYw6zDEyfOtMgabS7Mz93wimSk2M1quQaTJnL98Mkcsl2j+7shNHxIS/qpcIDDA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-darwin-x64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.97.3.tgz",
+      "integrity": "sha512-b/2RBs/2bZpP8lMkyZ0Px0vkVkT8uBd0YXpOwK7iOwYkAT8SsO4+WdVwErsqC65vI5e1e5p1bb20tuwsoQBMVA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-arm": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.97.3.tgz",
+      "integrity": "sha512-2lPQ7HQQg4CKsH18FTsj2hbw5GJa6sBQgDsls+cV7buXlHjqF8iTKhAQViT6nrpLK/e8nFCoaRgSqEC8xMnXuA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-arm64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.97.3.tgz",
+      "integrity": "sha512-IP1+2otCT3DuV46ooxPaOKV1oL5rLjteRzf8ldZtfIEcwhSgSsHgA71CbjYgLEwMY9h4jeal8Jfv3QnedPvSjg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-arm": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.97.3.tgz",
+      "integrity": "sha512-cBTMU68X2opBpoYsSZnI321gnoaiMBEtc+60CKCclN6PCL3W3uXm8g4TLoil1hDD6mqU9YYNlVG6sJ+ZNef6Lg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-arm64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.97.3.tgz",
+      "integrity": "sha512-Lij0SdZCsr+mNRSyDZ7XtJpXEITrYsaGbOTz5e6uFLJ9bmzUbV7M8BXz2/cA7bhfpRPT7/lwRKPdV4+aR9Ozcw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-riscv64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.97.3.tgz",
+      "integrity": "sha512-sBeLFIzMGshR4WmHAD4oIM7WJVkSoCIEwutzptFtGlSlwfNiijULp+J5hA2KteGvI6Gji35apR5aWj66wEn/iA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-x64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.97.3.tgz",
+      "integrity": "sha512-/oWJ+OVrDg7ADDQxRLC/4g1+Nsz1g4mkYS2t6XmyMJKFTFK50FVI2t5sOdFH+zmMp+nXHKM036W94y9m4jjEcw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-riscv64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.97.3.tgz",
+      "integrity": "sha512-l3IfySApLVYdNx0Kjm7Zehte1CDPZVcldma3dZt+TfzvlAEerM6YDgsk5XEj3L8eHBCgHgF4A0MJspHEo2WNfA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-x64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.97.3.tgz",
+      "integrity": "sha512-Kwqwc/jSSlcpRjULAOVbndqEy2GBzo6OBmmuBVINWUaJLJ8Kczz3vIsDUWLfWz/kTEw9FHBSiL0WCtYLVAXSLg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-unknown-all": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.97.3.tgz",
+      "integrity": "sha512-/GHajyYJmvb0IABUQHbVHf1nuHPtIDo/ClMZ81IDr59wT5CNcMe7/dMNujXwWugtQVGI5UGmqXWZQCeoGnct8Q==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "!android",
+        "!darwin",
+        "!linux",
+        "!win32"
+      ],
+      "dependencies": {
+        "sass": "1.97.3"
+      }
+    },
+    "node_modules/sass-embedded-win32-arm64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.97.3.tgz",
+      "integrity": "sha512-RDGtRS1GVvQfMGAmVXNxYiUOvPzn9oO1zYB/XUM9fudDRnieYTcUytpNTQZLs6Y1KfJxgt5Y+giRceC92fT8Uw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-win32-x64": {
+      "version": "1.97.3",
+      "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.97.3.tgz",
+      "integrity": "sha512-SFRa2lED9UEwV6vIGeBXeBOLKF+rowF3WmNfb/BzhxmdAsKofCXrJ8ePW7OcDVrvNEbTOGwhsReIsF5sH8fVaw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/sass/node_modules/chokidar": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "readdirp": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/sass/node_modules/readdirp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">= 14.18.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/sax": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz",
+      "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/selfsigned": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
+      "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node-forge": "^1.3.0",
+        "node-forge": "^1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/semver": {
+      "version": "7.7.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+      "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.19.0",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+      "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/send/node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/send/node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/serialize-javascript": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+      "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/serve-static": {
+      "version": "1.16.2",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+      "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "encodeurl": "~2.0.0",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.19.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3",
+        "side-channel-list": "^1.0.0",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-list": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-weakmap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3",
+        "side-channel-map": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/socket.io-client": {
+      "version": "4.8.1",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
+      "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.2",
+        "engine.io-client": "~6.6.1",
+        "socket.io-parser": "~4.2.4"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/socket.io-client/node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/socket.io-parser": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+      "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+      "license": "MIT",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/socket.io-parser/node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/speakingurl": {
+      "version": "14.0.1",
+      "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
+      "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/stack-trace": {
+      "version": "1.0.0-pre2",
+      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz",
+      "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/streamx": {
+      "version": "2.22.0",
+      "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz",
+      "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-fifo": "^1.3.2",
+        "text-decoder": "^1.1.0"
+      },
+      "optionalDependencies": {
+        "bare-events": "^2.2.0"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string-width-cjs": {
+      "name": "string-width",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/superjson": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
+      "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
+      "license": "MIT",
+      "dependencies": {
+        "copy-anything": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/sync-child-process": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz",
+      "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "sync-message-port": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/sync-message-port": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz",
+      "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/synckit": {
+      "version": "0.9.2",
+      "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
+      "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@pkgr/core": "^0.1.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/unts"
+      }
+    },
+    "node_modules/tar-stream": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
+      "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "b4a": "^1.6.4",
+        "fast-fifo": "^1.2.0",
+        "streamx": "^2.15.0"
+      }
+    },
+    "node_modules/terser": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz",
+      "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "@jridgewell/source-map": "^0.3.3",
+        "acorn": "^8.8.2",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terser/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/text-decoder": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
+      "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "b4a": "^1.6.4"
+      }
+    },
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/tiny-invariant": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+      "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/tinyglobby": {
+      "version": "0.2.15",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+      "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/ts-api-utils": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
+      "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.12"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4"
+      }
+    },
+    "node_modules/ts-essentials": {
+      "version": "9.4.2",
+      "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.2.tgz",
+      "integrity": "sha512-mB/cDhOvD7pg3YCLk2rOtejHjjdSi9in/IBYE13S+8WA5FBSraYf4V/ws55uvs0IvQ/l0wBOlXy5yBNZ9Bl8ZQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "typescript": ">=4.1.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "dev": true,
+      "license": "0BSD"
+    },
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/type-fest": {
+      "version": "4.39.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz",
+      "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "5.9.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+      "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "peer": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/ufo": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.0.tgz",
+      "integrity": "sha512-AkgU2cV/+Xb4Uz6cic0kMZbtM42nbltnGvTVOt/8gMCbO2/z64nE47TOygh7HjgFPkUkVRBEyNFqpqi3zo+BJA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/undici-types": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/unicorn-magic": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+      "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/universalify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+      "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/unplugin": {
+      "version": "2.3.11",
+      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz",
+      "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/remapping": "^2.3.5",
+        "acorn": "^8.15.0",
+        "picomatch": "^4.0.3",
+        "webpack-virtual-modules": "^0.6.2"
+      },
+      "engines": {
+        "node": ">=18.12.0"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+      "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "escalade": "^3.2.0",
+        "picocolors": "^1.1.1"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/varint": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+      "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/vite": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
+      "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "^0.27.0",
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3",
+        "postcss": "^8.5.6",
+        "rollup": "^4.43.0",
+        "tinyglobby": "^0.2.15"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^20.19.0 || >=22.12.0",
+        "jiti": ">=1.21.0",
+        "less": "^4.0.0",
+        "lightningcss": "^1.21.0",
+        "sass": "^1.70.0",
+        "sass-embedded": "^1.70.0",
+        "stylus": ">=0.54.8",
+        "sugarss": "^5.0.0",
+        "terser": "^5.16.0",
+        "tsx": "^4.8.1",
+        "yaml": "^2.4.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-plugin-checker": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.9.1.tgz",
+      "integrity": "sha512-neH3CSNWdkZ+zi+WPt/0y5+IO2I0UAI0NX6MaXqU/KxN1Lz6np/7IooRB6VVAMBa4nigqm1GRF6qNa4+EL5jDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.26.2",
+        "chokidar": "^4.0.3",
+        "npm-run-path": "^6.0.0",
+        "picocolors": "^1.1.1",
+        "picomatch": "^4.0.2",
+        "strip-ansi": "^7.1.0",
+        "tiny-invariant": "^1.3.3",
+        "tinyglobby": "^0.2.12",
+        "vscode-uri": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "peerDependencies": {
+        "@biomejs/biome": ">=1.7",
+        "eslint": ">=7",
+        "meow": "^13.2.0",
+        "optionator": "^0.9.4",
+        "stylelint": ">=16",
+        "typescript": "*",
+        "vite": ">=2.0.0",
+        "vls": "*",
+        "vti": "*",
+        "vue-tsc": "~2.2.2"
+      },
+      "peerDependenciesMeta": {
+        "@biomejs/biome": {
+          "optional": true
+        },
+        "eslint": {
+          "optional": true
+        },
+        "meow": {
+          "optional": true
+        },
+        "optionator": {
+          "optional": true
+        },
+        "stylelint": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        },
+        "vls": {
+          "optional": true
+        },
+        "vti": {
+          "optional": true
+        },
+        "vue-tsc": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-plugin-checker/node_modules/ansi-regex": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/vite-plugin-checker/node_modules/chokidar": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "readdirp": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/vite-plugin-checker/node_modules/readdirp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14.18.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/vite-plugin-checker/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz",
+      "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/android-arm": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz",
+      "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/android-arm64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz",
+      "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/android-x64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz",
+      "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz",
+      "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz",
+      "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz",
+      "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz",
+      "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-arm": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz",
+      "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz",
+      "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz",
+      "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz",
+      "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz",
+      "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz",
+      "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz",
+      "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz",
+      "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-x64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz",
+      "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz",
+      "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz",
+      "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz",
+      "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz",
+      "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz",
+      "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz",
+      "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz",
+      "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/win32-x64": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz",
+      "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/vite/node_modules/esbuild": {
+      "version": "0.27.3",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
+      "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.27.3",
+        "@esbuild/android-arm": "0.27.3",
+        "@esbuild/android-arm64": "0.27.3",
+        "@esbuild/android-x64": "0.27.3",
+        "@esbuild/darwin-arm64": "0.27.3",
+        "@esbuild/darwin-x64": "0.27.3",
+        "@esbuild/freebsd-arm64": "0.27.3",
+        "@esbuild/freebsd-x64": "0.27.3",
+        "@esbuild/linux-arm": "0.27.3",
+        "@esbuild/linux-arm64": "0.27.3",
+        "@esbuild/linux-ia32": "0.27.3",
+        "@esbuild/linux-loong64": "0.27.3",
+        "@esbuild/linux-mips64el": "0.27.3",
+        "@esbuild/linux-ppc64": "0.27.3",
+        "@esbuild/linux-riscv64": "0.27.3",
+        "@esbuild/linux-s390x": "0.27.3",
+        "@esbuild/linux-x64": "0.27.3",
+        "@esbuild/netbsd-arm64": "0.27.3",
+        "@esbuild/netbsd-x64": "0.27.3",
+        "@esbuild/openbsd-arm64": "0.27.3",
+        "@esbuild/openbsd-x64": "0.27.3",
+        "@esbuild/openharmony-arm64": "0.27.3",
+        "@esbuild/sunos-x64": "0.27.3",
+        "@esbuild/win32-arm64": "0.27.3",
+        "@esbuild/win32-ia32": "0.27.3",
+        "@esbuild/win32-x64": "0.27.3"
+      }
+    },
+    "node_modules/vscode-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
+      "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/vue": {
+      "version": "3.5.29",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.29.tgz",
+      "integrity": "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.29",
+        "@vue/compiler-sfc": "3.5.29",
+        "@vue/runtime-dom": "3.5.29",
+        "@vue/server-renderer": "3.5.29",
+        "@vue/shared": "3.5.29"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-chartjs": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.3.2.tgz",
+      "integrity": "sha512-NrkbRRoYshbXbWqJkTN6InoDVwVb90C0R7eAVgMWcB9dPikbruaOoTFjFYHE/+tNPdIe6qdLCDjfjPHQ0fw4jw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "chart.js": "^4.1.1",
+        "vue": "^3.0.0-0 || ^2.7.0"
+      }
+    },
+    "node_modules/vue-currency-input": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/vue-currency-input/-/vue-currency-input-3.2.1.tgz",
+      "integrity": "sha512-Osfxzdu5cdZSCS4Cm0vuk7LwNeSdHWGIWK8gtDBC1kU0UtAKz7iU/8dyJ0KDJKxbAYiKeovoQTRfYxCH82I0EA==",
+      "license": "MIT",
+      "peerDependencies": {
+        "vue": "^2.7 || ^3.0.0"
+      }
+    },
+    "node_modules/vue-eslint-parser": {
+      "version": "9.4.3",
+      "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
+      "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.3.4",
+        "eslint-scope": "^7.1.1",
+        "eslint-visitor-keys": "^3.3.0",
+        "espree": "^9.3.1",
+        "esquery": "^1.4.0",
+        "lodash": "^4.17.21",
+        "semver": "^7.3.6"
+      },
+      "engines": {
+        "node": "^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mysticatea"
+      },
+      "peerDependencies": {
+        "eslint": ">=6.0.0"
+      }
+    },
+    "node_modules/vue-eslint-parser/node_modules/espree": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.9.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/vue-i18n": {
+      "version": "9.14.5",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.5.tgz",
+      "integrity": "sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==",
+      "deprecated": "v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html",
+      "license": "MIT",
+      "dependencies": {
+        "@intlify/core-base": "9.14.5",
+        "@intlify/shared": "9.14.5",
+        "@vue/devtools-api": "^6.5.0"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/vue-i18n/node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+      "license": "MIT"
+    },
+    "node_modules/vue-router": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz",
+      "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-api": "^6.6.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/vue-router/node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+      "license": "MIT"
+    },
+    "node_modules/wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "node_modules/webpack-merge": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
+      "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "clone-deep": "^4.0.1",
+        "flat": "^5.0.2",
+        "wildcard": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/webpack-virtual-modules": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+      "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/wildcard": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+      "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi-cjs": {
+      "name": "wrap-ansi",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/ws": {
+      "version": "8.17.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+      "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/xml-name-validator": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+      "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/xmlhttprequest-ssl": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
+      "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yaml": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
+      "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "yaml": "bin.mjs"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/yaml-eslint-parser": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz",
+      "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-visitor-keys": "^3.0.0",
+        "yaml": "^2.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ota-meshi"
+      }
+    },
+    "node_modules/yargs": {
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cliui": "^8.0.1",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/yoctocolors-cjs": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz",
+      "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/zip-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz",
+      "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "archiver-utils": "^5.0.0",
+        "compress-commons": "^6.0.2",
+        "readable-stream": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    }
+  }
+}

+ 49 - 0
package.json

@@ -0,0 +1,49 @@
+{
+  "name": "alugap",
+  "version": "0.5.0",
+  "description": "A skeleton for future projects",
+  "productName": "Quasar App",
+  "author": "Denis <denis.gnl@gmail.com>",
+  "type": "module",
+  "private": true,
+  "scripts": {
+    "lint": "eslint --ext .js,.vue ./",
+    "format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore",
+    "test": "echo \"No test specified\" && exit 0",
+    "dev": "quasar dev",
+    "build": "quasar build",
+    "deploy": "aws --profile michel-softpar --region sa-east-1 s3 sync ./dist/spa s3://alugap-backoffice-test --delete"
+  },
+  "dependencies": {
+    "@quasar/extras": "^1.16.17",
+    "axios": "^1.8.4",
+    "chart.js": "^4.4.8",
+    "date-fns": "^4.1.0",
+    "pinia": "^3.0.1",
+    "quasar": "^2.18.1",
+    "socket.io-client": "^4.8.1",
+    "vue": "^3.5",
+    "vue-chartjs": "^5.3.2",
+    "vue-currency-input": "^3.2.1",
+    "vue-i18n": "^9.14.5",
+    "vue-router": "^4.5.0"
+  },
+  "devDependencies": {
+    "@intlify/eslint-plugin-vue-i18n": "^3.2.0",
+    "@intlify/unplugin-vue-i18n": "^11.0.7",
+    "@intlify/vue-i18n-loader": "^4.2.0",
+    "@quasar/app-vite": "^2.2.0",
+    "autoprefixer": "^10.4.21",
+    "eslint": "^8.57.1",
+    "eslint-config-prettier": "^9.1.0",
+    "eslint-plugin-vue": "^9.32.0",
+    "postcss": "^8.5.3",
+    "prettier": "^3.5.3",
+    "vite-plugin-checker": "^0.9.1"
+  },
+  "engines": {
+    "node": "^24 || ^22 || ^20 || ^18",
+    "npm": ">= 6.13.4",
+    "yarn": ">= 1.21.1"
+  }
+}

BIN=BIN
public/icons/favicon-128x128.png


BIN=BIN
public/icons/favicon-16x16.png


BIN=BIN
public/icons/favicon-32x32.png


BIN=BIN
public/icons/favicon-96x96.png


BIN=BIN
public/icons/favicon.ico


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 14 - 0
public/icons/icon.svg


BIN=BIN
public/images/barcode.png


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 6 - 0
public/images/bg-login.svg


BIN=BIN
public/images/checkin-success.png


+ 203 - 0
public/images/checkin-success.svg

@@ -0,0 +1,203 @@
+<svg width="210" height="213" viewBox="0 0 210 213" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M52.5791 1.22632H11.9551V43.5727H52.5791V1.22632Z" fill="#E0E0E0"/>
+<path d="M49.8271 1.22632H9.20312V43.5727H49.8271V1.22632Z" fill="#EBEBEB"/>
+<path d="M44.3693 6.91968H14.668V37.8793H44.3693V6.91968Z" fill="#FAFAFA"/>
+<path d="M14.6678 38.085C14.4493 38.397 14.201 38.687 13.9263 38.9509C13.4478 39.4294 12.778 40.1231 12.0125 40.8647C11.247 41.6062 10.5772 42.2617 10.0988 42.7258C9.84001 42.9943 9.55648 43.2378 9.25195 43.453C9.46192 43.14 9.70405 42.8497 9.97439 42.587C10.4528 42.1086 11.1226 41.4101 11.8881 40.6733C12.6536 39.9365 13.3234 39.2763 13.8258 38.8074C14.0792 38.5365 14.3616 38.2943 14.6678 38.085Z" fill="#E0E0E0"/>
+<path d="M44.3691 37.9941C44.6728 38.2139 44.9548 38.4622 45.2112 38.7357C45.6896 39.2142 46.3834 39.884 47.1249 40.6495C47.8665 41.415 48.5172 42.0848 48.986 42.5632C49.2559 42.8207 49.4995 43.1044 49.7133 43.41C49.4072 43.1951 49.1249 42.9481 48.8712 42.6732C48.3928 42.1948 47.6991 41.525 46.9575 40.7595C46.2159 39.994 45.5652 39.3242 45.0964 38.8458C44.8246 38.5883 44.5809 38.3028 44.3691 37.9941Z" fill="#E0E0E0"/>
+<path d="M44.2871 7.00111C44.505 6.69596 44.7535 6.41381 45.0287 6.15907C45.5071 5.68063 46.1721 4.9869 46.9185 4.24532C47.6649 3.50375 48.3538 2.84829 48.8562 2.38421C49.1158 2.1148 49.401 1.87125 49.7078 1.65698C49.4889 1.95991 49.2405 2.24037 48.9662 2.49425C48.4878 2.97268 47.8228 3.6712 47.0525 4.40799C46.2822 5.14478 45.6172 5.80502 45.11 6.27389C44.861 6.54346 44.5853 6.78711 44.2871 7.00111Z" fill="#E0E0E0"/>
+<path d="M14.5863 7.07752C14.2826 6.85776 14.0007 6.60943 13.7443 6.33594C13.2658 5.85751 12.5673 5.1877 11.8305 4.4222C11.0937 3.6567 10.4335 2.98689 9.96463 2.50845C9.69522 2.25188 9.45311 1.96809 9.24219 1.66162C9.54474 1.8792 9.82517 2.12598 10.0795 2.39841C10.5579 2.87685 11.2564 3.54666 11.9932 4.31216C12.73 5.07765 13.3902 5.74746 13.8591 6.2259C14.1308 6.48335 14.3746 6.76881 14.5863 7.07752Z" fill="#E0E0E0"/>
+<path d="M44.2874 37.8794C44.2874 37.8794 44.2874 37.8268 44.2874 37.7311C44.2874 37.6354 44.2874 37.4823 44.2874 37.3005C44.2874 36.913 44.2874 36.3436 44.2874 35.6307C44.2874 34.1667 44.2874 32.0329 44.2874 29.3202C44.2874 23.8995 44.2587 16.1727 44.2348 6.91979L44.3353 7.01548H14.7153L14.8254 6.90544C14.8254 18.2683 14.8254 28.9135 14.8254 37.865L14.7297 37.7694L36.1827 37.8172L42.2015 37.8459H43.7947H42.2254H36.221L14.6914 37.8937H14.5957V37.7981C14.5957 28.8322 14.5957 18.1822 14.5957 6.83846V6.72363H14.7105H44.3305H44.4262V6.8241C44.4262 16.101 44.3879 23.8516 44.3783 29.3106C44.3783 32.0138 44.3784 34.138 44.3496 35.5972C44.3496 36.3149 44.3496 36.8699 44.3496 37.2479C44.3496 37.4297 44.3496 37.5684 44.3496 37.6689C44.3496 37.7694 44.2874 37.8794 44.2874 37.8794Z" fill="#E0E0E0"/>
+<path d="M22.5054 19.8518C22.5054 19.8518 21.8691 27.5068 30.1604 27.5068C30.17 23.4257 26.797 20.1963 22.5054 19.8518Z" fill="#EBEBEB"/>
+<path d="M37.694 19.8567C37.694 19.8567 30.0391 19.2204 30.0391 27.5117C34.1201 27.5261 37.3496 24.1483 37.694 19.8567Z" fill="#EBEBEB"/>
+<path d="M29.8013 15.6609C29.8013 15.6609 23.5386 21.2825 30.1458 27.5165C33.2173 24.2632 32.9398 19.1583 29.8013 15.6609Z" fill="#E0E0E0"/>
+<path d="M157.17 156.292C154.642 154.712 151.787 153.73 148.821 153.422C147.458 153.283 145.951 153.321 144.87 154.149C144.744 154.223 144.641 154.329 144.569 154.456C144.498 154.582 144.461 154.726 144.463 154.871C144.531 155.072 144.668 155.242 144.85 155.35C148.247 157.938 153.386 158.268 157.17 156.283" fill="#E0E0E0"/>
+<path d="M156.955 156.053C155.022 154.635 153.217 153.048 151.563 151.312C149.903 149.563 148.735 147.405 148.181 145.059C148.037 144.346 147.994 143.532 148.449 142.968C152.754 146.317 156.104 150.666 156.955 156.053Z" fill="#E0E0E0"/>
+<path d="M157.127 156.259C156.727 153.912 156.76 151.513 157.222 149.178C157.763 146.867 159.021 144.657 160.997 143.336C161.739 145.073 161.418 147.073 160.897 148.886C160.086 151.697 158.822 154.357 157.155 156.761" fill="#E0E0E0"/>
+<path d="M161.336 163.823C158.781 164.134 156.552 165.483 154.638 167.21C152.721 168.959 151.385 171.253 150.811 173.784C153.322 173.631 155.451 171.87 156.992 169.88C158.533 167.89 159.609 165.718 161.298 163.861" fill="#E0E0E0"/>
+<path d="M162.256 165.014C161.25 162.458 160.898 159.69 161.232 156.963C161.566 154.236 162.576 151.636 164.17 149.398C165.629 154.579 165.093 160.435 162.256 165.014Z" fill="#E0E0E0"/>
+<path d="M167.82 171.645C165.482 171.499 163.153 172.045 161.123 173.214C159.093 174.383 157.452 176.124 156.405 178.219C156.261 178.501 156.137 178.86 156.328 179.114C156.427 179.209 156.547 179.279 156.679 179.317C156.811 179.356 156.95 179.361 157.084 179.334C159.333 179.19 161.328 177.836 162.974 176.296C164.62 174.755 166.055 172.97 167.873 171.64" fill="#E0E0E0"/>
+<path d="M167.643 171.286C166.445 167.427 166.372 163.306 167.432 159.407C167.849 157.876 168.552 156.268 169.968 155.551C170.024 155.513 170.088 155.487 170.155 155.475C170.222 155.464 170.29 155.467 170.356 155.484C170.47 155.544 170.557 155.645 170.6 155.766C171.074 156.836 171.279 158.005 171.198 159.172C171.113 160.335 170.934 161.488 170.662 162.622C170.217 164.732 169.983 167 168.825 168.818C168.55 169.254 168.304 169.708 168.088 170.176C167.868 170.655 167.868 170.803 167.667 171.172" fill="#E0E0E0"/>
+<path d="M182.38 173.482C181.289 169.325 182.447 164.292 185.064 160.885C185.26 160.636 185.513 160.368 185.829 160.407C186.308 160.45 186.437 161.096 186.413 161.579C186.217 165.85 184.819 169.98 182.38 173.492" fill="#E0E0E0"/>
+<path d="M183.709 174.387C188.756 175.702 194.546 174.425 198.741 171.33C196.226 170.069 193.353 169.717 190.608 170.334C187.891 170.956 185.407 172.172 183.714 174.387" fill="#E0E0E0"/>
+<path d="M184.828 171.621C187.656 167.014 193.072 164.01 198.473 163.737C197.851 165.933 196.043 167.636 194.009 168.669C191.976 169.703 189.703 170.148 187.46 170.583C186.589 170.751 185.393 170.937 184.828 171.621Z" fill="#E0E0E0"/>
+<path d="M182.661 158.206C183.427 155.584 184.197 152.943 184.407 150.216C184.618 147.489 184.226 144.652 182.814 142.312C180.173 147.422 179.91 153.388 182.58 158.479" fill="#E0E0E0"/>
+<path d="M191.551 153.713C194.637 148.101 200.933 143.623 207.306 142.992C204.847 149.116 198.144 153.843 191.551 153.713Z" fill="#E0E0E0"/>
+<path d="M189.607 154.814C194.21 155.513 198.133 158.455 202.434 160.235C203.335 160.672 204.335 160.863 205.334 160.79C205.799 160.787 206.253 160.642 206.633 160.373C207.013 160.104 207.301 159.724 207.458 159.286C207.614 158.847 207.632 158.371 207.509 157.922C207.386 157.473 207.127 157.073 206.769 156.776C206.159 156.214 205.444 155.779 204.664 155.498C199.975 153.546 194.952 153.498 190.014 154.68" fill="#E0E0E0"/>
+<path d="M186.943 158.043C187.986 158.34 188.34 158.881 189.168 159.584C191.982 161.976 195.311 163.685 198.895 164.579C199.268 164.67 199.751 164.708 199.938 164.373C200.124 164.038 199.895 163.722 199.684 163.464C198.122 161.63 196.094 160.252 193.814 159.474C191.565 158.641 189.623 157.632 186.943 157.847" fill="#E0E0E0"/>
+<path d="M183.934 138.537C185.823 140.276 188.055 141.599 190.487 142.423C192.918 143.247 195.495 143.553 198.052 143.322C198.287 143.326 198.515 143.245 198.693 143.092C199.047 142.705 198.622 142.107 198.215 141.786C194.062 138.552 189.038 137.207 183.938 138.518" fill="#E0E0E0"/>
+<path d="M187.498 137.236C189.997 135.397 192.895 134.174 195.957 133.668C199.019 133.163 202.156 133.389 205.114 134.327C202.894 136.514 199.818 137.676 196.718 138.011C193.623 138.295 190.502 138.032 187.498 137.236Z" fill="#E0E0E0"/>
+<path d="M186.082 128.275C185.675 124.132 185.938 120.864 185.651 116.702C185.651 116.367 185.56 115.97 185.249 115.85C184.814 115.683 184.455 116.214 184.292 116.654C183.689 118.583 183.534 120.625 183.84 122.623C184.146 124.622 184.905 126.524 186.058 128.184" fill="#E0E0E0"/>
+<path d="M185.785 128.729C188.594 126.993 190.699 124.73 192.646 122.065C194 120.209 195.143 117.989 194.837 115.711C192.923 115.673 191.125 116.721 189.885 118.17C188.705 119.671 187.846 121.399 187.364 123.247C186.814 125.069 186.431 126.94 185.785 128.729Z" fill="#E0E0E0"/>
+<path d="M192.526 126.859C198.701 124.572 204.419 121.2 209.41 116.903C207.395 116.089 205.104 116.577 203.07 117.381C198.463 119.242 194.698 122.381 192.439 126.801" fill="#E0E0E0"/>
+<path d="M187.68 130.997C190.799 131.337 193.966 131.562 197.057 131.045C200.148 130.528 202.971 129.332 205.808 128.136C206.061 128.059 206.275 127.888 206.406 127.658C206.45 127.526 206.453 127.384 206.414 127.251C206.376 127.118 206.298 126.999 206.19 126.911C205.973 126.738 205.717 126.618 205.444 126.562C202.358 125.696 199.023 126.084 195.985 127.127C193.091 128.109 190.307 129.392 187.68 130.954" fill="#E0E0E0"/>
+<path d="M169.883 138.681C167.758 134.375 167.897 129.38 169.729 124.955C171.026 126.926 171.165 129.433 170.945 131.782C170.725 134.131 169.988 136.538 169.95 138.896" fill="#E0E0E0"/>
+<path d="M161.384 134.394C158.722 134.36 156.082 134.881 153.633 135.925C151.183 136.968 148.979 138.512 147.16 140.456C149.811 140.872 152.538 140.188 154.949 139.021C157.36 137.853 159.504 136.193 161.647 134.552" fill="#E0E0E0"/>
+<path d="M155.677 132.485C153.079 132.275 150.577 131.954 148.079 132.72C145.582 133.485 143.295 135.222 142.295 137.629C144.746 137.825 147.204 137.361 149.414 136.284C151.611 135.207 153.707 133.936 155.677 132.485Z" fill="#E0E0E0"/>
+<path d="M164.131 132.572C161.796 131.041 159.394 129.486 156.677 128.849C153.959 128.213 150.802 128.682 148.902 130.734C151.108 132.026 153.778 132.17 156.332 132.17C158.887 132.17 162.016 132.136 164.423 132.988" fill="#E0E0E0"/>
+<path d="M164.145 132.696C160.15 128.773 158.638 121.725 160.246 116.367C163.398 121.194 164.777 126.965 164.145 132.696Z" fill="#E0E0E0"/>
+<path d="M175.131 121.582C175.887 119.831 176.413 117.993 177.092 116.209C177.708 114.4 178.653 112.721 179.882 111.257C181.133 109.787 182.911 108.866 184.834 108.693C184.218 111.395 183.046 113.939 181.393 116.163C179.74 118.387 177.641 120.242 175.231 121.61" fill="#E0E0E0"/>
+<path d="M173.145 123.897C171.896 122.185 170.456 119.855 168.767 118.572C167.078 117.29 164.873 116.515 162.811 117.008C163.879 118.88 165.37 120.478 167.164 121.674C168.958 122.87 171.005 123.631 173.145 123.897Z" fill="#E0E0E0"/>
+<path d="M173.543 121.721C172.724 119.644 171.902 117.544 171.571 115.338C171.241 113.133 171.442 110.774 172.571 108.851C174.763 112.994 175.471 117.462 173.653 121.768" fill="#E0E0E0"/>
+<path d="M175.15 108.855C176.394 104.746 180.155 101.717 184.217 100.33C184.721 100.125 185.267 100.043 185.81 100.09C186.08 100.122 186.334 100.231 186.543 100.406C186.751 100.58 186.904 100.811 186.982 101.071C187.13 101.77 186.552 102.396 186.025 102.86C182.849 105.571 179.156 107.611 175.17 108.855" fill="#E0E0E0"/>
+<path d="M175.198 105.492C175.356 102.846 175.518 100.157 176.38 97.6456C177.241 95.1338 178.906 92.7799 181.322 91.6843C181.733 94.3588 180.552 97.0189 179.126 99.3393C177.7 101.66 175.987 103.813 175.131 106.382" fill="#E0E0E0"/>
+<path d="M175.13 107.32C174.106 104.325 173.996 100.521 172.207 97.9087C170.953 96.0859 168.944 94.8419 167.862 92.9138C167.21 94.7653 167.301 96.7974 168.116 98.5833C168.931 100.351 170.053 101.96 171.432 103.334C172.762 104.769 173.895 105.817 175.13 107.32Z" fill="#E0E0E0"/>
+<path d="M175.149 195.51C175.073 195.51 175.001 175.53 174.996 150.895C174.992 126.261 175.049 106.272 175.13 106.272C175.212 106.272 175.279 126.246 175.283 150.895C175.288 175.545 175.231 195.51 175.149 195.51Z" fill="#E0E0E0"/>
+<path d="M192.607 135.667C192.366 135.784 192.115 135.879 191.856 135.949L189.789 136.648C188.048 137.241 185.651 138.083 183.053 139.164C180.455 140.245 178.053 141.164 176.67 142.36C176.12 142.822 175.682 143.403 175.388 144.059C175.192 144.537 175.158 144.814 175.13 144.81C175.118 144.74 175.118 144.669 175.13 144.599C175.161 144.4 175.211 144.205 175.278 144.015C175.539 143.319 175.968 142.698 176.527 142.207C177.361 141.502 178.295 140.924 179.297 140.489C180.402 139.973 181.632 139.432 182.933 138.896C185.541 137.829 187.957 136.982 189.717 136.451C190.598 136.179 191.315 135.973 191.818 135.839C192.075 135.757 192.339 135.699 192.607 135.667Z" fill="#E0E0E0"/>
+<path d="M198.329 121.61C198.329 121.61 198.267 121.696 198.119 121.835L197.477 122.438L195.085 124.61L187.119 131.705C184.009 134.471 181.325 137.116 179.464 139.107C178.531 140.102 177.795 140.925 177.292 141.499C177.063 141.767 176.871 141.977 176.713 142.159C176.555 142.341 176.508 142.389 176.498 142.379C176.548 142.29 176.605 142.205 176.67 142.126C176.79 141.963 176.967 141.724 177.206 141.427C177.685 140.829 178.397 139.992 179.311 138.968C181.715 136.342 184.258 133.845 186.928 131.49C190.047 128.725 192.889 126.227 194.951 124.457L197.406 122.352L198.08 121.792C198.156 121.722 198.239 121.661 198.329 121.61Z" fill="#E0E0E0"/>
+<path d="M183.767 134.519C183.685 134.48 184.331 132.983 184.982 131.083C185.633 129.184 185.939 127.586 186.025 127.6C186.111 127.615 185.915 129.256 185.255 131.179C184.979 131.993 184.659 132.792 184.298 133.571C184.167 133.911 183.988 134.23 183.767 134.519Z" fill="#E0E0E0"/>
+<path d="M175.168 146.599C174.99 146.432 174.829 146.246 174.69 146.044L173.46 144.47C172.432 143.135 171.006 141.298 169.408 139.284C167.81 137.27 166.341 135.456 165.279 134.16L164.03 132.614C163.866 132.432 163.722 132.234 163.6 132.021C163.789 132.177 163.962 132.352 164.116 132.543C164.437 132.887 164.891 133.399 165.442 134.035C166.547 135.313 168.044 137.097 169.642 139.116C171.24 141.135 172.647 142.992 173.637 144.355C174.116 145.039 174.522 145.594 174.79 145.987C174.934 146.18 175.06 146.385 175.168 146.599Z" fill="#E0E0E0"/>
+<path d="M171.341 141.695C171.293 141.748 170.274 140.533 169.738 138.695C169.437 137.716 169.313 136.69 169.375 135.667H169.499C169.446 135.896 169.403 136.021 169.379 136.016C169.355 136.011 169.355 135.882 169.379 135.648H169.509C169.568 136.645 169.74 137.632 170.021 138.59C170.532 140.379 171.418 141.647 171.341 141.695Z" fill="#E0E0E0"/>
+<path d="M166.423 135.48C166.079 135.217 165.702 134.998 165.303 134.83C164.296 134.528 163.236 134.444 162.193 134.581C161.138 134.662 160.091 134.832 159.064 135.088C158.644 135.223 158.214 135.325 157.777 135.394C158.162 135.167 158.578 134.997 159.012 134.892C160.04 134.572 161.101 134.372 162.174 134.294C163.255 134.15 164.354 134.268 165.38 134.638C165.816 134.787 166.185 135.086 166.423 135.48Z" fill="#E0E0E0"/>
+<path d="M165.228 133.973C165.228 134.016 164.577 133.71 163.515 133.347C160.736 132.394 157.76 132.169 154.869 132.691C153.764 132.887 153.094 133.093 153.08 133.045C153.22 132.957 153.374 132.892 153.535 132.854C153.959 132.705 154.392 132.584 154.831 132.49C157.75 131.849 160.793 132.08 163.582 133.155C164.001 133.316 164.41 133.501 164.807 133.71C165.089 133.863 165.237 133.954 165.228 133.973Z" fill="#E0E0E0"/>
+<path d="M175.131 127.601C175.054 127.601 174.494 125.687 173.882 123.256C173.27 120.826 172.83 118.86 172.925 118.84C173.021 118.821 173.562 120.754 174.174 123.185C174.786 125.615 175.207 127.581 175.131 127.601Z" fill="#E0E0E0"/>
+<path d="M175.212 127.6C175.126 127.629 174.762 126.328 173.824 124.998C173.236 124.212 172.549 123.504 171.781 122.893C172.072 122.965 172.343 123.104 172.571 123.299C173.15 123.723 173.653 124.243 174.059 124.835C174.678 125.64 175.075 126.594 175.212 127.6Z" fill="#E0E0E0"/>
+<path d="M175.149 184.874C175.12 184.874 175.058 184.396 174.833 183.544C174.504 182.35 174.057 181.191 173.498 180.085C172.12 177.267 169.609 173.688 166.417 170.11C164.834 168.301 163.303 166.598 162.001 164.966C160.833 163.529 159.776 162.005 158.839 160.407C158.213 159.328 157.68 158.198 157.246 157.029C157.098 156.608 156.992 156.287 156.93 156.072C156.889 155.948 156.863 155.82 156.854 155.689C156.882 155.689 157.026 156.168 157.356 156.962C157.829 158.108 158.385 159.218 159.021 160.282C159.975 161.855 161.041 163.357 162.212 164.775C163.518 166.387 165.054 168.086 166.638 169.894C169.838 173.487 172.345 177.104 173.69 179.975C174.235 181.1 174.657 182.28 174.948 183.496C175.028 183.825 175.087 184.159 175.125 184.496C175.148 184.621 175.156 184.748 175.149 184.874Z" fill="#E0E0E0"/>
+<path d="M190.929 167.043C190.663 167.219 190.387 167.378 190.102 167.521C189.353 167.947 188.637 168.427 187.958 168.956C186.953 169.738 186.011 170.597 185.14 171.526C184.15 172.569 183.131 173.784 182.093 175.08C180.016 177.688 178.074 179.994 176.911 181.836C176.318 182.75 175.887 183.52 175.605 184.061C175.475 184.349 175.323 184.628 175.15 184.893C175.164 184.812 175.19 184.733 175.227 184.659C175.289 184.51 175.375 184.286 175.504 184.013C175.869 183.227 176.28 182.464 176.734 181.726C177.868 179.841 179.796 177.501 181.868 174.899C182.911 173.597 183.939 172.382 184.949 171.339C185.834 170.413 186.794 169.562 187.819 168.794C188.517 168.278 189.258 167.825 190.035 167.44C190.307 167.301 190.513 167.215 190.68 167.153C190.755 167.099 190.84 167.062 190.929 167.043Z" fill="#E0E0E0"/>
+<path d="M191.235 172.822C190.66 172.951 190.076 173.036 189.488 173.076C188.086 173.221 186.699 173.494 185.345 173.889C184.007 174.326 182.752 174.984 181.633 175.836C180.776 176.501 180.374 177.047 180.336 177.013C180.396 176.864 180.484 176.728 180.594 176.612C180.866 176.264 181.17 175.944 181.503 175.655C182.61 174.733 183.883 174.033 185.254 173.593C186.627 173.186 188.041 172.936 189.469 172.846C190.056 172.784 190.647 172.776 191.235 172.822Z" fill="#E0E0E0"/>
+<path d="M180.843 176.382C180.752 176.329 181.542 175.123 182.149 173.511C182.757 171.899 182.857 170.449 182.963 170.463C183.008 170.782 182.998 171.105 182.934 171.42C182.846 172.174 182.675 172.915 182.422 173.631C182.158 174.34 181.818 175.018 181.408 175.655C181.26 175.926 181.07 176.172 180.843 176.382Z" fill="#E0E0E0"/>
+<path d="M196.038 151.522C195.949 151.58 195.854 151.63 195.756 151.671L194.933 152.044C194.574 152.197 194.139 152.393 193.646 152.651C193.153 152.91 192.579 153.168 191.976 153.532L191.019 154.072C190.689 154.264 190.359 154.489 190.015 154.704C189.311 155.134 188.608 155.661 187.857 156.192C184.638 158.595 181.83 161.503 179.542 164.804C179.034 165.574 178.532 166.296 178.13 167.014C177.924 167.368 177.709 167.703 177.532 168.038L177.02 168.995C176.681 169.607 176.441 170.191 176.202 170.693C175.963 171.195 175.776 171.65 175.638 172.004L175.293 172.837C175.258 172.937 175.211 173.033 175.154 173.124C175.169 173.019 175.196 172.916 175.236 172.817C175.317 172.593 175.413 172.31 175.532 171.961C175.684 171.509 175.858 171.065 176.054 170.631C176.279 170.119 176.508 169.526 176.838 168.904L177.317 167.918C177.489 167.579 177.7 167.239 177.905 166.875C178.298 166.148 178.795 165.44 179.302 164.641C181.582 161.299 184.413 158.369 187.675 155.976C188.44 155.441 189.153 154.919 189.866 154.498C190.22 154.283 190.55 154.063 190.885 153.876L191.842 153.345C192.45 152.996 193.038 152.742 193.541 152.503C193.967 152.291 194.405 152.1 194.852 151.934L195.698 151.613C195.807 151.567 195.921 151.536 196.038 151.522Z" fill="#E0E0E0"/>
+<path d="M183.551 159.885C183.668 159.483 183.907 159.127 184.235 158.866C185.003 158.195 185.985 157.819 187.005 157.804C188.003 157.797 188.992 157.991 189.914 158.373C190.304 158.497 190.675 158.676 191.014 158.905C190.622 158.827 190.237 158.711 189.866 158.56C188.953 158.248 187.994 158.086 187.029 158.082C186.072 158.102 185.147 158.427 184.388 159.01C184.089 159.282 183.809 159.574 183.551 159.885Z" fill="#E0E0E0"/>
+<path d="M181.684 161.813C181.603 161.77 182.306 160.737 182.469 159.258C182.632 157.78 182.206 156.613 182.292 156.589C182.378 156.565 182.483 156.847 182.617 157.335C182.958 158.621 182.799 159.989 182.172 161.163C181.928 161.603 181.732 161.832 181.684 161.813Z" fill="#E0E0E0"/>
+<path d="M161.352 187.745C161.782 195.4 164.083 203.145 167.624 210.997H183.01C186.388 203.198 188.527 195.447 188.909 187.745H161.352Z" fill="#E0E0E0"/>
+<path d="M186.416 200.074C186.416 200.155 181.349 200.222 175.096 200.222C168.843 200.222 163.781 200.155 163.781 200.074C163.781 199.993 168.848 199.93 175.096 199.93C181.345 199.93 186.416 199.997 186.416 200.074Z" fill="#FAFAFA"/>
+<path d="M186.072 202.839C186.072 202.921 181.321 202.988 175.465 202.988C169.609 202.988 164.854 202.921 164.854 202.839C164.854 202.758 169.604 202.696 175.465 202.696C181.326 202.696 186.072 202.763 186.072 202.839Z" fill="#FAFAFA"/>
+<path d="M167.858 192.735C168.05 195.094 168.05 197.466 167.858 199.825C167.777 199.825 167.715 198.237 167.715 196.28C167.715 194.323 167.791 192.735 167.858 192.735Z" fill="#FAFAFA"/>
+<path d="M176.116 192.735C176.198 192.735 176.26 194.376 176.26 196.404C176.26 198.433 176.198 200.074 176.116 200.074C176.035 200.074 175.973 198.433 175.973 196.404C175.973 194.376 176.035 192.735 176.116 192.735Z" fill="#FAFAFA"/>
+<path d="M183.856 192.673C183.938 192.673 184 194.347 184 196.414C184 198.481 183.938 200.16 183.856 200.16C183.775 200.16 183.713 198.486 183.713 196.414C183.713 194.342 183.775 192.673 183.856 192.673Z" fill="#FAFAFA"/>
+<path d="M188.43 192.735C188.43 192.816 182.488 192.878 175.159 192.878C167.829 192.878 161.887 192.816 161.887 192.735C161.887 192.653 167.824 192.591 175.159 192.591C182.493 192.591 188.43 192.653 188.43 192.735Z" fill="#FAFAFA"/>
+<path d="M180.164 116.568H5.7832V121.94H180.164V116.568Z" fill="#EBEBEB"/>
+<path d="M20.8688 121.28L7.80273 210.973H10.6064L26.7201 121.941L20.8688 121.28Z" fill="#EBEBEB"/>
+<path d="M167.848 120.711L181.632 210.973H178.833L161.992 121.534L167.848 120.711Z" fill="#EBEBEB"/>
+<path d="M12.4038 94.9282V107.023H10.3848V108.324H12.4038V116.42H50.1619V109.052H47.3679V107.444H50.1619V105.052H51.4059V103.961H49.9227V94.9282H12.4038Z" fill="#F5F5F5"/>
+<path d="M40.1309 94.9471V116.281H50.1541V108.917H47.36V107.449L50.1541 107.496V105.09H51.422L51.398 103.846L49.9244 103.812V94.9136L40.1309 94.9471Z" fill="#E0E0E0"/>
+<path d="M40.8439 108.147C40.8439 108.224 34.0166 108.281 25.5913 108.281C17.1661 108.281 10.334 108.224 10.334 108.147C10.334 108.071 17.1661 108.013 25.5913 108.013C34.0166 108.013 40.8439 108.075 40.8439 108.147Z" fill="#E0E0E0"/>
+<path d="M40.8439 106.918C40.8439 106.994 34.0166 107.052 25.5913 107.052C17.1661 107.052 10.334 106.994 10.334 106.918C10.334 106.841 17.1661 106.784 25.5913 106.784C34.0166 106.784 40.8439 106.846 40.8439 106.918Z" fill="#E0E0E0"/>
+<path d="M42.8048 103.612C42.8048 103.688 35.9727 103.746 27.5522 103.746C19.1318 103.746 12.2949 103.688 12.2949 103.612C12.2949 103.535 19.1222 103.478 27.5522 103.478C35.9823 103.478 42.8048 103.54 42.8048 103.612Z" fill="#E0E0E0"/>
+<path d="M42.9864 112.63C42.9864 112.707 36.1591 112.769 27.7339 112.769C19.3086 112.769 12.4766 112.707 12.4766 112.63C12.4766 112.554 19.3038 112.496 27.7339 112.496C36.1639 112.496 42.9864 112.549 42.9864 112.63Z" fill="#E0E0E0"/>
+<path d="M52.9524 86.8137H46.3691V94.6409H52.9524V86.8137Z" fill="#F5F5F5"/>
+<path d="M46.5929 86.3018H16.8438V95.1289H46.5929V86.3018Z" fill="#E0E0E0"/>
+<path d="M53.1485 87.0482H45.7949V86.3162H53.1485C53.2475 86.3162 53.3424 86.3555 53.4124 86.4255C53.4824 86.4954 53.5217 86.5904 53.5217 86.6893C53.518 86.7858 53.477 86.8771 53.4074 86.944C53.3378 87.0109 53.245 87.0482 53.1485 87.0482Z" fill="#E0E0E0"/>
+<path d="M53.1485 95.1338H45.7949V94.3875H53.1485C53.2475 94.3875 53.3424 94.4268 53.4124 94.4968C53.4824 94.5667 53.5217 94.6617 53.5217 94.7606C53.5217 94.8596 53.4824 94.9545 53.4124 95.0245C53.3424 95.0945 53.2475 95.1338 53.1485 95.1338Z" fill="#E0E0E0"/>
+<path d="M44.2587 86.3018H40.7422V95.1289H44.2587V86.3018Z" fill="#EBEBEB"/>
+<path d="M23.1942 86.4023H19.6777V95.2295H23.1942V86.4023Z" fill="#EBEBEB"/>
+<path d="M52.952 88.1104C52.952 88.1104 51.5167 88.1487 49.7704 88.1487C48.0241 88.1487 46.584 88.1487 46.584 88.1104C46.584 88.0722 48.0193 88.0674 49.7704 88.0674C51.5214 88.0674 52.952 88.0865 52.952 88.1104Z" fill="#E0E0E0"/>
+<path d="M52.952 89.2824C52.952 89.2824 51.5167 89.3207 49.7704 89.3207C48.0241 89.3207 46.584 89.3207 46.584 89.2824C46.584 89.2441 48.0193 89.2441 49.7704 89.2441C51.5214 89.2441 52.952 89.2585 52.952 89.2824Z" fill="#E0E0E0"/>
+<path d="M52.952 90.7275C52.952 90.7275 51.5167 90.7658 49.7704 90.7658C48.0241 90.7658 46.584 90.7658 46.584 90.7275C46.584 90.6892 48.0193 90.6892 49.7704 90.6892C51.5214 90.6892 52.952 90.7036 52.952 90.7275Z" fill="#E0E0E0"/>
+<path d="M52.952 92.1723C52.952 92.1723 51.5167 92.2106 49.7704 92.2106C48.0241 92.2106 46.584 92.2106 46.584 92.1723C46.584 92.134 48.0193 92.134 49.7704 92.134C51.5214 92.134 52.952 92.1484 52.952 92.1723Z" fill="#E0E0E0"/>
+<path d="M52.952 93.6171C52.952 93.6171 51.5167 93.6554 49.7704 93.6554C48.0241 93.6554 46.584 93.6554 46.584 93.6171C46.584 93.5789 48.0193 93.5789 49.7704 93.5789C51.5214 93.5789 52.952 93.5932 52.952 93.6171Z" fill="#E0E0E0"/>
+<path d="M38.8487 89.9331H25.4668V91.5215H38.8487V89.9331Z" fill="#EBEBEB"/>
+<path d="M40.3449 77.7332L44.048 86.4311H41.6653L40.0195 81.7855L40.3449 77.7332Z" fill="#E0E0E0"/>
+<path d="M28.9774 69.8674L27.5469 86.4309H39.6465L40.9766 69.8674H28.9774Z" fill="#EBEBEB"/>
+<path d="M30.1598 71.1785L28.9062 85.0531L37.9917 85.1728L39.2165 71.0972L30.1598 71.1785Z" fill="#FAFAFA"/>
+<path d="M32.0879 73.1018L31.375 82.6466H36.2216L37.0732 73.1018H32.0879Z" fill="#E0E0E0"/>
+<path d="M171.132 8.3005L166.658 8.32471L166.779 30.586L171.252 30.5618L171.132 8.3005Z" fill="#E0E0E0"/>
+<path d="M139.484 8.35698L127.896 8.41968L127.963 20.7105L139.551 20.6478L139.484 8.35698Z" fill="#EBEBEB"/>
+<path d="M151.013 8.29961L139.426 8.3623L139.492 20.6531L151.08 20.5905L151.013 8.29961Z" fill="#F5F5F5"/>
+<path d="M127.913 11.8237C135.611 11.8907 143.333 11.8237 151.031 11.7185C151.059 11.7128 151.085 11.6976 151.103 11.6754C151.121 11.6531 151.131 11.6252 151.131 11.5965C151.131 11.5677 151.121 11.5398 151.103 11.5175C151.085 11.4953 151.059 11.4801 151.031 11.4745C143.335 11.4298 135.63 11.4761 127.918 11.6132C127.89 11.6132 127.863 11.6243 127.843 11.644C127.824 11.6638 127.812 11.6905 127.812 11.7185C127.812 11.7464 127.824 11.7732 127.843 11.7929C127.863 11.8126 127.89 11.8237 127.918 11.8237H127.913Z" fill="#E0E0E0"/>
+<path d="M141.727 20.4493L120.676 20.5632L120.73 30.5768L141.781 30.4629L141.727 20.4493Z" fill="#EBEBEB"/>
+<path d="M162.676 20.3312L141.625 20.4451L141.679 30.4586L162.73 30.3447L162.676 20.3312Z" fill="#F5F5F5"/>
+<path d="M120.683 23.3539C134.668 23.5118 148.701 23.3539 162.685 23.1482C162.718 23.1482 162.75 23.1351 162.773 23.1118C162.797 23.0885 162.81 23.0568 162.81 23.0238C162.81 22.9908 162.797 22.9592 162.773 22.9359C162.75 22.9125 162.718 22.8994 162.685 22.8994C148.701 22.8277 134.663 22.8324 120.683 23.1434C120.655 23.1434 120.629 23.1545 120.609 23.1743C120.589 23.194 120.578 23.2208 120.578 23.2487C120.578 23.2766 120.589 23.3034 120.609 23.3231C120.629 23.3429 120.655 23.3539 120.683 23.3539Z" fill="#E0E0E0"/>
+<path d="M194.369 30.5833H112.814V34.1715H194.369V30.5833Z" fill="#E0E0E0"/>
+<path d="M129.479 32.3103H126.168V44.5535H129.479V32.3103Z" fill="#E0E0E0"/>
+<path d="M178.901 32.3103H175.59V44.5535H178.901V32.3103Z" fill="#E0E0E0"/>
+<path d="M175.493 -3.32781e-05L171.02 0.0241699L171.185 30.6436L175.659 30.6194L175.493 -3.32781e-05Z" fill="#EBEBEB"/>
+<path d="M182.485 5.70335L175.533 5.74097L175.667 30.5523L182.619 30.5147L182.485 5.70335Z" fill="#F5F5F5"/>
+<path d="M182.44 10.489C181.285 10.6088 180.122 10.6488 178.962 10.6086C177.803 10.6489 176.642 10.6089 175.488 10.489C177.803 10.3295 180.125 10.3295 182.44 10.489Z" fill="#E0E0E0"/>
+<path d="M182.44 9.44578C181.285 9.5656 180.122 9.60557 178.962 9.56538C177.803 9.60567 176.642 9.5657 175.488 9.44578C177.803 9.2863 180.125 9.2863 182.44 9.44578Z" fill="#E0E0E0"/>
+<path d="M182.44 26.7893C180.125 26.9488 177.803 26.9488 175.488 26.7893C177.803 26.6298 180.125 26.6298 182.44 26.7893Z" fill="#E0E0E0"/>
+<path d="M182.44 25.7461C180.125 25.9055 177.803 25.9055 175.488 25.7461C177.803 25.5866 180.125 25.5866 182.44 25.7461Z" fill="#E0E0E0"/>
+<path d="M179.078 23.4735C179.011 23.4735 178.953 20.9713 178.953 17.8806C178.953 14.7899 179.011 12.2925 179.078 12.2925C179.145 12.2925 179.197 14.7947 179.197 17.8806C179.197 20.9665 179.14 23.4735 179.078 23.4735Z" fill="#E0E0E0"/>
+<path d="M190.081 11.8047H182.512V30.5355H190.081V11.8047Z" fill="#EBEBEB"/>
+<path d="M174.48 5.23582C174.481 5.49057 174.406 5.73986 174.266 5.95214C174.125 6.16441 173.924 6.33011 173.689 6.42825C173.454 6.5264 173.195 6.55257 172.945 6.50345C172.695 6.45433 172.465 6.33214 172.285 6.15234C172.104 5.97254 171.981 5.74323 171.931 5.49345C171.881 5.24367 171.906 4.98465 172.004 4.74921C172.101 4.51376 172.266 4.31248 172.478 4.17085C172.689 4.02922 172.938 3.95362 173.193 3.95361C173.534 3.95361 173.86 4.08855 174.102 4.32887C174.343 4.5692 174.479 4.89532 174.48 5.23582Z" fill="#E0E0E0"/>
+<path d="M173.589 8.77612H172.795V26.9902H173.589V8.77612Z" fill="#E0E0E0"/>
+<path d="M200.8 210.973C200.8 211.04 155.827 211.097 100.405 211.097C44.9826 211.097 0 211.04 0 210.973C0 210.906 44.9443 210.848 100.405 210.848C155.865 210.848 200.8 210.901 200.8 210.973Z" fill="#08514C"/>
+<path d="M99.583 150.365L119.309 210.973H115.716L92.6074 150.365H99.583Z" fill="#E0E0E0"/>
+<path d="M99.5822 150.365H99.1038H97.7642L92.5875 150.393L92.6353 150.322C96.5968 160.641 105.137 182.961 115.031 208.796C115.299 209.504 115.567 210.231 115.835 210.906L115.72 210.829H119.308L119.189 210.992C113.682 194.003 108.768 178.86 105.233 167.962C103.472 162.503 102.056 158.111 101.08 155.072C100.601 153.556 100.219 152.379 99.9602 151.575L99.6731 150.661C99.6109 150.456 99.5822 150.346 99.5822 150.346C99.5822 150.346 99.6205 150.441 99.6875 150.642L99.9889 151.537C100.252 152.336 100.64 153.498 101.137 155.001C102.132 158.029 103.568 162.407 105.357 167.842C108.921 178.755 113.873 193.912 119.423 210.901L119.476 211.064H115.648L115.615 210.983C115.351 210.284 115.079 209.581 114.811 208.873C104.979 182.999 96.4868 160.656 92.5684 150.35V150.279H92.6449L97.8503 150.307H99.1756C99.4435 150.355 99.5822 150.365 99.5822 150.365Z" fill="#08514C"/>
+<path d="M60.7611 150.365L41.0352 210.973H44.6234L67.7367 150.365H60.7611Z" fill="#E0E0E0"/>
+<path d="M60.7618 150.365C60.7618 150.365 60.9102 150.365 61.2068 150.365H62.5321L67.7374 150.336H67.814L67.7853 150.408C63.8717 160.713 55.3794 183.056 45.5476 208.93L44.739 211.04L44.7103 211.121H40.8828L40.9354 210.959L55.0062 167.899L59.2261 155.058C59.7045 153.556 60.1112 152.393 60.3743 151.594L60.6757 150.7C60.7427 150.499 60.781 150.403 60.781 150.403C60.781 150.403 60.7523 150.513 60.6901 150.719L60.403 151.632C60.1446 152.436 59.7667 153.613 59.2835 155.13C58.3027 158.168 56.8913 162.56 55.1306 168.019C51.5902 178.918 46.6815 194.06 41.1747 211.049L41.055 210.887H44.6433L44.5285 210.963L45.3323 208.853C55.2263 183.018 63.7664 160.68 67.7039 150.384L67.7566 150.456L62.5751 150.427H61.2403L60.7618 150.365Z" fill="#08514C"/>
+<path d="M93.1131 151.695C93.005 151.786 92.8898 151.87 92.7686 151.943L91.7543 152.613L88.0177 155.063C84.8648 157.139 80.5159 160.019 75.7363 163.225L63.4979 171.478L59.7852 173.971L58.7757 174.612C58.6617 174.696 58.54 174.77 58.4121 174.832C58.5174 174.738 58.6294 174.651 58.747 174.573L59.7326 173.87L63.4022 171.315C66.5072 169.172 70.818 166.229 75.6023 163.024C80.3867 159.818 84.7452 156.957 87.9268 154.919C89.5152 153.905 90.7974 153.087 91.7065 152.527L92.7447 151.896C92.8622 151.819 92.9854 151.752 93.1131 151.695Z" fill="#08514C"/>
+<path d="M55.2696 85.7518C55.2696 85.7518 49.0882 86.3881 48.1887 90.1103C47.2892 93.8325 44.3612 139.868 48.1887 146.389C52.0162 152.91 101.295 152.001 104.716 151.106C108.137 150.211 109.749 147.992 109.4 145.279C109.051 142.566 75.493 139.203 75.493 139.203L77.5408 91.1581C77.5408 91.1581 65.4746 85.082 55.2696 85.7518Z" fill="#08514C"/>
+<path d="M109.428 146.441H109.279H108.839L107.15 146.484C105.681 146.523 103.557 146.542 100.931 146.537C95.6678 146.537 88.4195 146.355 80.4248 145.781C76.4299 145.489 72.6263 145.121 69.1768 144.729C65.7273 144.336 62.627 143.906 60.0339 143.499C58.7325 143.308 57.5651 143.102 56.5365 142.93C55.5079 142.757 54.6227 142.6 53.9003 142.451L52.2401 142.131L51.8095 142.045L51.666 142.006C51.7152 142 51.7651 142 51.8143 142.006L52.2497 142.068L53.9195 142.341C54.6419 142.466 55.527 142.614 56.5604 142.767C57.5938 142.92 58.7612 143.121 60.0578 143.298C62.6557 143.686 65.756 144.083 69.2007 144.475C72.6454 144.867 76.449 145.217 80.4439 145.508C88.4338 146.083 95.6821 146.279 100.931 146.336C103.552 146.365 105.677 146.37 107.15 146.365H109.284L109.428 146.441Z" fill="#455A64"/>
+<path d="M102.195 175.511C102.156 175.569 94.3483 170.081 84.7604 163.263C75.1726 156.446 67.4267 150.862 67.465 150.824C67.5033 150.786 75.3113 156.254 84.904 163.077C94.4966 169.899 102.233 175.454 102.195 175.511Z" fill="#08514C"/>
+<path d="M59.6375 44.4195L55.6904 37.4678C58.1283 33.5097 58.9974 28.7828 58.127 24.2164C57.2566 19.6499 54.7097 15.5742 50.9868 12.7903C47.2639 10.0064 42.6343 8.71574 38.0081 9.17196C33.3819 9.62819 29.0937 11.7983 25.9863 15.2558C22.8789 18.7133 21.1771 23.208 21.2155 27.8565C21.2538 32.505 23.0296 36.971 26.1936 40.3767C29.3576 43.7824 33.6811 45.8815 38.3142 46.2613C42.9473 46.6411 47.555 45.2742 51.2314 42.4292L59.6375 44.4195Z" fill="white"/>
+<path d="M59.637 44.4195L51.207 42.5057H51.0921L51.1639 42.41L51.2691 42.5153C48.6776 44.5401 45.5953 45.841 42.3367 46.2854C41.3609 46.4241 40.3746 46.4753 39.3896 46.4385C38.8824 46.4097 38.3657 46.3954 37.8442 46.3523L36.2702 46.1179C31.5797 45.1976 27.4157 42.5254 24.625 38.6447C23.0752 36.5042 22.0003 34.0575 21.4722 31.4682C20.9362 28.7218 21.0113 25.891 21.6922 23.1769C22.397 20.3442 23.7664 17.7201 25.6872 15.5219C27.6372 13.2657 30.0975 11.5073 32.8637 10.3931C35.517 9.34535 38.3718 8.90716 41.2172 9.11087C43.9043 9.29622 46.5177 10.0704 48.8722 11.3787C53.1036 13.7193 56.2753 17.5949 57.7328 22.2057C58.3071 24.1738 58.5797 26.2176 58.5414 28.2675C58.4399 31.5371 57.4778 34.7222 55.7521 37.5013V37.4247L59.637 44.4147C59.3786 43.9745 58.1634 41.8742 55.6277 37.4965V37.463V37.4247C57.3162 34.6587 58.2484 31.4975 58.3309 28.2579C58.3621 26.2342 58.0846 24.2175 57.508 22.2774C56.0677 17.7194 52.9363 13.8861 48.7574 11.5653C46.4343 10.2799 43.8567 9.522 41.2076 9.34531C38.4058 9.1464 35.5951 9.5797 32.9833 10.6132C30.2612 11.7118 27.8403 13.4438 25.9216 15.6654C24.0295 17.8302 22.6813 20.4151 21.9889 23.2056C21.3137 25.8765 21.2369 28.6637 21.764 31.3677C22.2755 33.9294 23.3293 36.3519 24.8547 38.4725C27.6015 42.3102 31.7076 44.9569 36.3372 45.8739L37.8921 46.1131C38.4088 46.1562 38.9159 46.1705 39.4183 46.204C40.3917 46.2431 41.3667 46.1967 42.332 46.0653C45.5605 45.6392 48.6199 44.3703 51.2022 42.3861L51.6806 42.0273L51.3218 42.5057L51.2787 42.3909L59.637 44.4195Z" fill="#08514C"/>
+<path d="M36.6569 25.2342H37.8339L40.3983 21.6555V19.3064C40.3983 19.3064 42.2164 19.1964 42.0058 22.2679C41.7953 25.3395 42.0058 24.5596 42.0058 24.5596C42.0058 24.5596 45.8668 24.5596 46.1874 24.9137C46.4218 25.1529 46.5271 28.9899 46.5653 31.0664C46.5921 31.5682 46.4496 32.0644 46.1607 32.4756C45.8718 32.8868 45.4533 33.1891 44.9721 33.3341C44.8366 33.372 44.6966 33.3913 44.5559 33.3916C43.599 33.3916 38.6759 32.6069 38.6759 32.6069H36.6426L36.6569 25.2342Z" fill="#08514C"/>
+<path d="M33.2891 24.5884L34.0163 32.6309H36.0305V24.751L33.2891 24.5884Z" fill="#84A8A6"/>
+<path d="M134.067 126.505C134.067 126.505 145.138 126.505 145.593 136.82C146.047 147.135 113.365 201.553 113.365 201.553L103.017 196.639L125.206 143.834L77.0566 139.098L78.4202 126.984L134.067 126.505Z" fill="#FFBE9D"/>
+<path d="M115.553 198.414L115.233 199.146C115.233 199.146 125.376 209.576 124.467 211.978L100.014 200.974L104.009 192.984C106.884 196.309 110.606 198.213 115.553 198.414Z" fill="#455A64"/>
+<g opacity="0.6">
+<path d="M105.314 196.706C105.046 196.672 104.776 196.738 104.553 196.89C104.331 197.043 104.173 197.272 104.108 197.534C104.064 197.8 104.123 198.073 104.275 198.296C104.426 198.52 104.658 198.677 104.921 198.734C105.205 198.769 105.491 198.698 105.725 198.535C105.959 198.371 106.124 198.127 106.189 197.849C106.208 197.567 106.116 197.289 105.933 197.074C105.75 196.858 105.49 196.723 105.208 196.696" fill="white"/>
+</g>
+<g opacity="0.6">
+<path d="M100.014 200.978L100.971 199.064L124.055 210.312C124.055 210.312 124.931 211.269 124.462 211.987L100.014 200.978Z" fill="white"/>
+</g>
+<path d="M115.284 199.251C115.226 199.366 114.604 199.155 113.848 199.275C113.092 199.395 112.547 199.754 112.456 199.658C112.365 199.562 112.858 198.95 113.781 198.821C114.705 198.691 115.36 199.151 115.284 199.251Z" fill="#08514C"/>
+<path d="M117.376 201.466C117.352 201.591 116.739 201.562 116.108 201.887C115.476 202.213 115.118 202.691 115.003 202.634C114.888 202.576 115.113 201.863 115.907 201.476C116.701 201.088 117.424 201.351 117.376 201.466Z" fill="#08514C"/>
+<path d="M117.452 205.189C117.332 205.189 117.452 204.495 118.031 203.978C118.61 203.462 119.308 203.457 119.313 203.576C119.318 203.696 118.835 203.892 118.356 204.323C117.878 204.753 117.576 205.232 117.452 205.189Z" fill="#08514C"/>
+<path d="M113.121 87.613L115.088 93.627L104.366 94.4642L103.117 91.2444L113.121 87.613Z" fill="#FFBE9D"/>
+<path d="M143.566 95.5024C143.771 95.9139 144.307 95.9809 144.719 96.1962C145.102 96.4156 145.416 96.7382 145.625 97.1273C145.834 97.5164 145.929 97.9563 145.9 98.397C145.831 99.2783 145.54 100.128 145.054 100.866C144.904 101.166 144.686 101.426 144.417 101.626C144.281 101.721 144.119 101.772 143.953 101.772C143.787 101.772 143.625 101.721 143.489 101.626C143.173 101.363 143.212 100.875 143.279 100.469C143.532 98.9424 143.202 97.0143 143.561 95.5072" fill="#FFBE9D"/>
+<path d="M72.2589 20.096C72.168 19.4251 72.3318 18.7444 72.7179 18.1883C73.104 17.6321 73.6845 17.2408 74.3449 17.0914L86.1814 9.56083C90.693 8.54655 96.3768 16.0819 97.1854 20.6271C98.0024 25.6227 98.323 30.6869 98.1423 35.7456C97.8169 43.525 92.7168 44.3575 92.7168 44.3575L96.5443 70.2265L78.1006 58.8541L72.2589 20.096Z" fill="#FFBE9D"/>
+<path d="M94.7254 27.081C94.757 27.3354 94.6882 27.5921 94.5337 27.7967C94.3792 28.0013 94.151 28.1375 93.8977 28.1767C93.6484 28.2228 93.3909 28.1681 93.1819 28.0246C92.9729 27.881 92.8294 27.6604 92.7829 27.4112C92.7513 27.1568 92.82 26.9 92.9746 26.6955C93.1291 26.4909 93.3573 26.3546 93.6106 26.3155C93.8599 26.2694 94.1174 26.3241 94.3264 26.4676C94.5354 26.6112 94.6789 26.8318 94.7254 27.081Z" fill="#4D4E4E"/>
+<path d="M96.2473 24.2871C96.1516 24.3924 95.367 24.378 94.3766 24.7656C93.3863 25.1531 92.7308 25.6698 92.6064 25.6411C92.482 25.6124 92.6064 25.4737 92.9078 25.2344C93.3234 24.8949 93.7944 24.6295 94.3001 24.4498C94.7826 24.2641 95.295 24.1684 95.8119 24.1675C96.1564 24.158 96.2952 24.2393 96.2473 24.2871Z" fill="#4D4E4E"/>
+<path d="M84.9271 27.5549C84.9574 27.8098 84.8875 28.0665 84.7322 28.2709C84.5769 28.4753 84.3483 28.6114 84.0946 28.6505C83.846 28.6953 83.5898 28.6399 83.3819 28.4965C83.174 28.3531 83.0312 28.1333 82.9846 27.885C82.9518 27.6304 83.02 27.3731 83.1748 27.1682C83.3295 26.9634 83.5584 26.8274 83.8123 26.7894C84.0617 26.7433 84.3191 26.798 84.5281 26.9415C84.7371 27.085 84.8806 27.3057 84.9271 27.5549Z" fill="#4D4E4E"/>
+<path d="M85.9562 26.2917C85.8127 26.3491 85.0759 25.9089 83.9325 25.7415C82.789 25.574 81.8943 25.7415 81.7843 25.6649C81.6742 25.5884 81.8943 25.507 82.2627 25.4161C82.8367 25.3021 83.4263 25.2908 84.0042 25.3826C84.5643 25.4593 85.1048 25.6411 85.5974 25.9185C85.9371 26.1146 86.0471 26.2677 85.9562 26.2917Z" fill="#4D4E4E"/>
+<path d="M90.626 32.7986C91.16 32.5569 91.7228 32.3849 92.3006 32.2866C92.5637 32.2292 92.8125 32.1479 92.8364 31.9565C92.828 31.6762 92.7327 31.4053 92.5637 31.1815C92.2447 30.5435 91.9003 29.8913 91.5303 29.2246C90.095 26.4354 89.0041 24.1293 89.1381 24.0719C89.2721 24.0145 90.516 26.2296 91.9609 29.0189L92.9608 30.9901C93.1686 31.2959 93.2618 31.6653 93.2239 32.0331C93.1956 32.1324 93.1452 32.224 93.0764 32.3011C93.0076 32.3781 92.9223 32.4386 92.8268 32.478C92.6822 32.5347 92.5312 32.5732 92.3771 32.5928C91.8043 32.7342 91.216 32.8033 90.626 32.7986Z" fill="#4D4E4E"/>
+<path d="M92.7111 44.3767C89.1375 44.9051 85.4872 44.4074 82.1855 42.9414C82.1855 42.9414 85.3289 48.319 92.8882 46.7115L92.7111 44.3767Z" fill="#EB996E"/>
+<path d="M90.7456 35.3772C90.4883 35.042 90.1593 34.7688 89.7825 34.5775C89.4058 34.3863 88.991 34.2819 88.5687 34.272C88.3245 34.2771 88.0876 34.3562 87.8894 34.4989C87.6912 34.6415 87.541 34.841 87.4587 35.071C87.3761 35.368 87.3664 35.6806 87.4305 35.9821C87.4947 36.2836 87.6307 36.5652 87.8271 36.8029C88.02 37.0544 88.2821 37.244 88.5813 37.3486C88.8805 37.4531 89.2037 37.468 89.5112 37.3914C90.0103 37.1855 90.4355 36.8336 90.7312 36.3819C90.8384 36.2669 90.9157 36.1272 90.9561 35.9752C90.9736 35.8793 90.9698 35.7808 90.945 35.6865C90.9202 35.5923 90.875 35.5046 90.8125 35.4298" fill="#EB996E"/>
+<path d="M87.6073 33.8894C87.7795 33.8559 87.9135 34.9994 88.9851 35.6979C90.0568 36.3964 91.2625 36.1285 91.2912 36.2864C91.2912 36.3581 91.0472 36.5399 90.5305 36.6165C89.8624 36.7035 89.1849 36.5528 88.6168 36.1907C88.0712 35.8401 87.6835 35.291 87.5355 34.6597C87.435 34.1669 87.5307 33.8894 87.6073 33.8894Z" fill="#4D4E4E"/>
+<path d="M86.2909 21.5886C86.1905 21.8757 85.1283 21.7561 83.8987 21.9283C82.6692 22.1006 81.6549 22.4498 81.4827 22.1962C81.4061 22.0718 81.5783 21.7991 81.9611 21.5121C82.4962 21.1588 83.1048 20.932 83.7406 20.8491C84.3765 20.7662 85.0229 20.8293 85.6307 21.0336C86.0996 21.2489 86.334 21.4499 86.2909 21.5886Z" fill="#4D4E4E"/>
+<path d="M96.3054 21.9283C96.0997 22.1915 95.1715 22.0479 94.0855 22.158C92.9994 22.268 92.0999 22.5455 91.8607 22.3158C91.7507 22.2058 91.8607 21.9475 92.2483 21.6795C92.775 21.3419 93.3756 21.1369 93.9988 21.0819C94.622 21.0269 95.2493 21.1236 95.827 21.3638C96.2384 21.5695 96.3915 21.7991 96.3054 21.9283Z" fill="#4D4E4E"/>
+<path d="M67.0677 39.9798C67.2591 36.5112 67.8141 25.4066 70.0531 19.3496C72.2922 13.2926 75.4451 10.5799 78.6889 9.30249C79.9141 8.77903 81.2536 8.58061 82.5778 8.72645C83.9021 8.87229 85.1663 9.35744 86.2482 10.135C87.9132 11.3119 88.8796 15.1873 88.8796 15.1873C88.8796 15.1873 81.0093 17.9048 78.8324 22.8422C76.3111 28.4878 75.8614 31.234 75.8614 31.234L75.182 34.2434C75.182 34.2434 76.6603 47.3238 77.3254 50.0318L66.6562 60.3468C67.0055 56.9404 66.8763 43.4437 67.0677 39.9798Z" fill="#898989"/>
+<path d="M89.1146 15.2065C89.1146 15.2065 93.6741 14.1779 95.9753 19.1967C97.0183 21.4692 98.0518 28.3491 98.0518 28.3491C98.0518 28.3491 98.4393 22.7275 97.8365 19.6703C97.2336 16.6131 95.2481 12.8813 92.6359 10.9915C90.0236 9.10165 88.0429 8.38878 83.957 9.10644C85.1874 9.41407 86.3044 10.0664 87.1769 10.9867C87.7941 11.7091 88.1003 12.3502 89.1146 15.2065Z" fill="#898989"/>
+<path d="M75.9481 31.6071C75.6706 29.923 73.6995 29.0044 72.3311 30.0235C71.58 30.5785 71.0728 31.5832 71.3503 33.3725C72.0967 38.1569 76.7232 36.4058 76.7088 36.2719C76.6945 36.1379 76.2734 33.5735 75.9481 31.6071Z" fill="#FFBE9D"/>
+<path d="M74.9714 34.6884C74.9714 34.6884 74.8996 34.7602 74.7704 34.8463C74.5842 34.9595 74.3623 34.9988 74.1485 34.9563C73.6174 34.8511 73.072 34.1143 72.9141 33.2627C72.8376 32.856 72.8539 32.4373 72.9619 32.0379C72.9815 31.8816 73.0394 31.7326 73.1304 31.6041C73.2213 31.4756 73.3426 31.3715 73.4834 31.3011C73.5754 31.2624 73.6779 31.2566 73.7737 31.2844C73.8695 31.3123 73.9528 31.3722 74.0097 31.4542C74.0958 31.5786 74.0767 31.6743 74.1054 31.679C74.1341 31.6838 74.1963 31.5834 74.1054 31.392C74.0608 31.2782 73.9779 31.1834 73.871 31.1241C73.7239 31.0462 73.5521 31.029 73.3925 31.0762C73.2025 31.1459 73.0334 31.2629 72.9012 31.4161C72.7689 31.5693 72.6779 31.7536 72.6366 31.9518C72.4993 32.3947 72.473 32.8646 72.5601 33.3201C72.7371 34.277 73.3686 35.0999 74.0911 35.1908C74.2243 35.2077 74.3596 35.1945 74.4871 35.1523C74.6146 35.1101 74.731 35.0399 74.8278 34.9468C74.9809 34.8032 74.9905 34.6932 74.9714 34.6884Z" fill="#EB996E"/>
+<path d="M80.5684 8.77615C80.5684 8.81442 81.2286 8.71873 82.2812 8.73787C82.897 8.74996 83.5072 8.85811 84.0896 9.05842C84.7971 9.32003 85.447 9.71649 86.0034 10.2258C87.0331 11.146 87.8355 12.2924 88.3477 13.5749C88.74 14.5317 88.8262 15.2111 88.8836 15.2015C88.8767 15.0482 88.8542 14.8959 88.8166 14.747C88.4352 12.9546 87.4895 11.3315 86.1182 10.1158C85.5444 9.58418 84.869 9.17408 84.1327 8.91011C83.5345 8.70998 82.9071 8.61134 82.2764 8.61826C81.854 8.61808 81.4321 8.64525 81.0133 8.6996C80.8631 8.71275 80.7143 8.73835 80.5684 8.77615Z" fill="#455A64"/>
+<path d="M71.914 35.5733C71.9158 35.5463 71.9158 35.5191 71.914 35.492L71.847 35.2767C71.8136 35.1762 71.7801 35.0566 71.737 34.9227L71.6078 34.4442C71.347 33.3983 71.2375 32.3205 71.2825 31.2435C71.3433 29.6459 71.736 28.0785 72.4355 26.6409C73.3297 24.9005 74.6053 23.3844 76.1673 22.2058C76.9689 21.5872 77.8078 21.0184 78.6791 20.5026C79.5212 19.9955 80.368 19.5744 81.1526 19.1056C82.5248 18.2684 83.83 17.3263 85.0567 16.2876C86.1044 15.4025 86.913 14.6418 87.4488 14.1059C87.7215 13.838 87.9273 13.6275 88.066 13.4792L88.2239 13.3117C88.2574 13.2734 88.2765 13.2543 88.2718 13.2495L88.2143 13.2974L88.0421 13.4552L87.4106 14.0724C86.8508 14.5939 86.0327 15.3403 84.9753 16.2062C83.7443 17.2278 82.4394 18.1569 81.0713 18.986C80.2962 19.4644 79.4398 19.8615 78.593 20.3734C77.7132 20.889 76.8677 21.4611 76.0621 22.0862C74.4738 23.2761 73.1778 24.8125 72.2729 26.5787C71.571 28.0364 71.1862 29.6262 71.1437 31.2435C71.1108 32.3295 71.2382 33.4145 71.5217 34.4634L71.6652 34.9418C71.7179 35.0758 71.7609 35.1906 71.7944 35.2911L71.8805 35.5064C71.8997 35.5494 71.9092 35.5733 71.914 35.5733Z" fill="#455A64"/>
+<path d="M70.5984 33.8893C70.5984 33.8893 70.5984 33.8606 70.5984 33.8128L70.5697 33.5831C70.5697 33.3822 70.4931 33.1047 70.4549 32.7076C70.3421 31.63 70.3245 30.5445 70.4022 29.4638C70.5191 27.8632 70.8407 26.2843 71.3591 24.7655C72.0067 22.9106 72.952 21.1735 74.158 19.6224C75.3998 18.0894 76.849 16.7368 78.4639 15.6035C79.8992 14.5318 81.3345 13.6897 82.478 12.9338C83.6214 12.1779 84.5735 11.599 85.2098 11.1588C85.5304 10.9483 85.7696 10.7713 85.9323 10.6517L86.1189 10.5177L86.1811 10.4651C86.1811 10.4651 86.1523 10.4651 86.1093 10.5034L85.9131 10.623L85.1716 11.1014C84.5304 11.5176 83.5831 12.1061 82.411 12.8238C81.2388 13.5414 79.8418 14.4026 78.3682 15.4743C76.7499 16.6089 75.3002 17.9668 74.0623 19.5075C72.8323 21.0735 71.8704 22.8324 71.2156 24.7129C70.6911 26.2465 70.3694 27.842 70.2587 29.459C70.1922 30.5445 70.229 31.6339 70.3687 32.7124C70.4166 33.0951 70.4836 33.387 70.5171 33.5879C70.5171 33.6788 70.5505 33.7554 70.5649 33.8128C70.5793 33.8702 70.5936 33.8893 70.5984 33.8893Z" fill="#455A64"/>
+<path d="M96.1426 52.314C96.1426 52.314 102.31 54.821 103.491 58.0313C104.673 61.2416 113.639 87.7517 113.639 87.7517L103.233 91.7419L98.4869 69.9252L96.1426 52.314Z" fill="#455A64"/>
+<path d="M64.2596 127.596C64.2596 127.596 127.892 124.673 131.887 125.725C135.881 126.778 138.269 128.792 139.063 133.581C139.857 138.37 152.124 201.82 152.124 201.82L140.967 205.103C140.967 205.103 125.313 169.363 124.648 163.383C123.983 157.402 121.777 145.145 121.777 145.145C121.777 145.145 97.5875 145.542 79.7753 145.145C61.9631 144.748 64.3553 128.261 64.3553 128.261L64.2596 127.596Z" fill="#FFBE9D"/>
+<path d="M140.828 205.389L140.746 205.198C140.105 203.734 125.073 169.358 124.413 163.407C123.8 157.919 121.872 146.996 121.585 145.384C119.193 145.422 96.5294 145.757 79.7793 145.384C74.2438 145.26 70.0766 143.58 67.383 140.399C63.3068 135.581 64.034 128.835 64.1249 128.266L63.9766 127.371H64.2445C66.8472 127.251 127.967 124.457 131.948 125.51C136.417 126.691 138.546 129.021 139.302 133.552C140.086 138.279 152.219 201.155 152.363 201.792L152.401 202.002L140.828 205.389ZM121.982 144.901L122.02 145.102C122.044 145.221 124.231 157.436 124.891 163.354C125.518 169.004 139.861 201.969 141.105 204.811L151.856 201.653C151.071 197.591 139.598 138.212 138.833 133.619C138.115 129.313 136.086 127.084 131.828 125.964C128.058 124.964 69.0528 127.624 64.5411 127.83L64.6129 128.266V128.299C64.6129 128.371 63.656 135.255 67.761 140.097C70.3637 143.169 74.4113 144.786 79.7984 144.91C97.4001 145.303 121.547 144.91 121.791 144.91L121.982 144.901Z" fill="#EB996E"/>
+<path d="M68.5552 93.2776L70.158 103.191C70.158 103.191 63.1968 116.381 62.4121 127.72C62.0389 133.107 65.1296 144.14 65.1296 144.14C65.1296 144.14 89.6447 146.834 102.869 146.489L116.978 145.872L119.466 123.831L103.629 121.544L103.869 91.5074C103.869 91.5074 106.739 83.5989 106.959 81.2593C107.466 76.3218 107.256 71.327 102.323 64.9255L96.1419 52.3139L94.0798 51.357L95.0606 66.6335L77.2915 49.7495L68.2921 52.979L65.742 65.0116L68.5552 93.2776Z" fill="#455A64"/>
+<g opacity="0.3">
+<path d="M99.3566 125.194C98.2036 125.395 89.8836 125.515 88.7305 125.715C88.5343 125.776 88.328 125.795 88.124 125.773C87.92 125.751 87.7227 125.687 87.544 125.586C87.4 125.45 87.3002 125.274 87.2576 125.08C87.2149 124.886 87.2314 124.684 87.3048 124.5C87.4573 124.13 87.6969 123.802 88.0033 123.543C90.0175 121.63 92.6346 120.524 95.1798 119.443C95.9932 119.103 96.8735 118.754 97.7251 118.965C98.1427 119.103 98.5203 119.34 98.8254 119.657C99.1305 119.974 99.3539 120.36 99.4762 120.783C99.7188 121.626 99.8191 122.504 99.7728 123.381" fill="black"/>
+</g>
+<g opacity="0.3">
+<path d="M69.2107 100.191C72.1818 99.4972 74.0477 96.5692 75.2534 93.7656C76.459 90.9619 77.4542 87.8664 79.8177 85.9336C81.5496 84.4983 83.87 83.8667 85.3675 82.2018C86.0793 81.3862 86.5513 80.3894 86.7312 79.322C86.911 78.2545 86.7918 77.1581 86.3866 76.1543C85.956 75.1305 85.09 74.164 83.9944 74.1066C82.7026 74.0396 81.6979 75.1592 80.9085 76.1878C77.2979 80.918 73.893 85.798 70.6939 90.828C68.9763 93.5311 67.2635 96.8132 68.4596 99.7843" fill="black"/>
+</g>
+<path d="M69.2298 54.5576C69.2298 54.5576 64.2015 56.1556 62.3834 59.3085C60.5653 62.4614 57.5512 77.7713 56.824 81.8955C56.0968 86.0196 52.5802 102.99 56.824 105.659C61.0677 108.329 66.6463 104.224 68.1007 101.779C69.5552 99.3345 75.4926 86.6224 75.4926 86.6224L70.158 82.1395C70.158 82.1395 71.1149 70.0159 70.7656 67.4658C70.4163 64.9158 69.2298 54.5576 69.2298 54.5576Z" fill="#FFBE9D"/>
+<path d="M53.4609 86.0341L65.13 86.7948L70.4598 80.5369L71.9334 70.6811L71.541 51.8259C71.541 51.8259 61.1255 54.3664 58.872 62.2845C57.2023 68.1358 53.4609 86.0341 53.4609 86.0341Z" fill="#455A64"/>
+<path d="M74.1101 63.7341C73.4402 63.6432 72.5838 64.4326 73.1532 66.3368C73.6316 67.9252 74.5311 69.4705 74.4641 70.3556C74.3971 71.2407 74.0526 73.0827 74.0526 74.0396C74.011 74.9751 73.9199 75.9077 73.7799 76.8336L65.8379 86.4024L72.713 92.4689L78.1528 83.9241C78.1528 83.9241 79.7939 84.1968 80.746 83.1059L82.1813 81.4649C82.1813 81.4649 85.8652 80.1014 85.1141 78.1158C85.1141 78.1158 86.2049 77.0776 85.2146 75.4127C85.2146 75.4127 85.7313 73.6807 84.9801 72.6617C84.9801 72.6617 84.9131 70.3413 84.296 69.9298C83.6788 69.5183 77.2964 69.4514 77.2964 69.4514C76.9489 68.3905 76.5481 67.3478 76.0956 66.3272C75.397 65.1742 75.043 63.8585 74.1101 63.7341Z" fill="#FFBE9D"/>
+<path d="M76.8278 73.1451C76.8278 73.169 76.6604 73.0781 76.5121 72.8532C76.3188 72.5502 76.2344 72.1905 76.2727 71.8331C76.3109 71.4758 76.4696 71.1421 76.7226 70.8868C76.914 70.7002 77.0766 70.6428 77.091 70.6668C76.8065 71.0112 76.611 71.4203 76.5217 71.8581C76.5221 72.305 76.627 72.7457 76.8278 73.1451Z" fill="#EB996E"/>
+<path d="M84.7126 72.4895C83.7505 72.77 82.7606 72.9448 81.7606 73.011C80.7691 73.1552 79.7646 73.1889 78.7656 73.1115C79.7488 72.9403 80.7407 72.8237 81.7367 72.7622C82.7226 72.6145 83.7162 72.5234 84.7126 72.4895Z" fill="#EB996E"/>
+<path d="M85.2773 75.2261C84.4843 75.5482 83.6471 75.7482 82.7942 75.8194C81.9532 75.9751 81.0937 76.0041 80.2441 75.9055C80.2441 75.8338 81.3733 75.762 82.7607 75.5706C84.1482 75.3792 85.2629 75.1592 85.2773 75.2261Z" fill="#EB996E"/>
+<path d="M85.138 78.0346C83.9001 78.4142 82.5988 78.5427 81.3105 78.4125C81.94 78.2748 82.5804 78.1932 83.2243 78.1685C83.8571 78.0684 84.4974 78.0236 85.138 78.0346Z" fill="#EB996E"/>
+<path d="M79.1107 78.8958C79.1107 78.9245 78.9767 78.8958 78.8141 78.8049C78.5997 78.6588 78.4491 78.4363 78.3931 78.1829C78.3317 77.9324 78.3658 77.6681 78.4887 77.4414C78.5844 77.2739 78.6897 77.2069 78.7136 77.2261C78.7375 77.2452 78.5174 77.6423 78.6323 78.1255C78.7471 78.6088 79.1442 78.8336 79.1107 78.8958Z" fill="#EB996E"/>
+<path d="M77.5411 76.6184C77.5411 76.6424 77.3833 76.561 77.2349 76.3553C77.0445 76.0835 76.9351 75.7634 76.9192 75.4319C76.8995 75.0996 76.9723 74.7684 77.1297 74.475C77.2589 74.255 77.3833 74.1593 77.4072 74.1784C77.2609 74.5741 77.1801 74.9911 77.168 75.4128C77.229 75.8316 77.3549 76.2384 77.5411 76.6184Z" fill="#EB996E"/>
+<path d="M83.1775 81.0536C82.8306 81.2375 82.4495 81.3482 82.058 81.379C81.679 81.488 81.2811 81.5157 80.8906 81.4603C81.2368 81.2743 81.6183 81.1635 82.0102 81.135C82.3887 81.0231 82.7871 80.9953 83.1775 81.0536Z" fill="#EB996E"/>
+<path d="M80.0994 69.4945C80.0994 69.5663 79.1425 69.5663 77.9321 69.6859C76.7216 69.8055 75.7887 69.9921 75.7695 69.9251C76.4477 69.6378 77.1722 69.4757 77.9081 69.4467C78.6356 69.3328 79.3776 69.349 80.0994 69.4945Z" fill="#EB996E"/>
+<path d="M101.108 92.4929H140.656C141.354 92.4929 142.023 92.7702 142.516 93.2636C143.01 93.7571 143.287 94.4264 143.287 95.1243V123.156H98.4863V95.1195C98.4876 94.4241 98.7641 93.7575 99.2553 93.2653C99.7466 92.7731 100.413 92.4954 101.108 92.4929Z" fill="#E0E0E0"/>
+<path d="M143.288 125.194H90.6602C90.6602 124.659 90.8729 124.145 91.2515 123.766C91.6301 123.388 92.1437 123.175 92.6792 123.175H143.288V125.194Z" fill="#E0E0E0"/>
+<path d="M141.632 94.4641H99.8457V123.175H141.632V94.4641Z" fill="white"/>
+<path d="M141.628 123.156C141.628 123.156 141.628 122.974 141.628 122.63C141.628 122.285 141.628 121.769 141.628 121.108C141.628 119.773 141.628 117.821 141.599 115.324C141.599 110.329 141.571 103.167 141.547 94.445L141.647 94.5455H99.8654L99.9898 94.4211C99.9898 104.674 99.9898 114.41 99.9898 123.127L99.8798 123.012L129.978 123.07L138.59 123.103H140.882H141.47H141.676H141.485H140.906H138.638L130.069 123.132L99.8941 123.189H99.7793V123.156C99.7793 114.434 99.7793 104.698 99.7793 94.4498V94.3254H99.9037H141.686H141.786V94.4498C141.786 103.196 141.748 110.382 141.733 115.391C141.733 117.879 141.733 119.821 141.733 121.132C141.733 121.788 141.733 122.29 141.733 122.635C141.733 122.979 141.628 123.156 141.628 123.156Z" fill="#08514C"/>
+<path d="M143.068 123.156C143.068 123.228 131.772 123.28 117.84 123.28C103.908 123.28 92.6074 123.228 92.6074 123.156C92.6074 123.084 103.903 123.031 117.84 123.031C131.777 123.031 143.068 123.108 143.068 123.156Z" fill="#08514C"/>
+<path d="M120.734 119.802C126.798 119.802 131.714 114.886 131.714 108.822C131.714 102.758 126.798 97.8418 120.734 97.8418C114.67 97.8418 109.754 102.758 109.754 108.822C109.754 114.886 114.67 119.802 120.734 119.802Z" fill="#08514C"/>
+<path d="M113.912 109.09L116.237 106.889L119.448 109.846L125.768 103.899L128.064 106.071L119.414 114.281L113.912 109.09Z" fill="white"/>
+<path d="M73.7894 76.8338C73.842 76.8769 70.5456 80.8575 66.4262 85.7184C62.3069 90.5793 58.9243 94.4834 58.8717 94.4499C58.8191 94.4164 62.1155 90.431 66.2348 85.5653C70.3542 80.6996 73.7367 76.7908 73.7894 76.8338Z" fill="#EB996E"/>
+<path d="M73.2206 70.6667C73.113 72.0547 72.9229 73.4351 72.6512 74.8004C72.4628 76.1807 72.1912 77.5483 71.8379 78.8959C71.9453 77.5063 72.1354 76.1243 72.4072 74.7574C72.5987 73.3792 72.8702 72.0133 73.2206 70.6667Z" fill="#08514C"/>
+<path d="M103.869 91.5075C103.886 91.4098 103.912 91.3137 103.946 91.2205L104.204 90.4167C104.434 89.723 104.773 88.7182 105.161 87.4695C105.624 86.0107 106.01 84.5287 106.319 83.0296C106.704 81.1994 106.876 79.3305 106.831 77.4606C106.658 74.0561 105.701 70.7374 104.036 67.7627C103.542 66.857 102.999 65.9785 102.41 65.1313C102.209 64.8299 102.037 64.6051 101.931 64.4472C101.87 64.3686 101.817 64.2835 101.773 64.1936C101.847 64.2597 101.912 64.3335 101.97 64.4137C102.094 64.5668 102.281 64.7821 102.496 65.0787C103.118 65.908 103.687 66.7757 104.199 67.6766C104.961 69.0179 105.587 70.4315 106.07 71.8964C106.67 73.691 107.016 75.5606 107.098 77.4511C107.147 79.3413 106.967 81.2304 106.563 83.0775C106.241 84.5805 105.835 86.0644 105.347 87.5222C104.936 88.7661 104.572 89.766 104.314 90.4502C104.19 90.7691 104.089 91.0323 104.013 91.2396C103.976 91.3344 103.928 91.4244 103.869 91.5075Z" fill="#08514C"/>
+<path d="M93.7013 76.6089C93.7209 76.8317 93.7209 77.0559 93.7013 77.2787C93.7006 77.5413 93.6814 77.8035 93.6439 78.0633C93.6094 78.4103 93.5567 78.7553 93.486 79.0968C93.4094 79.511 93.3072 79.92 93.1798 80.3215C93.045 80.7875 92.8853 81.2458 92.7014 81.6947C92.2598 82.7071 91.7113 83.6694 91.0651 84.5653C90.4029 85.4594 89.6439 86.2777 88.8021 87.0053C88.4332 87.3205 88.0467 87.6144 87.6443 87.8856C87.3001 88.1301 86.9405 88.3523 86.5678 88.5506C86.2588 88.7293 85.9393 88.8891 85.611 89.0291C85.3759 89.1436 85.1328 89.2412 84.8838 89.3209C84.6767 89.4062 84.462 89.4719 84.2426 89.5171C84.2187 89.4645 85.1373 89.1822 86.4578 88.4119C86.819 88.2043 87.1687 87.9776 87.5056 87.7325C87.8788 87.4837 88.2376 87.168 88.6299 86.8474C90.2784 85.397 91.5855 83.5998 92.4574 81.5846C92.6399 81.1466 92.7996 80.6995 92.9358 80.245C93.068 79.8495 93.1783 79.447 93.2659 79.0393C93.6631 77.5658 93.6535 76.6089 93.7013 76.6089Z" fill="#08514C"/>
+<path d="M106.854 80.9579C106.827 80.9316 106.804 80.9009 106.787 80.867L106.62 80.5752C106.462 80.312 106.246 79.9532 105.974 79.5083C105.701 79.0633 105.275 78.5179 104.83 77.8959C104.385 77.274 103.821 76.5946 103.223 75.8339C100.763 72.8293 97.1322 68.8822 92.9698 64.6672C88.8074 60.4522 84.8985 56.7778 82.0327 54.1416L80.0807 52.3953C79.5066 51.8882 79.009 51.4384 78.5928 51.094L77.6359 50.2854L77.3919 50.0701C77.3604 50.0477 77.3329 50.0202 77.3105 49.9888C77.3448 50.0056 77.3769 50.0265 77.4062 50.051C77.478 50.1036 77.5641 50.1658 77.6646 50.2471L78.6502 51.0174L80.1668 52.29C80.7553 52.7972 81.4155 53.3761 82.1427 54.0124C85.0469 56.596 88.9652 60.2656 93.1468 64.4758C97.3283 68.6861 100.931 72.6666 103.357 75.7047C103.95 76.475 104.486 77.1687 104.945 77.7907L106.055 79.4365C106.309 79.9149 106.533 80.2594 106.663 80.5321L106.816 80.8192C106.848 80.9117 106.86 80.9579 106.854 80.9579Z" fill="#08514C"/>
+<path d="M97.563 103.09C97.4751 103.121 97.3833 103.139 97.2903 103.143L96.5104 103.253C95.8311 103.344 94.8407 103.449 93.6398 103.559C91.195 103.779 87.8029 103.956 84.0711 103.913C80.3393 103.87 76.9328 103.597 74.5024 103.32C73.2824 103.181 72.2968 103.047 71.6318 102.937L70.8519 102.813C70.7605 102.803 70.6705 102.782 70.584 102.751C70.6761 102.739 70.7693 102.739 70.8615 102.751L71.6461 102.832C72.3255 102.913 73.3159 103.019 74.5167 103.133C76.952 103.368 80.3345 103.612 84.0855 103.655C87.8364 103.698 91.2094 103.545 93.6542 103.373C94.8742 103.286 95.8645 103.21 96.5248 103.148L97.3094 103.086C97.3939 103.078 97.4789 103.08 97.563 103.09Z" fill="#08514C"/>
+<path d="M118.285 92.4595C118.285 92.4595 126.122 89.4023 126.864 89.1583C127.605 88.9143 134.456 88.3784 134.456 88.3784L143.288 91.5505C143.288 91.5505 143.37 93.3637 141.307 93.1197C139.49 92.8126 137.697 92.3713 135.944 91.7992L134.705 92.536L118.285 92.4595Z" fill="#FFBE9D"/>
+<path d="M142.862 93.622C143.068 94.0382 143.604 94.1004 144.015 94.3205C144.396 94.5428 144.708 94.866 144.916 95.2544C145.125 95.6428 145.222 96.0812 145.197 96.5213C145.128 97.4011 144.837 98.249 144.35 98.9852C144.201 99.2825 143.985 99.5413 143.719 99.7412C143.582 99.8358 143.421 99.8866 143.255 99.8866C143.089 99.8866 142.927 99.8358 142.791 99.7412C142.66 99.582 142.572 99.3922 142.535 99.1896C142.498 98.987 142.514 98.7783 142.58 98.5834C142.834 97.0571 142.504 95.1243 142.862 93.6172" fill="#FFBE9D"/>
+<path d="M151.742 199.452L152.01 200.199C152.01 200.199 166.554 200.768 167.55 203.131L142.25 212.021L139.633 203.481C144.011 203.902 148.015 202.715 151.742 199.452Z" fill="#455A64"/>
+<g opacity="0.6">
+<path d="M143.143 205.27C142.926 205.43 142.774 205.665 142.719 205.93C142.663 206.195 142.707 206.471 142.842 206.705C142.994 206.933 143.229 207.093 143.497 207.151C143.765 207.209 144.044 207.16 144.277 207.016C144.508 206.847 144.668 206.598 144.725 206.318C144.783 206.037 144.734 205.746 144.588 205.5C144.406 205.284 144.147 205.147 143.867 205.118C143.586 205.089 143.304 205.169 143.081 205.342" fill="white"/>
+</g>
+<g opacity="0.6">
+<path d="M142.25 212.021L141.623 209.968L166.1 202.198C166.1 202.198 167.396 202.294 167.535 203.155L142.25 212.021Z" fill="white"/>
+</g>
+<path d="M152.125 200.242C152.163 200.366 151.565 200.639 151.096 201.251C150.627 201.864 150.489 202.495 150.359 202.486C150.23 202.476 150.158 201.696 150.737 200.969C151.316 200.242 152.11 200.117 152.125 200.242Z" fill="#08514C"/>
+<path d="M155.162 200.404C155.234 200.514 154.769 200.911 154.535 201.581C154.301 202.251 154.372 202.849 154.248 202.887C154.124 202.925 153.798 202.251 154.109 201.423C154.42 200.595 155.119 200.289 155.162 200.404Z" fill="#08514C"/>
+<path d="M157.785 203.055C157.684 203.122 157.306 202.576 157.373 201.777C157.44 200.978 157.938 200.519 158.024 200.6C158.11 200.682 157.885 201.174 157.828 201.82C157.77 202.466 157.904 202.997 157.785 203.055Z" fill="#08514C"/>
+</svg>

BIN=BIN
public/images/default-image-card-checkin.png


BIN=BIN
public/images/kizzo_expanded_logo.png


BIN=BIN
public/images/kizzo_left_logo.png


BIN=BIN
public/images/kizzo_logo.png


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 6 - 0
public/images/kizzo_logo.svg


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 6 - 0
public/images/kizzo_logo_secondary.svg


BIN=BIN
public/images/left-expanded-logo.png


BIN=BIN
public/images/left-logo-layout.png


BIN=BIN
public/images/no-checkin.png


+ 193 - 0
public/images/no-checkin.svg

@@ -0,0 +1,193 @@
+<svg width="420" height="321" viewBox="0 0 420 321" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M419.986 282.105H0V282.315H419.986V282.105Z" fill="#E0E0E0"/>
+<path d="M318.626 289.849H289.731V290.059H318.626V289.849Z" fill="#E0E0E0"/>
+<path d="M352.62 289.253H336.358V289.463H352.62V289.253Z" fill="#E0E0E0"/>
+<path d="M207.759 289.748H186.188V289.958H207.759V289.748Z" fill="#E0E0E0"/>
+<path d="M223.341 292.73H208.607V292.94H223.341V292.73Z" fill="#E0E0E0"/>
+<path d="M121.519 287.623H77.0088V287.833H121.519V287.623Z" fill="#E0E0E0"/>
+<path d="M199.074 244.642H36.8835C35.613 244.64 34.3952 244.133 33.4975 243.234C32.5999 242.335 32.0957 241.116 32.0957 239.846V11.852C32.1068 10.5887 32.6158 9.3808 33.5123 8.49064C34.4087 7.60047 35.6202 7.09994 36.8835 7.09778H199.074C200.346 7.09778 201.566 7.6031 202.465 8.50256C203.365 9.40203 203.87 10.622 203.87 11.894V239.846C203.87 241.118 203.365 242.338 202.465 243.237C201.566 244.137 200.346 244.642 199.074 244.642ZM36.8835 7.26577C35.6687 7.268 34.5043 7.75217 33.646 8.61202C32.7877 9.47187 32.3057 10.6371 32.3057 11.852V239.846C32.3057 241.061 32.7877 242.226 33.646 243.086C34.5043 243.945 35.6687 244.43 36.8835 244.432H199.074C200.289 244.43 201.455 243.946 202.314 243.086C203.174 242.227 203.658 241.061 203.66 239.846V11.852C203.658 10.6364 203.174 9.47111 202.314 8.61151C201.455 7.7519 200.289 7.26799 199.074 7.26577H36.8835Z" fill="#E0E0E0"/>
+<path d="M380.767 244.642H218.569C217.297 244.64 216.079 244.134 215.18 243.235C214.281 242.336 213.775 241.117 213.772 239.846V11.852C213.786 10.588 214.297 9.38005 215.194 8.49011C216.092 7.60017 217.305 7.09992 218.569 7.09778H380.767C382.029 7.10215 383.239 7.60365 384.133 8.49358C385.028 9.38352 385.536 10.5902 385.547 11.852V239.846C385.547 241.115 385.044 242.332 384.148 243.231C383.252 244.13 382.036 244.637 380.767 244.642ZM218.569 7.26577C217.353 7.26799 216.188 7.7519 215.328 8.61151C214.469 9.47111 213.985 10.6364 213.982 11.852V239.846C213.985 241.061 214.469 242.227 215.328 243.086C216.188 243.946 217.353 244.43 218.569 244.432H380.767C381.983 244.43 383.148 243.946 384.008 243.086C384.867 242.227 385.351 241.061 385.354 239.846V11.852C385.351 10.6364 384.867 9.47111 384.008 8.61151C383.148 7.7519 381.983 7.26799 380.767 7.26577H218.569Z" fill="#E0E0E0"/>
+<path d="M364.573 27.4838H237.989V136.311H364.573V27.4838Z" fill="#E0E0E0"/>
+<path d="M367.387 27.4838H240.803V136.311H367.387V27.4838Z" fill="#F0F0F0"/>
+<path d="M362.339 131.204V32.5909L245.852 32.5909V131.204H362.339Z" fill="#FAFAFA"/>
+<path d="M325.111 131.204V32.5909H317.501V131.204H325.111Z" fill="#E0E0E0"/>
+<path d="M285.078 131.204V32.5909H277.468V131.204H285.078Z" fill="#E0E0E0"/>
+<path d="M327.791 134.438V28.7859H320.181V134.438H327.791Z" fill="#F0F0F0"/>
+<path d="M287.749 134.446V28.7942H280.139V134.446H287.749Z" fill="#F0F0F0"/>
+<path d="M362.339 131.195V32.5825H360.214V131.195H362.339Z" fill="#E0E0E0"/>
+<path d="M148.961 113.43C148.961 113.43 133.556 86.8951 154.933 65.7362C154.933 65.7362 160.511 69.3733 160.427 74.2619C160.343 79.1506 154.446 80.3853 155.715 84.4676C156.983 88.5498 162.535 92.5397 158.89 95.9164C155.244 99.2931 159.478 102.283 159.234 106.416C158.99 110.549 148.961 113.43 148.961 113.43Z" fill="#E0E0E0"/>
+<path d="M151.379 117.773C151.379 117.773 157.629 87.7183 130.682 74.3964C130.682 74.3964 126.533 79.6042 128.162 84.2156C129.792 88.8271 135.764 88.1383 135.848 92.4138C135.932 96.6892 131.926 102.233 136.445 104.283C140.964 106.332 137.898 110.515 139.435 114.362C140.972 118.209 151.379 117.773 151.379 117.773Z" fill="#E6E6E6"/>
+<path d="M137.663 110.137C137.663 110.137 137.932 136.084 148.306 136.084C158.679 136.084 158.94 110.137 158.94 110.137H137.663Z" fill="#F0F0F0"/>
+<path d="M75.3369 126.323C75.3369 126.323 75.9165 136.084 98.0666 136.084C120.217 136.084 120.805 126.323 120.805 126.323H75.3369Z" fill="#E6E6E6"/>
+<path d="M308.857 185.172H297.165C295.708 185.172 294.527 186.353 294.527 187.809V207.146C294.527 208.602 295.708 209.783 297.165 209.783H308.857C310.314 209.783 311.495 208.602 311.495 207.146V187.809C311.495 186.353 310.314 185.172 308.857 185.172Z" fill="#F0F0F0"/>
+<path d="M339.869 193.219H331.999C331.02 193.219 330.227 194.012 330.227 194.991V208.011C330.227 208.989 331.02 209.783 331.999 209.783H339.869C340.848 209.783 341.642 208.989 341.642 208.011V194.991C341.642 194.012 340.848 193.219 339.869 193.219Z" fill="#E6E6E6"/>
+<path d="M341.045 191.614H330.823C330.494 191.614 330.227 191.881 330.227 192.211V192.883C330.227 193.212 330.494 193.479 330.823 193.479H341.045C341.375 193.479 341.642 193.212 341.642 192.883V192.211C341.642 191.881 341.375 191.614 341.045 191.614Z" fill="#F0F0F0"/>
+<path d="M267.464 196.092C267.464 196.092 267.884 209.783 283.919 209.783C299.954 209.783 300.382 196.092 300.382 196.092H267.464Z" fill="#E6E6E6"/>
+<path d="M227.582 178.007H251.849V173.219H227.582V178.007Z" fill="#E0E0E0"/>
+<path d="M372.494 173.227H251.849V178.015H372.494V173.227Z" fill="#F0F0F0"/>
+<path d="M227.582 214.571H251.849V209.783H227.582V214.571Z" fill="#E0E0E0"/>
+<path d="M372.494 209.783H251.849V214.571H372.494V209.783Z" fill="#F0F0F0"/>
+<path d="M236.326 178.007H231.849V282.096H236.326V178.007Z" fill="#E0E0E0"/>
+<path d="M256.326 178.007H251.849V282.096H256.326V178.007Z" fill="#F0F0F0"/>
+<path d="M356.971 178.007H352.494V282.096H356.971V178.007Z" fill="#E0E0E0"/>
+<path d="M372.494 178.007H368.017V282.096H372.494V178.007Z" fill="#F0F0F0"/>
+<path d="M75.3367 142.174H52.3887V275.805H75.3367V142.174Z" fill="#E6E6E6"/>
+<path d="M169.96 275.796H56.7988V282.105H169.96V275.796Z" fill="#E6E6E6"/>
+<path d="M75.337 275.796H174.361L174.361 142.165H75.337L75.337 275.796Z" fill="#F0F0F0"/>
+<path d="M84.3581 225.306H165.34V192.664H84.3581V225.306Z" fill="#E6E6E6"/>
+<path d="M84.3581 263.894H165.34V231.253H84.3581V263.894Z" fill="#E6E6E6"/>
+<path d="M133.942 196.243H115.757C115.165 196.241 114.598 196.004 114.179 195.586C113.761 195.167 113.525 194.6 113.522 194.008C113.522 193.415 113.758 192.846 114.176 192.426C114.595 192.005 115.163 191.768 115.757 191.766H133.942C134.536 191.768 135.104 192.005 135.523 192.426C135.941 192.846 136.177 193.415 136.177 194.008C136.174 194.6 135.938 195.167 135.52 195.586C135.101 196.004 134.534 196.241 133.942 196.243Z" fill="#F0F0F0"/>
+<path d="M84.3581 186.709H165.34V154.068H84.3581V186.709Z" fill="#E6E6E6"/>
+<path d="M133.942 157.654H115.757C115.163 157.652 114.595 157.415 114.176 156.995C113.758 156.574 113.522 156.005 113.522 155.412C113.525 154.82 113.761 154.253 114.179 153.834C114.598 153.416 115.165 153.18 115.757 153.177H133.942C134.534 153.18 135.101 153.416 135.52 153.834C135.938 154.253 136.174 154.82 136.177 155.412C136.177 156.005 135.941 156.574 135.523 156.995C135.104 157.415 134.536 157.652 133.942 157.654Z" fill="#F0F0F0"/>
+<path d="M133.942 234.831H115.757C115.165 234.829 114.598 234.593 114.179 234.174C113.761 233.756 113.525 233.188 113.522 232.597C113.522 232.003 113.758 231.434 114.176 231.014C114.595 230.593 115.163 230.356 115.757 230.354H133.942C134.536 230.356 135.104 230.593 135.523 231.014C135.941 231.434 136.177 232.003 136.177 232.597C136.174 233.188 135.938 233.756 135.52 234.174C135.101 234.593 134.534 234.829 133.942 234.831Z" fill="#F0F0F0"/>
+<path d="M177.419 136.084H75.3369V142.174H177.419V136.084Z" fill="#E6E6E6"/>
+<path d="M49.1802 142.165H75.3369V136.075H49.1802V142.165Z" fill="#E0E0E0"/>
+<path d="M100.914 32.5909H63.7871V73.3632H100.914V32.5909Z" fill="#E6E6E6"/>
+<path d="M104.938 32.5909H66.585V73.3632H104.938V32.5909Z" fill="#F0F0F0"/>
+<path d="M101.721 70.1459V35.7994H69.7934V70.1459H101.721Z" fill="#FAFAFA"/>
+<path d="M93.9844 61.8219V44.1237H77.5377V61.8219H93.9844Z" fill="#F0F0F0"/>
+<path d="M140.057 20.5541H111.901V50.8015H140.057V20.5541Z" fill="#E6E6E6"/>
+<path d="M143.048 20.5541H114.598V50.8015H143.048V20.5541Z" fill="#F0F0F0"/>
+<path d="M140.662 48.4159V22.9396H116.983V48.4159H140.662Z" fill="#FAFAFA"/>
+<path d="M128.818 29.2311L122.342 40.4531H135.294L128.818 29.2311Z" fill="#F0F0F0"/>
+<path d="M209.993 320.038C299.939 320.038 372.855 315.781 372.855 310.529C372.855 305.278 299.939 301.021 209.993 301.021C120.047 301.021 47.1309 305.278 47.1309 310.529C47.1309 315.781 120.047 320.038 209.993 320.038Z" fill="#F5F5F5"/>
+<path d="M352.62 83.3842H270.219C265.872 83.3842 262.349 86.9079 262.349 91.2547V113.665C262.349 118.012 265.872 121.536 270.219 121.536H352.62C356.967 121.536 360.491 118.012 360.491 113.665V91.2547C360.491 86.9079 356.967 83.3842 352.62 83.3842Z" fill="#D5EE7D"/>
+<path d="M336.274 89.8184H271.907C271.146 89.8184 270.529 90.4351 270.529 91.1959V92.7079C270.529 93.4687 271.146 94.0854 271.907 94.0854H336.274C337.035 94.0854 337.651 93.4687 337.651 92.7079V91.1959C337.651 90.4351 337.035 89.8184 336.274 89.8184Z" fill="#D5EE7D"/>
+<path d="M315.888 100.1H271.907C271.146 100.1 270.529 100.716 270.529 101.477V102.989C270.529 103.75 271.146 104.367 271.907 104.367H315.888C316.649 104.367 317.265 103.75 317.265 102.989V101.477C317.265 100.716 316.649 100.1 315.888 100.1Z" fill="#D5EE7D"/>
+<path d="M304.095 110.381H271.907C271.146 110.381 270.529 110.998 270.529 111.758V113.27C270.529 114.031 271.146 114.648 271.907 114.648H304.095C304.855 114.648 305.472 114.031 305.472 113.27V111.758C305.472 110.998 304.855 110.381 304.095 110.381Z" fill="#D5EE7D"/>
+<path d="M343.985 110.381H311.797C311.037 110.381 310.42 110.998 310.42 111.758V113.27C310.42 114.031 311.037 114.648 311.797 114.648H343.985C344.746 114.648 345.363 114.031 345.363 113.27V111.758C345.363 110.998 344.746 110.381 343.985 110.381Z" fill="#D5EE7D"/>
+<g opacity="0.5">
+<path d="M336.274 89.8184H271.907C271.146 89.8184 270.529 90.4351 270.529 91.1959V92.7079C270.529 93.4687 271.146 94.0854 271.907 94.0854H336.274C337.035 94.0854 337.651 93.4687 337.651 92.7079V91.1959C337.651 90.4351 337.035 89.8184 336.274 89.8184Z" fill="white"/>
+<path d="M315.888 100.1H271.907C271.146 100.1 270.529 100.716 270.529 101.477V102.989C270.529 103.75 271.146 104.367 271.907 104.367H315.888C316.649 104.367 317.265 103.75 317.265 102.989V101.477C317.265 100.716 316.649 100.1 315.888 100.1Z" fill="white"/>
+<path d="M304.095 110.381H271.907C271.146 110.381 270.529 110.998 270.529 111.758V113.27C270.529 114.031 271.146 114.648 271.907 114.648H304.095C304.855 114.648 305.472 114.031 305.472 113.27V111.758C305.472 110.998 304.855 110.381 304.095 110.381Z" fill="white"/>
+<path d="M343.985 110.381H311.797C311.037 110.381 310.42 110.998 310.42 111.758V113.27C310.42 114.031 311.037 114.648 311.797 114.648H343.985C344.746 114.648 345.363 114.031 345.363 113.27V111.758C345.363 110.998 344.746 110.381 343.985 110.381Z" fill="white"/>
+</g>
+<path d="M286.615 74.4888H193.084C186.71 74.4888 181.543 79.656 181.543 86.03V118.89C181.543 125.264 186.71 130.431 193.084 130.431H286.615C292.989 130.431 298.156 125.264 298.156 118.89V86.03C298.156 79.656 292.989 74.4888 286.615 74.4888Z" fill="#D5EE7D"/>
+<path d="M289.925 83.9218H195.562C194.444 83.9218 193.538 84.8281 193.538 85.9461V88.1552C193.538 89.2732 194.444 90.1795 195.562 90.1795H289.925C291.043 90.1795 291.949 89.2732 291.949 88.1552V85.9461C291.949 84.8281 291.043 83.9218 289.925 83.9218Z" fill="#D5EE7D"/>
+<path d="M260.03 98.9991H195.562C194.444 98.9991 193.538 99.9055 193.538 101.023V103.233C193.538 104.351 194.444 105.257 195.562 105.257H260.03C261.148 105.257 262.055 104.351 262.055 103.233V101.023C262.055 99.9055 261.148 98.9991 260.03 98.9991Z" fill="#D5EE7D"/>
+<path d="M242.744 114.077H195.562C194.444 114.077 193.538 114.983 193.538 116.101V118.31C193.538 119.428 194.444 120.334 195.562 120.334H242.744C243.862 120.334 244.768 119.428 244.768 118.31V116.101C244.768 114.983 243.862 114.077 242.744 114.077Z" fill="#D5EE7D"/>
+<path d="M293.36 114.077H254.05C252.932 114.077 252.025 114.983 252.025 116.101V118.31C252.025 119.428 252.932 120.334 254.05 120.334H293.36C294.478 120.334 295.385 119.428 295.385 118.31V116.101C295.385 114.983 294.478 114.077 293.36 114.077Z" fill="#D5EE7D"/>
+<g opacity="0.5">
+<path d="M289.925 83.9218H195.562C194.444 83.9218 193.538 84.8281 193.538 85.9461V88.1552C193.538 89.2732 194.444 90.1795 195.562 90.1795H289.925C291.043 90.1795 291.949 89.2732 291.949 88.1552V85.9461C291.949 84.8281 291.043 83.9218 289.925 83.9218Z" fill="white"/>
+<path d="M260.03 98.9993H195.562C194.444 98.9993 193.538 99.9056 193.538 101.024V103.233C193.538 104.351 194.444 105.257 195.562 105.257H260.03C261.148 105.257 262.055 104.351 262.055 103.233V101.024C262.055 99.9056 261.148 98.9993 260.03 98.9993Z" fill="white"/>
+<path d="M242.744 114.077H195.562C194.444 114.077 193.538 114.983 193.538 116.101V118.31C193.538 119.428 194.444 120.334 195.562 120.334H242.744C243.862 120.334 244.768 119.428 244.768 118.31V116.101C244.768 114.983 243.862 114.077 242.744 114.077Z" fill="white"/>
+<path d="M293.36 114.077H254.05C252.932 114.077 252.025 114.983 252.025 116.101V118.31C252.025 119.428 252.932 120.334 254.05 120.334H293.36C294.478 120.334 295.385 119.428 295.385 118.31V116.101C295.385 114.983 294.478 114.077 293.36 114.077Z" fill="white"/>
+</g>
+<path d="M228.464 140.569H183.416C180.438 140.569 178.023 142.984 178.023 145.962V213.445C178.023 216.424 180.438 218.838 183.416 218.838H228.464C231.442 218.838 233.856 216.424 233.856 213.445V145.962C233.856 142.984 231.442 140.569 228.464 140.569Z" fill="#D5EE7D"/>
+<path opacity="0.4" d="M228.464 140.569H183.416C180.438 140.569 178.023 142.984 178.023 145.962V213.445C178.023 216.424 180.438 218.838 183.416 218.838H228.464C231.442 218.838 233.856 216.424 233.856 213.445V145.962C233.856 142.984 231.442 140.569 228.464 140.569Z" fill="black"/>
+<path d="M226.397 148.734H185.474C184.926 148.734 184.482 149.178 184.482 149.725V151.212C184.482 151.759 184.926 152.203 185.474 152.203H226.397C226.944 152.203 227.388 151.759 227.388 151.212V149.725C227.388 149.178 226.944 148.734 226.397 148.734Z" fill="#FAFAFA"/>
+<path d="M213.369 157.083H185.474C184.926 157.083 184.482 157.527 184.482 158.074V159.561C184.482 160.108 184.926 160.552 185.474 160.552H213.369C213.916 160.552 214.36 160.108 214.36 159.561V158.074C214.36 157.527 213.916 157.083 213.369 157.083Z" fill="#FAFAFA"/>
+<path d="M226.397 165.441H185.474C184.926 165.441 184.482 165.885 184.482 166.432V167.919C184.482 168.466 184.926 168.91 185.474 168.91H226.397C226.944 168.91 227.388 168.466 227.388 167.919V166.432C227.388 165.885 226.944 165.441 226.397 165.441Z" fill="#FAFAFA"/>
+<path d="M200.685 173.79H185.474C184.926 173.79 184.482 174.234 184.482 174.781V176.268C184.482 176.816 184.926 177.259 185.474 177.259H200.685C201.233 177.259 201.677 176.816 201.677 176.268V174.781C201.677 174.234 201.233 173.79 200.685 173.79Z" fill="#FAFAFA"/>
+<path d="M221.971 173.79H206.759C206.211 173.79 205.768 174.234 205.768 174.781V176.268C205.768 176.816 206.211 177.259 206.759 177.259H221.971C222.518 177.259 222.962 176.816 222.962 176.268V174.781C222.962 174.234 222.518 173.79 221.971 173.79Z" fill="#FAFAFA"/>
+<path d="M226.397 182.148H185.474C184.926 182.148 184.482 182.592 184.482 183.139V184.626C184.482 185.173 184.926 185.617 185.474 185.617H226.397C226.944 185.617 227.388 185.173 227.388 184.626V183.139C227.388 182.592 226.944 182.148 226.397 182.148Z" fill="#FAFAFA"/>
+<path d="M226.397 190.497H185.474C184.926 190.497 184.482 190.941 184.482 191.489V192.975C184.482 193.523 184.926 193.967 185.474 193.967H226.397C226.944 193.967 227.388 193.523 227.388 192.975V191.489C227.388 190.941 226.944 190.497 226.397 190.497Z" fill="#FAFAFA"/>
+<path d="M219.14 198.855H185.474C184.926 198.855 184.482 199.299 184.482 199.846V201.333C184.482 201.88 184.926 202.324 185.474 202.324H219.14C219.687 202.324 220.131 201.88 220.131 201.333V199.846C220.131 199.299 219.687 198.855 219.14 198.855Z" fill="#FAFAFA"/>
+<path d="M201.181 207.204H185.474C184.926 207.204 184.482 207.648 184.482 208.196V209.682C184.482 210.23 184.926 210.673 185.474 210.673H201.181C201.728 210.673 202.172 210.23 202.172 209.682V208.196C202.172 207.648 201.728 207.204 201.181 207.204Z" fill="#FAFAFA"/>
+<path d="M240.652 140.091H178.166L205.793 162.073L248.152 178.032V147.575C248.148 145.588 247.356 143.685 245.95 142.282C244.543 140.879 242.638 140.091 240.652 140.091Z" fill="#D5EE7D"/>
+<path opacity="0.4" d="M240.652 140.091H178.166L205.793 162.073L248.152 178.032V147.575C248.148 145.588 247.356 143.685 245.95 142.282C244.543 140.879 242.638 140.091 240.652 140.091Z" fill="black"/>
+<path d="M237.922 151.413H192.202C191.516 151.413 190.959 151.97 190.959 152.657V154.975C190.959 155.662 191.516 156.218 192.202 156.218H237.922C238.608 156.218 239.165 155.662 239.165 154.975V152.657C239.165 151.97 238.608 151.413 237.922 151.413Z" fill="#FAFAFA"/>
+<path d="M348.714 199.594V155.647C348.714 152.279 345.984 149.549 342.616 149.549H266.304C262.936 149.549 260.206 152.279 260.206 155.647V199.594C260.206 202.962 262.936 205.692 266.304 205.692H342.616C345.984 205.692 348.714 202.962 348.714 199.594Z" fill="#D5EE7D"/>
+<path d="M362.649 185.667V141.72C362.649 138.352 359.919 135.622 356.551 135.622H280.24C276.872 135.622 274.142 138.352 274.142 141.72V185.667C274.142 189.035 276.872 191.766 280.24 191.766H356.551C359.919 191.766 362.649 189.035 362.649 185.667Z" fill="#D5EE7D"/>
+<path opacity="0.5" d="M362.649 185.667V141.72C362.649 138.352 359.919 135.622 356.551 135.622H280.24C276.872 135.622 274.142 138.352 274.142 141.72V185.667C274.142 189.035 276.872 191.766 280.24 191.766H356.551C359.919 191.766 362.649 189.035 362.649 185.667Z" fill="white"/>
+<path d="M354.904 170.607V143.551C354.904 142.053 353.69 140.838 352.191 140.838H327.252C325.754 140.838 324.539 142.053 324.539 143.551V170.607C324.539 172.105 325.754 173.32 327.252 173.32H352.191C353.69 173.32 354.904 172.105 354.904 170.607Z" fill="#D5EE7D"/>
+<path opacity="0.7" d="M354.904 170.607V143.551C354.904 142.053 353.69 140.838 352.191 140.838H327.252C325.754 140.838 324.539 142.053 324.539 143.551V170.607C324.539 172.105 325.754 173.32 327.252 173.32H352.191C353.69 173.32 354.904 172.105 354.904 170.607Z" fill="white"/>
+<path d="M319.785 183.694V162.963C319.785 161.813 318.852 160.88 317.702 160.88H298.593C297.442 160.88 296.51 161.813 296.51 162.963V183.694C296.51 184.844 297.442 185.777 298.593 185.777H317.702C318.852 185.777 319.785 184.844 319.785 183.694Z" fill="#D5EE7D"/>
+<path opacity="0.3" d="M319.785 183.694V162.963C319.785 161.813 318.852 160.88 317.702 160.88H298.593C297.442 160.88 296.51 161.813 296.51 162.963V183.694C296.51 184.844 297.442 185.777 298.593 185.777H317.702C318.852 185.777 319.785 184.844 319.785 183.694Z" fill="white"/>
+<path d="M308.144 52.2548V41.058C308.144 37.6344 305.368 34.859 301.945 34.859L96.8822 34.859C93.4586 34.859 90.6832 37.6344 90.6832 41.058V52.2548C90.6832 55.6784 93.4586 58.4538 96.8822 58.4538L301.945 58.4538C305.368 58.4538 308.144 55.6784 308.144 52.2548Z" fill="#D5EE7D"/>
+<path opacity="0.5" d="M308.144 52.2548V41.058C308.144 37.6344 305.368 34.859 301.945 34.859L96.8822 34.859C93.4586 34.859 90.6832 37.6344 90.6832 41.058V52.2548C90.6832 55.6784 93.4586 58.4538 96.8822 58.4538L301.945 58.4538C305.368 58.4538 308.144 55.6784 308.144 52.2548Z" fill="white"/>
+<path d="M269.345 62.4016V54.2791L210.337 54.2791V62.4016H269.345Z" fill="#D5EE7D"/>
+<path opacity="0.5" d="M269.345 62.4016V54.2791L210.337 54.2791V62.4016H269.345Z" fill="white"/>
+<path d="M329.303 17.3959V6.19912C329.303 2.77551 326.527 0.00012207 323.104 0.00012207L118.041 0.00012207C114.618 0.00012207 111.842 2.77551 111.842 6.19912V17.3959C111.842 20.8196 114.618 23.5949 118.041 23.5949L323.104 23.5949C326.527 23.5949 329.303 20.8196 329.303 17.3959Z" fill="#D5EE7D"/>
+<path d="M109.498 124.072C108.759 125.752 107.944 127.567 107.23 129.339C106.516 131.111 105.777 132.934 105.131 134.748C103.803 138.285 102.739 141.916 101.947 145.609L101.703 146.953L101.619 147.457C101.619 147.6 101.619 147.785 101.569 147.953C101.537 148.771 101.554 149.59 101.619 150.406C101.779 152.178 102.065 154.076 102.459 155.975C103.165 159.78 104.064 163.702 104.979 167.566L100.67 169.246C98.6616 165.584 96.9509 161.767 95.5548 157.831C94.8193 155.782 94.2244 153.686 93.7741 151.556C93.5218 150.378 93.3645 149.181 93.3037 147.978C93.3037 147.642 93.3037 147.323 93.3037 146.962C93.3037 146.6 93.3037 146.197 93.3625 145.962L93.5305 144.282C93.7815 142.119 94.1658 139.973 94.6813 137.856C95.1516 135.756 95.7564 133.715 96.3612 131.699C96.966 129.683 97.722 127.701 98.5199 125.752C98.9147 124.778 99.3599 123.812 99.7463 122.846C100.133 121.88 100.586 120.956 101.124 119.923L109.498 124.072Z" fill="#E4897B"/>
+<path d="M104.753 166.432L108.028 169.632L100.88 172.992C100.88 172.992 99.15 169.96 100.351 167.222L104.753 166.432Z" fill="#E4897B"/>
+<path d="M110.674 174.395L104.635 176.865L100.889 172.959L108.028 169.632L110.674 174.395Z" fill="#E4897B"/>
+<path opacity="0.4" d="M233.016 170.951C221.131 169.617 209.909 164.789 200.768 157.077C191.626 149.366 184.977 139.117 181.659 127.627C178.342 116.136 178.506 103.921 182.13 92.5235C185.754 81.1264 192.676 71.0597 202.021 63.5959C211.365 56.1322 222.713 51.6066 234.629 50.5912C246.546 49.5758 258.496 52.1163 268.968 57.8914C279.441 63.6665 287.966 72.417 293.467 83.0367C298.967 93.6563 301.195 105.668 299.869 117.554C298.989 125.451 296.561 133.097 292.724 140.055C288.887 147.013 283.716 153.147 277.507 158.106C271.299 163.065 264.174 166.751 256.54 168.956C248.906 171.16 240.912 171.838 233.016 170.951Z" fill="#FAFAFA"/>
+<path opacity="0.4" d="M277.014 63.1996L185.037 136.689C184.651 135.849 184.273 135.009 183.92 134.169C181.614 128.684 180.139 122.886 179.544 116.966L258.988 53.4895C265.511 55.6652 271.609 58.9501 277.014 63.1996Z" fill="#FAFAFA"/>
+<path opacity="0.4" d="M298.24 95.3958L211.765 164.483C203.55 160.201 196.431 154.085 190.959 146.609L285.38 71.1626C291.467 78.1486 295.866 86.4396 298.24 95.3958Z" fill="#FAFAFA"/>
+<path d="M171.682 87.7352L170.884 87.4664C172.266 83.3884 174.003 79.4394 176.075 75.6649L176.806 76.068C174.761 79.8004 173.046 83.7043 171.682 87.7352ZM181.879 68.1303L181.199 67.6347C188.102 58.3008 197.136 50.7525 207.549 45.619L207.927 46.375C197.632 51.4555 188.702 58.9231 181.879 68.1555V68.1303ZM273.932 47.5258C271.187 46.0535 268.347 44.7655 265.431 43.6703L265.733 42.8807C268.678 44.0016 271.546 45.3148 274.318 46.8118L273.932 47.5258Z" fill="#D5EE7D"/>
+<path opacity="0.3" d="M171.682 87.7352L170.884 87.4664C172.266 83.3884 174.003 79.4394 176.075 75.6649L176.806 76.068C174.761 79.8004 173.046 83.7043 171.682 87.7352ZM181.879 68.1303L181.199 67.6347C188.102 58.3008 197.136 50.7525 207.549 45.619L207.927 46.375C197.632 51.4555 188.702 58.9231 181.879 68.1555V68.1303ZM273.932 47.5258C271.187 46.0535 268.347 44.7655 265.431 43.6703L265.733 42.8807C268.678 44.0016 271.546 45.3148 274.318 46.8118L273.932 47.5258Z" fill="black"/>
+<path d="M302.28 79.957C294.502 63.8256 280.815 51.3059 264.056 44.9933C247.297 38.6806 228.751 39.0593 212.264 46.0507C195.776 53.0421 182.612 66.11 175.499 82.5454C168.386 98.9808 167.87 117.523 174.059 134.328C168.448 136.294 162.904 138.402 157.394 140.578C149.447 143.731 141.574 147.023 133.774 150.456C125.979 153.908 118.217 157.428 110.532 161.107C106.676 162.913 102.871 164.819 99.0323 166.667C97.0354 167.525 95.2261 168.767 93.7069 170.321C92.8848 171.182 92.1608 172.131 91.5482 173.152C90.8007 174.359 90.2346 175.669 89.8682 177.041C89.2362 179.513 89.5095 182.129 90.6388 184.417C91.768 186.705 93.6787 188.513 96.0252 189.515C97.3282 190.061 98.7031 190.418 100.107 190.573C101.294 190.707 102.491 190.707 103.677 190.573C105.833 190.311 107.916 189.629 109.809 188.565C113.614 186.642 117.445 184.786 121.224 182.812C128.784 178.956 136.344 174.933 143.811 170.85C151.279 166.768 158.754 162.493 166.045 158.108C171.085 155.059 176.175 151.943 181.165 148.684C190.746 163.809 205.778 174.668 223.148 179.011C240.517 183.355 258.892 180.849 274.464 172.014C290.037 163.179 301.613 148.691 306.795 131.553C311.976 114.415 310.366 95.9401 302.297 79.957H302.28ZM264.095 160.2C254.334 165.018 243.362 166.834 232.569 165.417C221.776 164 211.645 159.415 203.457 152.241C195.27 145.067 189.393 135.626 186.571 125.112C183.749 114.598 184.107 103.484 187.601 93.1736C191.096 82.8637 197.568 73.8213 206.201 67.1899C214.835 60.5585 225.24 56.6359 236.102 55.918C246.965 55.2001 257.796 57.7193 267.227 63.1569C276.657 68.5945 284.264 76.7064 289.084 86.4668C292.286 92.9488 294.179 99.998 294.656 107.212C295.132 114.426 294.183 121.663 291.863 128.509C289.542 135.356 285.896 141.679 281.131 147.117C276.367 152.554 270.578 157 264.095 160.2Z" fill="#D5EE7D"/>
+<path opacity="0.3" d="M302.28 79.957C294.502 63.8256 280.815 51.3059 264.056 44.9933C247.297 38.6806 228.751 39.0593 212.264 46.0507C195.776 53.0421 182.612 66.11 175.499 82.5454C168.386 98.9808 167.87 117.523 174.059 134.328C168.448 136.294 162.904 138.402 157.394 140.578C149.447 143.731 141.574 147.023 133.774 150.456C125.979 153.908 118.217 157.428 110.532 161.107C106.676 162.913 102.871 164.819 99.0323 166.667C97.0354 167.525 95.2261 168.767 93.7069 170.321C92.8848 171.182 92.1608 172.131 91.5482 173.152C90.8007 174.359 90.2346 175.669 89.8682 177.041C89.2362 179.513 89.5095 182.129 90.6388 184.417C91.768 186.705 93.6787 188.513 96.0252 189.515C97.3282 190.061 98.7031 190.418 100.107 190.573C101.294 190.707 102.491 190.707 103.677 190.573C105.833 190.311 107.916 189.629 109.809 188.565C113.614 186.642 117.445 184.786 121.224 182.812C128.784 178.956 136.344 174.933 143.811 170.85C151.279 166.768 158.754 162.493 166.045 158.108C171.085 155.059 176.175 151.943 181.165 148.684C190.746 163.809 205.778 174.668 223.148 179.011C240.517 183.355 258.892 180.849 274.464 172.014C290.037 163.179 301.613 148.691 306.795 131.553C311.976 114.415 310.366 95.9401 302.297 79.957H302.28ZM264.095 160.2C254.334 165.018 243.362 166.834 232.569 165.417C221.776 164 211.645 159.415 203.457 152.241C195.27 145.067 189.393 135.626 186.571 125.112C183.749 114.598 184.107 103.484 187.601 93.1736C191.096 82.8637 197.568 73.8213 206.201 67.1899C214.835 60.5585 225.24 56.6359 236.102 55.918C246.965 55.2001 257.796 57.7193 267.227 63.1569C276.657 68.5945 284.264 76.7064 289.084 86.4668C292.286 92.9488 294.179 99.998 294.656 107.212C295.132 114.426 294.183 121.663 291.863 128.509C289.542 135.356 285.896 141.679 281.131 147.117C276.367 152.554 270.578 157 264.095 160.2Z" fill="black"/>
+<path d="M132.716 94.0769C132.716 94.5725 132.976 94.9756 133.304 94.9756C133.631 94.9756 133.892 94.5725 133.892 94.0769C133.892 93.5813 133.631 93.1781 133.304 93.1781C132.976 93.1781 132.716 93.6149 132.716 94.0769Z" fill="#263238"/>
+<path d="M132.951 94.9757C133.546 96.497 134.346 97.9298 135.328 99.2344C134.989 99.4774 134.6 99.6432 134.189 99.7201C133.778 99.7971 133.356 99.7832 132.951 99.6796V94.9757Z" fill="#DE5753"/>
+<path d="M130.977 91.3134C130.93 91.3134 130.884 91.3029 130.842 91.2825C130.799 91.2621 130.762 91.2325 130.733 91.1958C130.69 91.1317 130.672 91.0532 130.685 90.9766C130.697 90.9 130.739 90.8311 130.801 90.7842C131.17 90.5037 131.603 90.3167 132.06 90.2392C132.518 90.1617 132.988 90.1959 133.43 90.339C133.469 90.3499 133.506 90.3688 133.538 90.3948C133.57 90.4208 133.596 90.4532 133.615 90.4899C133.633 90.5265 133.644 90.5667 133.646 90.6078C133.648 90.6488 133.642 90.6899 133.627 90.7282C133.612 90.7666 133.589 90.8014 133.56 90.8305C133.531 90.8596 133.496 90.8823 133.458 90.897C133.42 90.9118 133.379 90.9184 133.338 90.9163C133.296 90.9142 133.256 90.9036 133.22 90.885C132.869 90.7774 132.497 90.7556 132.136 90.8214C131.775 90.8871 131.435 91.0386 131.145 91.263C131.095 91.296 131.037 91.3136 130.977 91.3134Z" fill="#263238"/>
+<path d="M115.748 97.8148C116.588 102.325 117.512 110.599 114.354 113.615C114.354 113.615 115.588 118.193 123.98 118.193C133.219 118.193 128.381 113.615 128.381 113.615C123.341 112.405 123.484 108.676 124.358 105.165L115.748 97.8148Z" fill="#E4897B"/>
+<path d="M110.583 115.992C111.582 114.438 109.902 110.666 109.902 110.666C109.902 110.666 124.753 106.928 130.826 112.665C132.086 113.85 130.692 115.597 130.692 115.597L110.583 115.992Z" fill="#D5EE7D"/>
+<path opacity="0.1" d="M110.583 115.992C111.582 114.438 109.902 110.666 109.902 110.666C109.902 110.666 124.753 106.928 130.826 112.665C132.086 113.85 130.692 115.597 130.692 115.597L110.583 115.992Z" fill="black"/>
+<path d="M86.0126 287.371C85.2315 287.371 83.9799 286.069 83.6103 285.582C83.5944 285.559 83.5859 285.531 83.5859 285.502C83.5859 285.474 83.5944 285.446 83.6103 285.423C83.6239 285.399 83.6435 285.38 83.6672 285.366C83.6908 285.353 83.7176 285.346 83.7447 285.347C83.8371 285.347 85.895 285.532 86.4578 286.263C86.519 286.34 86.5627 286.429 86.5859 286.525C86.6091 286.621 86.6113 286.72 86.5922 286.817C86.5849 286.942 86.539 287.062 86.4607 287.159C86.3825 287.257 86.2758 287.328 86.1554 287.363L86.0126 287.371ZM84.0639 285.691C84.6771 286.397 85.6598 287.195 86.0798 287.094C86.0798 287.094 86.2478 287.052 86.2982 286.783C86.3093 286.727 86.3075 286.669 86.2929 286.614C86.2784 286.559 86.2515 286.508 86.2142 286.464C85.592 285.993 84.8433 285.718 84.0639 285.675V285.691Z" fill="#D5EE7D"/>
+<path d="M84.1565 285.675C84.0057 285.69 83.8538 285.69 83.7029 285.675C83.6764 285.673 83.651 285.663 83.6301 285.646C83.6092 285.63 83.5936 285.608 83.5854 285.582C83.5735 285.559 83.5674 285.533 83.5674 285.507C83.5674 285.48 83.5735 285.454 83.5854 285.431C83.6442 285.381 84.8789 284.095 85.8113 284.095C85.9228 284.093 86.0337 284.114 86.1365 284.157C86.2393 284.201 86.3317 284.266 86.4077 284.347C86.4913 284.417 86.5485 284.514 86.5699 284.621C86.5913 284.728 86.5755 284.839 86.5253 284.935C86.2817 285.406 84.9965 285.675 84.1565 285.675ZM84.0473 285.381C84.8873 285.381 86.1053 285.12 86.3069 284.751C86.3069 284.751 86.3657 284.641 86.2313 284.507C86.1824 284.454 86.1225 284.412 86.0557 284.384C85.989 284.357 85.917 284.344 85.8449 284.347C85.1563 284.505 84.5305 284.865 84.0473 285.381Z" fill="#D5EE7D"/>
+<path d="M141.443 306.439C140.806 306.434 140.171 306.375 139.545 306.262C139.514 306.256 139.486 306.24 139.466 306.215C139.446 306.19 139.435 306.16 139.436 306.128C139.431 306.099 139.435 306.069 139.447 306.042C139.459 306.015 139.478 305.993 139.503 305.977C139.595 305.926 141.745 304.692 142.779 304.977C142.874 304.999 142.965 305.04 143.044 305.098C143.124 305.155 143.19 305.229 143.241 305.313C143.306 305.407 143.342 305.518 143.342 305.632C143.342 305.747 143.306 305.858 143.241 305.952C142.997 306.329 142.233 306.439 141.443 306.439ZM140.024 306.044C141.166 306.212 142.728 306.203 143.014 305.8C143.056 305.75 143.089 305.658 143.014 305.481C142.95 305.377 142.847 305.301 142.728 305.271C142.073 305.103 140.771 305.658 140.024 306.044Z" fill="#D5EE7D"/>
+<path d="M139.578 306.271C139.55 306.279 139.521 306.279 139.494 306.271C139.47 306.256 139.452 306.234 139.442 306.209C139.431 306.183 139.429 306.155 139.435 306.128C139.492 305.253 139.827 304.42 140.392 303.751C140.507 303.652 140.641 303.579 140.786 303.537C140.931 303.495 141.083 303.485 141.232 303.507C141.636 303.507 141.753 303.751 141.778 303.91C141.888 304.607 140.418 305.943 139.67 306.279L139.578 306.271ZM141.081 303.751C140.896 303.749 140.717 303.815 140.577 303.935C140.102 304.466 139.808 305.134 139.737 305.842C140.493 305.38 141.501 304.339 141.417 303.919C141.417 303.919 141.417 303.776 141.132 303.751H141.081Z" fill="#D5EE7D"/>
+<path d="M132.791 306.119H138.965L139.578 291.831H133.404L132.791 306.119Z" fill="#E4897B"/>
+<path d="M77.8145 281.592L82.9719 284.969L94.3619 275.351L89.1961 271.966L77.8145 281.592Z" fill="#E4897B"/>
+<path d="M83.8208 284.65L78.4617 280.257C78.3671 280.179 78.2483 280.136 78.1258 280.136C78.0032 280.136 77.8844 280.179 77.7898 280.257L73.3715 283.726C73.2648 283.811 73.1786 283.919 73.1193 284.042C73.0601 284.164 73.0293 284.299 73.0293 284.436C73.0293 284.572 73.0601 284.707 73.1193 284.83C73.1786 284.952 73.2648 285.06 73.3715 285.145C75.2698 286.649 76.2694 287.287 78.6297 289.219C80.0829 290.404 83.6696 294.032 85.6939 295.67C87.7182 297.308 89.5746 295.544 88.9026 294.696C85.8871 290.874 84.7027 287.606 84.3583 285.582C84.2988 285.216 84.1076 284.885 83.8208 284.65Z" fill="#263238"/>
+<path d="M138.923 305.406H132.204C132.081 305.406 131.962 305.448 131.866 305.524C131.77 305.6 131.703 305.706 131.674 305.826L130.457 311.311C130.426 311.443 130.426 311.582 130.457 311.714C130.487 311.847 130.548 311.972 130.634 312.078C130.719 312.184 130.828 312.269 130.952 312.326C131.075 312.384 131.211 312.413 131.347 312.411C133.774 312.369 137.285 312.226 140.343 312.226C143.913 312.226 147.004 312.419 151.187 312.419C153.707 312.419 154.429 309.857 153.363 309.631C148.541 308.572 144.593 308.463 140.427 305.884C139.98 305.588 139.459 305.423 138.923 305.406Z" fill="#263238"/>
+<path d="M102.191 115.454C96.8401 117.974 93.791 134.858 93.791 134.858L106.869 140.074C108.784 135.399 110.331 130.583 111.498 125.668C113.295 117.89 107.667 112.85 102.191 115.454Z" fill="#263238"/>
+<path d="M109.13 124.971C105.896 128.247 104.417 134.664 103.771 138.839L106.904 140.091C108.764 135.549 110.28 130.874 111.439 126.105C111.162 124.324 110.473 123.61 109.13 124.971Z" fill="#203048"/>
+<path d="M137.872 115.337C137.872 115.337 144.441 122.762 138.242 168.675H105.24C105.013 163.635 108.196 138.898 103.308 115.026C106.955 114.319 110.645 113.853 114.353 113.631C119.025 113.354 123.709 113.354 128.381 113.631C131.584 113.954 134.757 114.524 137.872 115.337Z" fill="#263238"/>
+<path d="M140.888 133.161L135.328 123.577C134.254 128.048 133.816 132.649 134.026 137.243C134.177 140.536 137.192 152.732 139.905 154.513C140.625 147.419 140.953 140.291 140.888 133.161Z" fill="#203048"/>
+<path d="M141.661 121.897C142.501 125.979 143.341 130.162 144.239 134.261C145.138 138.36 146.071 142.476 147.154 146.449C147.431 147.432 147.692 148.44 147.994 149.38L148.221 150.103L148.33 150.464V150.422C148.271 150.346 148.204 150.338 148.255 150.422C148.6 150.799 149.041 151.075 149.531 151.22C150.325 151.516 151.143 151.743 151.976 151.9C155.947 152.53 159.968 152.791 163.987 152.682L164.785 157.251C163.66 157.612 162.61 157.873 161.501 158.133C160.392 158.393 159.3 158.612 158.183 158.78C155.872 159.165 153.528 159.322 151.186 159.25C149.884 159.215 148.589 159.046 147.322 158.746C145.711 158.394 144.197 157.691 142.887 156.688C142.032 155.998 141.326 155.14 140.812 154.168C140.678 153.916 140.56 153.631 140.451 153.387L140.3 152.992L139.989 152.152C139.561 151.086 139.208 150.036 138.822 148.986C137.402 144.786 136.218 140.544 135.176 136.311C134.135 132.077 133.236 127.852 132.488 123.509L141.661 121.897Z" fill="#E4897B"/>
+<path d="M129.632 119.839C127.894 125.475 134.941 142.283 134.941 142.283L148.977 138.755C148.977 138.755 148.439 130.019 145.239 123.089C140.418 112.64 131.716 113.077 129.632 119.839Z" fill="#263238"/>
+<path d="M163.871 152.682L170.859 152.505L167.499 159.78C167.499 159.78 164.652 160.158 162.317 156.319L159.855 153.379L162.686 152.816C163.076 152.734 163.472 152.689 163.871 152.682Z" fill="#E4897B"/>
+<path d="M175.269 153.858L171.27 159.889L167.499 159.78L170.859 152.505L175.269 153.858Z" fill="#E4897B"/>
+<path d="M139.578 291.831L139.259 299.198H133.085L133.404 291.831H139.578Z" fill="#CE6F64"/>
+<path d="M89.1966 271.966L94.3624 275.351L88.4826 280.307L83.3252 276.93L89.1966 271.966Z" fill="#CE6F64"/>
+<path d="M116.135 93.0103C116.504 99.1169 116.412 102.72 119.494 105.853C124.131 110.583 131.682 107.785 133.144 101.654C134.463 96.1602 133.64 87.0885 127.659 84.6526C126.339 84.1199 124.906 83.9313 123.493 84.1043C122.081 84.2774 120.736 84.8065 119.584 85.6419C118.432 86.4774 117.511 87.5918 116.907 88.8806C116.304 90.1695 116.038 91.5905 116.135 93.0103Z" fill="#E4897B"/>
+<path d="M108.945 91.9351C110.465 97.5041 114.043 103.921 118.671 104.333C124.417 104.837 127.012 98.8985 127.768 92.7667C131.212 90.4063 129.406 87.8108 132.859 87.4832C137.294 87.0632 135.874 78.9491 130.036 77.6472C130.036 77.6472 131.993 81.301 127.886 79.4531C123.98 77.5967 119.64 76.8443 115.337 77.2776C115.337 77.2776 120.578 79.8983 115.454 81.0658C110.33 82.2334 108.802 85.3917 111.162 87.2984C111.162 87.3068 107.945 88.2728 108.945 91.9351Z" fill="#263238"/>
+<path d="M124.265 94.0265C124.378 95.5444 124.989 96.9825 126.004 98.1172C127.348 99.6039 128.751 98.68 128.986 96.874C129.204 95.2529 128.759 92.523 127.113 91.6998C125.466 90.8766 124.156 92.1954 124.265 94.0265Z" fill="#E4897B"/>
+<path d="M126.534 168.675C126.534 168.675 132.548 212.227 127.81 229.682C120.301 257.317 91.5907 280.643 91.5907 280.643L81.8555 274.259C81.8555 274.259 106.307 254.562 109.297 231.421C111.985 210.648 105.24 185.525 105.24 168.667L126.534 168.675Z" fill="#D5EE7D"/>
+<path opacity="0.1" d="M126.534 168.675C126.534 168.675 132.548 212.227 127.81 229.682C120.301 257.317 91.5907 280.643 91.5907 280.643L81.8555 274.259C81.8555 274.259 106.307 254.562 109.297 231.421C111.985 210.648 105.24 185.525 105.24 168.667L126.534 168.675Z" fill="black"/>
+<path d="M129.02 193.572C127.418 191.737 125.656 190.051 123.753 188.532C124.778 202.668 125.618 223.609 124.685 238.485C125.939 235.633 126.983 232.694 127.81 229.69C130.12 221.165 129.876 206.44 129.02 193.572Z" fill="#D5EE7D"/>
+<path opacity="0.3" d="M129.02 193.572C127.418 191.737 125.656 190.051 123.753 188.532C124.778 202.668 125.618 223.609 124.685 238.485C125.939 235.633 126.983 232.694 127.81 229.69C130.12 221.165 129.876 206.44 129.02 193.572Z" fill="black"/>
+<path d="M95.5129 278.468C95.5549 278.468 91.7415 280.987 91.7415 280.987L81.1074 274.016L84.4673 271.235L95.5129 278.468Z" fill="#D5EE7D"/>
+<path opacity="0.3" d="M95.5129 278.468C95.5549 278.468 91.7415 280.987 91.7415 280.987L81.1074 274.016L84.4673 271.235L95.5129 278.468Z" fill="black"/>
+<path d="M138.242 168.675C138.242 168.675 147.532 208.07 148.188 226.893C148.927 247.993 141.56 297.77 141.56 297.77H131.103C131.103 297.77 129.817 247.607 129.355 228.388C128.843 207.431 116.546 168.675 116.546 168.675H138.242Z" fill="#D5EE7D"/>
+<path opacity="0.1" d="M138.242 168.675C138.242 168.675 147.532 208.07 148.188 226.893C148.927 247.993 141.56 297.77 141.56 297.77H131.103C131.103 297.77 129.817 247.607 129.355 228.388C128.843 207.431 116.546 168.675 116.546 168.675H138.242Z" fill="black"/>
+<path d="M143.568 293.612C143.618 293.612 142.98 297.946 142.98 297.946H130.262L129.918 294.074L143.568 293.612Z" fill="#D5EE7D"/>
+<path opacity="0.3" d="M143.568 293.612C143.618 293.612 142.98 297.946 142.98 297.946H130.262L129.918 294.074L143.568 293.612Z" fill="black"/>
+<path d="M299.03 130.817C299.744 131.489 300.307 132.06 300.895 132.699C301.483 133.337 302.037 133.959 302.575 134.605C303.667 135.891 304.692 137.243 305.683 138.604C307.663 141.333 309.424 144.215 310.95 147.222L311.26 147.835C311.412 148.132 311.539 148.441 311.638 148.759C311.841 149.374 311.965 150.011 312.008 150.657C312.063 151.796 311.906 152.935 311.546 154.017C310.932 155.814 310.021 157.495 308.85 158.99C306.739 161.7 304.25 164.094 301.458 166.096L299.366 163.694C300.349 162.543 301.374 161.308 302.289 160.073C303.221 158.877 304.063 157.614 304.809 156.293C305.506 155.142 306.022 153.889 306.338 152.581C306.447 152.113 306.467 151.628 306.397 151.153C306.367 150.993 306.316 150.838 306.246 150.691C306.214 150.626 306.178 150.565 306.137 150.506L305.868 150.053C304.248 147.411 302.49 144.857 300.601 142.4C299.669 141.166 298.669 139.981 297.661 138.814C297.166 138.226 296.653 137.655 296.141 137.083C295.628 136.512 295.074 135.941 294.629 135.496L299.03 130.817Z" fill="#E4897B"/>
+<path d="M300.173 162.988L293.898 161.963L297.183 167.457C297.183 167.457 301.223 167.314 302.374 164.937L300.173 162.988Z" fill="#E4897B"/>
+<path d="M289.262 164.5L292.252 168.96L297.183 167.457L293.898 161.963L289.262 164.5Z" fill="#E4897B"/>
+<path d="M299.87 306.363C299.444 306.4 299.018 306.283 298.669 306.035C298.564 305.936 298.486 305.811 298.444 305.673C298.401 305.534 298.395 305.387 298.426 305.246C298.432 305.156 298.462 305.069 298.514 304.995C298.566 304.921 298.637 304.862 298.72 304.826C299.45 304.498 301.365 305.725 301.584 305.867C301.609 305.883 301.628 305.906 301.639 305.933C301.649 305.96 301.651 305.99 301.643 306.019C301.64 306.047 301.627 306.074 301.608 306.095C301.588 306.117 301.562 306.131 301.533 306.136C300.989 306.274 300.432 306.35 299.87 306.363ZM299.03 305.061C298.969 305.052 298.907 305.052 298.846 305.061C298.809 305.078 298.777 305.105 298.755 305.14C298.733 305.174 298.72 305.213 298.72 305.254C298.697 305.348 298.7 305.446 298.726 305.538C298.753 305.631 298.802 305.715 298.871 305.783C299.19 306.069 300.013 306.111 301.114 305.893C300.483 305.476 299.774 305.193 299.03 305.061Z" fill="#D5EE7D"/>
+<path d="M301.55 306.128H301.475C300.879 305.783 299.728 304.448 299.871 303.717C299.898 303.602 299.962 303.499 300.052 303.423C300.143 303.347 300.256 303.303 300.375 303.297C300.488 303.281 300.604 303.29 300.713 303.325C300.822 303.36 300.922 303.419 301.005 303.499C301.693 304.103 301.702 305.918 301.702 306.019C301.7 306.044 301.692 306.069 301.679 306.091C301.666 306.113 301.648 306.131 301.626 306.145L301.55 306.128ZM300.475 303.608H300.408C300.223 303.608 300.181 303.709 300.165 303.784C300.081 304.213 300.795 305.237 301.391 305.716C301.406 305.012 301.203 304.319 300.811 303.734C300.761 303.687 300.701 303.651 300.636 303.63C300.571 303.608 300.502 303.6 300.433 303.608H300.475Z" fill="#D5EE7D"/>
+<path d="M271.244 306.363C270.708 306.414 270.171 306.277 269.724 305.977C269.623 305.887 269.545 305.775 269.497 305.649C269.449 305.523 269.432 305.388 269.447 305.254C269.452 305.172 269.478 305.093 269.522 305.024C269.566 304.955 269.627 304.899 269.699 304.859C270.48 304.423 272.983 305.699 273.269 305.859C273.295 305.876 273.316 305.9 273.329 305.928C273.342 305.956 273.348 305.988 273.344 306.019C273.339 306.048 273.325 306.075 273.304 306.096C273.283 306.117 273.256 306.131 273.227 306.136C272.575 306.275 271.911 306.351 271.244 306.363ZM270.127 305.061C270.031 305.055 269.935 305.075 269.85 305.12C269.82 305.134 269.794 305.157 269.776 305.185C269.758 305.213 269.749 305.246 269.749 305.279C269.736 305.367 269.745 305.456 269.774 305.539C269.803 305.623 269.852 305.698 269.917 305.758C270.303 306.103 271.337 306.161 272.731 305.926C271.918 305.493 271.038 305.201 270.127 305.061Z" fill="#D5EE7D"/>
+<path d="M273.201 306.128H273.134C272.386 305.792 270.9 304.448 271.017 303.717C271.017 303.549 271.169 303.339 271.58 303.297C271.73 303.281 271.883 303.296 272.027 303.34C272.171 303.385 272.305 303.459 272.42 303.557C273.21 304.213 273.361 305.909 273.361 305.985C273.364 306.011 273.36 306.037 273.35 306.06C273.34 306.084 273.323 306.104 273.302 306.119C273.27 306.133 273.235 306.136 273.201 306.128ZM271.698 303.608H271.605C271.337 303.608 271.32 303.742 271.311 303.776C271.244 304.204 272.252 305.271 272.991 305.733C272.918 305.015 272.625 304.337 272.151 303.793C272.024 303.684 271.865 303.619 271.698 303.608Z" fill="#D5EE7D"/>
+<path d="M283.13 111.506C282.886 115.303 282.231 123.014 285.145 125.147C285.145 125.147 284.616 129.037 277.737 129.944C270.177 130.926 273.629 126.659 273.629 126.659C277.636 125.131 277.124 122.082 276.032 119.293L283.13 111.506Z" fill="#E4897B"/>
+<path d="M267.481 104.795C267.44 104.795 267.399 104.786 267.361 104.769C267.323 104.751 267.29 104.726 267.263 104.694C267.023 104.409 266.719 104.185 266.376 104.039C266.033 103.893 265.661 103.83 265.289 103.854C265.25 103.861 265.209 103.86 265.17 103.851C265.131 103.842 265.095 103.826 265.063 103.802C265.03 103.779 265.003 103.749 264.983 103.714C264.963 103.68 264.95 103.642 264.945 103.602C264.935 103.523 264.957 103.444 265.006 103.381C265.054 103.318 265.126 103.277 265.205 103.266C265.679 103.226 266.156 103.301 266.595 103.486C267.034 103.67 267.421 103.958 267.725 104.324C267.761 104.368 267.785 104.421 267.792 104.478C267.8 104.534 267.791 104.592 267.767 104.644C267.744 104.695 267.706 104.739 267.658 104.771C267.61 104.802 267.555 104.819 267.498 104.82L267.481 104.795Z" fill="#263238"/>
+<path d="M266.171 108.516C265.873 109.721 265.412 110.879 264.802 111.96C265.082 112.111 265.392 112.198 265.71 112.215C266.028 112.233 266.346 112.18 266.641 112.061L266.171 108.516Z" fill="#DE5753"/>
+<path d="M266.507 107.592C266.574 108.096 266.364 108.533 266.037 108.583C265.709 108.634 265.381 108.247 265.323 107.743C265.264 107.239 265.465 106.802 265.793 106.76C266.121 106.718 266.448 107.054 266.507 107.592Z" fill="#263238"/>
+<path d="M265.944 106.769L264.692 106.576C264.692 106.576 265.432 107.441 265.944 106.769Z" fill="#263238"/>
+<path d="M280.123 305.993H273.823L273.403 291.42H279.703L280.123 305.993Z" fill="#E4897B"/>
+<path d="M308.724 305.993H302.424L300.399 291.42H306.699L308.724 305.993Z" fill="#E4897B"/>
+<path d="M302.038 305.288H309.11C309.231 305.287 309.348 305.33 309.439 305.408C309.53 305.487 309.59 305.597 309.606 305.716L310.446 311.319C310.461 311.46 310.447 311.603 310.403 311.738C310.359 311.873 310.287 311.998 310.192 312.103C310.097 312.209 309.981 312.293 309.851 312.35C309.721 312.408 309.58 312.437 309.438 312.436C306.977 312.394 305.784 312.251 302.676 312.251C300.761 312.251 297.964 312.444 295.326 312.444C292.689 312.444 292.546 309.832 293.647 309.597C298.577 308.538 299.358 307.077 301.013 305.674C301.302 305.434 301.663 305.298 302.038 305.288Z" fill="#263238"/>
+<path d="M273.613 305.288H280.677C280.798 305.286 280.916 305.329 281.009 305.408C281.102 305.486 281.163 305.596 281.181 305.716L282.021 311.319C282.036 311.46 282.021 311.603 281.978 311.738C281.934 311.873 281.862 311.998 281.767 312.103C281.672 312.209 281.555 312.293 281.425 312.35C281.296 312.408 281.155 312.437 281.013 312.436C278.552 312.394 277.359 312.251 274.251 312.251C272.336 312.251 268.371 312.444 265.734 312.444C263.096 312.444 262.953 309.832 264.054 309.597C268.984 308.538 270.925 307.077 272.588 305.674C272.877 305.434 273.237 305.298 273.613 305.288Z" fill="#263238"/>
+<path d="M273.403 291.42L273.622 298.938H279.922L279.703 291.42H273.403Z" fill="#CE6F64"/>
+<path d="M306.699 291.42H300.399L301.449 298.938H307.741L306.699 291.42Z" fill="#CE6F64"/>
+<path d="M283.214 103.644C283.642 109.877 283.953 112.506 281.249 116.093C277.175 121.477 269.43 120.645 267.145 114.665C265.087 109.28 264.735 99.9987 270.463 96.7396C271.723 96.0174 273.147 95.6291 274.6 95.6116C276.052 95.5941 277.485 95.9479 278.762 96.6396C280.04 97.3312 281.119 98.3377 281.898 99.5636C282.677 100.79 283.13 102.194 283.214 103.644Z" fill="#E4897B"/>
+<path d="M286.843 109.432C290.337 111.38 292.933 106.576 292.933 106.576C292.933 106.576 286.666 107.256 287.229 103.527C287.968 98.5791 284.424 92.5649 275.537 93.3377C275.041 93.3797 274.571 93.4385 274.109 93.5141C273.178 93.0731 272.126 92.9592 271.123 93.191C270.12 93.4227 269.225 93.9865 268.582 94.7908C266.062 95.0008 262.66 98.0079 264.97 101.981C265.132 101.524 265.383 101.105 265.709 100.746C265.902 103.073 267.935 106.769 270.472 107.012C271.018 110.196 268.901 113.883 269.632 117.21C270.715 122.006 278.804 123.089 278.804 123.089C278.525 122.491 278.421 121.825 278.505 121.169C278.588 120.514 278.855 119.895 279.275 119.385C284.768 121.905 288.388 119.444 288.388 119.444C284.642 118.05 285.776 115.563 285.776 115.563C287.07 116.138 288.535 116.188 289.865 115.704C291.195 115.22 292.286 114.239 292.907 112.968C291.663 113.027 290.428 112.724 289.352 112.097C288.276 111.469 287.404 110.544 286.843 109.432Z" fill="#263238"/>
+<path d="M272.663 107.97C272.678 108.568 272.574 109.163 272.358 109.721C272.142 110.279 271.817 110.789 271.403 111.221C270.295 112.371 268.934 111.565 268.564 110.095C268.237 108.768 268.422 106.576 269.866 105.971C270.184 105.846 270.528 105.802 270.868 105.844C271.207 105.886 271.53 106.012 271.808 106.211C272.086 106.409 272.31 106.674 272.459 106.982C272.608 107.289 272.679 107.629 272.663 107.97Z" fill="#E4897B"/>
+<path d="M277.896 166.037C277.896 166.037 279.492 207.498 283.289 231.841C286.347 251.513 299.929 297.476 299.929 297.476H308.513C308.513 297.476 301.433 253.084 299.879 233.638C295.947 184.424 306.153 173.857 296.519 163.61L277.896 166.037Z" fill="#263238"/>
+<path d="M285.07 179.149C285.07 179.149 281.19 178.477 278.922 185.869C279.762 199.871 281.198 218.452 283.29 231.841C283.752 234.823 284.457 238.418 285.322 242.357C283.685 218.704 285.07 179.149 285.07 179.149Z" fill="#161F33"/>
+<path d="M271.202 166.911C271.202 166.911 264.129 212.782 264.541 231.975C264.969 251.941 272.285 297.493 272.285 297.493H280.794C280.794 297.493 279.45 253.126 280.198 233.521C281.038 212.143 289.765 164.5 289.765 164.5L271.202 166.911Z" fill="#263238"/>
+<path d="M309.757 297.879H298.342L297.451 294.049L309.673 294.133L309.757 297.879Z" fill="#D5EE7D"/>
+<path opacity="0.2" d="M309.757 297.879H298.342L297.451 294.049L309.673 294.133L309.757 297.879Z" fill="black"/>
+<path d="M296.091 125.156C299.375 125.475 304.365 134.807 304.365 134.807L296.074 141.166C296.074 141.166 289.211 135.143 290.026 131.758C290.875 128.239 292.941 124.862 296.091 125.156Z" fill="#D5EE7D"/>
+<path opacity="0.1" d="M296.091 125.156C299.375 125.475 304.365 134.807 304.365 134.807L296.074 141.166C296.074 141.166 289.211 135.143 290.026 131.758C290.875 128.239 292.941 124.862 296.091 125.156Z" fill="black"/>
+<path d="M293.613 129.171C292.776 128.945 291.909 128.849 291.042 128.885C290.602 129.804 290.261 130.767 290.026 131.758C289.186 135.118 296.074 141.166 296.074 141.166L296.687 140.695L293.613 129.171Z" fill="#D5EE7D"/>
+<path opacity="0.3" d="M293.613 129.171C292.776 128.945 291.909 128.849 291.042 128.885C290.602 129.804 290.261 130.767 290.026 131.758C289.186 135.118 296.074 141.166 296.074 141.166L296.687 140.695L293.613 129.171Z" fill="black"/>
+<path d="M268.388 138.133C265.994 144.189 263.474 150.346 261.467 156.419C261.333 156.806 261.223 157.175 261.106 157.553L260.82 158.486C260.742 158.76 260.742 159.051 260.82 159.326C261.294 160.376 262.047 161.276 262.996 161.93C265.507 163.731 268.243 165.197 271.135 166.289L270.379 169.38C266.822 168.911 263.382 167.789 260.232 166.071C258.294 165.035 256.715 163.436 255.705 161.484C255.125 160.237 254.923 158.847 255.125 157.486C255.144 157.32 255.172 157.154 255.209 156.991L255.293 156.638L255.436 155.999C255.537 155.571 255.638 155.159 255.747 154.739C256.587 151.38 257.662 148.188 258.796 145.021C259.93 141.854 261.114 138.73 262.45 135.613L268.388 138.133Z" fill="#E4897B"/>
+<path d="M263.289 129.633C263.289 129.633 260.45 131.069 271.202 166.911L296.552 163.601C294.771 153.337 293.931 146.978 296.09 125.156C292.455 124.895 288.806 124.895 285.171 125.156C281.3 125.381 277.452 125.886 273.655 126.668C268.791 127.751 263.289 129.633 263.289 129.633Z" fill="#D5EE7D"/>
+<path opacity="0.1" d="M263.289 129.633C263.289 129.633 260.45 131.069 271.202 166.911L296.552 163.601C294.771 153.337 293.931 146.978 296.09 125.156C292.455 124.895 288.806 124.895 285.171 125.156C281.3 125.381 277.452 125.886 273.655 126.668C268.791 127.751 263.289 129.633 263.289 129.633Z" fill="black"/>
+<path d="M296.737 162.064L298.191 164.173C298.3 164.341 298.115 164.542 297.829 164.584L271.244 168.062C271.017 168.062 270.807 168.003 270.774 167.86L270.253 165.617C270.211 165.466 270.396 165.307 270.648 165.273L296.317 161.913C296.394 161.901 296.473 161.908 296.547 161.935C296.62 161.961 296.686 162.006 296.737 162.064Z" fill="#D5EE7D"/>
+<path opacity="0.2" d="M296.737 162.064L298.191 164.173C298.3 164.341 298.115 164.542 297.829 164.584L271.244 168.062C271.017 168.062 270.807 168.003 270.774 167.86L270.253 165.617C270.211 165.466 270.396 165.307 270.648 165.273L296.317 161.913C296.394 161.901 296.473 161.908 296.547 161.935C296.62 161.961 296.686 162.006 296.737 162.064Z" fill="black"/>
+<path d="M293.663 165.382L294.352 165.29C294.486 165.29 294.579 165.189 294.562 165.105L293.856 162.199C293.83 162.149 293.787 162.11 293.735 162.089C293.683 162.067 293.625 162.065 293.571 162.081L292.882 162.165C292.739 162.165 292.647 162.266 292.672 162.358L293.378 165.256C293.394 165.349 293.529 165.399 293.663 165.382Z" fill="#263238"/>
+<path d="M276.998 167.532L277.687 167.44C277.821 167.44 277.922 167.339 277.897 167.255L277.191 164.349C277.164 164.3 277.121 164.261 277.069 164.238C277.018 164.216 276.96 164.21 276.906 164.223L276.217 164.315C276.082 164.315 275.982 164.416 276.007 164.5L276.712 167.406C276.729 167.532 276.864 167.583 276.998 167.532Z" fill="#263238"/>
+<path d="M264.474 141.796C265.171 145.038 266.154 149.145 267.59 154.345L267.901 141.166L264.474 141.796Z" fill="#D5EE7D"/>
+<path opacity="0.3" d="M264.474 141.796C265.171 145.038 266.154 149.145 267.59 154.345L267.901 141.166L264.474 141.796Z" fill="black"/>
+<path d="M263.29 129.633C260.14 130.901 257.41 141.678 257.41 141.678L268.246 146.953C268.246 146.953 273.479 133.774 271.135 131.204C268.792 128.633 266.919 128.18 263.29 129.633Z" fill="#D5EE7D"/>
+<path opacity="0.1" d="M263.29 129.633C260.14 130.901 257.41 141.678 257.41 141.678L268.246 146.953C268.246 146.953 273.479 133.774 271.135 131.204C268.792 128.633 266.919 128.18 263.29 129.633Z" fill="black"/>
+<path d="M282.248 297.879H270.833L269.942 294.049L282.651 294.133L282.248 297.879Z" fill="#D5EE7D"/>
+<path opacity="0.2" d="M282.248 297.879H270.833L269.942 294.049L282.651 294.133L282.248 297.879Z" fill="black"/>
+<path d="M271.311 165.248L270.395 164.87C270.17 164.778 269.925 164.748 269.685 164.782C269.444 164.816 269.217 164.913 269.025 165.063C268.834 165.213 268.686 165.411 268.597 165.637C268.507 165.862 268.478 166.108 268.514 166.348L269.178 170.724C269.209 170.943 269.29 171.153 269.412 171.337C269.535 171.521 269.697 171.676 269.886 171.79C270.076 171.904 270.289 171.975 270.509 171.997C270.729 172.019 270.951 171.992 271.16 171.917C271.493 171.796 271.805 171.623 272.084 171.405C272.388 171.153 272.628 170.833 272.786 170.471C272.943 170.109 273.013 169.716 272.991 169.322L272.899 167.507C272.883 167.017 272.724 166.542 272.442 166.141C272.16 165.739 271.767 165.429 271.311 165.248Z" fill="#E4897B"/>
+</svg>

+ 246 - 0
quasar.config.js

@@ -0,0 +1,246 @@
+/* eslint-env node */
+
+// Configuration for your app
+// https://v2.quasar.dev/quasar-cli-vite/quasar-config-js
+
+import { configure } from "quasar/wrappers";
+import { fileURLToPath } from "node:url";
+
+export default configure((ctx) => {
+  return {
+    // https://v2.quasar.dev/quasar-cli-vite/prefetch-feature
+    // preFetch: true,
+
+    // app boot file (/src/boot)
+    // --> boot files are part of "main.js"
+    // https://v2.quasar.dev/quasar-cli-vite/boot-files
+    boot: [
+      "i18n",
+      "axios",
+      "setPermissions",
+      "defaultPropsComponents",
+      // "socket.io",
+    ],
+
+    // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css
+    css: ["app.scss"],
+
+    // https://github.com/quasarframework/quasar/tree/dev/extras
+    extras: [
+      // 'ionicons-v4',
+      "mdi-v7",
+      // 'fontawesome-v6',
+      // 'eva-icons',
+      // 'themify',
+      "line-awesome",
+      // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both!
+
+      "roboto-font", // optional, you are not bound to it
+      "material-icons", // optional, you are not bound to it
+    ],
+
+    // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#build
+    build: {
+      target: {
+        browser: ["es2022", "firefox115", "chrome115", "safari14"],
+        node: "node20",
+      },
+
+      vueRouterMode: "history", // available values: 'hash', 'history'
+      // vueRouterBase,
+      // vueDevtools,
+      // vueOptionsAPI: false,
+
+      // rebuildCache: true, // rebuilds Vite/linter/etc cache on startup
+
+      // publicPath: '/',
+      // analyze: true,
+      env: {
+        API_URL: ctx.dev
+          ? "http://localhost:8000"
+          : "https://api.test.softpar.inf.br/alugap",
+        PASSWORD: ctx.dev ? "KizzoOwner@123" : "",
+        WEBSOCKET_API: ctx.dev
+          ? "http://localhost:4321/"
+          : "https://test-ws.softpar.inf.br/",
+        WEBSOCKET_PATH: ctx.dev ? "/socket.io" : "/socket.io",
+        WEBSOCKET_ROOM: ctx.dev ? "LARAVEL" : "LARAVEL",
+        WEBSOCKET_API_KEY:
+          "7wArC/kl0nTbt4zBu0agw.NXLyjA96I6x1XmBcuokwPqfo3/CIxzqYw.PTthh5eqa08Uf4ubFlOqatpShoz1CRRID9pZReEFvBk3il6E9u",
+      },
+      // rawDefine: {}
+      // ignorePublicFolder: true,
+      // minify: false,
+      // polyfillModulePreload: true,
+      // distDir
+
+      // extendViteConf (viteConf) {},
+      // viteVuePluginOptions: {},
+
+      vitePlugins: [
+        [
+          "@intlify/unplugin-vue-i18n/vite",
+          {
+            // if you want to use Vue I18n Legacy API, you need to set `compositionOnly: false`
+            // compositionOnly: false,
+
+            // if you want to use named tokens in your Vue I18n messages, such as 'Hello {name}',
+            // you need to set `runtimeOnly: false`
+            runtimeOnly: false,
+
+            ssr: ctx.modeName === "ssr",
+
+            // you need to set i18n resource including paths !
+            include: [fileURLToPath(new URL("./src/i18n", import.meta.url))],
+          },
+        ],
+        [
+          "vite-plugin-checker",
+          {
+            eslint: {
+              lintCommand: 'eslint "./**/*.{js,mjs,cjs,vue}"',
+            },
+          },
+          { server: false },
+        ],
+      ],
+    },
+
+    // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer
+    devServer: {
+      // https: true
+      open: true, // opens browser window automatically
+    },
+
+    // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework
+    framework: {
+      lang: "pt-BR",
+      config: {
+        dark: "false",
+        notify: {
+          position: "top-right",
+        },
+      },
+
+      // iconSet: 'material-icons', // Quasar icon set
+      // lang: 'en-US', // Quasar language pack
+
+      // For special cases outside of where the auto-import strategy can have an impact
+      // (like functional components as one of the examples),
+      // you can manually specify Quasar components/directives to be available everywhere:
+      //
+      // components: [],
+      // directives: [],
+
+      // Quasar plugins
+      plugins: ["Dialog", "Notify", "Loading", "Cookies", "Dark"],
+    },
+
+    // animations: 'all', // --- includes all animations
+    // https://v2.quasar.dev/options/animations
+    animations: [],
+
+    // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#property-sourcefiles
+    // sourceFiles: {
+    //   rootComponent: 'src/App.vue',
+    //   router: 'src/router/index',
+    //   store: 'src/store/index',
+    //   pwaRegisterServiceWorker: 'src-pwa/register-service-worker',
+    //   pwaServiceWorker: 'src-pwa/custom-service-worker',
+    //   pwaManifestFile: 'src-pwa/manifest.json',
+    //   electronMain: 'src-electron/electron-main',
+    //   electronPreload: 'src-electron/electron-preload'
+    //   bexManifestFile: 'src-bex/manifest.json
+    // },
+
+    // https://v2.quasar.dev/quasar-cli-vite/developing-ssr/configuring-ssr
+    ssr: {
+      prodPort: 3000, // The default port that the production server should use
+      // (gets superseded if process.env.PORT is specified at runtime)
+
+      middlewares: [
+        "render", // keep this as last one
+      ],
+
+      // extendPackageJson (json) {},
+      // extendSSRWebserverConf (esbuildConf) {},
+
+      // manualStoreSerialization: true,
+      // manualStoreSsrContextInjection: true,
+      // manualStoreHydration: true,
+      // manualPostHydrationTrigger: true,
+
+      pwa: false,
+
+      // pwaOfflineHtmlFilename: 'offline.html', // do NOT use index.html as name!
+      // will mess up SSR
+
+      // pwaExtendGenerateSWOptions (cfg) {},
+      // pwaExtendInjectManifestOptions (cfg) {}
+    },
+
+    // https://v2.quasar.dev/quasar-cli-vite/developing-pwa/configuring-pwa
+    pwa: {
+      workboxMode: "GenerateSW", // 'GenerateSW' or 'InjectManifest'
+      // swFilename: 'sw.js',
+      // manifestFilename: 'manifest.json'
+      // extendManifestJson (json) {},
+      // useCredentialsForManifestTag: true,
+      // injectPwaMetaTags: false,
+      // extendPWACustomSWConf (esbuildConf) {},
+      // extendGenerateSWOptions (cfg) {},
+      // extendInjectManifestOptions (cfg) {}
+    },
+
+    // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-cordova-apps/configuring-cordova
+    cordova: {
+      // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing
+    },
+
+    // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-capacitor-apps/configuring-capacitor
+    capacitor: {
+      hideSplashscreen: true,
+    },
+
+    // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-electron-apps/configuring-electron
+    electron: {
+      // extendElectronMainConf (esbuildConf) {},
+      // extendElectronPreloadConf (esbuildConf) {},
+
+      // extendPackageJson (json) {},
+
+      // Electron preload scripts (if any) from /src-electron, WITHOUT file extension
+      preloadScripts: ["electron-preload"],
+
+      // specify the debugging port to use for the Electron app when running in development mode
+      inspectPort: 5858,
+
+      bundler: "packager", // 'packager' or 'builder'
+
+      packager: {
+        // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options
+        // OS X / Mac App Store
+        // appBundleId: '',
+        // appCategoryType: '',
+        // osxSign: '',
+        // protocol: 'myapp://path',
+        // Windows only
+        // win32metadata: { ... }
+      },
+
+      builder: {
+        // https://www.electron.build/configuration/configuration
+
+        appId: "quasar-skeleton",
+      },
+    },
+
+    // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-browser-extensions/configuring-bex
+    bex: {
+      // extendBexScriptsConf (esbuildConf) {},
+      // extendBexManifestJson (json) {},
+
+      contentScripts: ["my-content-script"],
+    },
+  };
+});

+ 28 - 0
src/App.vue

@@ -0,0 +1,28 @@
+<template>
+  <router-view />
+</template>
+
+<script setup>
+import { Cookies } from "quasar";
+import { watch } from "vue";
+import { useI18n } from "vue-i18n";
+
+defineOptions({
+  name: "App",
+});
+
+const { locale } = useI18n();
+
+const localeCookie = Cookies.get("locale") || window.navigator.language;
+locale.value = localeCookie;
+
+watch(
+  () => locale.value,
+  (value) => {
+    Cookies.set("locale", value, {
+      expires: 365,
+      path: "/",
+    });
+  },
+);
+</script>

+ 172 - 0
src/api/cacheService.js

@@ -0,0 +1,172 @@
+import { api } from "src/boot/axios";
+
+const createDbConnection = (dbName = "apiCache", version = 1) => {
+  let db = null;
+
+  const ready = new Promise((resolve, reject) => {
+    const request = indexedDB.open(dbName, version);
+
+    request.onerror = () => reject(request.error);
+
+    request.onsuccess = () => {
+      db = request.result;
+
+      resolve(db);
+    };
+
+    request.onupgradeneeded = (event) => {
+      const db = event.target.result;
+
+      if (!db.objectStoreNames.contains("apiCache")) {
+        db.createObjectStore("apiCache", { keyPath: "key" });
+      }
+    };
+  });
+
+  return {
+    getDb: () => ready,
+  };
+};
+
+const { getDb } = createDbConnection();
+
+const getFromCache = async (key) => {
+  const db = await getDb();
+
+  return new Promise((resolve) => {
+    const transaction = db.transaction(["apiCache"], "readonly");
+    const store       = transaction.objectStore("apiCache");
+    const request     = store.get(key);
+
+    request.onsuccess = () => {
+      const entry = request.result;
+
+      if (entry?.timestamp + entry?.ttl > Date.now()) {
+        resolve(entry.data);
+      } else {
+        resolve(null);
+      }
+    };
+  });
+};
+
+const setInCache = async (key, data, ttl) => {
+  const db = await getDb();
+
+  const entry = {
+    key,
+    data,
+    timestamp: Date.now(), ttl: ttl * 1000,
+  };
+
+  return new Promise((resolve) => {
+    const transaction = db.transaction(["apiCache"], "readwrite");
+
+    const store = transaction.objectStore("apiCache");
+
+    store.put(entry);
+
+    transaction.oncomplete = () => resolve();
+  });
+};
+
+const clearCache = async (cacheKey) => {
+  const db = await getDb();
+
+  const transaction = db.transaction(["apiCache"], "readwrite");
+
+  const store = transaction.objectStore("apiCache");
+
+  return new Promise((resolve) => {
+    if (!cacheKey) {
+      store.clear();
+
+      transaction.oncomplete = () => resolve();
+
+      return;
+    }
+
+    const request = store.getAllKeys();
+
+    request.onsuccess = () => {
+      const deletePromises = request.result
+        .filter((key) => key.includes(cacheKey))
+        .map(
+          (key) =>
+            new Promise((resolve) => {
+              const deleteRequest = store.delete(key);
+
+              deleteRequest.onsuccess = () => resolve();
+            }),
+        );
+
+      Promise.all(deletePromises).then(() => resolve());
+    };
+  });
+};
+
+export const createCachedApi = (namespace, ttl = 3600) => {
+  const getCacheKey = (path) => `${namespace}:${path}`;
+
+  const getResourcePaths = (path) => {
+    const segments = path.split("/").filter(Boolean);
+
+    const paths = [];
+
+    for (let i = 0; i <= segments.length; i++) {
+      const currentPath = "/" + segments.slice(0, i).join("/");
+
+      paths.push(currentPath);
+    }
+
+    return paths;
+  };
+
+  const invalidateAll = async (path) => {
+    const paths = getResourcePaths(path);
+
+    await Promise.all(paths.map((path) => clearCache(getCacheKey(path))));
+  };
+
+  //
+
+  const get = async (path, options = {}) => {
+    const key = getCacheKey(path);
+
+    const cached = await getFromCache(key);
+
+    if (cached) return cached;
+
+    const { data } = await api.get(path);
+
+    await setInCache(key, { data }, options.ttl ?? ttl);
+
+    return { data };
+  };
+
+  const post = async (path, payload) => {
+    const { data } = await api.post(path, payload);
+
+    await invalidateAll(path);
+
+    return { data };
+  };
+
+  const put = async (path, payload) => {
+    const { data } = await api.put(path, payload);
+
+    await invalidateAll(path);
+
+    return { data };
+  };
+
+  const del = async (path) => {
+    const { data } = await api.delete(path);
+
+    await invalidateAll(path);
+
+    return { data };
+  };
+
+  return { get, post, put, del, invalidateAll };
+};

+ 38 - 0
src/api/city.js

@@ -0,0 +1,38 @@
+import { createCachedApi } from "./cacheService";
+
+const api = createCachedApi("city");
+
+export const getCity = async (id) => {
+  const { data } = await api.get("/city/" + id);
+  return data.payload;
+};
+
+export const getCities = async () => {
+  const { data } = await api.get("/city");
+  return data.payload;
+};
+
+export const getCityByState = async (stateId) => {
+  const { data } = await api.get(`/city-state/${stateId}`);
+  return data.payload;
+};
+
+export const getCityByCountry = async (countryId) => {
+  const { data } = await api.get(`/city-country/${countryId}`);
+  return data.payload;
+};
+
+export const createCity = async (city) => {
+  const { data } = await api.post("/city", city);
+  return data.payload;
+};
+
+export const updateCity = async (city, id) => {
+  const { data } = await api.put(`/city/${id}`, city);
+  return data.payload;
+};
+
+export const deleteCity = async (id) => {
+  const { data } = await api.del(`/city/${id}`);
+  return data.payload;
+};

+ 28 - 0
src/api/country.js

@@ -0,0 +1,28 @@
+import { createCachedApi } from "./cacheService";
+
+const api = createCachedApi("country");
+
+export const getCountry = async (id) => {
+  const { data } = await api.get("/country/" + id);
+  return data.payload;
+};
+
+export const getCountries = async () => {
+  const { data } = await api.get("/country");
+  return data.payload;
+};
+
+export const createCountry = async (country) => {
+  const data = await api.post("/country", country);
+  return data.payload;
+};
+
+export const updateCountry = async (country, id) => {
+  const data = await api.put(`/country/${id}`, country);
+  return data.payload;
+};
+
+export const deleteCountry = async (id) => {
+  const data = await api.del(`/country/${id}`);
+  return data.payload;
+};

+ 11 - 0
src/api/ownerDashboard.js

@@ -0,0 +1,11 @@
+import { api } from "src/boot/axios";
+
+export const getOwnerDashboard = async (params = {}) => {
+  const { data } = await api.get("/owner-dashboard", { params });
+
+  return data.payload;
+};
+
+export const downloadOwnerDashboardReport = async (params = {}) => {
+  return api.get("/owner-dashboard/report", { params, responseType: "blob" });
+};

+ 29 - 0
src/api/permission.js

@@ -0,0 +1,29 @@
+import { api } from "src/boot/axios";
+
+export const getGuestPermissions = async () => {
+  const { data } = await api.get("/permissions-by-type/guest");
+  return data.payload;
+};
+
+export const getUserPermissions = async () => {
+  const { data } = await api.get("/permissions-by-type");
+  return data.payload;
+};
+
+export const getPermissionCatalog = async () => {
+  const { data } = await api.get("/permission-no-tree");
+  return data.payload;
+};
+
+export const getPermissionsByUserType = async (userTypeId) => {
+  const { data } = await api.get(`/permissions-by-type/${userTypeId}`);
+  return data.payload;
+};
+
+export const updatePermissionsByUserType = async (userTypeId, permissions) => {
+  const { data } = await api.put(`/permissions-by-type/${userTypeId}`, {
+    permissions,
+  });
+
+  return data.payload;
+};

+ 33 - 0
src/api/state.js

@@ -0,0 +1,33 @@
+import { createCachedApi } from "./cacheService";
+
+const api = createCachedApi("state");
+
+export const getState = async (id) => {
+  const { data } = await api.get("/state/" + id);
+  return data.payload;
+}
+
+export const getStates = async () => {
+  const { data } = await api.get("/state");
+  return data.payload;
+}
+
+export const getStateByCountry = async (countryId) => {
+  const { data } = await api.get(`/state-country/${countryId}`);
+  return data.payload;
+}
+
+export const createState = async (state) => {
+  const { data } = await api.post("/state", state);
+  return data.payload;
+}
+
+export const updateState = async (state, id) => {
+  const { data } = await api.put(`/state/${id}`, state);
+  return data.payload;
+}
+
+export const deleteState = async (id) => {
+  const { data } = await api.del(`/state/${id}`);
+  return data.payload;
+}

+ 48 - 0
src/api/user.js

@@ -0,0 +1,48 @@
+import { api } from "src/boot/axios";
+
+export const getUserById = async (id) => {
+  const { data } = await api.get("/user/" + id);
+  return data.payload;
+};
+
+export const getUsers = async () => {
+  const { data } = await api.get("/user");
+  return data.payload;
+};
+
+export const createUser = async (user) => {
+  const { data } = await api.post("/user", user);
+  return data.payload;
+};
+
+export const updateUser = async (user, id) => {
+  const { data } = await api.put(`/user/${id}`, user);
+  return data.payload;
+};
+
+export const deleteUser = async (id) => {
+  const { data } = await api.delete(`/user/${id}`);
+  return data.payload;
+};
+
+export const getUser = async () => {
+  const { data } = await api.get("/user/me");
+  return data.payload;
+};
+
+export const countUsers = async () => {
+  const { data } = await api.get("/user/count");
+  return data.payload;
+};
+
+//
+
+export const userTypes = async () => {
+  const { data } = await api.get("/user-types");
+  return data.payload;
+};
+
+export const createUserType = async (payload) => {
+  const { data } = await api.post("/user-types", payload);
+  return data.payload;
+};

BIN=BIN
src/assets/alugap-logo.png


BIN=BIN
src/assets/logo.png


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/assets/softpar_logo_dark.svg


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/assets/softpar_logo_light.svg


+ 1 - 0
src/assets/softpar_logo_mini.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -15 80 80" fill="none"><rect width="50" height="50" rx="25" fill="#21316C"></rect><path d="M10 19.549C10 14.8784 13.1257 12 17.474 12C21.8222 12 25.0591 15.0456 25.0591 19.5768C25.0591 24.4191 21.4518 26.8101 18.1547 26.8101C16.307 26.8101 14.7743 26.0672 13.8342 24.6466V32.4509H10V19.549ZM21.1646 19.405C21.1646 17.1533 19.6874 15.5888 17.5018 15.5888C15.3161 15.5888 13.8389 17.1533 13.8389 19.405C13.8389 21.6567 15.3161 23.2213 17.5018 23.2213C19.6874 23.2213 21.1646 21.6521 21.1646 19.405Z" fill="#EEF4FF"></path><path d="M25.5635 19.5768C25.5635 15.0456 28.6892 12 33.1486 12C37.608 12 40.6226 14.962 40.6226 19.549V26.4433H37.0986V23.9084C36.3021 25.8165 34.5702 26.8147 32.4401 26.8147C29.2032 26.8147 25.5635 24.4237 25.5635 19.5815V19.5768ZM36.7883 19.405C36.7883 17.1533 35.3111 15.5888 33.1208 15.5888C30.9305 15.5888 29.4579 17.1533 29.4579 19.405C29.4579 21.6567 30.9351 23.2213 33.1208 23.2213C35.3065 23.2213 36.7883 21.6521 36.7883 19.405Z" fill="#EEF4FF"></path><path d="M26.0549 38.8485C19.9933 38.8485 16.1359 35.139 15.0801 33.9737L17.8168 31.4713C18.3957 32.1073 21.5353 35.2736 26.4022 35.1297C30.63 34.9997 34.4179 31.9541 35.1311 31.2067L37.8122 33.7694C37.7659 33.8205 32.9963 38.6442 26.5179 38.8438C26.3651 38.8485 26.2077 38.8531 26.0595 38.8531L26.0549 38.8485Z" fill="#0F86FA"></path></svg>

+ 0 - 0
src/boot/.gitkeep


+ 125 - 0
src/boot/axios.js

@@ -0,0 +1,125 @@
+import axios from "axios";
+
+import { boot } from "quasar/wrappers";
+import { Cookies, Notify } from "quasar";
+import { useAuth } from "src/composables/useAuth";
+
+const api = axios.create({
+  baseURL:         process.env.API_URL + "/api",
+  withCredentials: true,
+  withXSRFToken:   true,
+});
+
+api.interceptors.request.use(
+  async (config) => {
+    const accessToken   = Cookies.get("access_token");
+    const savedLanguage = Cookies.get("locale");
+    const language      = savedLanguage || window.navigator.language;
+
+    config.headers["Accept-Language"] = language;
+
+    if (accessToken) {
+      config.headers.Authorization = `Bearer ${accessToken}`;
+    }
+
+    return config;
+  },
+  (error) => {
+    return Promise.reject(error);
+  },
+);
+
+let isRefreshing = false;
+
+let validQueue = [];
+
+const errorInterceptor = async (error) => {
+  if (error.config?.retryCount) {
+    error.config.retryCount = 0;
+  }
+
+  if (error.config.retryCount >= 3) {
+    return Promise.reject(error);
+  }
+
+  error.config.retryCount++;
+
+  if (!error.response) {
+    return Promise.reject(error);
+  }
+
+  if (error.response.status === 401) {
+    const requestUrl = error?.config?.url ?? "";
+
+    if (requestUrl.startsWith("/login")) {
+      return Promise.reject(error);
+    }
+
+    if (isRefreshing) {
+      return new Promise((resolve, reject) => {
+        validQueue.push({ resolve, reject, config: error.config });
+      });
+    }
+
+    isRefreshing = true;
+
+    try {
+      await useAuth().refreshToken();
+    } catch (error) {
+      validQueue = [];
+
+      Cookies.remove("access_token");
+      Cookies.remove("refresh_token");
+
+      if (window.location.pathname !== "/login") {
+        window.location.href = "/login";
+      }
+
+      return Promise.reject(error);
+    }
+
+    try {
+      validQueue.forEach((request) => {
+        request.resolve(api.request(request.config));
+      });
+
+      validQueue = [];
+
+      return await api.request(error.config);
+    } catch (error) {
+      console.error(error);
+    } finally {
+      isRefreshing = false;
+    }
+  }
+
+  return Promise.reject(error);
+};
+
+const successInterceptor = (response) => {
+  if (response.data.message) {
+    Notify.create({
+      message: response.data.message, type: "positive",
+    });
+  }
+
+  return response;
+};
+
+export default boot(({ app }) => {
+  api.interceptors.response.use(
+    (response) => successInterceptor(response),
+    (error)    => errorInterceptor(error),
+  );
+
+  // for use inside Vue files (Options API) through this.$axios and this.$api
+  app.config.globalProperties.$axios = axios;
+  // ^ ^ ^ this will allow you to use this.$axios (for Vue Options API form)
+  //       so you won't necessarily have to import axios in each vue file
+
+  app.config.globalProperties.$api = api;
+  // ^ ^ ^ this will allow you to use this.$api (for Vue Options API form)
+  //       so you can easily perform requests against your app's API
+});
+
+export { api };

+ 48 - 0
src/boot/defaultPropsComponents.js

@@ -0,0 +1,48 @@
+import { boot } from "quasar/wrappers";
+import { QDialog, QInput, QSelect, QScrollArea, QCard } from "quasar";
+
+/**
+ * Set some default properties on a component
+ */
+const SetComponentDefaults = (component, defaults) => {
+  Object.keys(defaults).forEach((prop) => {
+    component.props[prop] =
+      Array.isArray(component.props[prop]) === true ||
+      typeof component.props[prop] === "function"
+        ? { type: component.props[prop], default: defaults[prop] }
+        : { ...component.props[prop], default: defaults[prop] };
+  });
+};
+
+export default boot(() => {
+  SetComponentDefaults(QDialog, {
+    transitionShow: "slide-up",
+    transitionHide: "slide-down",
+  });
+  SetComponentDefaults(QInput, {
+    outlined:   true,
+    labelColor: "primary",
+    dense:      true,
+    bgColor:    "surface",
+    class:      "text-bold",
+  });
+  SetComponentDefaults(QSelect, {
+    outlined:   true,
+    labelColor: "primary",
+    dense:      true,
+    bgColor:    "surface",
+  });
+  SetComponentDefaults(QCard, {
+    flat: true,
+  });
+  SetComponentDefaults(QScrollArea, {
+    thumbStyle: {
+      borderRadius: "4px",
+      background:   "#A6A6A6",
+      width:        "6px",
+      opacity:      0.6,
+    },
+    verticalOffset:   [4, 2],
+    horizontalOffset: [0, 2],
+  });
+});

+ 20 - 0
src/boot/i18n.js

@@ -0,0 +1,20 @@
+import { boot } from "quasar/wrappers";
+import { Cookies } from "quasar";
+import { createI18n } from "vue-i18n";
+
+import messages from "src/i18n";
+
+const i18n = createI18n({
+  locale: Cookies.get("locale")
+    ? Cookies.get("locale")
+    : window.navigator.language,
+
+  globalInjection: true,
+  messages,
+});
+
+export default boot(({ app }) => {
+  app.use(i18n);
+});
+
+export { i18n };

+ 6 - 0
src/boot/setPermissions.js

@@ -0,0 +1,6 @@
+import { boot } from "quasar/wrappers";
+import { permissionStore } from "src/stores/permission";
+
+export default boot(async () => {
+  await permissionStore().fetchScopes();
+});

+ 71 - 0
src/boot/socket.io.js

@@ -0,0 +1,71 @@
+import { boot } from "quasar/wrappers";
+import { io } from "socket.io-client";
+
+const socket = io(process.env.WEBSOCKET_API, {
+  transport: ["websocket"],
+
+  path: process.env.WEBSOCKET_PATH,
+
+  auth: {
+    apiKey: process.env.WEBSOCKET_API_KEY,
+  },
+
+  reconnection:      true,
+  reconnectionDelay: 1000,
+  timeout:           20000,
+});
+
+const sendEvent = (room, eventName, data) => {
+  const channel = process.env.WEBSOCKET_ROOM + ":" + room + "@" + eventName;
+
+  socket.emit("eventWrapperToNode", {
+    channel: channel, data: data,
+  });
+};
+
+const sendEventToLaravel = (eventName, data) => {
+  const channel = process.env.WEBSOCKET_ROOM + ":" + eventName;
+
+  socket.emit("eventWrapperToLaravel", {
+    channel: channel, data: data,
+  });
+};
+
+const joinRoom = (roomName) => {
+  socket.emit("join", process.env.WEBSOCKET_ROOM + ":" + roomName);
+};
+
+const leaveRoom = (roomName) => {
+  socket.emit("leave", process.env.WEBSOCKET_ROOM + ":" + roomName);
+};
+
+export default boot(async () => {
+  socket.on("connect", () => {
+    console.log("Connected to websocket server!");
+  });
+
+  socket.on("disconnect", () => {
+    console.log("Disconnected from websocket server!");
+  });
+
+  socket.on("connect_error", (error) => {
+    console.error("Websocket connection error: ", error);
+  });
+
+  socket.on("connect_timeout", (timeout) => {
+    console.error("Websocket connection timeout: ", timeout);
+  });
+
+  socket.on("reconnect", (attemptNumber) => {
+    console.log(
+      "Reconnected to websocket server! Attempt number: ",
+      attemptNumber,
+    );
+  });
+
+  socket.on("reconnect_attempt", (attemptNumber) => {
+    console.log("Reconnect attempt number: ", attemptNumber);
+  });
+});
+
+export { socket, joinRoom, leaveRoom, sendEvent, sendEventToLaravel };

+ 97 - 0
src/components/charts/CardIconChart.vue

@@ -0,0 +1,97 @@
+<template>
+  <q-card flat class="q-pa-lg">
+    <div class="column no-wrap full-width">
+      <div class="flex items-center no-wrap">
+        <div class="round background q-mr-sm">
+          <q-icon
+            class="q-pa-sm"
+            :name="props.icon"
+            size="24px"
+            :color="props.color"
+          />
+        </div>
+        <span class="text-h5">{{ props.title }}</span>
+      </div>
+      <div class="flex no-wrap full-width justify-between q-pa-sm">
+        <div class="column flex-center">
+          <span class="text-h3">{{ props.numberCard }}</span>
+          <div
+            class="flex no-wrap text-subtitle2"
+            :class="props.numberPorcent > 0 ? 'text-positive' : 'text-negative'"
+          >
+            <q-icon
+              :name="
+                props.numberPorcent > 0 ? 'mdi-arrow-up' : 'mdi-arrow-down'
+              "
+              size="18px"
+              class="q-mr-xs"
+            />
+            {{ props.numberPorcent + "%" }}
+          </div>
+        </div>
+        <div class="flex justify-end" style="max-width: 120px; height: 80px;">
+          <slot name="chart">
+            <MiniLineChart
+              :data="chartData"
+              line-color="#1976D2"
+              fill-color="rgba(0, 0, 0, 0)"
+            />
+
+            <MiniBarChart
+              :data="chartData"
+              bar-color="#1976D2"
+            />
+          </slot>
+        </div>
+      </div>
+    </div>
+  </q-card>
+</template>
+
+<script setup>
+// import MiniLineChart from "./mini/MiniLineChart.vue";
+import MiniBarChart from "./mini/MiniBarChart.vue";
+const props = defineProps({
+  color: {
+    type: String,
+    default: "primary",
+  },
+  title: {
+    type: String,
+    default: "Usuários",
+  },
+  icon: {
+    type: String,
+    default: "mdi-account",
+  },
+  chartData: {
+    type: Array,
+    default: () =>
+      Array.from({ length: 7 }, () => Math.floor(Math.random() * 100)),
+  },
+  numberCard: {
+    type: Number,
+    default: () => Math.floor(Math.random() * 100),
+  },
+  numberPorcent: {
+    type: Number,
+    default: () => Math.ceil(Math.random() * 200 - 100),
+  },
+});
+</script>
+<style lang="scss" scoped>
+@use "sass:map";
+@use "src/css/quasar.variables.scss";
+
+body.body--light {
+  .background {
+    background: rgba(map.get($colors, "primary"), 0.2) !important;
+  }
+}
+
+body.body--dark {
+  .background {
+    background: rgba(map.get($colors-dark, "primary"), 0.2) !important;
+  }
+}
+</style>

+ 57 - 0
src/components/charts/DefaultCard.vue

@@ -0,0 +1,57 @@
+<template>
+  <q-card flat class="users-card q-pa-md">
+    <div class="card-header q-mb-md">
+      <h6 class="text-h6 q-ma-none">{{ title }}</h6>
+      <q-separator />
+    </div>
+    <div class="card-content">
+      <DonutChart :total-users="total" />
+    </div>
+  </q-card>
+</template>
+
+<script setup>
+import DonutChart from "./DonutChart.vue";
+
+defineProps({
+  total: {
+    type: Number,
+    default: 1,
+  },
+  title: {
+    type: String,
+    default: "",
+  },
+});
+</script>
+
+<style scoped>
+.users-card {
+  border-radius: 8px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+  min-height: 250px;
+  display: flex;
+  flex-direction: column;
+}
+
+.card-header {
+  text-align: left;
+}
+
+.card-content {
+  flex: 1;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+body.body--light .users-card {
+  background: white;
+  border: 1px solid #e0e0e0;
+}
+
+body.body--dark .users-card {
+  background: #1e1e1e;
+  border: 1px solid #404040;
+}
+</style>

+ 91 - 0
src/components/charts/DonutChart.vue

@@ -0,0 +1,91 @@
+<template>
+  <div class="donut-chart-container">
+    <div class="chart-wrapper">
+      <Doughnut
+        :data="chartData"
+        :options="chartOptions"
+        :plugins="[centerTextPlugin]"
+      />
+      <div class="center-text">
+        <div class="center-number text-text">{{ totalUsers }}</div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { computed } from "vue";
+import { Doughnut } from "vue-chartjs";
+import { Chart as ChartJS, ArcElement, Tooltip, Legend } from "chart.js";
+
+ChartJS.register(ArcElement, Tooltip, Legend);
+
+const props = defineProps({
+  totalUsers: {
+    type: Number,
+    default: 1,
+  },
+  color: {
+    type: String,
+    default: "#08514C",
+  },
+});
+
+const chartData = computed(() => ({
+  datasets: [
+    {
+      data: [props.totalUsers],
+      backgroundColor: [props.color],
+      borderWidth: 0,
+      cutout: "70%",
+    },
+  ],
+}));
+
+const chartOptions = {
+  responsive: true,
+  maintainAspectRatio: true,
+  plugins: {
+    legend: {
+      display: false,
+    },
+    tooltip: {
+      enabled: false,
+    },
+  },
+};
+
+const centerTextPlugin = {
+  id: "centerText",
+  beforeDraw: () => {},
+};
+</script>
+
+<style scoped>
+.donut-chart-container {
+  position: relative;
+  width: 150px;
+  height: 150px;
+}
+
+.chart-wrapper {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+
+.center-text {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  text-align: center;
+  pointer-events: none;
+}
+
+.center-number {
+  font-size: 32px;
+  font-weight: bold;
+  line-height: 1;
+}
+</style>

+ 113 - 0
src/components/charts/mini/MiniBarChart.vue

@@ -0,0 +1,113 @@
+<template>
+  <Bar
+    :id="props.id"
+    ref="chart_ref"
+    :options="chartOptions"
+    :data="computedChartData"
+  />
+</template>
+
+<script setup>
+import {
+  Chart as ChartJS,
+  CategoryScale,
+  LinearScale,
+  BarElement,
+  Tooltip,
+} from "chart.js";
+import { computed, useTemplateRef } from "vue";
+import { Bar } from "vue-chartjs";
+
+// Register only necessary components
+ChartJS.register(
+  CategoryScale,
+  LinearScale,
+  BarElement,
+  Tooltip,
+);
+
+const chart_ref = useTemplateRef(null);
+
+// Simplified props focusing on essential functionality
+const props = defineProps({
+  // Core data props
+  data: {
+    type: Array,
+    required: true,
+  },
+
+  // Essential styling
+  barColor: {
+    type: String,
+    default: "#1976D2",
+  },
+
+  // Optional configurations for flexibility
+  horizontal: {
+    type: Boolean,
+    default: false,
+  },
+  showTooltip: {
+    type: Boolean,
+    default: true,
+  }
+});
+
+// Optimized chart options for mini-charts
+const chartOptions = computed(() => ({
+  responsive: true,
+  maintainAspectRatio: false,
+  indexAxis: props.horizontal ? "y" : "x",
+
+  plugins: {
+    legend: {
+      display: false, // Always hide legend in mini charts
+    },
+    tooltip: {
+      enabled: props.showTooltip,
+      displayColors: false,
+      callbacks: {
+        label: (context) => `${context.raw}`
+      }
+    },
+  },
+
+  scales: {
+    x: {
+      display: false,
+      grid: {
+        display: false,
+      }
+    },
+    y: {
+      display: false,
+      grid: {
+        display: false,
+      },
+      beginAtZero: true,
+    },
+  },
+
+  animation: {
+    duration: 750,
+    easing: 'easeOutQuad',
+  },
+}));
+
+// Simplified data computation
+const computedChartData = computed(() => ({
+  labels: Array(props.data.length).fill(''),
+  datasets: [{
+    data: props.data,
+    backgroundColor: props.barColor,
+    borderRadius: 2,
+    barThickness: 8,
+    maxBarThickness: 10,
+  }]
+}));
+
+// Expose essential methods
+defineExpose({
+  chart_ref,
+});
+</script>

+ 123 - 0
src/components/charts/mini/MiniLineChart.vue

@@ -0,0 +1,123 @@
+<template>
+  <Line
+    ref="chart_ref"
+    :options="chartOptions"
+    :data="computedChartData"
+  />
+</template>
+
+<script setup>
+import {
+  Chart as ChartJS,
+  CategoryScale,
+  LinearScale,
+  LineElement,
+  PointElement,
+  Tooltip,
+  Filler
+} from "chart.js";
+import { computed, useTemplateRef } from "vue";
+import { Line } from "vue-chartjs";
+
+// Register only essential components
+ChartJS.register(
+  CategoryScale,
+  LinearScale,
+  LineElement,
+  PointElement,
+  Tooltip,
+  Filler
+);
+
+const chart_ref = useTemplateRef(null);
+
+const props = defineProps({
+  // Essential data props
+  data: {
+    type: Array,
+    required: true,
+  },
+
+  // Core styling
+  lineColor: {
+    type: String,
+    default: "#1976D2",
+  },
+  fillColor: {
+    type: String,
+    default: "rgba(25, 118, 210, 0.1)",
+  },
+
+  // Optional display features
+  showTooltip: {
+    type: Boolean,
+    default: true,
+  },
+  showPoints: {
+    type: Boolean,
+    default: false,
+  }
+});
+
+const chartOptions = computed(() => ({
+  responsive: true,
+  maintainAspectRatio: false,
+
+  plugins: {
+    legend: {
+      display: false, // Always hidden for mini charts
+    },
+    tooltip: {
+      enabled: props.showTooltip,
+      displayColors: false,
+      callbacks: {
+        label: (context) => `${context.raw}`
+      }
+    },
+  },
+
+  scales: {
+    x: {
+      display: false,
+      grid: { display: false }
+    },
+    y: {
+      display: false,
+      grid: { display: false },
+      beginAtZero: true
+    }
+  },
+
+  elements: {
+    line: {
+      tension: 0.4,
+      borderWidth: 2,
+    },
+    point: {
+      radius: props.showPoints ? 3 : 0,
+      hitRadius: 5,
+      borderWidth: 0,
+      backgroundColor: props.showPoints ? props.lineColor : "rgba(0,0,0,0)",
+    }
+  },
+
+  animation: {
+    duration: 750,
+    easing: 'easeOutQuad',
+  }
+}));
+
+const computedChartData = computed(() => ({
+  labels: Array(props.data.length).fill(''),
+  datasets: [{
+    data: props.data,
+    borderColor: props.lineColor,
+    backgroundColor: props.fillColor,
+    fill: true,
+  }]
+}));
+
+defineExpose({
+  chart_ref,
+});
+</script>

+ 81 - 0
src/components/defaults/ActionsDropdownDefault.vue

@@ -0,0 +1,81 @@
+<template>
+  <q-btn-dropdown
+    dense
+    flat
+    round
+    dropdown-icon="mdi-cog"
+    size="md"
+    color="black"
+    outline
+    @click.stop
+  >
+    <q-list class="flex column items-center q-gutter-none">
+      <q-item v-if="props.enableDuplicate" v-close-popup clickable>
+        <q-item-section style="min-width: 120px">
+          <q-item-label
+            class="q-pa-sm border-style flex items-center justify-center"
+          >
+            <span class="text-subtitle2 text-primary">Ajustes</span>
+            <q-icon name="mdi-cog" size="sm" color="primary" class="q-px-xs" />
+          </q-item-label>
+        </q-item-section>
+      </q-item>
+
+      <q-item v-if="props.enableDuplicate" v-close-popup clickable>
+        <q-item-section style="min-width: 120px">
+          <q-item-label
+            class="q-pa-sm border-style flex items-center justify-center"
+          >
+            <span class="text-subtitle2 text-primary">Clonar</span>
+            <q-icon
+              name="mdi-text-box-multiple-outline"
+              size="sm"
+              color="primary"
+              class="q-px-xs"
+            />
+          </q-item-label>
+        </q-item-section>
+      </q-item>
+
+      <q-item v-if="props.enableDelete" v-close-popup clickable>
+        <q-item-section class="q-pa-md border-style">
+          <q-item-label>
+            <q-icon name="mdi-delete-empty" size="sm" color="negative" />
+          </q-item-label>
+        </q-item-section>
+      </q-item>
+    </q-list>
+  </q-btn-dropdown>
+</template>
+<script setup>
+const props = defineProps({
+  row: {
+    type: Object,
+    required: true,
+  },
+  enableDuplicate: {
+    type: Boolean,
+    default: false,
+  },
+  enableDelete: {
+    type: Boolean,
+    default: false,
+  },
+});
+</script>
+
+<style scoped>
+.file-label {
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+}
+
+.file-label input {
+  position: absolute;
+  opacity: 0;
+  width: 0;
+  height: 0;
+}
+</style>

+ 87 - 0
src/components/defaults/DefaultAvatarPicker.vue

@@ -0,0 +1,87 @@
+<template>
+  <div class="column items-center q-gutter-y-sm">
+    <q-avatar
+      size="200px"
+      font-size="80px"
+      color="grey-4"
+      text-color="grey-7"
+    >
+      <q-img
+        v-if="previewUrl"
+        :src="previewUrl"
+        spinner-color="primary"
+        style="height: 100%; width: 100%"
+      />
+
+      <q-icon name="mdi-camera-plus" color="primary"/>
+    </q-avatar>
+
+    <q-btn
+      :label="previewUrl ? 'Alterar foto' : 'Escolher foto'"
+      color="primary"
+      outline
+      no-caps
+      class="q-mt-md"
+      @click="triggerFilePick"
+    />
+
+    <q-file
+      ref="fileInputRef"
+      v-model="selectedFile"
+      class="hidden"
+      accept="image/*"
+    />
+  </div>
+</template>
+
+<script setup>
+import { ref, watch } from "vue";
+
+const model = defineModel({
+  type: [String, Object],
+  default: null,
+});
+
+const fileInputRef = ref(null);
+const selectedFile = ref(null);
+
+const previewUrl = ref(null);
+
+const generatePreview = (file) => {
+  const reader = new FileReader();
+  reader.onload = (e) => {
+    previewUrl.value = e.target.result;
+  };
+  reader.readAsDataURL(file);
+};
+
+watch(
+  model,
+  (newValue) => {
+    if (typeof newValue === "string") {
+      previewUrl.value = newValue;
+    } else if (newValue instanceof File) {
+      generatePreview(newValue);
+    } else {
+      previewUrl.value = null;
+    }
+  },
+  { immediate: true },
+);
+
+watch(selectedFile, (newFile) => {
+  if (newFile) {
+    model.value = newFile;
+  }
+});
+
+const triggerFilePick = () => {
+  fileInputRef.value?.pickFiles();
+};
+</script>
+
+<style scoped>
+.hidden {
+  display: none;
+}
+</style>

+ 95 - 0
src/components/defaults/DefaultCepInput.vue

@@ -0,0 +1,95 @@
+<template>
+  <div v-bind="$attrs">
+    <q-input
+      v-model="model"
+      outlined
+      debounce="500"
+      :disable="disable"
+      :class="disable ?? 'no-pointer-events'"
+      :readonly="readonly"
+      :label="newLabel"
+      :mask="masks.Brasil.cep"
+      :rules="rules"
+      :loading="loading"
+      :label-color="labelColor"
+    />
+  </div>
+</template>
+<script setup>
+import { watch, computed, ref, nextTick } from "vue";
+import { useQuasar } from "quasar";
+import masks from "src/helpers/masks.js";
+
+const $q = useQuasar();
+
+const model = defineModel();
+
+const { disable, readonly, label, rules } = defineProps({
+  disable: {
+    type: Boolean,
+    default: false,
+  },
+  readonly: {
+    type: Boolean,
+    default: false,
+  },
+  label: {
+    type: String,
+    default: "CEP",
+  },
+  rules: {
+    type: Array,
+    default: () => [],
+  },
+  labelColor: {
+    type: String,
+    default: "primary",
+  },
+});
+
+const emit = defineEmits([
+  "cidade",
+  "estado",
+  "rua",
+  "bairro",
+  "numero",
+  "complemento",
+  "uf",
+]);
+
+const loading = ref(false);
+
+const newLabel = computed(() => label ?? void 0);
+
+watch(
+  () => model.value,
+  async (value) => {
+    if (value < 0) {
+      model.value = 0;
+    }
+    if (value && value.length > 8) {
+      try {
+        loading.value = true;
+        const response = await fetch(`https://viacep.com.br/ws/${value}/json`);
+        const data = await response.json();
+        emit("estado", data.estado);
+        emit("uf", data.uf);
+        // this is a hack to work well with the city and state select
+        await nextTick();
+        emit("cidade", data.localidade);
+        emit("rua", data.logradouro);
+        emit("bairro", data.bairro);
+        emit("numero", null);
+        emit("complemento", null);
+      } catch (error) {
+        $q.notify({
+          message: "CEP inválido",
+          color: "negative",
+        });
+      } finally {
+        loading.value = false;
+      }
+    }
+  },
+);
+</script>

+ 71 - 0
src/components/defaults/DefaultCurrencyInput.vue

@@ -0,0 +1,71 @@
+<template>
+  <q-input
+    ref="inputRef"
+    v-model="formattedValue"
+    outlined
+    :error-message="errorMessage"
+    :error="!!errorMessage"
+    :disable="disable"
+    :class="disable ? 'no-pointer-events' : ''"
+    :label="newLabel"
+    :readonly="readonly"
+  >
+    <!-- <template #append>
+      <div class="text-primary-light">R$</div>
+    </template> -->
+  </q-input>
+</template>
+<script setup>
+import { useCurrencyInput } from "vue-currency-input";
+import { computed, watch } from "vue";
+import { useI18n } from "vue-i18n";
+
+const model = defineModel();
+
+const { options, disable, readonly, label } = defineProps({
+  options: {
+    type: Object,
+    default: () => ({
+      locale: "pt-BR",
+      currency: "BRL",
+      currencyDisplay: "symbol",
+      hideCurrencySymbolOnFocus: false,
+      hideGroupingSeparatorOnFocus: false,
+      hideNegligibleDecimalDigitsOnFocus: false,
+      autoDecimalDigits: true,
+      useGrouping: true,
+      accountingSign: false,
+    }),
+  },
+  disable: {
+    type: Boolean,
+    default: false,
+  },
+  readonly: {
+    type: Boolean,
+    default: false,
+  },
+  label: {
+    type: String,
+    default: () => useI18n().t("common.terms.currency"),
+  },
+});
+
+const { inputRef, formattedValue, numberValue, setValue } =
+  useCurrencyInput(options);
+
+const errorMessage = computed(() =>
+  numberValue.value < 0
+    ? useI18n().t("validation.rules.value_smaller_than_zero")
+    : undefined,
+);
+
+const newLabel = computed(() => (label ? label : void 0));
+
+watch(
+  () => model.value,
+  (value) => {
+    setValue(value);
+  },
+);
+</script>

+ 61 - 0
src/components/defaults/DefaultDialogHeader.vue

@@ -0,0 +1,61 @@
+<template>
+  <q-bar
+    class="q-py-md bg-primary text-white text-weight-medium"
+    v-bind="$attrs"
+    style="height: 50px"
+  >
+    <q-icon v-if="icon" :name="icon" />
+    <div>{{ title }}</div>
+
+    <q-space />
+
+    <q-btn
+      v-if="maximizable"
+      dense
+      flat
+      :icon="!maximizedToggle ? 'mdi-arrow-expand' : 'mdi-arrow-collapse'"
+      @click="onMaximazedClick"
+    />
+
+    <q-btn dense flat icon="mdi-close" @click="emit('close')" />
+  </q-bar>
+</template>
+
+<script setup>
+import { ref, onMounted } from "vue";
+
+const emit = defineEmits(["maximized", "close"]);
+
+const { title, fullscreen, maximizable, icon } = defineProps({
+  title: {
+    type: String,
+    default: "title",
+  },
+  fullscreen: {
+    type: Boolean,
+    default: false,
+  },
+  maximizable: {
+    type: Boolean,
+    default: false,
+  },
+  icon: {
+    type: String,
+    default: "",
+  },
+});
+
+const maximizedToggle = ref(false);
+
+const onMaximazedClick = () => {
+  maximizedToggle.value = !maximizedToggle.value;
+
+  emit("maximized", maximizedToggle.value);
+};
+
+onMounted(() => {
+  if (fullscreen) {
+    maximizedToggle.value = true;
+  }
+});
+</script>

+ 226 - 0
src/components/defaults/DefaultFilePicker.vue

@@ -0,0 +1,226 @@
+<template>
+  <q-field v-model="model" v-bind="$attrs" borderless :rules="rules">
+    <div class="column flex-center q-mb-sm full-width">
+      <span class="text-grey-6">{{ label }}</span>
+      <div
+        class="image-preview-container"
+        :class="{
+          'has-image': preview,
+          'is-dragging': isDragging,
+        }"
+        @click="pickImage"
+        @dragover.prevent="handleDragOver"
+        @dragleave.prevent="handleDragLeave"
+        @drop.prevent="handleDrop"
+      >
+        <template v-if="!preview">
+          <q-icon
+            :name="
+              isDragging
+                ? 'file_upload'
+                : type == 'image'
+                  ? 'add_photo_alternate'
+                  : 'insert_drive_file'
+            "
+            size="48px"
+            color="grey-6"
+            class="absolute-center"
+          />
+          <div
+            class="text-caption text-grey-6 text-center absolute-bottom q-pb-sm q-px-md"
+          >
+            {{
+              isDragging
+                ? $t("common.ui.file.drag_and_drop")
+                : type == "image"
+                  ? $t("common.ui.file.click_select_image")
+                  : $t("common.ui.file.click_select")
+            }}
+          </div>
+        </template>
+        <q-img
+          v-else-if="type == 'image'"
+          :src="preview"
+          fit="cover"
+          class="full-height"
+        >
+          <div class="absolute-bottom text-right">
+            <q-btn
+              flat
+              dense
+              round
+              color="negative"
+              icon="delete"
+              @click.stop="clearImage"
+            />
+          </div>
+        </q-img>
+        <div v-else class="position-relative column full-height flex-center">
+          <q-icon name="mdi-file-check" size="48px" color="grey-6" />
+          <div
+            class="absolute-bottom text-caption text-grey-6 text-center q-mb-sm q-px-md"
+          >
+            {{ preview }}
+          </div>
+        </div>
+      </div>
+
+      <q-file v-show="false" ref="fileInput" v-model="model" :accept="accept" />
+    </div>
+  </q-field>
+</template>
+
+<script setup>
+import { onMounted, ref, useTemplateRef, watch } from "vue";
+
+const { label, rules, accept, type, initialImage } = defineProps({
+  label: {
+    type: String,
+    default: "Select Image",
+  },
+  rules: {
+    type: Array,
+    default: () => [],
+  },
+  accept: {
+    type: String,
+    default: "image/*",
+  },
+  type: {
+    type: String,
+    default: "image",
+  },
+  initialImage: {
+    type: String,
+    default: null,
+  },
+});
+
+const model = defineModel();
+const base64File = defineModel("base64File", { type: String, default: null });
+const preview = ref(initialImage || model.value);
+const isDragging = ref(false);
+const fileInput = useTemplateRef("fileInput");
+
+const processFile = async (file) => {
+  if (!file) {
+    console.error("No file provided");
+    return;
+  }
+
+  if (type == "image" && !file.type.startsWith("image/")) {
+    console.error("Invalid file type");
+    return;
+  }
+
+  if (type == "file") {
+    const blob = new Blob([file], { type: file.type });
+    preview.value = file.name;
+    return new Promise((resolve) => {
+      const reader = new FileReader();
+      reader.onload = (e) => {
+        base64File.value = e.target.result;
+        console.log(preview.value);
+        resolve();
+      };
+      reader.readAsDataURL(blob);
+    });
+  } else {
+    return new Promise((resolve) => {
+      const reader = new FileReader();
+      reader.onload = (e) => {
+        base64File.value = e.target.result;
+        preview.value = e.target.result;
+        resolve();
+      };
+      reader.readAsDataURL(file);
+    });
+  }
+};
+
+const pickImage = () => {
+  fileInput.value?.pickFiles();
+};
+
+const clearImage = () => {
+  model.value = null;
+  preview.value = null;
+};
+
+const handleDragOver = () => {
+  isDragging.value = true;
+};
+
+const handleDragLeave = () => {
+  isDragging.value = false;
+};
+
+const handleDrop = async (event) => {
+  isDragging.value = false;
+  const file = event.dataTransfer?.files?.[0];
+
+  if (file) {
+    model.value = file;
+    await processFile(file);
+  }
+};
+
+watch(
+  () => model.value,
+  async (value, oldValue) => {
+    if (value != oldValue) {
+      await processFile(value);
+    } else {
+      preview.value = null;
+    }
+  },
+);
+
+onMounted(() => {
+  console.log(initialImage);
+  console.log(model.value)
+});
+</script>
+
+<style lang="scss" scoped>
+@use "sass:map";
+@use "src/css/quasar.variables.scss";
+
+.image-preview-container {
+  .body--dark & {
+    --image-bg-color: #{map.get($colors-dark, "surface")};
+    --image-border-color: #{map.get($colors-dark, "primary")};
+    --image-border-hover-color: #{map.get($colors-dark, "primary-dark")};
+  }
+
+  .body--light & {
+    --image-bg-color: #{map.get($colors, "surface")};
+    --image-border-color: #{map.get($colors, "primary")};
+    --image-border-hover-color: #{map.get($colors, "primary-dark")};
+  }
+
+  width: 200px;
+  height: 200px;
+  border: 2px solid var(--image-border-color);
+  border-radius: 10%;
+  position: relative;
+  overflow: hidden;
+  transition: all 0.3s;
+  cursor: pointer;
+
+  &.is-dragging {
+    border-color: var(--image-border-hover-color);
+    background-color: var(--image-bg-color);
+    opacity: 0.8;
+  }
+
+  &:hover {
+    border-color: var(--image-border-hover-color);
+    background-color: var(--image-bg-color);
+  }
+
+  &.has-image {
+    border-style: solid;
+  }
+}
+</style>

+ 139 - 0
src/components/defaults/DefaultInputDatePicker.vue

@@ -0,0 +1,139 @@
+<template>
+  <div v-bind="$attrs">
+    <q-input
+      v-model="treatedDate"
+      :mask="time ? masks.Brasil.datetime : masks.Brasil.date"
+      :label="label"
+      :rules="rules"
+      :disable
+      clearable
+    >
+      <template #append>
+        <q-icon
+          :name="time ? 'mdi-calendar-clock' : 'mdi-calendar'"
+          class="cursor-pointer"
+        >
+          <q-popup-proxy cover transition-show="scale" transition-hide="scale">
+            <template v-if="!time">
+              <q-date v-model="date" mask="YYYY-MM-DD">
+                <div class="row items-center justify-end">
+                  <q-btn v-close-popup label="Close" color="primary" flat />
+                </div>
+              </q-date>
+            </template>
+
+            <template v-else>
+              <q-tab-panels
+                v-model="activePanel"
+                animated
+                transition-prev="slide-right"
+                transition-next="slide-left"
+                class="bg-white"
+              >
+                <q-tab-panel name="date" class="q-pa-none">
+                  <q-date
+                    v-model="date"
+                    mask="YYYY-MM-DD HH:mm"
+                    @update:model-value="handleDateSelection"
+                  />
+                </q-tab-panel>
+
+                <q-tab-panel name="time" class="q-pa-none">
+                  <q-time v-model="date" mask="YYYY-MM-DD HH:mm" format24h />
+                </q-tab-panel>
+              </q-tab-panels>
+            </template>
+          </q-popup-proxy>
+        </q-icon>
+      </template>
+    </q-input>
+  </div>
+</template>
+
+<script setup>
+import { watch, ref } from "vue";
+import { useI18n } from "vue-i18n";
+import masks from "src/helpers/masks";
+
+const { label, rules, time, disable } = defineProps({
+  label: {
+    type: String,
+    default: () => useI18n().t("common.terms.date"),
+  },
+  rules: {
+    type: Array,
+    default: () => [],
+  },
+  time: {
+    type: Boolean,
+    default: false,
+  },
+  disable: {
+    type: Boolean,
+    default: false,
+  },
+});
+
+const date = ref();
+const treatedDate = defineModel();
+const untreatedDate = defineModel("untreatedDate");
+const activePanel = ref("date");
+
+const handleDateSelection = () => {
+  if (time) {
+    activePanel.value = "time";
+  }
+};
+
+const formatDate = (value) => {
+  if (!value) return null;
+
+  const [datePart, timePart] = value.split(" ");
+  const formattedDate = datePart.split("-").reverse().join("/");
+
+  return time && timePart ? `${formattedDate} ${timePart}` : formattedDate;
+};
+
+const unformatDate = (value) => {
+  if (!value) return null;
+
+  const [datePart, timePart] = value.split(" ");
+  const formattedDate = datePart.split("/").reverse().join("-");
+
+  return time && timePart ? `${formattedDate} ${timePart}` : formattedDate;
+};
+
+watch(date, (value) => {
+  if (!value) return;
+
+  untreatedDate.value = value;
+  treatedDate.value = formatDate(value);
+});
+
+watch(treatedDate, (value) => {
+  if (!value) {
+    date.value = null;
+    untreatedDate.value = null;
+    treatedDate.value = null;
+    activePanel.value = "date";
+    return;
+  }
+  date.value = unformatDate(value);
+});
+
+watch(
+  untreatedDate,
+  (value) => {
+    if (!value) {
+      date.value = null;
+      untreatedDate.value = null;
+      treatedDate.value = null;
+      activePanel.value = "date";
+      return;
+    }
+    date.value = value;
+    treatedDate.value = formatDate(value);
+  },
+  { immediate: true },
+);
+</script>

+ 112 - 0
src/components/defaults/DefaultMultiSelect.vue

@@ -0,0 +1,112 @@
+<template>
+  <div class="column" :class="attrs.class" :style="attrs.style">
+    <div v-if="label || $slots.label" class="q-pl-xs">
+      <slot name="label">
+        <span>{{ label }}</span>
+      </slot>
+
+      <span v-if="required" class="text-negative q-ml-xs">*</span>
+    </div>
+
+    <div class="col">
+      <q-select
+        ref="selectRef"
+        v-model="model"
+        v-bind="selectAttrs"
+        behavior="menu"
+        hide-bottom-space
+        hide-dropdown-icon
+        multiple
+        use-chips
+        :bg-color="bgColor"
+        :class="inputClass"
+        :error="!!error"
+        :error-message="errorMessage"
+        :popup-content-class="popupContentClass"
+        :rules="rules"
+        @update:model-value="error = null"
+      >
+        <template #append>
+          <q-icon name="mdi-chevron-down" class="text-text" />
+        </template>
+
+        <template #selected-item="scope">
+          <q-chip
+            class="q-ma-xs"
+            dense
+            removable
+            @remove="scope.removeAtIndex(scope.index)"
+          >
+            {{ scope.opt?.label ?? scope.opt }}
+          </q-chip>
+        </template>
+
+        <template v-for="(_, slotName) in $slots" #[slotName]="scope">
+          <slot :name="slotName" v-bind="scope" />
+        </template>
+      </q-select>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { computed, onBeforeMount, ref, useAttrs } from "vue";
+
+defineOptions({
+  inheritAttrs: false,
+});
+
+const props = defineProps({
+  label:             { type: String, default: "" },
+  rules:             { type: Array,  default: () => [] },
+  inputClass:        { type: String, default: null },
+  popupContentClass: { type: String, default: null },
+  bgColor:           { type: String, default: "surface" },
+});
+
+const { label, inputClass, popupContentClass, bgColor, rules } = props;
+
+const attrs = useAttrs();
+
+const model = defineModel({
+  type: Array, default: () => [],
+});
+
+const error = defineModel("error", {
+  type: [String, Object, Array, Boolean, null],
+});
+
+const selectRef = ref(null);
+const required  = ref(false);
+
+const errorMessage = computed(() => {
+  if (error.value == null) return void 0;
+
+  if (typeof error.value === "boolean") return void 0;
+
+  return String(error.value);
+});
+
+const selectAttrs = computed(() => {
+  // eslint-disable-next-line no-unused-vars
+  const { class: _, style: __, ...rest } = attrs;
+
+  return rest;
+});
+
+onBeforeMount(() => {
+  rules.forEach((r) => {
+    if (r?.$id === "required") {
+      required.value = true;
+    }
+  });
+});
+
+defineExpose({
+  focus: () => {
+    if (selectRef.value && typeof selectRef.value.focus === "function") {
+      selectRef.value.focus();
+    }
+  },
+});
+</script>

+ 29 - 0
src/components/defaults/DefaultPasswordInput.vue

@@ -0,0 +1,29 @@
+<template>
+  <q-input
+    v-model="password"
+    v-bind="$attrs"
+    :label="$t('common.terms.password')"
+    :type="!seePassword ? 'password' : 'text'"
+    :rules="rules"
+  >
+    <template #append>
+      <q-icon
+        :name="seePassword ? 'mdi-eye-off-outline' : 'mdi-eye-outline'"
+        class="cursor-pointer q-ml-md"
+        color="primary"
+        @click="seePassword = !seePassword"
+      />
+    </template>
+  </q-input>
+</template>
+<script setup>
+const { rules } = defineProps({
+  rules: {
+    type: Array,
+    default: () => [],
+  },
+});
+
+const password = defineModel();
+const seePassword = defineModel("seePassword", { default: false });
+</script>

+ 101 - 0
src/components/defaults/DefaultSelect.vue

@@ -0,0 +1,101 @@
+<template>
+  <q-select
+    v-model="model"
+    outlined
+    :options="optionsRef"
+    :label="label"
+    :loading="isLoading"
+    map-options
+    emit-value
+  >
+    <template #no-option>
+      <div class="q-pa-sm text-caption">
+        Nenhum prestador vinculado a este serviço
+      </div>
+    </template>
+  </q-select>
+</template>
+
+<script setup>
+import { onMounted, ref, watch } from "vue";
+
+const { apiCall, label, loadWhen, noApiCall, options, loading } = defineProps({
+  apiCall: {
+    type: Function,
+    required: false,
+    default: null,
+  },
+
+  loadWhen: {
+    type: [Boolean, String, Number],
+    default: undefined,
+  },
+
+  noApiCall: {
+    type: Boolean,
+    default: false,
+  },
+
+  label: {
+    type: String,
+    default: "Selecione",
+  },
+
+  options: {
+    type: Array,
+    default: () => [],
+  },
+
+  loading: {
+    type: Boolean,
+    default: false,
+  },
+});
+
+const model = defineModel();
+const optionsRef = ref([]);
+const isLoading = ref(loading);
+
+const fetchOptions = async () => {
+  if (noApiCall) {
+    optionsRef.value = options;
+    return;
+  }
+
+  if (!apiCall) return;
+
+  try {
+    isLoading.value = true;
+    const response = await apiCall();
+    optionsRef.value = response;
+  } catch (error) {
+    console.error("Falha ao buscar dados para o select:", error);
+    optionsRef.value = [];
+  } finally {
+    isLoading.value = false;
+  }
+};
+
+const canLoad = () => {
+  if (loadWhen === undefined) return true;
+  return !!loadWhen;
+};
+
+onMounted(async () => {
+  if (loadWhen !== undefined) {
+    if (!canLoad()) return;
+  }
+  await fetchOptions();
+});
+
+watch(
+  () => loadWhen,
+  async (newVal) => {
+    if (newVal) {
+      await fetchOptions();
+    } else {
+      optionsRef.value = [];
+    }
+  },
+);
+</script>

+ 241 - 0
src/components/defaults/DefaultTable.vue

@@ -0,0 +1,241 @@
+<template>
+  <q-table
+    v-model:fullscreen="fullscreen"
+    row-key="id"
+    class="softpar-table q-pa-sm"
+    flat
+    :columns="columns"
+    :filter="filter"
+    :grid="$q.screen.lt.sm"
+    :loading="loading"
+    :pagination="{ rowsPerPage }"
+    :pagination-label="getPaginationLabel"
+    :rows="rows"
+    :rows-per-page-label="$t('common.ui.table.rows_per_page')"
+    :visible-columns="visibleColumns"
+    @row-click="onRowClick"
+  >
+    <template #top>
+      <div
+        class="flex full-width justify-between align-center q-mb-md"
+        style="gap: 1rem; height: 40px"
+      >
+        <q-input
+          v-if="showSearchField"
+          v-model="filter"
+          autofocus
+          bg-color="surface"
+          clearable
+          color="primary"
+          debounce="250"
+          dense
+          style="width: 390px"
+          :placeholder="$t('common.actions.search')"
+        >
+          <template #append>
+            <q-icon name="mdi-magnify" />
+          </template>
+        </q-input>
+
+        <q-select
+          v-if="showColumnsSelect"
+          v-model="visibleColumns"
+          emit-value
+          map-options
+          multiple
+          options-outlined
+          options-selected-class="text-bold"
+          style="width: 150px"
+          :display-value="$q.lang.table.columns"
+          :options="mapColumns"
+        />
+
+        <q-btn
+          v-if="filterBtn"
+          color="secondary"
+          icon="mdi-filter-outline"
+          text-color="primary"
+          @click="() => emit('toggleFilters')"
+        >
+        </q-btn>
+
+        <q-space />
+
+        <q-btn
+          v-if="addItem"
+          class="add-item-color btn-custom-default"
+          color="secondary"
+          padding="10px 16px"
+          :outline="outlineAdd"
+          @click="onAddItem"
+        >
+          <div class="text-primary">Adicionar</div>
+        </q-btn>
+      </div>
+
+      <div class="q-mt-sm">
+        <slot name="filters"></slot>
+      </div>
+    </template>
+
+    <template #loading>
+      <q-inner-loading showing color="primary" />
+    </template>
+
+    <template v-if="!hideNoDataLabel" #no-data>
+      <div v-if="!loading" class="q-my-md row justify-center full-width">
+        <div class="q-pa-md body2">
+          {{ $t("http.errors.no_records_found") }}
+        </div>
+      </div>
+    </template>
+
+    <template v-for="(index, name) in $slots" #[name]="data">
+      <slot :name="name" v-bind="data"></slot>
+    </template>
+  </q-table>
+</template>
+
+<script setup>
+import { onMounted, ref, toRaw, watch } from "vue";
+import { useRouter } from "vue-router";
+
+const emit = defineEmits(["onRowClick", "onAddItem", "noRows", "toggleFilters"]);
+
+const {
+  addItem,
+  addItemRoute,
+  apiCall,
+  columns,
+  hideNoDataLabel,
+  noApiCall,
+  outlineAdd,
+  openItem,
+  openItemRoute,
+  rowsPerPage,
+  showSearchField,
+} = defineProps({
+  addItem:           { type: Boolean,  default: true },
+  addItemRoute:      { type: String,   default: "" },
+  apiCall:           { type: Function, required: true },
+  columns:           { type: Array,    required: true },
+  deleteFunction:    { type: Function, default: null },
+  filterBtn:         { type: Boolean,  default: true },
+  hideNoDataLabel:   { type: Boolean,  default: false },
+  noApiCall:         { type: Boolean,  default: false },
+  outlineAdd:        { type: Boolean,  default: false },
+  openItem:          { type: Boolean,  default: false },
+  openItemRoute:     { type: String,   default: "" },
+  rowsPerPage:       { type: Number,   default: 10 },
+  showColumnsSelect: { type: Boolean,  default: false },
+  showSearchField:   { type: Boolean,  default: true },
+});
+
+const router = useRouter();
+
+const rows         = ref([]);
+const filter       = ref("");
+const loading      = ref(true);
+const fullscreen   = ref(false);
+const showInativos = ref(false);
+const inativos     = ref([]);
+
+//
+
+const mapColumns = columns.reduce((accm, column) => {
+  if (!column.required) {
+    accm.push({
+      label: column.label,
+      value: column.name,
+    });
+  }
+  return accm;
+}, []);
+
+const visibleColumns = ref(mapColumns.map((column) => column.value));
+
+//
+
+const getPaginationLabel = (from, to, last) => {
+  return `${from}-${to} de ${last}`;
+};
+
+const onAddItem = () => {
+  if (addItem) {
+    if (addItemRoute) {
+      router.push({ name: addItemRoute });
+    } else {
+      emit("onAddItem");
+    }
+  }
+};
+
+const onRowClick = (evt, row, index) => {
+  const item = toRaw(row);
+
+  if (openItem) {
+    if (openItemRoute) {
+      router.push({ name: openItemRoute, params: { id: item.id } });
+    } else {
+      emit("onRowClick", { evt, row, index });
+    }
+  }
+};
+
+const onRequest = async () => {
+  if (noApiCall) {
+    loading.value = false;
+
+    return;
+  }
+
+  loading.value = true;
+
+  const response = await apiCall();
+
+  rows.value.splice(0, rows.value.length, ...response);
+
+  if (rows.value.length == 0) {
+    emit("noRows");
+  }
+
+  loading.value = false;
+};
+
+watch(showInativos, () => {
+  if (showInativos.value) {
+    rows.value = rows.value.concat(inativos.value);
+  } else {
+    inativos.value = rows.value.filter(
+      (row) => row.status === false || row.ativo === false,
+    );
+
+    rows.value = rows.value.filter((row) => row.ativo);
+  }
+});
+
+watch(
+  () => apiCall,
+  async () => {
+    await onRequest();
+  },
+);
+
+onMounted(async () => {
+  await onRequest({
+    filter: undefined,
+  });
+});
+
+defineExpose({
+  refresh: onRequest,
+});
+</script>
+
+<style lang="scss">
+@import "src/css/table.scss";
+
+:deep(.q-field__control) {
+  border-radius: 10px;
+}
+</style>

+ 373 - 0
src/components/defaults/DefaultTableServerSide.vue

@@ -0,0 +1,373 @@
+# DefaultTableServerSide.vue
+<template>
+  <q-table
+    v-model:fullscreen="fullscreen"
+    v-model:pagination="pagination"
+    row-key="id"
+    flat
+    class="softpar-table q-pa-sm"
+    :pagination-label="getPaginationLabel"
+    :rows="rows"
+    :rows-per-page-label="$t('common.ui.table.rows_per_page')"
+    :columns="columns"
+    :visible-columns="visibleColumns"
+    :filter="pagination.filter"
+    :grid="$q.screen.lt.sm"
+    :loading="loading"
+    v-bind="$attrs"
+    @row-click="onRowClick"
+  >
+    <template #top>
+      <div
+        class="flex full-width justify-between items-center q-mb-md q-pl-sm"
+        style="gap: 1rem"
+      >
+        <q-input
+          v-if="showSearchField"
+          v-model="pagination.filter"
+          outlined
+          dense
+          debounce="500"
+          :placeholder="$t('common.actions.search')"
+          clearable
+          autofocus
+        >
+          <template #append>
+            <q-icon name="mdi-magnify" />
+          </template>
+        </q-input>
+
+        <q-select
+          v-if="showColumnsSelect"
+          v-model="visibleColumns"
+          class="q-ml-md"
+          multiple
+          dense
+          outlined
+          options-outlined
+          :display-value="$q.lang.table.columns"
+          emit-value
+          map-options
+          :options="mapColumns"
+          style="min-width: 150px"
+          options-selected-class="text-bold"
+        />
+
+        <q-space />
+
+        <q-btn
+          v-if="addItem"
+          color="primary"
+          padding="12px 16px"
+          :outline="outlineAdd"
+          :label="labelAdd"
+          @click="onAddItem"
+        />
+      </div>
+    </template>
+
+    <template #body-cell-actions="{ row }">
+      <q-td v-if="deleteFunction">
+        <q-item-section>
+          <q-btn
+            color="negative"
+            flat
+            dense
+            icon="mdi-delete"
+            style="width: 45px"
+            class="q-ml-auto q-mr-sm"
+            @click.prevent.stop="onDelete(row.id)"
+          />
+        </q-item-section>
+      </q-td>
+    </template>
+
+    <template v-if="!hideNoDataLabel" #no-data>
+      <div class="q-my-md row justify-center full-width">
+        <q-spinner v-if="loading" color="primary" size="30px" />
+        <div v-else class="q-pa-md body2">
+          {{ $t("http.errors.no_records_found") }}
+        </div>
+      </div>
+    </template>
+
+    <template #bottom="scope">
+      <div class="flex full-width justify-end">
+        <div class="flex items-center">
+          {{ $t("common.ui.table.rows_per_page") }}
+          <q-select
+            v-model="pagination.rowsPerPage"
+            class="q-mx-sm"
+            dense
+            borderless
+            :options="rowsPerPageOptions"
+          >
+            <template #option="selectData">
+              <q-item v-bind="selectData.itemProps">
+                <q-item-section>
+                  <q-item-label>{{
+                    selectData.opt == 0 ? $t("common.ui.misc.all") : selectData.opt
+                  }}</q-item-label>
+                </q-item-section>
+              </q-item>
+            </template>
+          </q-select>
+        </div>
+        <div class="flex items-center">
+          {{ pagination.from + "-" + pagination.to }} {{ $t("common.ui.table.of") }}
+          {{ pagination.rowsNumber }}
+        </div>
+        <div class="flex items-center">
+          <q-btn
+            icon="mdi-chevron-left"
+            color="grey-8"
+            round
+            dense
+            flat
+            :disable="scope.isFirstPage"
+            @click="prevPage"
+          />
+          <q-btn
+            icon="mdi-chevron-right"
+            color="grey-8"
+            round
+            dense
+            flat
+            :disable="scope.isLastPage"
+            @click="nextPage"
+          />
+        </div>
+      </div>
+    </template>
+
+    <template v-for="name in $slots" #[name]="data">
+      <slot :name="name" v-bind="data"></slot>
+    </template>
+  </q-table>
+</template>
+
+<script setup>
+import { ref, computed, onMounted, toRaw, watch } from "vue";
+import { useI18n } from "vue-i18n";
+import { useRouter } from "vue-router";
+
+const emit = defineEmits([
+  "onRowClick",
+  "onAddItem",
+  "noRows",
+  "togglePrincipal",
+]);
+
+const {
+  columns,
+  apiCall,
+  outlineAdd,
+  openItem,
+  openItemRoute,
+  addItem,
+  addItemRoute,
+  rowsPerPage,
+  showSearchField,
+  hideNoDataLabel,
+  deleteFunction,
+} = defineProps({
+  columns: {
+    type: Array,
+    required: true,
+  },
+  apiCall: {
+    type: Function,
+    required: true,
+  },
+  labelAdd: {
+    type: String,
+    default: "Adicionar",
+  },
+  outlineAdd: {
+    type: Boolean,
+    default: false,
+  },
+  openItem: {
+    type: Boolean,
+    default: false,
+  },
+  openItemRoute: {
+    type: String,
+    default: "",
+  },
+  addItem: {
+    type: Boolean,
+    default: true,
+  },
+  addItemRoute: {
+    type: String,
+    default: "",
+  },
+  rowsPerPage: {
+    type: Number,
+    default: 10,
+  },
+  showColumnsSelect: {
+    type: Boolean,
+    default: false,
+  },
+  showSearchField: {
+    type: Boolean,
+    default: true,
+  },
+  noApiRoute: {
+    type: Boolean,
+    default: false,
+  },
+  hideNoDataLabel: {
+    type: Boolean,
+    default: false,
+  },
+  deleteFunction: {
+    type: Function,
+    default: null,
+  },
+});
+
+const { t } = useI18n();
+const router = useRouter();
+const rows = ref([]);
+const loading = ref(true);
+const fullscreen = ref(false);
+const rowsPerPageOptions = [10, 15, 25, 50];
+
+const pagination = ref({
+  filter: undefined,
+  page: 1,
+  rowsPerPage: rowsPerPage,
+  rowsNumber: 0,
+  from: 0,
+  to: 0,
+});
+
+const mapColumns = computed(() => {
+  return columns.reduce((accm, column) => {
+    if (!column.required) {
+      accm.push({
+        label: column.label.toUpperCase(),
+        value: column.name,
+      });
+    }
+    return accm;
+  }, []);
+});
+
+const visibleColumns = ref(mapColumns.value.map((column) => column.value));
+
+const onRowClick = (evt, row, index) => {
+  const item = toRaw(row);
+  if (openItem) {
+    if (openItemRoute) {
+      router.push({ name: openItemRoute, params: { id: item.id } });
+    } else {
+      emit("onRowClick", { evt, row, index });
+    }
+  }
+};
+
+const onAddItem = () => {
+  if (addItem) {
+    if (addItemRoute) {
+      router.push({ name: addItemRoute });
+    } else {
+      emit("onAddItem");
+    }
+  }
+};
+
+const onDelete = async (id) => {
+  if (deleteFunction) {
+    loading.value = true;
+    try {
+      await deleteFunction(id);
+      await onRequest();
+    } catch (error) {
+      console.error(error);
+    } finally {
+      loading.value = false;
+    }
+  }
+};
+
+const prevPage = () => {
+  pagination.value.page--;
+  onRequest();
+};
+
+const nextPage = () => {
+  pagination.value.page++;
+  onRequest();
+};
+
+const getPaginationLabel = (from, to, total) => {
+  return `${from}-${to} ${t?.("common.ui.table.of") ?? "of"} ${total}`;
+};
+
+let isFetching = false;
+const onRequest = async () => {
+  if (isFetching) return;
+
+  isFetching = true;
+  loading.value = true;
+
+  try {
+    const response = await apiCall({
+      page: pagination.value.page,
+      perPage: pagination.value.rowsPerPage,
+      filter: pagination.value.filter,
+    });
+
+    rows.value = response.data.result.data;
+    pagination.value.rowsNumber = response.data.result.total;
+    pagination.value.from = response.data.result.from;
+    pagination.value.to = response.data.result.to;
+
+    if (rows.value.length === 0) {
+      emit("noRows");
+    }
+  } catch (error) {
+    console.error("Error fetching data:", error);
+  } finally {
+    loading.value = false;
+    isFetching = false;
+  }
+};
+
+watch(
+  () => apiCall,
+  () => onRequest(),
+);
+
+watch(
+  pagination,
+  async (newVal, oldVal) => {
+    if (!oldVal || loading.value) return;
+
+    if (
+      newVal.rowsPerPage !== oldVal.rowsPerPage ||
+      newVal.filter !== oldVal.filter ||
+      newVal.page !== oldVal.page
+    ) {
+      await onRequest();
+    }
+  },
+  { deep: true },
+);
+
+onMounted(async () => {
+  await onRequest();
+});
+
+defineExpose({
+  refresh: onRequest,
+});
+</script>
+
+<style lang="scss">
+@import "src/css/table.scss";
+</style>

+ 34 - 0
src/components/defaults/DefaultTabs.vue

@@ -0,0 +1,34 @@
+<template>
+  <q-tabs
+    v-model="tab"
+    class="button bg-background-2 text-font"
+    indicator-color="transparent"
+    active-color="dark"
+    active-bg-color="surface"
+    v-bind="$attrs"
+    align="justify"
+  >
+    <q-tab
+      v-for="(q_tab, i) in tabsItems"
+      :key="i"
+      :name="q_tab.name"
+      :label="q_tab.label"
+      :disable="q_tab.disable"
+      :class="{ hidden: q_tab.hide }"
+      class="bg-white"
+      style="border: none"
+    />
+  </q-tabs>
+</template>
+
+<script setup>
+const { tabsItems } = defineProps({
+  tabsItems: {
+    type: Array,
+    required: false,
+    default: () => [],
+  },
+});
+
+const tab = defineModel();
+</script>

+ 72 - 0
src/components/defaults/DefaultTextEditor.vue

@@ -0,0 +1,72 @@
+<template>
+  <q-editor
+    v-model="model"
+    :definitions="editorDefinitions"
+    :toolbar="editorToolbar"
+    :fonts="editorFonts"
+    placeholder="Ex. Oferecemos um serviço completo de limpeza para apartamentos, garantindo ambientes impecáveis e organizados. Nossa equipe é treinada para atender todas as necessidades, desde limpeza básica até higienização profunda, incluindo:
+Ideal para quem busca praticidade, conforto e um espaço sempre limpo e agradável. Agende de acordo com sua necessidade: diária, semanal ou mensal."
+    min-height="200px"
+    max-height="400px"
+    class="q-editor-custom"
+    content-class="text-body1"
+  />
+</template>
+
+<script setup>
+const model = defineModel();
+
+const editorDefinitions = {
+  bold: { icon: "format_bold" },
+  italic: { icon: "format_italic" },
+  underline: {
+    icon: "format_underlined",
+  },
+
+  unordered: {
+    icon: "format_list_bulleted",
+  },
+  ordered: {
+    icon: "format_list_numbered",
+  },
+
+  left: {
+    icon: "format_align_left",
+  },
+
+  center: { icon: "format_align_center" },
+  right: { icon: "format_align_right" },
+  justify: { icon: "format_align_justify" },
+  quote: { icon: "format_quote" },
+  hr: { icon: "remove" },
+
+  removeFormat: false,
+  undo: false,
+  redo: false,
+};
+
+const editorToolbar = [
+  ["undo", "redo"],
+  ["bold", "italic", "underline", "strike"],
+  ["unordered", "ordered"],
+  ["left", "center", "right", "justify"],
+  ["quote", "link"],
+  ["removeFormat"],
+  ["hr"],
+];
+
+const editorFonts = {
+  arial: "Arial",
+  arial_black: "Arial Black",
+  comic_sans: "Comic Sans MS",
+  courier_new: "Courier New",
+  impact: "Impact",
+  lucida_grande: "Lucida Grande",
+  times_new_roman: "Times New Roman",
+  verdana: "Verdana",
+};
+</script>
+
+<style lang="scss">
+@import "src/css/editor.scss";
+</style>

+ 19 - 0
src/components/layout/DefaultHeaderPage.vue

@@ -0,0 +1,19 @@
+<template>
+  <div>
+    <q-breadcrumbs class="q-mb-md">
+      <template #separator> <div class="text-primary">/</div> </template>
+
+      <q-breadcrumbs-el
+        v-for="breadcrumb in $route.meta?.breadcrumbs"
+        :key="breadcrumb?.name"
+        :label="$t(breadcrumb?.title)"
+        :to="{ name: breadcrumb?.name }"
+        style="font-size: 12px"
+      />
+    </q-breadcrumbs>
+
+    <span class="text-h6 text-bold">{{ $t($route.meta?.title) }}</span>
+  </div>
+</template>
+
+<script setup></script>

+ 298 - 0
src/components/layout/LeftMenuLayout.vue

@@ -0,0 +1,298 @@
+<template>
+  <q-drawer
+    v-bind="$attrs"
+    :model-value="true"
+    show-if-above
+    no-swipe-close
+    no-swipe-open
+    :width="300"
+    :mini-width="64"
+    :breakpoint="500"
+    :mini="miniState"
+    :behavior="'desktop'"
+    class="detached-container bg-surface"
+  >
+    <div class="column full-height q-pa-sm no-wrap">
+      <div
+        v-if="!$q.screen.lt.md"
+        class="toggle-button-wrapper absolute"
+        style="top: 50%; right: -32px; z-index: 1"
+      >
+        <q-btn
+          flat
+          round
+          size="sm"
+          padding="8px 8px"
+          @click="miniState = !miniState"
+        >
+          <q-icon
+            :name="miniState ? 'mdi-chevron-right' : 'mdi-chevron-left'"
+          />
+          <q-tooltip
+            anchor="center right"
+            self="center left"
+            :offset="[10, 10]"
+            >{{
+              miniState
+                ? $t("ui.navigation.expand_menu")
+                : $t("ui.navigation.collapse_menu")
+            }}</q-tooltip
+          >
+        </q-btn>
+      </div>
+
+      <q-list class="column q-mb-md no-wrap" style="border-radius: 6px">
+        <q-item v-ripple clickable :class="miniState ? '' : 'q-pa-none'">
+          <div class="flex full-width">
+            <img
+              :src="
+                miniState
+                  ? 'images/kizzo_left_logo.png'
+                  : 'images/kizzo_expanded_logo.png'
+              "
+              alt="avatar"
+              class="full-width"
+            />
+          </div>
+        </q-item>
+      </q-list>
+
+      <q-list class="column no-wrap" style="border-radius: 10px">
+        <template v-for="item in navigationItems" :key="item.name">
+          <template v-if="item.permission">
+            <q-item
+              v-if="item.type === 'single'"
+              v-ripple
+              clickable
+              exact-active-class="menu-selected"
+              exact
+              active-class="menu-selected"
+              style="border-radius: 4px"
+              :to="{ name: item.name }"
+              class="q-my-xs"
+            >
+              <q-item-section v-if="item.icon" avatar>
+                <q-icon :name="item.icon" style="font-size: 24px" />
+              </q-item-section>
+              <q-item-section>{{ $t(item.title) }}</q-item-section>
+              <q-tooltip
+                v-if="miniState"
+                anchor="center right"
+                self="center left"
+                :offset="[10, 10]"
+                >{{ $t(item.title) }}</q-tooltip
+              >
+            </q-item>
+            <div v-else>
+              <template v-if="!miniState">
+                <q-tooltip
+                  v-if="miniState"
+                  anchor="center right"
+                  self="center left"
+                  :offset="[10, 10]"
+                  >{{ $t(item.title) }}</q-tooltip
+                >
+                <q-expansion-item
+                  v-model="isExpasionItemExpanded"
+                  header-class="menu-item--spaced"
+                  :class="{
+                    'menu-selected':
+                      childrenAreActive(item.children) &&
+                      !isExpasionItemExpanded,
+                  }"
+                  class="menu-item--spaced"
+                >
+                  <template #header>
+                    <q-item-section avatar>
+                      <q-icon :name="item.icon" style="font-size: 24px" />
+                    </q-item-section>
+                    <q-item-section>{{ $t(item.title) }}</q-item-section>
+                  </template>
+                  <div v-for="child in item.childrens" :key="child.name">
+                    <q-item
+                      v-ripple
+                      clickable
+                      :to="{ name: child.name }"
+                      exact
+                      exact-active-class="menu-selected"
+                      class="menu-item--spaced"
+                    >
+                      <q-item-section v-if="child.icon" avatar>
+                        <q-icon :name="child.icon" style="font-size: 18px" />
+                      </q-item-section>
+                      <q-item-section class="q-px-md">{{
+                        $t(child.title)
+                      }}</q-item-section>
+                      <q-tooltip
+                        v-if="miniState"
+                        anchor="center right"
+                        self="center left"
+                        :offset="[10, 10]"
+                        >{{ $t(child.title) }}</q-tooltip
+                      >
+                    </q-item>
+                  </div>
+                </q-expansion-item>
+              </template>
+              <template v-else>
+                <q-item
+                  v-ripple
+                  clickable
+                  exact
+                  exact-active-class="menu-selected"
+                  class="menu-item--spaced"
+                >
+                  <q-item-section avatar>
+                    <q-icon :name="item.icon" style="font-size: 18px" />
+                  </q-item-section>
+                  <q-item-section>{{ $t(item.title) }}</q-item-section>
+                  <q-tooltip
+                    v-if="miniState"
+                    anchor="center right"
+                    self="center left"
+                    :offset="[10, 10]"
+                    >{{ $t(item.title) }}</q-tooltip
+                  >
+                  <q-menu anchor="center right" self="top start">
+                    <q-list>
+                      <q-item
+                        v-for="child in item.childrens"
+                        :key="child.name"
+                        v-ripple
+                        v-close-popup
+                        clickable
+                        :to="{ name: child.name }"
+                        exact
+                        exact-active-class="menu-selected"
+                      >
+                        <q-item-section avatar>
+                          <q-icon :name="child.icon" style="font-size: 18px" />
+                        </q-item-section>
+                        <q-item-section>{{ $t(child.title) }}</q-item-section>
+                      </q-item>
+                    </q-list>
+                  </q-menu>
+                </q-item>
+              </template>
+            </div>
+          </template>
+        </template>
+      </q-list>
+      <q-list class="q-mt-auto">
+        <q-btn
+          :label="miniState ? '' : 'Sair'"
+          flat
+          class="full-width"
+          icon-right="mdi-location-exit"
+          @click="logoutFn"
+        >
+        </q-btn>
+        <q-item v-ripple clickable @click="openUrl('https://softpar.inf.br')">
+          <div class="flex full-width justify-center">
+            <q-img
+              :src="
+                miniState || $q.screen.lt.md
+                  ? LogoSoftparMini
+                  : $q.dark.isActive
+                    ? LogoSoftparLight
+                    : LogoSoftparDark
+              "
+              style="width: 100%; height: 30px; max-width: 114px"
+            />
+          </div>
+        </q-item>
+      </q-list>
+      <div
+        class="full-width text-center text-subtitle3 cursor-pointer"
+        @click="$router.push('/version')"
+      >
+        <span class="text-caption text-weight-light">{{ version }}</span>
+      </div>
+    </div>
+  </q-drawer>
+</template>
+<script setup>
+import { ref, watch, watchEffect } from "vue";
+import { useAuth } from "src/composables/useAuth";
+import { useRouter, useRoute } from "vue-router";
+import { navigationStore } from "src/stores/navigation";
+import LogoSoftparLight from "src/assets/softpar_logo_light.svg";
+import LogoSoftparDark from "src/assets/softpar_logo_dark.svg";
+import LogoSoftparMini from "src/assets/softpar_logo_mini.svg";
+import { Cookies } from "quasar";
+import { useQuasar } from "quasar";
+import { version } from "../../../package.json";
+
+const $q = useQuasar();
+const { logout } = useAuth();
+const router = useRouter();
+const route = useRoute();
+const { navigationItems } = navigationStore();
+
+const miniState = ref(Cookies.get("miniState") === "true" ?? false);
+
+const childrenAreActive = (children) => {
+  if (!children) return false;
+  return children.some((child) => {
+    return route.path.includes(child.path);
+  });
+};
+
+const expandedItems = ref({});
+
+watchEffect(() => {
+  if ($q.screen.lt.md) {
+    miniState.value = true;
+    if (Array.isArray(expandedItems.value)) {
+      expandedItems.value.forEach((expansion, index) => {
+        expandedItems.value[index] = false;
+      });
+    } else {
+      expandedItems.value = false;
+    }
+  }
+});
+
+const logoutFn = async () => {
+  await logout();
+  router.push({ name: "LoginPage" });
+};
+
+const openUrl = (url) => {
+  window.open(url, "_blank");
+};
+
+watch(miniState, () => {
+  Cookies.set("miniState", miniState.value);
+});
+</script>
+
+<style lang="scss" scoped>
+@import "/src/css/quasar.variables.scss";
+.text-subtitle3 {
+  font-size: 1.1rem !important;
+  font-weight: 400 !important;
+}
+
+.menu-selected {
+  background-color: rgba($secondary, 1);
+  color: $primary;
+}
+
+.toggle-button-wrapper {
+  transition: transform 0.3s ease;
+}
+
+.toggle-button-wrapper:hover {
+  transform: scale(1.1);
+}
+
+.menu-item--spaced {
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+
+:deep(.q-drawer) {
+  box-shadow: none !important;
+}
+</style>

+ 126 - 0
src/components/layout/LeftMenuLayoutMobile.vue

@@ -0,0 +1,126 @@
+<!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
+<template>
+  <q-drawer
+    v-bind="$attrs"
+    v-model="leftDrawerOpen"
+    :width="250"
+    :breakpoint="500"
+    behavior="mobile"
+    class="detached-container"
+  >
+    <div class="column full-height q-pa-sm no-wrap">
+      <q-list class="column no-wrap">
+        <template v-for="item in navigationItems" :key="item.name">
+          <template v-if="item.permission">
+            <!-- Single Menu -->
+            <q-item
+              v-if="item.type === 'single'"
+              v-ripple
+              clickable
+              exact-active-class="menu-selected"
+              exact
+              active-class="menu-selected"
+              :to="{ name: item.name }"
+              class="q-my-xs"
+            >
+              <q-item-section avatar>
+                <q-icon :name="item.icon" style="font-size: 18px" />
+              </q-item-section>
+              <q-item-section>{{ $t(item.title) }}</q-item-section>
+            </q-item>
+            <!-- Expansive Menu with children -->
+            <q-expansion-item
+              v-else
+              v-model="isExpasionItemExpanded"
+              header-class="menu-item--spaced"
+              :class="{
+                'menu-selected':
+                  childrenAreActive(item.children) && !isExpasionItemExpanded,
+              }"
+            >
+              <template #header>
+                <q-item-section avatar>
+                  <q-icon :name="item.icon" style="font-size: 18px" />
+                </q-item-section>
+                <q-item-section>{{ $t(item.title) }}</q-item-section>
+              </template>
+              <div v-for="child in item.childrens" :key="child.name">
+                <q-item
+                  v-ripple
+                  clickable
+                  :to="{ name: child.name }"
+                  exact
+                  exact-active-class="menu-selected"
+                  class="menu-item--spaced q-pl-lg"
+                >
+                  <q-item-section avatar>
+                    <q-icon :name="child.icon" style="font-size: 18px" />
+                  </q-item-section>
+                  <q-item-section>{{ $t(child.title) }}</q-item-section>
+                </q-item>
+              </div>
+            </q-expansion-item>
+          </template>
+        </template>
+      </q-list>
+
+      <q-list class="q-mt-auto">
+        <q-item v-ripple clickable @click="openUrl('https://softpar.inf.br')">
+          <div class="flex full-width justify-center">
+            <q-img
+              :src="$q.dark.isActive ? LogoSoftparLight : LogoSoftparDark"
+              style="width: 100%; height: 30px; max-width: 114px"
+            />
+          </div>
+        </q-item>
+      </q-list>
+      <div class="full-width text-center text-subtitle3">
+        <span class="text-caption text-weight-light">1.0.0</span>
+      </div>
+    </div>
+  </q-drawer>
+</template>
+
+<script setup>
+import { ref } from "vue";
+import { useRoute } from "vue-router";
+import { navigationStore } from "src/stores/navigation";
+import LogoSoftparLight from "src/assets/softpar_logo_light.svg";
+import LogoSoftparDark from "src/assets/softpar_logo_dark.svg";
+const route = useRoute();
+
+const leftDrawerOpen = defineModel();
+
+const { navigationItems } = navigationStore();
+
+const childrenAreActive = (children) => {
+  if (!children) return false;
+  return children.some((child) => {
+    return route.path.includes(child.path);
+  });
+};
+
+const isExpasionItemExpanded = ref(false);
+
+const openUrl = (url) => {
+  window.open(url, "_blank");
+};
+</script>
+
+<style lang="scss" scoped>
+@import "/src/css/quasar.variables.scss";
+.text-subtitle3 {
+  font-size: 1.1rem !important;
+  font-weight: 400 !important;
+}
+
+.menu-selected {
+  background-color: rgba($primary, 0.1);
+  color: $primary;
+}
+
+.menu-item--spaced {
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+</style>

+ 149 - 0
src/components/payments/ServiceRatingView.vue

@@ -0,0 +1,149 @@
+<template>
+  <div class="radius-8 shadow-1 q-pa-sm q-mt-sm">
+    <div class="row q-col-gutter-md">
+      <div class="col column q-gutter-y-sm">
+        <div class="column q-gutter-y-xs q-mt-none">
+          <span class="text-body2">Estado Geral do Item/Apartamento</span>
+          <div class="row q-gutter-x-sm">
+            <q-btn
+              v-for="opt in generalStateOptions"
+              :key="opt.value"
+              no-caps
+              disable
+              padding="1px"
+              unelevated
+              class="text-subtitle1 state-chip col"
+              :class="rating.general_state === opt.value ? 'state-chip--active' : 'state-chip--inactive'"
+              :label="opt.label"
+            />
+          </div>
+        </div>
+
+        <div class="row q-gutter-x-sm">
+          <q-btn
+            v-for="opt in conditionOptions"
+            :key="opt.value"
+            no-caps
+            disable
+            padding="1px"
+            class="text-subtitle1 text-weight-regular state-chip col"
+            :class="rating.condition === opt.value ? 'state-chip--active' : 'state-chip--inactive'"
+            :label="opt.label"
+          />
+        </div>
+
+        <div class="column">
+          <span class="text-body2 q-mb-xs">Check-List de Itens</span>
+          <q-list>
+            <q-item
+              v-for="item in checklistItems"
+              :key="item.field"
+              style="padding: 4px 8px; min-height: unset;"
+              dense
+            >
+              <q-item-section>
+                <q-item-label class="text-body2 text-text-2">{{ item.label }}</q-item-label>
+              </q-item-section>
+              <q-item-section side>
+                <q-toggle :model-value="rating[item.field]" color="primary" dense disable />
+              </q-item-section>
+            </q-item>
+          </q-list>
+        </div>
+
+        <div class="column q-gutter-y-xs">
+          <span class="text-body2">Danos/Itens faltantes e Observações:</span>
+          <q-input
+            :model-value="rating.notes || ''"
+            type="textarea"
+            disable
+            autogrow
+            bg-color="white"
+            :input-style="{ minHeight: '106px' }"
+            :placeholder="rating.notes ? '' : 'Nada a declarar'"
+          />
+        </div>
+      </div>
+
+      <div v-if="rating.medias && rating.medias.length" class="col">
+        <span class="text-body2">Fotos</span>
+        <div
+          v-for="(photo, index) in rating.medias"
+          :key="photo.id ?? index"
+          class="row items-center justify-between"
+        >
+          <span class="text-caption text-text-2">foto.png</span>
+          <q-btn
+            flat
+            dense
+            round
+            color="primary"
+            icon="mdi-eye-outline"
+            :href="photo.url"
+            target="_blank"
+            type="a"
+          />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { computed } from "vue";
+
+const props = defineProps({
+  rating: { type: Object, required: true },
+});
+
+const checklistItems = [
+  { label: "Integridade Estrutural", field: "structural_integrity" },
+  { label: "Funcionamento", field: "functioning" },
+  { label: "Itens faltantes", field: "missing_items" },
+];
+
+const generalStateOptions = [
+  { label: "Limpo", value: "clean" },
+  { label: "Sujo", value: "dirty" },
+];
+
+const conditionMap = {
+  clean: [
+    { label: "Bom", value: "good" },
+    { label: "Regular", value: "regular" },
+    { label: "Ótimo", value: "great" },
+  ],
+  dirty: [
+    { label: "Ruim", value: "bad" },
+    { label: "Péssimo", value: "terrible" },
+    { label: "Horrível", value: "horrible" },
+  ],
+};
+
+const conditionOptions = computed(
+  () => conditionMap[props.rating?.general_state] ?? [],
+);
+</script>
+
+<style lang="scss" scoped>
+@use "sass:map";
+
+.state-chip {
+  border-radius: 4px;
+  border: 1px solid #111212;
+
+  &--active {
+    background-color: #467D79;
+    color: white !important;
+  }
+
+  &--inactive {
+    background-color: #F0F3F5;
+    color: $primary !important;
+  }
+}
+
+:deep(.q-btn:before) {
+  box-shadow: none;
+}
+</style>

+ 174 - 0
src/components/regions/CitySelect.vue

@@ -0,0 +1,174 @@
+<template>
+  <q-select
+    v-model="selectedCity"
+    v-bind="$attrs"
+    use-input
+    hide-selected
+    fill-input
+    clearable
+    :options="cityOptions"
+    :label="label"
+    :loading="loading"
+    :placeholder="$t('common.actions.search') + ' ' + $t('ui.navigation.city')"
+    :rules="rules"
+    :disable="disable"
+    label-color="primary"
+    @filter="filterFn"
+  >
+    <template #no-option>
+      <q-item>
+        <q-item-section class="text-grey">
+          {{ $t("http.errors.no_records_found") }}
+        </q-item-section>
+      </q-item>
+    </template>
+  </q-select>
+</template>
+
+<script setup>
+import { getCities } from "src/api/city";
+import { ref, onMounted, watch } from "vue";
+import { useI18n } from "vue-i18n";
+
+const emit = defineEmits(["selectedStateId"]);
+
+const { state, label, rules, initialId, disable } = defineProps({
+  // This country prop is here for future use, maybe
+  country: {
+    type: Object,
+    required: false,
+    default: () => {
+      return {
+        label: "Brasil",
+        value: 1,
+      };
+    },
+  },
+  state: {
+    type: Object,
+    required: false,
+    default: null,
+  },
+  label: {
+    type: String,
+    default: () => useI18n().t("ui.navigation.city"),
+  },
+  rules: {
+    type: Array,
+    default: () => [],
+  },
+  initialId: {
+    type: Number,
+    required: false,
+    default: null,
+  },
+  disable: {
+    type: Boolean,
+    default: false
+  }
+});
+
+const selectedCity = defineModel();
+
+const loading = ref(false);
+const filteredCities = ref([]);
+const baseCities = ref([]);
+const cityOptions = ref([]);
+
+const filterFn = async (val, update) => {
+  if (!val) {
+    cityOptions.value = filteredCities.value.map((city) => ({
+      label: city.name,
+      value: city.id,
+      state_id: city.state_id,
+    }));
+  } else {
+    const needle = val.toLowerCase();
+    const cities = filteredCities.value.filter(
+      (v) => v.name.toLowerCase().indexOf(needle) > -1,
+    );
+    cityOptions.value = cities.map((city) => ({
+      label: city.name,
+      value: city.id,
+      state_id: city.state_id,
+    }));
+  }
+
+  update();
+};
+
+const selectCityByName = (name) => {
+  if (selectedCity.value?.label === name) {
+    return;
+  }
+  selectedCity.value = cityOptions.value.find((city) => city.label === name);
+};
+
+const selectCityById = (id) => {
+  if (selectedCity.value?.value === id) {
+    return;
+  }
+  selectedCity.value = cityOptions.value.find((city) => city.value === id);
+};
+
+watch(
+  () => state,
+  (value, oldValue) => {
+    if (
+      value?.value != oldValue?.value &&
+      value?.value != selectedCity.value?.state_id
+    ) {
+      selectedCity.value = null;
+    }
+    if (value) {
+      filteredCities.value = baseCities.value.filter(
+        (city) => city.state_id === value.value,
+      );
+      cityOptions.value = filteredCities.value.map((city) => ({
+        label: city.name,
+        value: city.id,
+        state_id: city.state_id,
+      }));
+    } else {
+      filteredCities.value = baseCities.value;
+      cityOptions.value = baseCities.value.map((city) => ({
+        label: city.name,
+        value: city.id,
+        state_id: city.state_id,
+      }));
+    }
+  },
+  { immediate: true },
+);
+
+watch(selectedCity, () => {
+  if (selectedCity.value?.state_id) {
+    emit("selectedStateId", selectedCity.value.state_id);
+  }
+});
+
+onMounted(async () => {
+  try {
+    loading.value = true;
+    baseCities.value = await getCities();
+    filteredCities.value = baseCities.value;
+    cityOptions.value = baseCities.value.map((city) => ({
+      label: city.name,
+      value: city.id,
+      state_id: city.state_id,
+    }));
+    if (initialId) {
+      selectCityById(initialId);
+    }
+  } catch (e) {
+    console.error(e);
+  } finally {
+    loading.value = false;
+  }
+});
+
+defineExpose({
+  selectCityByName,
+  selectCityById,
+});
+</script>

+ 107 - 0
src/components/regions/CountrySelect.vue

@@ -0,0 +1,107 @@
+<template>
+  <q-select
+    v-model="selectedCountry"
+    v-bind="$attrs"
+    use-input
+    hide-selected
+    fill-input
+    clearable
+    :options="countryOptions"
+    :label="label"
+    :loading="loading"
+    :placeholder="
+      $t('common.actions.search') + ' ' + $t('ui.navigation.country')
+    "
+    :rules="rules"
+    @filter="filterFn"
+  >
+    <template #no-option>
+      <q-item>
+        <q-item-section class="text-grey">
+          {{ $t("http.errors.no_records_found") }}
+        </q-item-section>
+      </q-item>
+    </template>
+  </q-select>
+</template>
+
+<script setup>
+import { getCountries } from "src/api/country";
+import { ref, onMounted } from "vue";
+import { useI18n } from "vue-i18n";
+
+const { label, rules, initialId } = defineProps({
+  label: {
+    type: String,
+    default: () => useI18n().t("ui.navigation.country"),
+  },
+  rules: {
+    type: Array,
+    default: () => [],
+  },
+  initialId: {
+    type: Number,
+    required: false,
+    default: null,
+  },
+});
+
+const selectedCountry = defineModel();
+
+const loading = ref(false);
+const baseCountry = ref([]);
+const countries = ref([]);
+const countryOptions = ref([]);
+
+const filterFn = async (val, update) => {
+  const filter = () => {
+    const needle = val.toLowerCase();
+    countries.value = baseCountry.value.filter((v) =>
+      v.name.toLowerCase().includes(needle),
+    );
+    countryOptions.value = countries.value.map((country) => ({
+      label: country.name,
+      value: country.id,
+    }));
+  };
+
+  update(filter);
+};
+
+const selectCountryByName = (name) => {
+  if (selectedCountry.value && selectedCountry.value.label === name) return;
+  selectedCountry.value = countryOptions.value.find(
+    (country) => country.label === name,
+  );
+};
+
+const selectCountryById = (id) => {
+  if (selectedCountry.value && selectedCountry.value.id === id) return;
+  selectedCountry.value = countryOptions.value.find(
+    (country) => country.value === id,
+  );
+};
+
+onMounted(async () => {
+  try {
+    loading.value = true;
+    baseCountry.value = await getCountries();
+    countryOptions.value = baseCountry.value.map((country) => ({
+      label: country.name,
+      value: country.id,
+    }));
+    if (initialId) {
+      selectCountryById(initialId);
+    }
+  } catch (e) {
+    console.error(e);
+  } finally {
+    loading.value = false;
+  }
+});
+
+defineExpose({
+  selectCountryByName,
+  selectCountryById,
+});
+</script>

+ 178 - 0
src/components/regions/StateSelect.vue

@@ -0,0 +1,178 @@
+<template>
+  <q-select
+    v-model="selectedState"
+    v-bind="$attrs"
+    use-input
+    hide-selected
+    fill-input
+    clearable
+    :options="stateOptions"
+    :label="label"
+    :loading="loading"
+    :placeholder="$t('common.actions.search') + ' ' + $t('ui.navigation.state')"
+    :rules="rules"
+    label-color="primary"
+    @filter="filterFn"
+  >
+    <template #no-option>
+      <q-item>
+        <q-item-section class="text-grey">
+          {{ $t("http.errors.no_records_found") }}
+        </q-item-section>
+      </q-item>
+    </template>
+  </q-select>
+</template>
+
+<script setup>
+import { getStates } from "src/api/state";
+import { ref, onMounted, watch } from "vue";
+import { useI18n } from "vue-i18n";
+
+const emit = defineEmits(["selectedCountryId"]);
+
+const { country, label, rules, initialId } = defineProps({
+  country: {
+    type: Object,
+    required: false,
+    default: () => {
+      return {
+        label: "Brasil",
+        value: 1,
+      };
+    },
+  },
+  label: {
+    type: String,
+    default: () => useI18n().t("ui.navigation.state"),
+  },
+  rules: {
+    type: Array,
+    default: () => [],
+  },
+  initialId: {
+    type: Number,
+    required: false,
+    default: null,
+  },
+});
+
+const selectedState = defineModel();
+
+const loading = ref(false);
+const filteredStates = ref([]);
+const baseStates = ref([]);
+const stateOptions = ref([]);
+
+const filterFn = (val, update) => {
+  if (!val) {
+    stateOptions.value = filteredStates.value.map((state) => ({
+      label: state.name,
+      value: state.id,
+      code: state.code,
+      country_id: state.country_id,
+    }));
+  } else {
+    const needle = val.toLowerCase();
+    filteredStates.value = filteredStates.value.filter(
+      (v) => v.name.toLowerCase().indexOf(needle) > -1,
+    );
+    stateOptions.value = filteredStates.value.map((state) => ({
+      label: state.name,
+      value: state.id,
+      code: state.code,
+      country_id: state.country_id,
+    }));
+  }
+
+  update();
+};
+
+const selectStateById = async (id) => {
+  if (selectedState.value?.value === id) {
+    return;
+  }
+  selectedState.value = stateOptions.value.find((state) => state.value === id);
+};
+
+const selectStateByName = (name) => {
+  if (selectedState.value?.label === name) {
+    return;
+  }
+  selectedState.value = stateOptions.value.find(
+    (state) => state.label === name,
+  );
+};
+
+const selectStateByCode = (code) => {
+  if (selectedState.value?.code === code) {
+    return;
+  }
+  selectedState.value = stateOptions.value.find((state) => state.code === code);
+};
+
+watch(
+  () => country,
+  (value, oldValue) => {
+    if (
+      value?.value != oldValue?.value &&
+      value?.value != selectedState.value?.country_id
+    ) {
+      selectedState.value = null;
+    }
+    if (value) {
+      filteredStates.value = baseStates.value.filter(
+        (state) => state.country_id === value.value,
+      );
+      stateOptions.value = filteredStates.value.map((state) => ({
+        label: state.name,
+        value: state.id,
+        code: state.code,
+        country_id: state.country_id,
+      }));
+    } else {
+      filteredStates.value = baseStates.value;
+      stateOptions.value = baseStates.value.map((state) => ({
+        label: state.name,
+        value: state.id,
+        code: state.code,
+        country_id: state.country_id,
+      }));
+    }
+  },
+  { immediate: true },
+);
+
+watch(selectedState, () => {
+  if (selectedState.value?.country_id) {
+    emit("selectedCountryId", selectedState.value.country_id);
+  }
+});
+
+onMounted(async () => {
+  try {
+    loading.value = true;
+    baseStates.value = await getStates();
+    filteredStates.value = baseStates.value;
+    stateOptions.value = baseStates.value.map((state) => ({
+      label: state.name,
+      value: state.id,
+      code: state.code,
+      country_id: state.country_id,
+    }));
+    if (initialId) {
+      selectStateById(initialId);
+    }
+  } catch (e) {
+    console.error(e);
+  } finally {
+    loading.value = false;
+  }
+});
+
+defineExpose({
+  selectStateById,
+  selectStateByName,
+  selectStateByCode,
+});
+</script>

+ 42 - 0
src/components/selects/BusinessSelect.vue

@@ -0,0 +1,42 @@
+<template>
+  <q-select
+    v-model="model"
+    label="Selecione empreendimento"
+    outlined
+    clearable
+    :options="businessOptions"
+    :loading="loading"
+    option-label="name"
+    emit-value
+    map-options
+  />
+</template>
+
+<script setup>
+import { getBusinessToSelect } from "src/api/business";
+import { onMounted, ref } from "vue";
+
+const model = defineModel();
+const businesses = ref([]);
+const loading = ref(false);
+const businessOptions = ref([]);
+
+const fetchBusiness = async () => {
+  try {
+    loading.value = true;
+    businesses.value = await getBusinessToSelect();
+    businessOptions.value = businesses.value;
+  } catch (error) {
+    console.error("Erro ao carregar empreendimentos:", error);
+  } finally {
+    loading.value = false;
+  }
+};
+
+onMounted(fetchBusiness);
+
+defineExpose({
+  businesses: businesses,
+  getBusinessById: (id) => businesses.value.find((b) => b.id === id),
+});
+</script>

+ 49 - 0
src/components/selects/OwnersSelect.vue

@@ -0,0 +1,49 @@
+<template>
+  <q-select
+    v-model="model"
+    :label="label"
+    outlined
+    clearable
+    :options="ownersOptions"
+    :loading="loading"
+    option-label="name"
+    emit-value
+    map-options
+  />
+</template>
+
+<script setup>
+import { getOwners } from 'src/api/owner';
+import { onMounted, ref } from "vue";
+
+const { label } = defineProps({
+  label: {
+    type: String,
+    default: "Selecione um usuário",
+  },
+});
+
+const model = defineModel();
+const owners = ref([]);
+const loading = ref(false);
+const ownersOptions = ref([]);
+
+const fetchOwners = async () => {
+  try {
+    loading.value = true;
+    owners.value = await getOwners();
+    ownersOptions.value = owners.value;
+  } catch (error) {
+    console.error("Erro ao carregar empreendimentos:", error);
+  } finally {
+    loading.value = false;
+  }
+};
+
+onMounted(fetchOwners);
+
+defineExpose({
+  owner: owners,
+  getOwnerById: (id) => owners.value.find((b) => b.id === id),
+});
+</script>

+ 38 - 0
src/components/selects/ServicesSelect.vue

@@ -0,0 +1,38 @@
+<template>
+  <q-select
+    v-model="model"
+    label="Selecione serviço"
+    outlined
+    clearable
+    :options="serviceOptions"
+    :loading="loading"
+    option-label="name"
+    :error-message="'teste'"
+    emit-value
+    map-options
+  />
+</template>
+
+<script setup>
+import { getAllServices } from "src/api/services";
+import { onMounted, ref } from "vue";
+
+const model = defineModel();
+const services = ref([]);
+const loading = ref(false);
+const serviceOptions = ref([]);
+
+const fetchBusiness = async () => {
+  try {
+    loading.value = true;
+    services.value = await getAllServices();
+    serviceOptions.value = services.value;
+  } catch (error) {
+    console.error("Erro ao carregar serviços:", error);
+  } finally {
+    loading.value = false;
+  }
+};
+
+onMounted(fetchBusiness);
+</script>

+ 99 - 0
src/composables/useAuth.js

@@ -0,0 +1,99 @@
+import { api } from "src/boot/axios";
+import { Cookies } from "quasar";
+import { permissionStore } from "src/stores/permission";
+import { userStore } from "src/stores/user";
+
+export const useAuth = () => {
+  const login = async (email, password) => {
+    try {
+      const response = await api.post("/login/owner", {
+        email:    email,
+        password: password,
+      });
+
+      if (response.status === 200) {
+        const payload = response.data.payload;
+
+        const accessTokenExpiresIn = new Date(
+          new Date().getTime() + payload.expires_in * 1000,
+        );
+
+        const refreshTokenExpiresIn = new Date(
+          new Date().getTime() + payload.refresh_token_expires_in * 1000,
+        );
+
+        Cookies.set("access_token", payload.access_token, {
+          expires: accessTokenExpiresIn,
+        });
+
+        Cookies.set("refresh_token", payload.refresh_token, {
+          expires: refreshTokenExpiresIn,
+        });
+
+        userStore().setUser(payload.user);
+
+        await permissionStore().fetchScopes();
+      }
+      return response;
+    } catch (error) {
+      return Promise.reject(error);
+    }
+  };
+
+  const logout = async () => {
+    try {
+      const response = await api.post("/logout");
+
+      if (response.status === 200) {
+        Cookies.remove("access_token");
+        Cookies.remove("refresh_token");
+
+        userStore().resetUser();
+
+        permissionStore().resetScopes();
+      }
+    } catch (error) {
+      console.error(error);
+    }
+  };
+
+  const refreshToken = async () => {
+    try {
+      const refresh_token = Cookies.get("refresh_token");
+
+      const response = await api.post("/refresh", {
+        refresh_token: refresh_token,
+      });
+
+      if (response.status === 200) {
+        const payload = response.data.payload;
+
+        const accessTokenExpiresIn = new Date(
+          new Date().getTime() + payload.expires_in * 1000,
+        );
+
+        const refreshTokenExpiresIn = new Date(
+          new Date().getTime() + payload.refresh_token_expires_in * 1000,
+        );
+
+        Cookies.set("access_token", payload.access_token, {
+          expires: accessTokenExpiresIn,
+        });
+
+        Cookies.set("refresh_token", payload.refresh_token, {
+          expires: refreshTokenExpiresIn,
+        });
+
+        userStore().setUser(payload.user);
+      }
+    } catch (error) {
+      return Promise.reject(error);
+    }
+  };
+
+  return {
+    login,
+    logout,
+    refreshToken,
+  };
+};

+ 60 - 0
src/composables/useInputRules.js

@@ -0,0 +1,60 @@
+import { useI18n } from "vue-i18n";
+
+export const useInputRules = () => {
+  const { t } = useI18n();
+
+  // Regex patterns
+  const emailPattern =
+    /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+
+  const cpfPattern      = /^[0-9]{3}\.[0-9]{3}\.[0-9]{3}-[0-9]{2}$/;
+  const cnpjPattern     = /^[0-9]{2}\.[0-9]{3}\.[0-9]{3}\/[0-9]{4}-[0-9]{2}$/;
+  const passwordPattern = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/;
+  const cepPattern      = /^[0-9]{5}-[0-9]{3}$/;
+
+  const inputRules = {
+    required:            (value) => !!value || t("validation.rules.required"),
+    requiredNumber:      (value) => !isNaN(value) || t("validation.rules.required"),
+    requiredHideMessage: (value) => !!value,
+
+    min: (min) => (value) =>
+      value?.length >= min ||
+      `${t("validation.rules.min")} ${min} ${t("validation.rules.characters")}`,
+
+    max: (max) => (value) =>
+      value?.length <= max ||
+      `${t("validation.rules.max")} ${max} ${t("validation.rules.characters")}`,
+
+    minValue: (min) => (value) => value >= min || `${t("validation.rules.min")} ${min}`,
+    maxValue: (max) => (value) => value <= max || `${t("validation.rules.max")} ${max}`,
+    email:    (value) => !value || emailPattern.test(value) || t("validation.rules.email"),
+
+    emails: (value) => {
+      if (!value) return true;
+
+      const emails = value.split(";").map((email) => email.trim());
+
+      return (
+        emails.every((email) => inputRules.email(email) === true) ||
+        t("validation.rules.email")
+      );
+    },
+
+    cpf:  (value) => !value || cpfPattern.test(value) || t("validation.rules.cpf"),
+    cnpj: (value) => !value || cnpjPattern.test(value) || t("validation.rules.cnpj"),
+
+    samePassword: (otherValue) => (value) =>
+      value === otherValue || t("validation.rules.same_password"),
+
+    password: (value) =>
+      !value || passwordPattern.test(value) || t("validation.rules.password"),
+
+    cep: (value) => {
+      return cepPattern.test(value) || t("validation.rules.cep");
+    },
+  };
+
+  return {
+    inputRules,
+  };
+};

+ 64 - 0
src/composables/useScroll.js

@@ -0,0 +1,64 @@
+import { unref } from 'vue'
+
+export const useScroll = () => {
+  /**
+   * Scrolls to a specific component within a scroll container
+   * @param {Ref<Component>} targetRef - Reference to the component to scroll to
+   * @param {Ref<Component>} containerRef - Reference to the Quasar ScrollArea component
+   * @param {Object} options - Scroll options
+   * @param {number} options.offset - Offset from the top in pixels (default: 50)
+   * @param {number} options.duration - Animation duration in milliseconds (default: 150)
+   * @returns {boolean} - Whether the scroll was successful
+   */
+  const scrollToComponent = (targetRef, containerRef, options = {}) => {
+    const {
+      offset   = 50,
+      duration = 150
+    } = options
+
+    const target    = unref(targetRef)
+    const container = unref(containerRef)
+
+    const targetElement = target?.$el
+
+    const containerElement = container?.$el
+
+    if (!targetElement || !containerElement) {
+      console.warn('useScroll: Target or container element not found')
+
+      return false
+    }
+
+    try {
+      let currentElement = targetElement
+
+      let offsetTop = 0
+
+      // Calculate total offset up to the scroll container
+      while (currentElement && currentElement !== containerElement) {
+        offsetTop += currentElement.offsetTop
+
+        currentElement = currentElement.offsetParent
+      }
+
+      if (!currentElement) {
+        console.warn('useScroll: Target is not a child of the container')
+
+        return false
+      }
+
+      const targetPosition = Math.max(0, offsetTop - offset)
+
+      container.setScrollPosition('vertical', targetPosition, duration)
+
+      return true
+    } catch (error) {
+      console.error('useScroll: Error while scrolling', error)
+      return false
+    }
+  }
+
+  return {
+    scrollToComponent
+  }
+}

+ 43 - 0
src/composables/useSubmitHandler.js

@@ -0,0 +1,43 @@
+import { ref } from "vue";
+
+export function useSubmitHandler(onSuccess) {
+  const loading      = ref(false);
+  const serverErrors = ref({});
+
+  const execute = async (apiCallThunk) => {
+    loading.value = true;
+
+    serverErrors.value = {};
+
+    try {
+      const response = await apiCallThunk();
+
+      if (onSuccess && typeof onSuccess === "function") {
+        onSuccess(response);
+      }
+    } catch (error) {
+      if (error.response?.status === 422) {
+        const errors = error.response.data.errors || {};
+
+        for (const key in errors) {
+          serverErrors.value[key] = errors[key][0];
+        }
+      } else {
+        console.error(
+          "An unexpected error occurred in useSubmitHandler:",
+          error,
+        );
+
+        throw error;
+      }
+    } finally {
+      loading.value = false;
+    }
+  };
+
+  return {
+    loading,
+    serverErrors,
+    execute,
+  };
+}

+ 124 - 0
src/css/app.scss

@@ -0,0 +1,124 @@
+@use "sass:map";
+@use "src/css/quasar.variables.scss";
+@import url('https://fonts.googleapis.com/css2?family=Rethink+Sans:ital,wght@0,400..800;1,400..800&display=swap');
+
+html {
+  font-size: 16px;
+}
+
+body {
+  font-family: "Rethink Sans", sans-serif;
+  color: $text;
+}
+
+.flex-grow {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: 0;
+}
+
+.round {
+  border-radius: 50%;
+}
+
+.self-center {
+  align-self: center;
+}
+
+.input-disable {
+  .q-field--outlined .q-field__control::before {
+    border: 1px solid #b9b9b9 !important;
+    transition: border-color 0.36s cubic-bezier(0.4, 0, 0.2, 1);
+  }
+}
+
+.q-toolbar {
+  position: relative;
+  padding: 0 12px;
+  min-height: 50px;
+  width: auto;
+}
+
+.q-drawer:has(.detached-container) {
+  margin: 16px !important;
+  margin-bottom: 16px !important;
+  margin-left: 10px !important;
+  border-radius: 6px !important;
+  transition: all;
+}
+
+body.body--light {
+  .q-drawer:has(.detached-container) {
+    box-shadow: 6px 5px 3px -3px rgba(0, 1, 1, 0.1);
+  }
+
+  background: #fff;
+}
+
+body.body--dark {
+  .q-drawer:has(.detached-container) {
+    background: #{map.get($colors-dark, "surface")} !important;
+  }
+
+  .q-menu {
+    background: #{map.get($colors-dark, "surface")};
+  }
+
+  background: #{map.get($colors-dark, "page")};
+}
+
+.q-card__actions .q-btn {
+  padding: 10px 16px;
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+  margin: 0;
+}
+
+.q-separator {
+  padding-top: 0px;
+  padding-left: 0;
+}
+
+.q-scrollarea__content {
+  display: flex;
+  flex-direction: column;
+  flex: 1 1 auto !important;
+}
+
+.border-style {
+  border: 1px solid $primary;
+}
+
+
+.q-field--outlined .q-field__control {
+  border-radius: 4px;
+}
+
+.q-tab--active .q-tab__label {
+  font-weight: bolder;
+}
+
+.btn-custom-default {
+  border: 1px solid black;
+  border-radius: 8px;
+}
+
+.radius-8 {
+  border-radius: 8px;
+}
+
+.btn-secondary {
+  background-color: #C7E852;
+  border: 1px solid #08514C;
+  border-radius: 8px;
+  color: #08514C;
+}
+
+.shadow-1 {
+  box-shadow: 0px 0px 4px 0px #00000040;
+}

+ 92 - 0
src/css/editor.scss

@@ -0,0 +1,92 @@
+@use "sass:map";
+@use "src/css/quasar.variables.scss";
+
+.q-editor-custom {
+  border: 1px solid rgba(0, 0, 0, 0.12);
+  border-radius: 4px;
+  background: #{map.get($colors, "surface")};
+}
+
+.q-editor-custom :deep(.q-editor__toolbar) {
+  border-bottom: 1px solid #e0e0e0;
+  background: #fafafa;
+}
+
+.q-editor-custom :deep(.q-editor__content) {
+  min-height: 200px;
+  padding: 16px;
+}
+
+.q-editor-custom :deep(.q-editor__content p) {
+  margin-bottom: 1rem;
+  line-height: 1.6;
+}
+
+.q-editor-custom :deep(.q-editor__content ul),
+.q-editor-custom :deep(.q-editor__content ol) {
+  margin: 1rem 0;
+  padding-left: 1.5rem;
+}
+
+.q-editor-custom :deep(.q-editor__content li) {
+  margin-bottom: 0.5rem;
+  line-height: 1.5;
+}
+
+.q-editor-custom :deep(.q-editor__content h1),
+.q-editor-custom :deep(.q-editor__content h2),
+.q-editor-custom :deep(.q-editor__content h3),
+.q-editor-custom :deep(.q-editor__content h4),
+.q-editor-custom :deep(.q-editor__content h5),
+.q-editor-custom :deep(.q-editor__content h6) {
+  margin-top: 1.5rem;
+  margin-bottom: 0.75rem;
+  font-weight: 600;
+}
+
+.q-editor-custom :deep(.q-editor__content h1) {
+  font-size: 1.75rem;
+}
+
+.q-editor-custom :deep(.q-editor__content h2) {
+  font-size: 1.5rem;
+}
+
+.q-editor-custom :deep(.q-editor__content h3) {
+  font-size: 1.25rem;
+}
+
+.q-editor-custom :deep(.q-editor__content blockquote) {
+  border-left: 4px solid #1976d2;
+  padding-left: 1rem;
+  margin: 1rem 0;
+  font-style: italic;
+  background-color: #f5f5f5;
+  padding: 1rem;
+  border-radius: 4px;
+}
+
+.q-editor-custom :deep(.q-editor__content a) {
+  color: #1976d2;
+  text-decoration: underline;
+}
+
+.q-editor-custom :deep(.q-editor__content a:hover) {
+  color: #1565c0;
+}
+
+.q-editor-custom :deep(.q-editor__content hr) {
+  margin: 1.5rem 0;
+  border: none;
+  border-top: 1px solid #e0e0e0;
+}
+
+@media (max-width: 768px) {
+  .q-editor-custom :deep(.q-editor__toolbar) {
+    flex-wrap: wrap;
+  }
+
+  .q-editor-custom :deep(.q-editor__toolbar .q-btn-group) {
+    margin: 2px;
+  }
+}

+ 118 - 0
src/css/quasar.variables.scss

@@ -0,0 +1,118 @@
+$primary: #08514C;
+$secondary: #C7E852;
+$accent: #e91e63;
+
+$dark: #1d1d1d;
+$text: #111212;
+
+$button-color: #9d9d9d;
+
+$positive: #2e7d32;
+$negative: #d32f2f;
+$info: #0288d1;
+$warning: #ed6c02;
+
+$colors: (
+  "primary": #08514C,
+  "secondary": #C7E852,
+
+  "text": #111212,
+  "text-2": #4D4E4E,
+  "text-3": #898989,
+
+  "primary-light": #42a5f5,
+  "primary-dark": #1565c0,
+  "primary-3": #84A8A6,
+
+  "secondary-light": #ba68c8,
+  "secondary-dark": #7b1fa2,
+  "terciary": #ff9800,
+  "terciary-light": #ffb74d,
+  "terciary-dark": #f57c00,
+
+  "page": #f1f1f1,
+
+  "surface": #F0F3F5,
+  "surface-light": #f5f5f5,
+  "surface-dark": #f1f1f1,
+
+  "default-background": #FFF,
+
+  "light-2": #555555,
+
+  "success": #59B259,
+
+  "error": #d32f2f,
+  "error-light": #ef5350,
+  "error-dark": #c62828,
+
+  "warning": #FFF001,
+
+  "info": #0288d1,
+  "info-light": #03a9f4,
+  "info-dark": #01579b,
+
+  "dark-blue": #0d214f,
+  "light-brown": #b68678,
+  "dark-brown": #613123
+);
+
+$colors-dark: (
+  "primary": #1976d2,
+  "primary-light": #42a5f5,
+  "primary-dark": #1565c0,
+
+  "dark": #1d1d1d,
+
+  "secondary": #ce93d8,
+  "secondary-light": #f3e5f5,
+  "secondary-dark": #ab47bc,
+
+  "terciary": #ffd191,
+  "terciary-light": #ffecb3,
+  "terciary-dark": #ffab40,
+
+  "page": #121212,
+
+  "surface": #1d1d1d,
+  "surface-light": #333333,
+  "surface-dark": #121212,
+
+  "text": #ffffff,
+
+  "success": #66bb6a,
+  "success-light": #81c784,
+  "success-dark": #388e3c,
+
+  "error": #f44336,
+  "error-light": #e57373,
+  "error-dark": #d32f2f,
+
+  "warning": #ffa726,
+  "warning-light": #ffb74d,
+  "warning-dark": #f57c00,
+
+  "info": #29b6f6,
+  "info-light": #4fc3f7,
+  "info-dark": #0288d1
+);
+
+@each $name, $color in $colors {
+  .text-#{$name} {
+    color: $color !important;
+  }
+  .bg-#{$name} {
+    background: $color !important;
+  }
+}
+
+.body--dark {
+  @each $name, $color in $colors-dark {
+    .text-#{$name} {
+      color: $color !important;
+    }
+    .bg-#{$name} {
+      background: $color !important;
+    }
+  }
+}

+ 206 - 0
src/css/table.scss

@@ -0,0 +1,206 @@
+@use "sass:map";
+@use "src/css/quasar.variables.scss";
+.softpar-table {
+  padding-left: 16px !important;
+  padding-right: 16px !important;
+
+  .body--dark & {
+    --table-bg-color: #{map.get($colors-dark, "default-background")}; // Using our dark background
+    --table-border-color: #{map.get($colors-dark, "surface-light")}; // Darker border
+    --table-header-color: #{map.get($colors-dark, "text")}; // Light text for dark mode
+  }
+
+  .body--light & {
+    --table-bg-color: #{map.get($colors, "default-background")}; // Light background
+    --table-border-color: #{map.get($colors, "surface-light")}; // Border color
+    --table-header-color: #{map.get($colors, "text")}; // Dark text for light mode
+  }
+
+  :deep(.q-table) {
+    thead tr:first-child th {
+      background-color: $primary !important;
+    }
+
+    thead tr th {
+      text-transform: uppercase;
+      position: sticky;
+      z-index: 1;
+    }
+
+    thead tr:first-child th {
+      top: 0;
+    }
+
+    &.q-table--loading thead tr:last-child th {
+      top: 48px;
+    }
+  }
+
+  td {
+    background-color: white;
+}
+
+  tr {
+    background-color: #{map.get($colors, "surface")};
+  }
+
+  .q-table__middle {
+    border: none;
+    border-radius: 4px;
+  }
+
+  .q-table__top {
+    padding-top: 16px;
+    padding-left: 0px;
+    padding-right: 0px;
+    padding-bottom: 16px;;
+  }
+
+  .q-table th {
+    font-weight: normal;
+    font-family: "Roboto";
+    font-style: normal;
+    font-weight: 500;
+    font-size: 14px;
+    line-height: 16px;
+    letter-spacing: 0.1px;
+    color: var(--table-header-color);
+    background-color: var(--table-surface);
+  }
+}
+
+.ativo {
+  justify-content: center;
+  padding: 5px 12px;
+  gap: 10px;
+  border-radius: 24px;
+  width: fit-content;
+  margin-right: auto;
+  margin-left: auto;
+
+  .body--dark & {
+    background: none;
+    border: 1px solid #{map.get($colors, "positive-1")};
+  }
+
+  .body--light & {
+    background: #{map.get($colors, "positive-1")};
+    border: none;
+  }
+}
+
+.inativo {
+  justify-content: center;
+  padding: 5px 12px;
+  gap: 10px;
+  border-radius: 24px;
+  width: fit-content;
+  margin-right: auto;
+  margin-left: auto;
+
+  .body--dark & {
+    background: none;
+    border: 1px solid #{map.get($colors, "negative-1")};
+  }
+
+  .body--light & {
+    background: #{map.get($colors, "negative-1")};
+    border: none;
+  }
+}
+
+.rejeitado {
+  justify-content: center;
+  padding: 5px 12px;
+  gap: 10px;
+  border-radius: 24px;
+  width: fit-content;
+  margin-right: auto;
+  margin-left: auto;
+
+  .body--dark & {
+    background: none;
+    border: 1px solid #{map.get($colors, "negative-1")};
+  }
+
+  .body--light & {
+    background: #{map.get($colors, "negative-1")};
+    border: none;
+  }
+}
+
+.gerado {
+  justify-content: center;
+  padding: 5px 12px;
+  gap: 10px;
+  border-radius: 24px;
+  width: fit-content;
+  margin-right: auto;
+  margin-left: auto;
+
+  .body--dark & {
+    background: none;
+    border: 1px solid #{map.get($colors, "primary-1")};
+  }
+
+  .body--light & {
+    background: #{map.get($colors, "primary-1")};
+    border: none;
+  }
+}
+
+.pendente {
+  justify-content: center;
+  padding: 5px 12px;
+  gap: 10px;
+  border-radius: 24px;
+  width: fit-content;
+  margin-right: auto;
+  margin-left: auto;
+
+  .body--dark & {
+    background: none;
+    border: 1px solid #{map.get($colors, "warning")};
+  }
+
+  .body--light & {
+    background: #{map.get($colors, "warning")};
+    border: none;
+  }
+}
+
+.table-bottom {
+  .q-table__top {
+    .body--light & {
+      background: #{map.get($colors, "page")};
+    }
+
+    .body--dark & {
+      background: #{map.get($colors, "background-3")};
+    }
+  }
+
+  .q-table__bottom {
+    .body--light & {
+      background: #{map.get($colors, "page")};
+    }
+
+    .body--dark & {
+      background: #{map.get($colors, "background-3")};
+    }
+  }
+}
+
+.q-table__grid-item-card {
+  .body--light & {
+    background: #{map.get($colors, "dark")};
+  }
+
+  .body--dark & {
+    background: #{map.get($colors, "background-3")};
+  }
+}
+
+.q-table thead, .q-table tr, .q-table th, .q-table td {
+  border: none
+}

+ 59 - 0
src/helpers/convertBase64Image.js

@@ -0,0 +1,59 @@
+const base64ToJPEG = (base64String, fileName) => {
+  // Remova a parte inicial "data:image/jpeg;base64,"
+  const base64WithoutHeader = base64String.replace(
+    /^data:image\/jpeg;base64,/,
+    ""
+  );
+
+  // Converte a string base64 para um array de bytes
+  const byteCharacters = atob(base64WithoutHeader);
+  const byteNumbers = new Array(byteCharacters.length);
+  for (let i = 0; i < byteCharacters.length; i++) {
+    byteNumbers[i] = byteCharacters.charCodeAt(i);
+  }
+  const byteArray = new Uint8Array(byteNumbers);
+
+  // Cria um objeto Blob contendo os dados da imagem
+  const blob = new Blob([byteArray], { type: "image/png" });
+
+  // Cria um link para download
+  const link = document.createElement("a");
+  link.href = URL.createObjectURL(blob);
+  link.download = fileName || "image.png";
+
+  // Adiciona o link ao documento, clica nele e remove-o
+  document.body.appendChild(link);
+  link.click();
+  document.body.removeChild(link);
+};
+
+const base64ToPNG = (base64String, fileName) => {
+  // Remova a parte inicial "data:image/jpeg;base64,"
+  const base64WithoutHeader = base64String.replace(
+    /^data:image\/png;base64,/,
+    ""
+  );
+
+  // Converte a string base64 para um array de bytes
+  const byteCharacters = atob(base64WithoutHeader);
+  const byteNumbers = new Array(byteCharacters.length);
+  for (let i = 0; i < byteCharacters.length; i++) {
+    byteNumbers[i] = byteCharacters.charCodeAt(i);
+  }
+  const byteArray = new Uint8Array(byteNumbers);
+
+  // Cria um objeto Blob contendo os dados da imagem
+  const blob = new Blob([byteArray], { type: "image/png" });
+
+  // Cria um link para download
+  const link = document.createElement("a");
+  link.href = URL.createObjectURL(blob);
+  link.download = fileName || "image.png";
+
+  // Adiciona o link ao documento, clica nele e remove-o
+  document.body.appendChild(link);
+  link.click();
+  document.body.removeChild(link);
+}
+
+export { base64ToJPEG, base64ToPNG };

+ 29 - 0
src/helpers/masks.js

@@ -0,0 +1,29 @@
+// # -> number
+// S -> letra (case insensitive)
+// N -> alphanumerico (case insensitive)
+// A -> letra (maiuscula)
+// a -> letra (minuscula)
+// X -> alphanumerico (maiusculo)
+// x -> alphanumerico (minusculo)
+const masks = {
+  Brasil: {
+    cpf: "###.###.###-##",
+    docEmpresa: "##.###.###/####-##",
+    celular: "(##) # ####-####",
+    telefone: "(##) ####-####",
+    cep: "#####-###",
+    cnpj: "##.###.###/####-##",
+    date: "##/##/####",
+    datetime: "##/##/#### ##:##",
+  },
+  Paraguay: {
+    celular: "(###) ###-###",
+    telefone: "## ### ###",
+    docEmpresa: "#######-#",
+  },
+  placasVeiculo: {
+    Brasil: "AAA-#X##",
+  }
+};
+
+export default masks;

+ 286 - 0
src/helpers/utils.js

@@ -0,0 +1,286 @@
+import { useI18n } from "vue-i18n";
+
+/**
+ * @description Corta uma string em um determinado tamanho.
+ * @param {string} string string a ser cortada.
+ * @param {string} size tamanho da string.
+ * @returns {string} string cortada.
+ */
+const excerpt = (string, size = 30) => {
+  if (size == null) return string;
+  if (string.length > size) {
+    string = string.substring(0, size) + "...";
+  }
+  return string;
+};
+
+/**
+ * @description Formata uma data de DD/MM/YYYY para YYYY-MM-DD
+ * @param {string} date data.
+ * @param {string} time tempo.
+ * @throws {Error} Caso a data seja nula ou invalida.
+ * @returns {string} data formatada.
+ */
+const formatDateDMYtoYMD = (date, time) => {
+  if (!date) throw new Error(useI18n().t("validation.rules.required"));
+  const testDate =
+    /^([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{4}$/;
+  if (testDate.test(date) === false)
+    throw new Error(useI18n().t("validation.rules.date"));
+
+  const [day, month, year] = date.split("/");
+  return `${year}-${month}-${day} ${time ? time : ""}`;
+};
+
+/**
+ * @description Converte uma data e hora para o formato brasileiro.
+ * @param {string} dateTimeString data e hora.
+ * @returns {string} data e hora no formato brasileiro.
+ * @throws {Error} Caso a data seja nula ou invalida.
+ * @returns {string} data formatada.
+ * @example
+ * // convertDateTime("2023-05-23T13:07:27.000000Z");
+ * // Output: 23/05/2023 10:07:27
+ */
+const convertDateTime = (dateTimeString) => {
+  const dateTime = new Date(dateTimeString);
+  const options = {
+    timeZone: "America/Sao_Paulo",
+    day: "2-digit",
+    month: "2-digit",
+    year: "numeric",
+    hour: "2-digit",
+    minute: "2-digit",
+    second: "2-digit",
+  };
+  const formattedDateTime = dateTime
+    .toLocaleString("pt-BR", options)
+    .replace(",", "");
+  return formattedDateTime;
+};
+
+/**
+ * @description Formata uma data de YYYY-MM-DD para DD/MM/YYYY
+ * @param {string} dateTime data e hora.
+ * @returns {string} data e hora no formato brasileiro.
+ * @example
+ * // formatDateYMDtoDMY("2023-05-23T13:07:27.000000Z");
+ * // Output: 23/05/2023 10:07:27
+ */
+const formatDateYMDtoDMY = (dateTime) => {
+  const [datePart, timePart] = dateTime.split(" ");
+  const [year, month, day] = datePart.split("-");
+  const formattedDate = `${day}/${month}/${year}`;
+  if (timePart) {
+    const [hours, minutes, seconds] = timePart.split(":");
+    const formattedTime = `${hours}:${minutes}:${seconds}`;
+    return `${formattedDate} ${formattedTime}`;
+  }
+  return formattedDate;
+};
+
+/**
+ * @description Checa a moeda selecionada.
+ * @param {number} moeda moeda selecionada.
+ * @returns {object} opções de moeda.
+ */
+const checaMoeda = (moeda) => {
+  let currencyOptions = {};
+  if (moeda == 1) {
+    currencyOptions = {
+      locale: "pt-BR",
+      currency: "BRL",
+      currencyDisplay: "symbol",
+      hideCurrencySymbolOnFocus: false,
+      hideGroupingSeparatorOnFocus: false,
+      hideNegligibleDecimalDigitsOnFocus: false,
+      autoDecimalDigits: true,
+      useGrouping: true,
+      accountingSign: false,
+    };
+  } else if (moeda == 2) {
+    currencyOptions = {
+      currency: "PYG",
+      locale: "es-PY",
+      valueAsInteger: true,
+      distractionFree: true,
+      precision: 0,
+      autoDecimalMode: true,
+      valueRange: { min: 0 },
+      allowNegative: true,
+    };
+  } else if (moeda == 3) {
+    currencyOptions = {
+      locale: "en-US",
+      currency: "USD",
+      currencyDisplay: "symbol",
+      hideCurrencySymbolOnFocus: true,
+      hideGroupingSeparatorOnFocus: true,
+      hideNegligibleDecimalDigitsOnFocus: false,
+      autoDecimalDigits: true,
+      useGrouping: true,
+      accountingSign: false,
+    };
+  }
+  return currencyOptions;
+};
+
+/**
+ * @description Filtra a moeda.
+ * @param {number} value valor.
+ * @returns {string} valor formatado.
+ */
+const filterCurrency = (value) => {
+  if (value) {
+    value = parseFloat(value);
+    return value.toLocaleString("pt-BR", {
+      style: "currency",
+      currency: "BRL",
+    });
+  }
+  return value;
+};
+
+/**
+ * @description Filtra a unidade de medida.
+ * @param {number} value valor.
+ * @returns {string} valor formatado.
+ */
+const filterUnidadeMedida = (value) => {
+  return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
+};
+
+/**
+ * @description Valida se a data é válida.
+ * @param {string} date data.
+ * @returns {boolean} true se a data é válida, false caso contrário.
+ */
+const validaData = (date) => {
+  const regex = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/\d{4}$/;
+  return regex.test(date);
+};
+
+/**
+ * @description Valida se a hora é válida.
+ * @param {string} time hora.
+ * @returns {boolean} true se a hora é válida, false caso contrário.
+ */
+const validaHora = (time) => {
+  const regex = /^([0-1][0-9]|2[0-3]):[0-5][0-9]$/;
+  return regex.test(time);
+};
+
+/**
+ * @description Valida se a data e hora são válidas.
+ * @param {string} dataHora data e hora.
+ * @returns {boolean} true se a data e hora são válidas, false caso contrário.
+ */
+const validaDataHora = (dataHora) => {
+  const regex =
+    /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/\d{4}\s([0-1][0-9]|2[0-3]):[0-5][0-9]$/;
+  return regex.test(dataHora);
+};
+
+/**
+ * @description Formata a quantidade.
+ * @param {number} value valor.
+ * @returns {string} valor formatado.
+ */
+const formatQuantity = (value) => {
+  if (value) {
+    return value
+      .toString()
+      .replace(/[^0-9]/g, "")
+      .replace(/\B(?=(\d{3})+(?!\d))/g, ".");
+  }
+  return value;
+};
+
+/**
+ * @description Formata a moeda.
+ * @param {number} value valor.
+ * @returns {string} valor formatado.
+ */
+const formatCurrency = (value) => {
+  if (value != null) {
+    value = parseFloat(value);
+    return value.toLocaleString("pt-BR", {
+      minimumFractionDigits: 2,
+      style: "currency",
+      currency: "BRL",
+    });
+  }
+  return value;
+};
+
+const truncatedName = (name) => {
+  if (name.length <= 15) return name;
+  const extension = name.split(".").pop();
+  const nameWithoutExt = name.substring(0, name.lastIndexOf("."));
+  return `${nameWithoutExt.substring(0, 8)}...${extension}`;
+};
+
+const convertToCents = (value) => {
+  if (value === null || value === undefined || value === "") return null;
+
+  if (typeof value === "number") {
+    return Math.round(value * 100);
+  }
+
+  if (typeof value === "string") {
+    const cleanValue = value.replace(/[R$\s.]/g, "").replace(",", ".");
+    const numericValue = parseFloat(cleanValue);
+    return isNaN(numericValue) ? null : Math.round(numericValue * 100);
+  }
+
+  return null;
+};
+
+/**
+ * Mascara um número de CPF, exibindo apenas os três primeiros e os dois últimos dígitos.
+ * A função lida com CPFs formatados (ex: '123.456.789-00') ou apenas com números.
+ *
+ * @param {string | null | undefined} cpf O CPF a ser mascarado.
+ * @returns {string} O CPF mascarado (ex: '123.***.***-00') ou uma string vazia se a entrada for inválida.
+ *
+ * @example
+ * maskCpf('12345678900'); // '123.***.***-00'
+ * maskCpf('123.456.789-00'); // '123.***.***-00'
+ * maskCpf(null); // ''
+ */
+export const maskCpf = (cpf) => {
+  if (!cpf) {
+    return "";
+  }
+
+  const cleanedCpf = String(cpf).replace(/\D/g, "");
+
+  if (cleanedCpf.length !== 11) {
+    console.warn(
+      "CPF inválido fornecido para a máscara. Retornando valor original.",
+    );
+    return cpf;
+  }
+
+  const firstPart = cleanedCpf.slice(0, 3);
+  const lastPart = cleanedCpf.slice(9, 11);
+
+  return `${firstPart}.***.***-${lastPart}`;
+};
+
+export {
+  formatDateDMYtoYMD,
+  formatDateYMDtoDMY,
+  excerpt,
+  convertDateTime,
+  checaMoeda,
+  filterCurrency,
+  filterUnidadeMedida,
+  validaData,
+  validaHora,
+  validaDataHora,
+  formatQuantity,
+  formatCurrency,
+  truncatedName,
+  convertToCents,
+};

+ 33 - 0
src/i18n/index.js

@@ -0,0 +1,33 @@
+import en from "./locales/en.json";
+import pt from "./locales/pt.json";
+import es from "./locales/es.json";
+
+export default {
+  "en": en,
+  "en-us": en,
+  "en-gb": en,
+  "en-US": en,
+  "en-GB": en,
+  "EN": en,
+  "EN-US": en,
+  "EN-GB": en,
+  "pt": pt,
+  "pt-br": pt,
+  "pt-pt": pt,
+  "pt-BR": pt,
+  "pt-PT": pt,
+  "PT": pt,
+  "PT-BR": pt,
+  "PT-PT": pt,
+  "es": es,
+  "es-es": es,
+  "es-mx": es,
+  "es-ar": es,
+  "es-ES": es,
+  "es-MX": es,
+  "es-AR": es,
+  "ES": es,
+  "ES-ES": es,
+  "ES-MX": es,
+  "ES-AR": es,
+};

+ 351 - 0
src/i18n/locales/en.json

@@ -0,0 +1,351 @@
+{
+  "common": {
+    "actions": {
+      "save": "Save",
+      "cancel": "Cancel",
+      "edit": "Edit",
+      "add": "Add",
+      "search": "Search",
+      "delete": "Delete",
+      "view": "View",
+      "back": "Back",
+      "next": "Next",
+      "resend_email": "Resend email",
+      "download_certificate": "Download certificate",
+      "download_boleto": "Download Boleto",
+      "copy_paste_code": "Copy and paste the code below to make the payment"
+    },
+    "terms": {
+      "name": "Name",
+      "email": "Email",
+      "password": "Password",
+      "description": "Description",
+      "date": "Date",
+      "start_date": "Start Date",
+      "end_date": "End Date",
+      "code": "Code",
+      "title": "Title",
+      "status": "Status",
+      "price": "Price",
+      "quantity": "Quantity",
+      "city": "City",
+      "state": "State",
+      "country": "Country",
+      "address": "Address",
+      "address_number": "Address Number",
+      "complement": "Complement",
+      "postal_code": "Postal Code",
+      "phone": "Phone",
+      "document": "Document",
+      "document_type": "Document Type",
+      "cpf": "CPF",
+      "cnpj": "CNPJ",
+      "cep": "ZIP Code",
+      "order_number": "Order Number",
+      "order_amount": "Order Amount",
+      "total_amount": "Total Amount",
+      "payment": "Payment",
+      "payment_method": "Payment Method",
+      "payment_date": "Payment Date",
+      "payment_amount": "Payment Amount",
+      "language": "Language",
+      "currency": "Currency",
+      "interests": "Interests",
+      "avatar": "Avatar",
+      "banner": "Banner",
+      "logo": "Logo",
+      "media": "Media",
+      "certificate": "Certificate",
+      "version": "Version"
+    },
+    "status": {
+      "active": "Active",
+      "inactive": "Inactive",
+      "canceled": "Canceled",
+      "loading": "Please wait...",
+      "yes": "Yes",
+      "no": "No"
+    },
+    "ui": {
+      "file": {
+        "choose": "Choose a file",
+        "click_select": "Click to select a file",
+        "click_select_image": "Click to select an image",
+        "drag": "Drag",
+        "drag_and_drop": "Drag and drop the file here",
+        "drag_here": "Drag the file here",
+        "selected": "File selected"
+      },
+      "table": {
+        "rows_per_page": "Rows per page",
+        "of": "of",
+        "to": "to"
+      },
+      "messages": {
+        "copied_to_clipboard": "Copied to clipboard",
+        "confirm_action": "Are you sure?",
+        "welcome": "Welcome",
+        "enjoy_the_event": "Enjoy the event!"
+      },
+      "misc": {
+        "all": "All",
+        "or": "or",
+        "example": "Example",
+        "options": "Options",
+        "total": "Total",
+        "type": "Tipo"
+      }
+    },
+    "metadata": {
+      "created_at": "Created at",
+      "updated_at": "Updated at",
+      "created_by": "Created by"
+    }
+  },
+  "auth": {
+    "login": "Login",
+    "logout": "Logout",
+    "registration": "Registration",
+    "confirm_password": "Confirm Password",
+    "agreed_terms": "I agree with the terms",
+    "agreed_privacy": "I agree with the privacy policy"
+  },
+  "business": {
+    "advertise": "Advertise",
+    "my_advertisements": "My Advertisements",
+    "negotiations": "Negotiations",
+    "opportunities": "Opportunities",
+    "plans": "Plans"
+  },
+  "validation": {
+    "rules": {
+      "required": "This field is required",
+      "email": "This field must be a valid email | These fields must be valid emails",
+      "date": "This field must be a valid date",
+      "min": "This field must have at least",
+      "max": "This field must have at most",
+      "characters": "characters",
+      "password": "Password must have at least 6 characters, one uppercase letter, one lowercase letter and one number",
+      "same_password": "Passwords must match",
+      "cpf": "This field must be a valid CPF",
+      "cnpj": "This field must be a valid CNPJ",
+      "cep": "This field must be a valid ZIP code",
+      "value_smaller_than_zero": "Value cannot be less than zero"
+    },
+    "permissions": {
+      "view": "You don't have permission to view this",
+      "create": "You don't have permission to create this",
+      "edit": "You don't have permission to edit this",
+      "delete": "You don't have permission to delete this",
+      "add": "You don't have permission to add this"
+    }
+  },
+  "http": {
+    "errors": {
+      "404": "Page not found",
+      "failed": "The action failed",
+      "no_records_found": "No records found"
+    },
+    "success": "The action was successful"
+  },
+  "events": {
+    "singular": "Event",
+    "plural": "Events",
+    "core": {
+      "basic_information": "Basic Information",
+      "schedule": "Schedule",
+      "opening": "Opening",
+      "total_capacity": "Total Capacity",
+      "unique_code": "Unique Code",
+      "unique_code_hint": "This code is automatically generated",
+      "list_of_allowed_documents": "List of allowed documents"
+    },
+    "tickets": {
+      "singular": "Ticket",
+      "plural": "Tickets",
+      "types_singular": "Ticket Type",
+      "types_plural": "Ticket Types",
+      "event_ticket": "Event Ticket",
+      "event_tickets": "Event Tickets",
+      "event_ticket_types": "Event Ticket Types",
+      "sales_start_date": "Sales Start Date",
+      "sales_end_date": "Sales End Date",
+      "max_per_user": "Maximum Tickets per User",
+      "max_per_user_hint": "0 for unlimited",
+      "quantity_available": "Available Quantity",
+      "quantity_sold": "Quantity Sold"
+    },
+    "location": {
+      "singular": "Location"
+    },
+    "attendance": {
+      "participant_singular": "Participant",
+      "participant_plural": "Participants",
+      "checked_in_at": "Checked in at",
+      "is_checked_in": "Is checked in"
+    }
+  },
+  "user": {
+    "singular": "User",
+    "plural": "Users",
+    "profile": {
+      "singular": "Profile",
+      "name_and_surname": "Name and Surname",
+      "birth_date": "Birth Date",
+      "personal_information": "Personal Information"
+    },
+    "preferences": {
+      "singular": "Preferences"
+    }
+  },
+  "orders": {
+    "singular": "Order",
+    "plural": "Orders",
+    "core": {
+      "new_order": "New Order",
+      "payment_received": "Payment Received",
+      "resume": "Order Resume",
+      "buyer_information": "Buyer Information",
+      "participant_information": "Participant Information",
+      "same_as_buyer": "Same as buyer",
+      "select_at_least_one_ticket": "Select at least one ticket",
+      "select_payment_method": "Select a payment method",
+      "exclusive_list": "Exclusive list",
+      "successful_payment": "Successful payment"
+    },
+    "statuses": {
+      "paid": "Paid",
+      "pending": "Pending",
+      "approved": "Approved",
+      "canceled": "Canceled",
+      "completed": "Completed",
+      "confirmed": "Confirmed",
+      "confirmation": "Confirmation"
+    },
+    "payment_methods": {
+      "credit_card": "Credit Card",
+      "boleto": "Boleto",
+      "pix": "Pix"
+    }
+  },
+  "ui": {
+    "navigation": {
+      "collapse_menu": "Collapse menu",
+      "expand_menu": "Expand menu",
+      "dashboard": "Dashboard",
+      "explore": "Explore",
+      "advertise": "Advertise",
+      "my_advertisements": "My Advertisements",
+      "negotiations": "Negotiations",
+      "opportunities": "Opportunities",
+      "plans": "Plans",
+      "events": "Events",
+      "event_tickets": "Event Tickets",
+      "event_ticket_types": "Event Ticket Types",
+      "orders": "Orders",
+      "sales": "Sales",
+      "participants": "Participants",
+      "users": "Users",
+      "profile": "Profile",
+      "interests": "Interests",
+      "registration": "Registration",
+      "wallet": "Wallet",
+      "settings": "Settings",
+      "city": "City",
+      "state": "State",
+      "country": "Country",
+      "exit": "Exit"
+    }
+  },
+  "property": {
+    "filters": {
+      "statusLabel": "Availability status",
+      "clear": "Clear filter"
+    },
+    "buttons": {
+      "changeStatus": "Change status",
+      "viewHistory": "View history"
+    },
+    "dialogs": {
+      "changeStatus": {
+        "title": "Update availability status",
+        "statusLabel": "Status",
+        "reasonLabel": "Reason",
+        "reasonRequired": "Please provide a reason.",
+        "cancel": "Cancel",
+        "save": "Save"
+      },
+      "history": {
+        "title": "Status history",
+        "empty": "No history recorded for this advertisement.",
+        "close": "Close",
+        "clear": "Clear selection"
+      }
+    },
+    "messages": {
+      "basePriceSaved": "Base price updated"
+    },
+    "columns": {
+      "status": "Status",
+      "history": "History",
+      "basePrice": "Base price"
+    },
+    "status": {
+      "available": "Available",
+      "permanently_unavailable": "Permanently unavailable",
+      "temporarily_unavailable": "Temporarily unavailable"
+    }
+  },
+  "settings": {
+    "tabs": {
+      "users": "Users",
+      "user_types": "User Types"
+    },
+    "users": {
+      "single": "User",
+      "plural": "Users",
+      "create_title": "New user",
+      "edit_title": "Edit user",
+      "form_description": "Define the user data and the type it will receive.",
+      "password_optional_hint": "Fill only if you want to change it.",
+      "created_at": "Created at",
+      "actions": "Actions"
+    },
+    "user_types": {
+      "single": "User Type",
+      "plural": "User Types",
+      "create_title": "New user type",
+      "edit_title": "Permissions for {userType}",
+      "create_description": "Create a new user type and select the desired permissions.",
+      "edit_description": "Select the allowed bits in the permissions tree.",
+      "description": "User type name",
+      "permissions": "Permissions",
+      "actions": "Actions",
+      "locked": "Locked",
+      "editable": "Editable",
+      "readonly_banner": "Admin and manager permissions are read-only.",
+      "selected_permissions": "{count} selected permissions",
+      "types": {
+        "admin": "Administrator",
+        "guest": "Guest",
+        "owner": "Owner",
+        "receptionist": "Receptionist",
+        "customer": "Customer",
+        "provider": "Provider",
+        "manager": "Manager",
+        "agent": "Agent"
+      }
+    },
+    "permissions": {
+      "read": "Read",
+      "create": "Create",
+      "edit": "Edit",
+      "delete": "Delete",
+      "print": "Print",
+      "export": "Export",
+      "import": "Import",
+      "limit": "Limit",
+      "menu": "Menu"
+    }
+  }
+}

+ 351 - 0
src/i18n/locales/es.json

@@ -0,0 +1,351 @@
+{
+  "common": {
+    "actions": {
+      "save": "Guardar",
+      "cancel": "Cancelar",
+      "edit": "Editar",
+      "add": "Añadir",
+      "search": "Buscar",
+      "delete": "Eliminar",
+      "view": "Ver",
+      "back": "Volver",
+      "next": "Siguiente",
+      "resend_email": "Reenviar correo electrónico",
+      "download_certificate": "Descargar certificado",
+      "download_boleto": "Descargar Boleto/Recibo",
+      "copy_paste_code": "Copia y pega el código a continuación para realizar el pago"
+    },
+    "terms": {
+      "name": "Nombre",
+      "email": "Correo Electrónico",
+      "password": "Contraseña",
+      "description": "Descripción",
+      "date": "Fecha",
+      "start_date": "Fecha de Inicio",
+      "end_date": "Fecha de Fin",
+      "code": "Código",
+      "title": "Título",
+      "status": "Estado",
+      "price": "Precio",
+      "quantity": "Cantidad",
+      "city": "Ciudad",
+      "state": "Estado/Provincia",
+      "country": "País",
+      "address": "Dirección",
+      "address_number": "Número",
+      "complement": "Complemento",
+      "postal_code": "Código Postal",
+      "phone": "Teléfono",
+      "document": "Documento",
+      "document_type": "Tipo de Documento",
+      "cpf": "CPF/Identificación Fiscal",
+      "cnpj": "CNPJ/Identificación Fiscal Empresa",
+      "cep": "Código Postal",
+      "order_number": "Número de Pedido",
+      "order_amount": "Importe del Pedido",
+      "total_amount": "Importe Total",
+      "payment": "Pago",
+      "payment_method": "Método de Pago",
+      "payment_date": "Fecha de Pago",
+      "payment_amount": "Importe del Pago",
+      "language": "Idioma",
+      "currency": "Moneda",
+      "interests": "Intereses",
+      "avatar": "Avatar",
+      "banner": "Banner",
+      "logo": "Logo",
+      "media": "Medios",
+      "certificate": "Certificado",
+      "version": "Versión"
+    },
+    "status": {
+      "active": "Activo",
+      "inactive": "Inactivo",
+      "canceled": "Cancelado",
+      "loading": "Por favor espere...",
+      "yes": "Sí",
+      "no": "No"
+    },
+    "ui": {
+      "file": {
+        "choose": "Elige un archivo",
+        "click_select": "Haz clic para seleccionar un archivo",
+        "click_select_image": "Haz clic para seleccionar una imagen",
+        "drag": "Arrastra",
+        "drag_and_drop": "Arrastra y suelta el archivo aquí",
+        "drag_here": "Arrastra el archivo aquí",
+        "selected": "Archivo seleccionado"
+      },
+      "table": {
+        "rows_per_page": "Filas por página",
+        "of": "de",
+        "to": "a"
+      },
+      "messages": {
+        "copied_to_clipboard": "Copiado al portapapeles",
+        "confirm_action": "¿Estás seguro?",
+        "welcome": "Bienvenido(a)",
+        "enjoy_the_event": "¡Disfruta del evento!"
+      },
+      "misc": {
+        "all": "Todos",
+        "or": "o",
+      "messages": {
+        "basePriceSaved": "Precio base actualizado"
+      },
+        "example": "Ejemplo",
+        "options": "Opciones",
+        "total": "Total",
+        "type": "Tipo"
+      }
+    },
+    "metadata": {
+      "created_at": "Creado el",
+      "updated_at": "Actualizado el",
+      "created_by": "Creado por"
+    }
+  },
+  "auth": {
+    "login": "Iniciar Sesión",
+    "logout": "Cerrar Sesión",
+    "registration": "Registro",
+    "confirm_password": "Confirmar Contraseña",
+    "agreed_terms": "Acepto los términos",
+    "agreed_privacy": "Acepto la política de privacidad"
+  },
+  "business": {
+    "advertise": "Anunciar",
+    "my_advertisements": "Mis Anuncios",
+    "negotiations": "Negociaciones",
+    "opportunities": "Oportunidades",
+    "plans": "Planes"
+  },
+  "validation": {
+    "rules": {
+      "required": "Este campo es obligatorio",
+      "email": "Este campo debe ser un correo electrónico válido | Estos campos deben ser correos electrónicos válidos",
+      "date": "Este campo debe ser una fecha válida",
+      "min": "Este campo debe tener al menos",
+      "max": "Este campo debe tener como máximo",
+      "characters": "caracteres",
+      "password": "La contraseña debe tener al menos 6 caracteres, una letra mayúscula, una letra minúscula y un número",
+      "same_password": "Las contraseñas deben coincidir",
+      "cpf": "Este campo debe ser un CPF/Identificación Fiscal válido",
+      "cnpj": "Este campo debe ser un CNPJ/Identificación Fiscal de Empresa válido",
+      "cep": "Este campo debe ser un Código Postal válido",
+      "value_smaller_than_zero": "El valor no puede ser menor que cero"
+    },
+    "permissions": {
+      "view": "No tienes permiso para ver esto",
+      "create": "No tienes permiso para crear esto",
+      "edit": "No tienes permiso para editar esto",
+      "delete": "No tienes permiso para eliminar esto",
+      "add": "No tienes permiso para añadir esto"
+    }
+  },
+  "http": {
+    "errors": {
+      "404": "Página no encontrada",
+      "failed": "La acción falló",
+      "no_records_found": "No se encontraron registros"
+    },
+    "success": "La acción se realizó con éxito"
+  },
+  "events": {
+    "singular": "Evento",
+    "plural": "Eventos",
+    "core": {
+      "basic_information": "Información Básica",
+      "schedule": "Programa",
+      "opening": "Apertura",
+      "total_capacity": "Capacidad Total",
+      "unique_code": "Código Único",
+      "unique_code_hint": "Este código se genera automáticamente",
+      "list_of_allowed_documents": "Lista de documentos permitidos"
+    },
+    "tickets": {
+      "singular": "Entrada",
+      "plural": "Entradas",
+      "types_singular": "Tipo de Entrada",
+      "types_plural": "Tipos de Entrada",
+      "event_ticket": "Entrada del Evento",
+      "event_tickets": "Entradas del Evento",
+      "event_ticket_types": "Tipos de Entrada del Evento",
+      "sales_start_date": "Fecha de Inicio de Ventas",
+      "sales_end_date": "Fecha de Fin de Ventas",
+      "max_per_user": "Máximo de Entradas por Usuario",
+      "max_per_user_hint": "0 para ilimitado",
+      "quantity_available": "Cantidad Disponible",
+      "quantity_sold": "Cantidad Vendida"
+    },
+    "location": {
+      "singular": "Ubicación"
+    },
+    "attendance": {
+      "participant_singular": "Participante",
+      "participant_plural": "Participantes",
+      "checked_in_at": "Check-in realizado el",
+      "is_checked_in": "Check-in realizado"
+    }
+  },
+  "user": {
+    "singular": "Usuario",
+    "plural": "Usuarios",
+    "profile": {
+      "singular": "Perfil",
+      "name_and_surname": "Nombre y Apellido",
+      "birth_date": "Fecha de Nacimiento",
+      "personal_information": "Información Personal"
+    },
+    "preferences": {
+      "singular": "Preferencias"
+    }
+  },
+  "orders": {
+    "singular": "Pedido",
+    "plural": "Pedidos",
+    "core": {
+      "new_order": "Nuevo Pedido",
+      "payment_received": "Pago Recibido",
+      "resume": "Resumen del Pedido",
+      "buyer_information": "Información del Comprador",
+      "participant_information": "Información del Participante",
+      "same_as_buyer": "Igual que el comprador",
+      "select_at_least_one_ticket": "Selecciona al menos una entrada",
+      "select_payment_method": "Selecciona un método de pago",
+      "exclusive_list": "Lista exclusiva",
+      "successful_payment": "Pago realizado con éxito"
+    },
+    "statuses": {
+      "paid": "Pagado",
+      "pending": "Pendiente",
+      "approved": "Aprobado",
+      "canceled": "Cancelado",
+      "completed": "Completado",
+      "confirmed": "Confirmado",
+      "confirmation": "Confirmación"
+    },
+    "payment_methods": {
+      "credit_card": "Tarjeta de Crédito",
+      "boleto": "Boleto/Recibo",
+      "pix": "Pix/Transferencia Instantánea"
+    }
+  },
+  "ui": {
+    "navigation": {
+      "collapse_menu": "Contraer menú",
+      "expand_menu": "Expandir menú",
+      "dashboard": "Panel",
+      "explore": "Explorar",
+      "advertise": "Anunciar",
+      "my_advertisements": "Mis Anuncios",
+      "negotiations": "Negociaciones",
+      "opportunities": "Oportunidades",
+      "plans": "Planes",
+      "events": "Eventos",
+      "event_tickets": "Entradas",
+      "event_ticket_types": "Tipos de Entrada",
+      "orders": "Pedidos",
+      "sales": "Ventas",
+      "participants": "Participantes",
+      "users": "Usuarios",
+      "profile": "Perfil",
+      "interests": "Intereses",
+      "registration": "Registro",
+      "wallet": "Cartera",
+      "settings": "Configuración",
+      "city": "Ciudad",
+      "state": "Estado/Provincia",
+      "country": "País",
+      "exit": "Salir"
+    }
+  },
+  "property": {
+    "filters": {
+      "statusLabel": "Estado de disponibilidad",
+      "clear": "Limpiar filtro"
+    },
+    "buttons": {
+      "changeStatus": "Cambiar estado",
+      "viewHistory": "Ver historial"
+    },
+    "dialogs": {
+      "changeStatus": {
+        "title": "Actualizar estado de disponibilidad",
+        "statusLabel": "Estado",
+        "reasonLabel": "Motivo",
+        "reasonRequired": "Proporcione un motivo.",
+        "cancel": "Cancelar",
+        "save": "Guardar"
+      },
+      "history": {
+        "title": "Historial de estado",
+        "empty": "No hay historial registrado para este anuncio.",
+        "close": "Cerrar",
+        "clear": "Limpiar selección"
+      }
+    },
+    "columns": {
+      "status": "Estado",
+      "history": "Historial",
+      "basePrice": "Precio base"
+    },
+    "status": {
+      "available": "Disponible",
+      "permanently_unavailable": "No disponible permanentemente",
+      "temporarily_unavailable": "No disponible temporalmente"
+    }
+  },
+  "settings": {
+    "tabs": {
+      "users": "Usuarios",
+      "user_types": "Tipos de Usuario"
+    },
+    "users": {
+      "single": "Usuario",
+      "plural": "Usuarios",
+      "create_title": "Nuevo usuario",
+      "edit_title": "Editar usuario",
+      "form_description": "Defina los datos del usuario y el tipo que recibirá.",
+      "password_optional_hint": "Complete solo si desea cambiarla.",
+      "created_at": "Registro",
+      "actions": "Ajustes"
+    },
+    "user_types": {
+      "single": "Tipo de Usuario",
+      "plural": "Tipos de Usuario",
+      "create_title": "Nuevo tipo de usuario",
+      "edit_title": "Permisos del tipo {userType}",
+      "create_description": "Cree un nuevo tipo de usuario y seleccione los permisos deseados.",
+      "edit_description": "Seleccione los bits permitidos en el árbol de permisos.",
+      "description": "Nombre del tipo de usuario",
+      "permissions": "Permisos",
+      "actions": "Ajustes",
+      "locked": "Protegido",
+      "editable": "Editable",
+      "readonly_banner": "Los permisos de admin y manager son de solo lectura.",
+      "selected_permissions": "{count} permisos marcados",
+      "types": {
+        "admin": "Administrador",
+        "guest": "Invitado",
+        "owner": "Propietario",
+        "receptionist": "Recepcionista",
+        "customer": "Cliente",
+        "provider": "Prestador",
+        "manager": "Manager",
+        "agent": "Agent"
+      }
+    },
+    "permissions": {
+      "read": "Read",
+      "create": "Create",
+      "edit": "Edit",
+      "delete": "Delete",
+      "print": "Print",
+      "export": "Export",
+      "import": "Import",
+      "limit": "Limit",
+      "menu": "Menu"
+    }
+  }
+}

+ 351 - 0
src/i18n/locales/pt.json

@@ -0,0 +1,351 @@
+{
+  "common": {
+    "actions": {
+      "save": "Salvar",
+      "cancel": "Cancelar",
+      "edit": "Editar",
+      "add": "Adicionar",
+      "search": "Buscar",
+      "delete": "Excluir",
+      "view": "Visualizar",
+      "back": "Voltar",
+      "next": "Próximo",
+      "resend_email": "Reenviar e-mail",
+      "download_certificate": "Baixar certificado",
+      "download_boleto": "Baixar Boleto",
+      "copy_paste_code": "Copie e cole o código abaixo para realizar o pagamento PIX"
+    },
+    "terms": {
+      "name": "Nome",
+      "email": "E-mail",
+      "password": "Senha",
+      "description": "Descrição",
+      "date": "Data",
+      "start_date": "Data de Início",
+      "end_date": "Data de Fim",
+      "code": "Código",
+      "title": "Título",
+      "status": "Status",
+      "price": "Preço",
+      "quantity": "Quantidade",
+      "city": "Cidade",
+      "state": "Estado",
+      "country": "País",
+      "address": "Endereço",
+      "address_number": "Número",
+      "complement": "Complemento",
+      "postal_code": "CEP",
+      "phone": "Telefone",
+      "document": "Documento",
+      "document_type": "Tipo de Documento",
+      "cpf": "CPF",
+      "cnpj": "CNPJ",
+      "cep": "CEP",
+      "order_number": "Número do Pedido",
+      "order_amount": "Valor do Pedido",
+      "total_amount": "Valor Total",
+      "payment": "Pagamento",
+      "payment_method": "Método de Pagamento",
+      "payment_date": "Data do Pagamento",
+      "payment_amount": "Valor do Pagamento",
+      "language": "Idioma",
+      "currency": "Moeda",
+      "interests": "Interesses",
+      "avatar": "Avatar",
+      "banner": "Banner",
+      "logo": "Logo",
+      "media": "Mídia",
+      "certificate": "Certificado",
+      "version": "Versão"
+    },
+    "status": {
+      "active": "Ativo",
+      "inactive": "Inativo",
+      "canceled": "Cancelado",
+      "loading": "Aguarde...",
+      "yes": "Sim",
+      "no": "Não"
+    },
+    "ui": {
+      "file": {
+        "choose": "Escolha um arquivo",
+        "click_select": "Clique para selecionar um arquivo",
+        "click_select_image": "Clique para selecionar uma imagem",
+        "drag": "Arraste",
+        "drag_and_drop": "Arraste e solte o arquivo aqui",
+        "drag_here": "Arraste o arquivo aqui",
+        "selected": "Arquivo selecionado"
+      },
+      "table": {
+        "rows_per_page": "Linhas por página",
+        "of": "de",
+        "to": "a"
+      },
+      "messages": {
+        "copied_to_clipboard": "Copiado para a área de transferência",
+        "confirm_action": "Você tem certeza?",
+        "welcome": "Bem-vindo(a)",
+        "enjoy_the_event": "Aproveite o evento!"
+      },
+      "misc": {
+        "all": "Todos",
+        "or": "ou",
+        "example": "Exemplo",
+        "options": "Opções",
+        "total": "Total",
+        "type": "Tipo"
+      }
+    },
+    "metadata": {
+      "created_at": "Criado em",
+      "updated_at": "Atualizado em",
+      "created_by": "Criado por"
+    }
+  },
+  "auth": {
+    "login": "Login",
+    "logout": "Sair",
+    "registration": "Cadastro",
+    "confirm_password": "Confirmar Senha",
+    "agreed_terms": "Concordo com os termos",
+    "agreed_privacy": "Concordo com a política de privacidade"
+  },
+  "business": {
+    "advertise": "Anunciar",
+    "my_advertisements": "Meus Anúncios",
+    "negotiations": "Negociações",
+    "opportunities": "Oportunidades",
+    "plans": "Planos"
+  },
+  "validation": {
+    "rules": {
+      "required": "Este campo é obrigatório",
+      "email": "Este campo deve ser um e-mail válido | Estes campos devem ser e-mails válidos",
+      "date": "Este campo deve ser uma data válida",
+      "min": "Este campo deve ter no mínimo",
+      "max": "Este campo deve ter no máximo",
+      "characters": "caracteres",
+      "password": "A senha deve ter no mínimo 6 caracteres, uma letra maiúscula, uma letra minúscula e um número",
+      "same_password": "As senhas devem ser iguais",
+      "cpf": "Este campo deve ser um CPF válido",
+      "cnpj": "Este campo deve ser um CNPJ válido",
+      "cep": "Este campo deve ser um CEP válido",
+      "value_smaller_than_zero": "O valor não pode ser menor que zero"
+    },
+    "permissions": {
+      "view": "Você não tem permissão para visualizar isto",
+      "create": "Você não tem permissão para criar isto",
+      "edit": "Você não tem permissão para editar isto",
+      "delete": "Você não tem permissão para excluir isto",
+      "add": "Você não tem permissão para adicionar isto"
+    }
+  },
+  "http": {
+    "errors": {
+      "404": "Página não encontrada",
+      "failed": "A ação falhou",
+      "no_records_found": "Nenhum registro encontrado"
+    },
+    "success": "A ação foi bem-sucedida"
+  },
+  "events": {
+    "singular": "Evento",
+    "plural": "Eventos",
+    "core": {
+      "basic_information": "Informações Básicas",
+      "schedule": "Programação",
+      "opening": "Abertura",
+      "total_capacity": "Capacidade Total",
+      "unique_code": "Código Único",
+      "unique_code_hint": "Este código é gerado automaticamente",
+      "list_of_allowed_documents": "Lista de documentos permitidos"
+    },
+    "tickets": {
+      "singular": "Ingresso",
+      "plural": "Ingressos",
+      "types_singular": "Tipo de Ingresso",
+      "types_plural": "Tipos de Ingresso",
+      "event_ticket": "Ingresso do Evento",
+      "event_tickets": "Ingressos do Evento",
+      "event_ticket_types": "Tipos de Ingresso do Evento",
+      "sales_start_date": "Data de Início das Vendas",
+      "sales_end_date": "Data de Fim das Vendas",
+      "max_per_user": "Máximo de Ingressos por Usuário",
+      "max_per_user_hint": "0 para ilimitado",
+      "quantity_available": "Quantidade Disponível",
+      "quantity_sold": "Quantidade Vendida"
+    },
+    "location": {
+      "singular": "Localização"
+    },
+    "attendance": {
+      "participant_singular": "Participante",
+      "participant_plural": "Participantes",
+      "checked_in_at": "Check-in realizado em",
+      "is_checked_in": "Check-in realizado"
+    }
+  },
+  "user": {
+    "singular": "Usuário",
+    "plural": "Usuários",
+    "profile": {
+      "singular": "Perfil",
+      "name_and_surname": "Nome e Sobrenome",
+      "birth_date": "Data de Nascimento",
+      "personal_information": "Informações Pessoais"
+    },
+    "preferences": {
+      "singular": "Preferências"
+    }
+  },
+  "orders": {
+    "singular": "Pedido",
+    "plural": "Pedidos",
+    "core": {
+      "new_order": "Novo Pedido",
+      "payment_received": "Pagamento Recebido",
+      "resume": "Resumo do Pedido",
+      "buyer_information": "Informações do Comprador",
+      "participant_information": "Informações do Participante",
+      "same_as_buyer": "Mesmo que o comprador",
+      "select_at_least_one_ticket": "Selecione pelo menos um ingresso",
+      "select_payment_method": "Selecione um método de pagamento",
+      "exclusive_list": "Lista exclusiva",
+      "successful_payment": "Pagamento realizado com sucesso"
+    },
+    "statuses": {
+      "paid": "Pago",
+      "pending": "Pendente",
+      "approved": "Aprovado",
+      "canceled": "Cancelado",
+      "completed": "Concluído",
+      "confirmed": "Confirmado",
+      "confirmation": "Confirmação"
+    },
+    "payment_methods": {
+      "credit_card": "Cartão de Crédito",
+      "boleto": "Boleto",
+      "pix": "Pix"
+    }
+  },
+  "ui": {
+    "navigation": {
+      "collapse_menu": "Recolher menu",
+      "expand_menu": "Expandir menu",
+      "dashboard": "Painel",
+      "explore": "Explorar",
+      "advertise": "Anunciar",
+      "my_advertisements": "Meus Anúncios",
+      "negotiations": "Negociações",
+      "opportunities": "Oportunidades",
+      "plans": "Planos",
+      "events": "Eventos",
+      "event_tickets": "Ingressos",
+      "event_ticket_types": "Tipos de Ingresso",
+      "orders": "Pedidos",
+      "sales": "Vendas",
+      "participants": "Participantes",
+      "users": "Usuários",
+      "profile": "Perfil",
+      "interests": "Interesses",
+      "registration": "Cadastro",
+      "wallet": "Carteira",
+      "settings": "Configurações",
+      "city": "Cidade",
+      "state": "Estado",
+      "country": "País",
+      "exit": "Sair"
+    }
+  },
+  "property": {
+    "filters": {
+      "statusLabel": "Status de disponibilidade",
+      "clear": "Limpar filtro"
+    },
+    "buttons": {
+      "changeStatus": "Alterar status",
+      "viewHistory": "Ver histórico"
+    },
+    "dialogs": {
+      "changeStatus": {
+        "title": "Atualizar status de disponibilidade",
+        "statusLabel": "Status",
+        "reasonLabel": "Motivo",
+        "reasonRequired": "Informe um motivo.",
+        "cancel": "Cancelar",
+        "save": "Salvar"
+      },
+      "history": {
+        "title": "Histórico de status",
+        "empty": "Nenhum histórico registrado para este anúncio.",
+        "close": "Fechar",
+        "clear": "Limpar seleção"
+      }
+    },
+    "messages": {
+      "basePriceSaved": "Preço base atualizado"
+    },
+    "columns": {
+      "status": "Status",
+      "history": "Histórico",
+      "basePrice": "Preço base"
+    },
+    "status": {
+      "available": "Disponível",
+      "permanently_unavailable": "Indisponível permanentemente",
+      "temporarily_unavailable": "Indisponível temporariamente"
+    }
+  },
+  "settings": {
+    "tabs": {
+      "users": "Usuários",
+      "user_types": "Tipos de Usuário"
+    },
+    "users": {
+      "single": "Usuário",
+      "plural": "Usuários",
+      "create_title": "Novo usuário",
+      "edit_title": "Editar usuário",
+      "form_description": "Defina os dados do usuário e o tipo que ele vai receber.",
+      "password_optional_hint": "Preencha apenas se quiser alterar.",
+      "created_at": "Cadastro",
+      "actions": "Ajustes"
+    },
+    "user_types": {
+      "single": "Tipo de Usuário",
+      "plural": "Tipos de Usuário",
+      "create_title": "Novo tipo de usuário",
+      "edit_title": "Permissões do tipo {userType}",
+      "create_description": "Crie um novo tipo de usuário e selecione as permissões desejadas.",
+      "edit_description": "Selecione os bits permitidos na árvore de permissões.",
+      "description": "Nome do tipo de usuário",
+      "permissions": "Permissões",
+      "actions": "Ajustes",
+      "locked": "Protegido",
+      "editable": "Editável",
+      "readonly_banner": "As permissões de admin e manager são somente leitura.",
+      "selected_permissions": "{count} permissões marcadas",
+      "types": {
+        "admin": "Administrador",
+        "guest": "Convidado",
+        "owner": "Proprietário",
+        "receptionist": "Recepcionista",
+        "customer": "Cliente",
+        "provider": "Prestador",
+        "manager": "Manager",
+        "agent": "Agent"
+      }
+    },
+    "permissions": {
+      "read": "Visualizar",
+      "create": "Criar",
+      "edit": "Editar",
+      "delete": "Excluir",
+      "print": "Imprimir",
+      "export": "Exportar",
+      "import": "Importar",
+      "limit": "Limitar",
+      "menu": "Menu"
+    }
+  }
+}

+ 14 - 0
src/layouts/LoginLayout.vue

@@ -0,0 +1,14 @@
+<template>
+  <q-layout view="hHh lpR fFf">
+    <q-page-container
+      style="
+        background-image: url(&quot;images/bg-login.svg&quot;);
+        background-repeat: no-repeat;
+        background-size: cover;
+        background-position: center;
+      "
+    >
+      <router-view />
+    </q-page-container>
+  </q-layout>
+</template>

+ 145 - 0
src/layouts/MainLayout.vue

@@ -0,0 +1,145 @@
+<template>
+  <q-layout class="relative" view="hHh lpR fFf">
+    <LeftMenuLayout v-if="!$q.screen.lt.sm" />
+    <LeftMenuLayoutMobile v-else v-model="leftDrawerOpen" />
+    <q-header v-if="$q.screen.lt.sm" class="bg-transparent q-pa-sm">
+      <q-toolbar
+        class="flex justify-between bg-surface"
+        style="border-radius: 6px !important"
+      >
+        <q-btn dense flat @click="toggleLeftDrawer">
+          <q-icon name="menu" :color="$q.dark.isActive ? 'white' : 'black'" />
+        </q-btn>
+        <q-btn dense flat>
+          <img
+            :src="someAvatar()"
+            alt="avatar"
+            style="width: 20px; height: 20px; border-radius: 50%"
+          />
+          <q-menu anchor="center right" self="top start">
+            <q-list class="column no-wrap overflow-hidden">
+              <q-item
+                v-ripple
+                v-close-popup
+                clickable
+                :to="{ name: 'ProfilePage' }"
+                exact
+                exact-active-class="menu-selected"
+              >
+                <div class="flex">
+                  <q-item-section avatar>
+                    <q-icon
+                      name="account_circle"
+                      color="primary"
+                      style="font-size: 18px"
+                    />
+                  </q-item-section>
+                  <q-item-section>{{ $t("user.profile.singular") }}</q-item-section>
+                </div>
+              </q-item>
+              <q-item v-ripple clickable @click="logoutFn">
+                <div class="flex">
+                  <q-item-section avatar>
+                    <q-icon
+                      name="logout"
+                      color="negative"
+                      style="font-size: 18px"
+                    />
+                  </q-item-section>
+                  <q-item-section>{{ $t('auth.logout') }}</q-item-section>
+                </div>
+              </q-item>
+            </q-list>
+          </q-menu>
+        </q-btn>
+      </q-toolbar>
+    </q-header>
+    <q-page-container>
+      <q-page>
+        <q-scroll-area
+          ref="scrollAreaRef"
+          :style="
+            $q.screen.lt.sm
+              ? 'height: calc(100dvh - 68px - env(safe-area-inset-top)) !important;'
+              : 'height: calc(100dvh - env(safe-area-inset-top)) !important;'
+          "
+        >
+          <router-view v-slot="{ Component }">
+            <Transition mode="out-in">
+              <component
+                :is="Component"
+                style="padding: 20px !important; padding-right: 10px !important"
+                :style="
+                  $q.screen.lt.sm ? 'padding-left: 10px !important;' : ''
+                "
+              />
+            </Transition>
+          </router-view>
+        </q-scroll-area>
+      </q-page>
+    </q-page-container>
+  </q-layout>
+</template>
+
+<script setup>
+import { ref, useTemplateRef, watch } from "vue";
+import { useRoute } from "vue-router";
+import { useAuth } from "src/composables/useAuth";
+import { useRouter } from "vue-router";
+import LeftMenuLayout from "src/components/layout/LeftMenuLayout.vue";
+import LeftMenuLayoutMobile from "src/components/layout/LeftMenuLayoutMobile.vue";
+
+defineOptions({
+  name: "MainLayout",
+});
+
+const { logout } = useAuth();
+const route = useRoute();
+const leftDrawerOpen = ref(false);
+const scrollAreaRef = useTemplateRef("scrollAreaRef");
+const router = useRouter();
+
+let oldValue = route.path;
+
+const someAvatar = () => {
+  return "https://cdn.quasar.dev/img/avatar4.jpg";
+};
+
+const logoutFn = async () => {
+  await logout();
+  router.push({ name: "LoginPage" });
+};
+
+const toggleLeftDrawer = () => {
+  leftDrawerOpen.value = !leftDrawerOpen.value;
+};
+
+watch(route, (value) => {
+  if (oldValue.path != value.path) {
+    scrollAreaRef.value.setScrollPosition("vertical", 0, 0);
+    scrollAreaRef.value.setScrollPosition("horizontal", 0, 0);
+  }
+  oldValue = value.path;
+});
+</script>
+<style scoped>
+.v-enter-active {
+  opacity: 1;
+  transition: all 0.15s ease-in;
+}
+
+.v-leave-active {
+  opacity: 1;
+  transition: all 0.15s ease-out;
+}
+
+.v-enter-from,
+.v-leave-to {
+  opacity: 0;
+  transition: all 0.15s ease-in;
+}
+
+.v-leave-to {
+  transition: all 0.15s ease-out;
+}
+</style>

+ 30 - 0
src/pages/ErrorNotFound.vue

@@ -0,0 +1,30 @@
+<template>
+  <div
+    class="fullscreen bg-blue text-white text-center q-pa-md flex flex-center"
+  >
+    <div>
+      <!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
+      <div style="font-size: 30vh">{{ "404" }}</div>
+
+      <div class="text-h2" style="opacity: 0.4">
+        {{ $t("http.errors.404") }}
+      </div>
+
+      <q-btn
+        class="q-mt-xl"
+        color="white"
+        label="Go Home"
+        no-caps
+        text-color="blue"
+        to="/"
+        unelevated
+      />
+    </div>
+  </div>
+</template>
+
+<script setup>
+defineOptions({
+  name: "ErrorNotFound",
+});
+</script>

+ 118 - 0
src/pages/LoginPage.vue

@@ -0,0 +1,118 @@
+<template>
+  <q-page padding class="login-page">
+    <q-card flat class="login-card q-pa-lg bg-surface">
+      <div class="text-center">
+        <q-img src="images/kizzo_logo.svg" style="max-width: 220px" />
+        <div
+          class="text-weight-regular"
+          style="font-size: 20px; letter-spacing: 0.15px"
+        >
+          Acesso do proprietário
+        </div>
+      </div>
+
+      <q-form
+        ref="loginForm"
+        autocapitalize="off"
+        autocomplete="off"
+        autocorrect="off"
+        class="q-pa-md"
+        spellcheck="false"
+        @submit="submitLogin"
+      >
+        <q-card-section class="q-mt-sm flex column q-gutter-y-md">
+          <q-input
+            v-model="email"
+            hide-bottom-space
+            label="Email"
+            lazy-rules
+            type="email"
+            :rules="[inputRules.required, inputRules.email]"
+          />
+
+          <DefaultPasswordInput
+            v-model="password"
+            hide-bottom-space
+            label="senha"
+            :rules="[inputRules.required, inputRules.min(6)]"
+          />
+        </q-card-section>
+
+        <q-card-actions align="right" class="q-px-md q-mt-md">
+          <q-btn
+            class="full-width"
+            color="primary"
+            label="Entrar"
+            type="submit"
+            size="md"
+            style="border-radius: 8px"
+            :loading="submitting"
+          >
+            <template #loading>
+              <q-spinner />
+            </template>
+          </q-btn>
+        </q-card-actions>
+      </q-form>
+    </q-card>
+  </q-page>
+</template>
+
+<script setup>
+import { onMounted, ref } from "vue";
+import { useAuth } from "src/composables/useAuth";
+import { useInputRules } from "src/composables/useInputRules";
+import { useRouter } from "vue-router";
+
+import DefaultPasswordInput from "src/components/defaults/DefaultPasswordInput.vue";
+
+const router = useRouter();
+
+const { inputRules } = useInputRules();
+
+const email      = ref("");
+const password   = ref(process.env.PASSWORD);
+const submitting = ref(false);
+const loginForm  = ref(null);
+
+const submitLogin = async () => {
+  try {
+    submitting.value = true;
+
+    const validate = await loginForm.value.validate();
+
+    if (!validate) {
+      return;
+    }
+
+    await useAuth().login(email.value, password.value);
+
+    submitting.value = false;
+
+    router.push({ name: "DashboardPage" });
+  } catch (error) {
+    submitting.value = false;
+  }
+};
+
+onMounted(() => {
+  if (process.env.DEV && process.env.SENHA) {
+    password.value = process.env.SENHA;
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+.login-page {
+  display:         flex;
+  justify-content: center;
+  align-items:     center;
+
+  .login-card {
+    width:         100%;
+    max-width:     600px;
+    border-radius: 12px;
+    padding-top:   40px;
+  }
+}
+</style>

+ 97 - 0
src/pages/VersionPage.vue

@@ -0,0 +1,97 @@
+<template>
+  <q-page class="q-pa-md">
+    <DefaultHeaderPage />
+    <div class="subtitle-1 q-my-md text-dark q-mx-lg">
+      Histórico de atualizações
+    </div>
+
+    <div class="sub1 q-mt-lg text-dark q-mx-lg">
+      Versão atual:
+      <span class="body1 text-dark">{{ version.version }}</span>
+    </div>
+    <q-table
+      :columns="columns"
+      :rows="versoes"
+      class="q-my-md softpar-table"
+      flat
+      hide-bottom
+      :pagination="{ rowsPerPage: 0 }"
+    >
+      <template #no-data>
+        <div class="q-mx-auto q-pa-md body2">Nenhum registro encontrado</div>
+      </template>
+      <template #body="props">
+        <q-tr :props="props" class="body2 text-dark">
+          <q-td key="versao" :props="props">
+            {{ props.row.versao }}
+          </q-td>
+          <q-td key="atualizacoes" :props="props">
+            <div
+              v-for="atualizacao in props.row.atualizacoes"
+              :key="atualizacao"
+              class="flex q-my-auto q-pt-sm"
+            >
+              <div v-if="atualizacao.mudancas.length > 0">
+                <div
+                  class="text-bold bg-dark-4 q-mb-xs"
+                  style="
+                    height: 20px;
+                    width: fit-content;
+                    margin-left: 5px;
+                    border-radius: 5px;
+                    padding-left: 5px;
+                    padding-right: 5px;
+                  "
+                >
+                  {{ atualizacao.tipo }}
+                </div>
+                <div v-for="mudanca in atualizacao.mudancas" :key="mudanca">
+                  <div style="white-space: normal" class="q-mb-xs">
+                    - {{ mudanca.descricao }}
+                  </div>
+                </div>
+              </div>
+            </div>
+          </q-td>
+          <q-td key="data" :props="props">
+            {{ props.row.data }}
+          </q-td>
+        </q-tr>
+      </template>
+    </q-table>
+  </q-page>
+</template>
+
+<script setup>
+import versoes from "src/pages/version/components/version";
+import version from "../../package.json";
+import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
+
+const columns = [
+  {
+    name: "versao",
+    label: "Versão do sistema",
+    field: "versao",
+    align: "center",
+    style: "width: 5%; ",
+  },
+  {
+    name: "atualizacoes",
+    label: "Atualizações",
+    field: "atualizacoes",
+    align: "left",
+    style: "width: 75%;",
+  },
+  {
+    name: "data",
+    label: "Data da atualização",
+    field: "data",
+    align: "center",
+    style: "width: 10%",
+  },
+];
+</script>
+
+<style lang="scss">
+@import "src/css/table.scss";
+</style>

+ 8 - 0
src/pages/WelcomePage.vue

@@ -0,0 +1,8 @@
+<template>
+  <div class="flex column items-center justify-center q-gutter-y-md fullscreen">
+    <div class="text-h4 text-primary text-weight-bold">Olá, bem-vindo</div>
+    <q-img src="images/kizzo_logo_secondary.svg" width="500px" />
+  </div>
+</template>
+
+<script setup></script>

+ 1199 - 0
src/pages/dashboard/DashboardPage.vue

@@ -0,0 +1,1199 @@
+<template>
+  <q-page class="owner-dashboard-page">
+    <DefaultHeaderPage />
+
+    <div class="dashboard-shell">
+      <q-banner
+        v-if="!hasProperties"
+        class="bg-surface text-text radius-8"
+        rounded
+      >
+        Nenhum imóvel vinculado ao proprietário autenticado.
+      </q-banner>
+
+      <template v-else>
+        <div class="dashboard-header">
+          <div class="dashboard-title">Dashboard</div>
+
+          <div class="dashboard-filters">
+            <q-select
+              v-model="selectedPropertyOption"
+              class="dashboard-filter dashboard-filter--property"
+              dense
+              label="Imóveis"
+              option-label="label"
+              outlined
+              :options="propertyOptions"
+              @update:model-value="handlePropertyChange"
+            />
+
+            <q-select
+              v-model="selectedMonth"
+              class="dashboard-filter dashboard-filter--month"
+              dense
+              emit-value
+              map-options
+              label="Mês"
+              option-label="label"
+              option-value="value"
+              outlined
+              :options="monthOptions"
+              @update:model-value="handleMonthChange"
+            >
+              <template #append>
+                <q-icon name="event" />
+              </template>
+            </q-select>
+
+            <q-select
+              v-model="selectedYear"
+              class="dashboard-filter dashboard-filter--year"
+              dense
+              emit-value
+              label="Ano"
+              map-options
+              option-label="label"
+              option-value="value"
+              outlined
+              :options="yearOptions"
+              @update:model-value="handleYearChange"
+            />
+
+            <q-btn-dropdown
+              class="dashboard-export-btn"
+              color="primary"
+              label="Exportar"
+              no-caps
+              unelevated
+              :disable="loading || exporting || !canExportReport"
+              :loading="exporting"
+            >
+              <q-list dense>
+                <q-item v-close-popup clickable @click="exportDashboardReport('xlsx')">
+                  <q-item-section>XLSX</q-item-section>
+                </q-item>
+
+                <q-item v-close-popup clickable @click="exportDashboardReport('pdf')">
+                  <q-item-section>PDF</q-item-section>
+                </q-item>
+              </q-list>
+            </q-btn-dropdown>
+          </div>
+        </div>
+
+        <q-separator class="dashboard-separator" />
+
+        <div class="metrics-grid">
+          <DashboardMetricCard
+            v-for="card in firstRowCards"
+            :key="card.label"
+            :caption="card.caption"
+            :label="card.label"
+            :value="card.value"
+          />
+        </div>
+
+        <div class="metrics-grid">
+          <DashboardMetricCard
+            v-for="card in secondRowCards"
+            :key="card.label"
+            :caption="card.caption"
+            :label="card.label"
+            :value="card.value"
+          />
+        </div>
+
+        <div class="dashboard-panels">
+          <q-card flat class="panel-card panel-card--soft panel-card--channels">
+            <div class="panel-title">Canais de Aquisição</div>
+
+            <div class="channel-chart-wrap">
+              <div class="channel-chart-box">
+                <Doughnut
+                  :data="channelChartData"
+                  :options="channelChartOptions"
+                />
+              </div>
+            </div>
+
+            <div class="channel-legend">
+              <div
+                v-for="channel in channelLegendItems"
+                :key="channel.key"
+                class="channel-legend-item"
+              >
+                <span
+                  class="channel-dot"
+                  :style="{ backgroundColor: channel.color }"
+                />
+
+                <span class="channel-name">
+                  {{ channel.label }}
+                </span>
+
+                <strong class="channel-total">
+                  {{ formatInteger(channel.reservations_count) }}
+                </strong>
+
+                <span class="channel-caption">
+                  {{ reservationsLabel(channel.reservations_count) }}
+                </span>
+              </div>
+            </div>
+          </q-card>
+
+          <q-card flat class="panel-card">
+            <div class="panel-title">Repasses por Unidade</div>
+
+            <DashboardPayoutTable
+              :rows="payoutRows"
+              :total-reservations="Number(summary.reservations_count ?? 0)"
+              :total-value="Number(summary.owner_payout_amount ?? 0)"
+            />
+          </q-card>
+
+          <q-card flat class="panel-card panel-card--soft">
+            <div class="panel-title">Disponibilidade do Período</div>
+
+            <div class="availability-list">
+              <div
+                v-for="item in availabilityItems"
+                :key="item.label"
+                class="availability-item"
+              >
+                <div class="availability-track">
+                  <div
+                    class="availability-bar"
+                    :style="{
+                      width: `${item.percentage}%`,
+                      backgroundColor: item.color,
+                    }"
+                  >
+                    <div class="availability-bar-content">
+                      <span class="availability-bar-label">{{ item.label }}</span>
+                      <span class="availability-bar-value">{{ item.valueLabel }}</span>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+
+            <div class="availability-total">
+              {{ isAllPropertiesSelected
+                ? "Total: 100% do período consolidado"
+                : `Total: ${formatInteger(totalCapacityDays)} dias no período` }}
+            </div>
+          </q-card>
+
+          <q-card flat class="panel-card">
+            <div class="panel-title">Evolução do Faturamento</div>
+
+            <div class="line-chart-wrap">
+              <Line
+                :data="revenueChartData"
+                :options="revenueChartOptions"
+              />
+            </div>
+          </q-card>
+        </div>
+      </template>
+
+      <q-inner-loading :showing="loading">
+        <q-spinner color="primary" size="48px" />
+      </q-inner-loading>
+    </div>
+  </q-page>
+</template>
+
+<script setup>
+import {
+  ArcElement,
+  CategoryScale,
+  Chart as ChartJS,
+  Filler,
+  Legend,
+  LineElement,
+  LinearScale,
+  PointElement,
+  Tooltip,
+} from "chart.js";
+
+import { computed, onMounted, ref } from "vue";
+import { Doughnut, Line } from "vue-chartjs";
+import { useQuasar } from "quasar";
+
+import {
+  downloadOwnerDashboardReport,
+  getOwnerDashboard,
+} from "src/api/ownerDashboard";
+
+import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
+import DashboardMetricCard from "./components/DashboardMetricCard.vue";
+import DashboardPayoutTable from "./components/DashboardPayoutTable.vue";
+
+ChartJS.register(
+  ArcElement,
+  CategoryScale,
+  Filler,
+  Legend,
+  LineElement,
+  LinearScale,
+  PointElement,
+  Tooltip,
+);
+
+const $q = useQuasar();
+
+const dashboard = ref(null);
+const loading = ref(false);
+const exporting = ref(false);
+const selectedPropertyOption = ref(null);
+const selectedMonth = ref(null);
+const selectedYear = ref(null);
+const revenueSeries = ref([]);
+const dashboardRequestId = ref(0);
+const historyRequestId = ref(0);
+
+const defaultSummary = Object.freeze({
+  reserve_total: 0,
+  total_forward_fee_all: 0,
+  owner_payout_amount: 0,
+  final_payout_amount: 0,
+  total_expenses_amount: 0,
+  occupied_nights_in_month: 0,
+  occupancy_rate: 0,
+  average_price_per_night: null,
+  average_reservation_ticket: null,
+  average_nights_per_reservation: 0,
+  maintenance_days: 0,
+  cleanings_count: 0,
+  expenses: 0,
+  reservations_count: 0,
+  available_days: 0,
+  days_in_month: 30,
+  properties_count: 1,
+});
+
+const monthLabels = [
+  "Janeiro",
+  "Fevereiro",
+  "Março",
+  "Abril",
+  "Maio",
+  "Junho",
+  "Julho",
+  "Agosto",
+  "Setembro",
+  "Outubro",
+  "Novembro",
+  "Dezembro",
+];
+
+const availableReferences = computed(
+  () => dashboard.value?.filters?.available_references ?? [],
+);
+
+const selectedFilters = computed(
+  () => dashboard.value?.filters?.selected ?? {},
+);
+
+const channels = computed(() => dashboard.value?.channels ?? []);
+
+//
+
+const propertyOptions = computed(() => {
+  const properties = dashboard.value?.filters?.properties ?? [];
+
+  return [
+    { id: null, label: "Todos os imóveis" },
+    ...properties.map((property) => ({
+      id: property.id,
+      label: property.label,
+    })),
+  ];
+});
+
+const selectedPropertyId = computed(() => {
+  return selectedPropertyOption.value?.id ?? null;
+});
+
+const hasProperties = computed(() => propertyOptions.value.length > 1);
+
+const canExportReport = computed(
+  () => hasProperties.value && dashboard.value !== null && selectedPropertyId.value !== null,
+);
+
+//
+
+const isAllPropertiesSelected = computed(() => selectedPropertyId.value === null);
+
+const payoutRows = computed(
+  () => dashboard.value?.properties_breakdown ?? [],
+);
+
+const summary = computed(() => dashboard.value?.summary ?? defaultSummary);
+
+const totalCapacityDays = computed(
+  () => Math.max(1, Number(summary.value.days_in_month ?? 0) * Number(summary.value.properties_count ?? 1)),
+);
+
+//
+
+const yearOptions = computed(() => {
+  const years = [...new Set(availableReferences.value.map((reference) => reference.reference_year))];
+
+  return years
+    .sort((a, b) => b - a)
+    .map((year) => ({
+      label: String(year),
+      value: year,
+    }));
+});
+
+const monthOptions = computed(() => {
+  if (!selectedYear.value) {
+    return [];
+  }
+
+  const months = [...new Set(
+    availableReferences.value
+      .filter((reference) => reference.reference_year === selectedYear.value)
+      .map((reference) => reference.reference_month),
+  )];
+
+  return months
+    .sort((a, b) => a - b)
+    .map((month) => ({
+      label: monthLabels[month - 1] ?? String(month),
+      value: month,
+    }));
+});
+
+//
+
+const buildMetricCards = () => [
+  {
+    label: "Faturamento Bruto",
+    value: formatCurrency(summary.value.reserve_total),
+    caption: "Valor pago pelo hóspede no período",
+  },
+  {
+    label: "Faturamento Líquido",
+    value: formatCurrency(summary.value.owner_payout_amount),
+    caption: "Saldo líquido conforme a planilha",
+  },
+  {
+    label: "Diária Média",
+    value: formatCurrency(summary.value.average_price_per_night),
+    caption: "Média por diária ocupada",
+  },
+  {
+    label: "Ticket Médio/Reserva",
+    value: formatCurrency(summary.value.average_reservation_ticket),
+    caption: "Valor médio por reserva",
+  },
+  {
+    label: "Repasse Total",
+    value: formatCurrency(summary.value.owner_payout_amount),
+    caption: "Repasse ao proprietário no período",
+  },
+  {
+    label: "Ocupação",
+    value: formatPercent(summary.value.occupancy_rate, 1),
+    caption: `${formatInteger(summary.value.occupied_nights_in_month)} diárias ocupadas`,
+  },
+  {
+    label: "Total de Reservas",
+    value: formatInteger(summary.value.reservations_count),
+    caption: "Reservas consolidadas no período",
+  },
+  {
+    label: "Dias por Reserva",
+    value: formatDecimal(summary.value.average_nights_per_reservation),
+    caption: "Média de permanência",
+  },
+  {
+    label: "Limpeza",
+    value: formatInteger(summary.value.cleanings_count),
+    caption: "Total de limpezas no período",
+  },
+  {
+    label: "Despesas",
+    value: formatCurrency(summary.value.expenses),
+    caption: "Despesas cadastradas no dashboard",
+  },
+];
+
+const allMetricCards = computed(buildMetricCards);
+const firstRowCards  = computed(() => allMetricCards.value.slice(0, 5));
+const secondRowCards = computed(() => allMetricCards.value.slice(5, 10));
+
+const availabilityItems = computed(() => {
+  const total = totalCapacityDays.value;
+  const items = [
+    {
+      label: "Dias Ocupados",
+      value: Number(summary.value.occupied_nights_in_month ?? 0),
+      color: "#B7F35A",
+    },
+    {
+      label: "Dias Disponíveis",
+      value: Number(summary.value.available_days ?? 0),
+      color: "#7AA7AA",
+    },
+    {
+      label: "Dias de Manutenção",
+      value: Number(summary.value.maintenance_days ?? 0),
+      color: "#FFC86D",
+    },
+  ];
+
+  return items.map((item) => ({
+    ...item,
+    valueLabel: isAllPropertiesSelected.value
+      ? formatPercent(total > 0 ? (item.value * 100) / total : 0, 1)
+      : `${formatInteger(item.value)} dias`,
+    percentage: total > 0 ? Number(((item.value * 100) / total).toFixed(2)) : 0,
+  }));
+});
+
+const channelLegendItems = computed(() => {
+  const normalizedChannels = new Map(
+    channels.value.map((channel) => [normalizeChannelKey(channel.channel), channel]),
+  );
+
+  const preferredChannels = [
+    createChannelLegendItem("AirBnb", "#FF2D55", normalizedChannels.get("airbnb")),
+    createChannelLegendItem("Kizzo", "#08514C", normalizedChannels.get("kizzo")),
+    createChannelLegendItem("API Booking", "#399FE7", normalizedChannels.get("booking")),
+  ];
+
+  const extraChannels = channels.value
+    .filter((channel) => !["airbnb", "kizzo", "booking"].includes(normalizeChannelKey(channel.channel)))
+    .map((channel) => createChannelLegendItem(channel.channel, null, channel));
+
+  return [...preferredChannels, ...extraChannels];
+});
+
+const channelChartData = computed(() => {
+  const itemsWithValue = channelLegendItems.value.filter((item) => item.reservations_count > 0);
+
+  if (!itemsWithValue.length) {
+    return {
+      labels: ["Sem reservas"],
+      datasets: [
+        {
+          data: [1],
+          backgroundColor: ["#D8E0E5"],
+          borderWidth: 0,
+        },
+      ],
+    };
+  }
+
+  return {
+    labels: itemsWithValue.map((item) => item.label),
+    datasets: [
+      {
+        data: itemsWithValue.map((item) => item.reservations_count),
+        backgroundColor: itemsWithValue.map((item) => item.color),
+        borderWidth: 0,
+      },
+    ],
+  };
+});
+
+const channelChartOptions = {
+  responsive: true,
+  maintainAspectRatio: false,
+  cutout: "0%",
+  plugins: {
+    legend: {
+      display: false,
+    },
+    tooltip: {
+      callbacks: {
+        label: (context) => `${context.label}: ${formatInteger(context.raw)} reservas`,
+      },
+    },
+  },
+};
+
+const revenueChartData = computed(() => {
+  const series = revenueSeries.value.length
+    ? revenueSeries.value
+    : [
+      {
+        label: shortMonthLabel(selectedMonth.value, selectedYear.value),
+        value: Number(summary.value.reserve_total ?? 0),
+      },
+    ];
+
+  return {
+    labels: series.map((item) => item.label),
+    datasets: [
+      {
+        label: "Faturamento",
+        data: series.map((item) => item.value),
+        borderColor: "#399FE7",
+        backgroundColor: "rgba(57, 159, 231, 0.14)",
+        borderWidth: 2,
+        fill: true,
+        tension: 0.35,
+        pointBackgroundColor: "#399FE7",
+        pointBorderColor: "#399FE7",
+        pointRadius: 3,
+        pointHoverRadius: 4,
+      },
+    ],
+  };
+});
+
+const revenueChartOptions = computed(() => ({
+  responsive: true,
+  maintainAspectRatio: false,
+  plugins: {
+    legend: {
+      display: false,
+    },
+    tooltip: {
+      displayColors: false,
+      callbacks: {
+        label: (context) => formatCurrency(context.raw),
+      },
+    },
+  },
+  scales: {
+    x: {
+      grid: {
+        display: false,
+      },
+      ticks: {
+        color: "#7B878C",
+      },
+    },
+    y: {
+      beginAtZero: true,
+      grid: {
+        color: "rgba(8, 81, 76, 0.08)",
+      },
+      ticks: {
+        color: "#7B878C",
+        callback: (value) => formatCurrencyCompact(value),
+      },
+    },
+  },
+}));
+
+//
+
+const formatCurrency = (value) => {
+  return new Intl.NumberFormat("pt-BR", {
+    style: "currency", currency: "BRL", minimumFractionDigits: 2,
+  }).format(Number(value ?? 0));
+}
+
+const formatCurrencyCompact = (value) => {
+  return new Intl.NumberFormat("pt-BR", {
+    style:    "currency",
+    currency: "BRL",
+    notation: "compact",
+    maximumFractionDigits: 1,
+  }).format(Number(value ?? 0));
+}
+
+const formatInteger = (value) => {
+  return Number(value ?? 0).toLocaleString("pt-BR");
+}
+
+const formatPercent = (value, digits = 2) => {
+  return `${Number(value ?? 0).toFixed(digits).replace(".", ",")}%`;
+}
+
+const formatDecimal = (value) => {
+  return Number(value ?? 0).toLocaleString("pt-BR", {
+    minimumFractionDigits: 1,
+    maximumFractionDigits: 1,
+  });
+}
+
+//
+
+const normalizeChannelKey = (channel) => {
+  const normalized = String(channel ?? "")
+    .normalize("NFD")
+    .replace(/[\u0300-\u036f]/g, "")
+    .toLowerCase()
+    .trim();
+
+  if (!normalized || normalized === "sem canal") {
+    return "kizzo";
+  }
+
+  if (normalized.includes("booking")) {
+    return "booking";
+  }
+
+  if (normalized.includes("airbnb")) {
+    return "airbnb";
+  }
+
+  if (normalized.includes("kizzo")) {
+    return "kizzo";
+  }
+
+  return normalized || "kizzo";
+}
+
+const shortMonthLabel = (month, year) => {
+  if (!month || !year) {
+    return "-";
+  }
+
+  return new Intl.DateTimeFormat("pt-BR", {
+    month: "short",
+  })
+    .format(new Date(year, month - 1, 1))
+    .replace(".", "");
+}
+
+//
+
+const buildDashboardParams = ({ year, month, propertyId, format } = {}) => {
+  const params = {};
+
+  if (year) {
+    params.year = year;
+  }
+
+  if (month) {
+    params.month = month;
+  }
+
+  if (propertyId !== null && propertyId !== undefined) {
+    params.property_id = propertyId;
+  }
+
+  if (format) {
+    params.format = format;
+  }
+
+  return params;
+}
+
+const buildFallbackReportFilename = (format) => {
+  const year = String(selectedYear.value ?? "0000");
+
+  const month = String(selectedMonth.value ?? "00").padStart(2, "0");
+
+  const propertySegment = selectedPropertyId.value === null
+    ? "all-properties"
+    : `property_${selectedPropertyId.value}`;
+
+  return `owner_dashboard_report_${year}${month}_${propertySegment}.${format}`;
+}
+
+const findPropertyOptionById = (propertyId) => {
+  return propertyOptions.value.find((option) => option.id === propertyId) ?? propertyOptions.value[0] ?? null;
+}
+
+const createChannelLegendItem = (label, color, channelData) => {
+  return {
+    key: normalizeChannelKey(label),
+    label,
+    color: color ?? generateChannelColor(label),
+    reservations_count: Number(channelData?.reservations_count ?? 0),
+  };
+}
+
+const downloadBlob = (blob, filename) => {
+  const url  = window.URL.createObjectURL(blob);
+  const link = document.createElement("a");
+
+  link.href     = url;
+  link.download = filename;
+
+  document.body.appendChild(link);
+
+  link.click();
+
+  document.body.removeChild(link);
+
+  window.URL.revokeObjectURL(url);
+}
+
+const generateChannelColor = (seed) => {
+  const input = String(seed ?? "canal");
+
+  let hash = 0;
+
+  for (let index = 0; index < input.length; index += 1) {
+    hash = input.charCodeAt(index) + ((hash << 5) - hash);
+  }
+
+  const hue = Math.abs(hash) % 360;
+
+  return `hsl(${hue} 62% 54%)`;
+}
+
+const reservationsLabel = (count) => {
+  return Number(count ?? 0) === 1 ? "1 reserva" : `${formatInteger(count)} reservas`;
+}
+
+const resolveReportFilename = (response, format) => {
+  const explicitHeader = response.headers["x-report-filename"];
+
+  if (explicitHeader) {
+    return explicitHeader;
+  }
+
+  const contentDisposition = response.headers["content-disposition"];
+  const utf8Match = contentDisposition?.match(/filename\*=UTF-8''([^;]+)/i);
+
+  if (utf8Match?.[1]) {
+    return decodeURIComponent(utf8Match[1]);
+  }
+
+  const asciiMatch = contentDisposition?.match(/filename="?([^"]+)"?/i);
+
+  if (asciiMatch?.[1]) {
+    return asciiMatch[1];
+  }
+
+  return buildFallbackReportFilename(format);
+}
+
+
+
+const extractBlobErrorMessage = async (blob) => {
+  if (!(blob instanceof Blob)) {
+    return null;
+  }
+
+  try {
+    const text   = await blob.text();
+    const parsed = JSON.parse(text);
+
+    return parsed?.message ?? null;
+  } catch {
+    return null;
+  }
+}
+
+const exportDashboardReport = async (format) => {
+  if (!canExportReport.value) {
+    return;
+  }
+
+  exporting.value = true;
+
+  try {
+    const response = await downloadOwnerDashboardReport(buildDashboardParams({
+      year:       selectedYear.value,
+      month:      selectedMonth.value,
+      propertyId: selectedPropertyId.value,
+      format,
+    }));
+
+    downloadBlob(response.data, resolveReportFilename(response, format));
+  } catch (error) {
+    const blobMessage = await extractBlobErrorMessage(error?.response?.data);
+
+    $q.notify({
+      type: "negative", message: blobMessage ?? "Não foi possível exportar o relatório do dashboard.",
+    });
+  } finally {
+    exporting.value = false;
+  }
+}
+
+const fetchRevenueHistory = async (payload) => {
+  const requestId = ++historyRequestId.value;
+
+  const references = (payload?.filters?.available_references ?? [])
+    .slice(0, 6)
+    .reverse();
+
+  if (!references.length) {
+    revenueSeries.value = [];
+    return;
+  }
+
+  try {
+    const propertyId = payload?.filters?.selected?.property_id ?? null;
+
+    const responses = await Promise.all(
+      references.map(async (reference) => {
+        const historyPayload = await getOwnerDashboard(
+          buildDashboardParams({
+            year:  reference.reference_year,
+            month: reference.reference_month,
+            propertyId,
+          }),
+        );
+
+        return {
+          label: shortMonthLabel(reference.reference_month, reference.reference_year),
+          value: Number(historyPayload?.summary?.reserve_total ?? 0),
+        };
+      }),
+    );
+
+    if (requestId === historyRequestId.value) {
+      revenueSeries.value = responses;
+    }
+  } catch {
+    if (requestId === historyRequestId.value) {
+      revenueSeries.value = [];
+    }
+  }
+}
+
+const fetchDashboard = async ({ year, month, propertyId } = {}) =>   {
+  const requestId = ++dashboardRequestId.value;
+
+  loading.value = true;
+
+  try {
+    const payload = await getOwnerDashboard(
+      buildDashboardParams({ year, month, propertyId }),
+    );
+
+    if (requestId !== dashboardRequestId.value) {
+      return;
+    }
+
+    dashboard.value = payload;
+
+    selectedPropertyOption.value = findPropertyOptionById(payload.filters.selected?.property_id ?? null);
+    selectedMonth.value = payload.filters.selected?.reference_month ?? null;
+    selectedYear.value = payload.filters.selected?.reference_year ?? null;
+
+    await fetchRevenueHistory(payload);
+  } catch (error) {
+    if (requestId !== dashboardRequestId.value) {
+      return;
+    }
+
+    $q.notify({
+      type: "negative",
+      message: error?.response?.data?.message ?? "Não foi possível carregar o dashboard do proprietário.",
+    });
+  } finally {
+    if (requestId === dashboardRequestId.value) {
+      loading.value = false;
+    }
+  }
+}
+
+const handlePropertyChange = async (propertyOption) => {
+  const nextPropertyId = propertyOption?.id ?? null;
+  const currentPropertyId = selectedFilters.value.property_id ?? null;
+
+  if (nextPropertyId === currentPropertyId) {
+    return;
+  }
+
+  await fetchDashboard({
+    year: selectedYear.value,
+    month: selectedMonth.value,
+    propertyId: nextPropertyId,
+  });
+}
+
+const handleMonthChange = async (month) => {
+  if (month === selectedFilters.value.reference_month) {
+    return;
+  }
+
+  await fetchDashboard({
+    year: selectedYear.value,
+    month,
+    propertyId: selectedPropertyId.value,
+  });
+}
+
+const handleYearChange = async (year) => {
+  const availableMonth = availableReferences.value
+    .filter((reference) => reference.reference_year === year)
+    .sort((a, b) => b.reference_month - a.reference_month)[0]?.reference_month ?? selectedMonth.value;
+
+  if (
+    year === selectedFilters.value.reference_year
+    && availableMonth === selectedFilters.value.reference_month
+  ) {
+    return;
+  }
+
+  await fetchDashboard({
+    year,
+    month: availableMonth,
+    propertyId: selectedPropertyId.value,
+  });
+}
+
+onMounted(async () => {
+  await fetchDashboard();
+});
+</script>
+
+<style scoped lang="scss">
+.owner-dashboard-page {
+  position: relative;
+}
+
+.dashboard-shell {
+  position:       relative;
+  display:        flex;
+  flex-direction: column;
+  gap:            16px;
+}
+
+.dashboard-header {
+  display:         flex;
+  align-items:     center;
+  justify-content: space-between;
+  gap:             16px;
+  flex-wrap:       wrap;
+  vertical-align:  middle;
+}
+
+.dashboard-title {
+  font-size:   28px;
+  font-weight: 700;
+  color:       #202427;
+  line-height: 1.1;
+}
+
+.dashboard-filters {
+  display:         flex;
+  align-items:     center;
+  justify-content: flex-end;
+  gap:             12px;
+  flex-wrap:       wrap;
+  margin-left:     auto;
+  vertical-align:  middle;
+}
+
+.dashboard-filter {
+  min-width: 120px;
+}
+
+.dashboard-filter--property {
+  min-width: 220px;
+}
+
+.dashboard-filter--month,
+.dashboard-filter--year {
+  min-width: 110px;
+}
+
+.dashboard-export-btn {
+  height: 40px;
+}
+
+.dashboard-separator {
+  margin-top: -4px;
+  background: rgba(8, 81, 76, 0.12);
+}
+
+.metrics-grid {
+  display: grid;
+
+  grid-template-columns: repeat(5, minmax(0, 1fr));
+
+  gap: 12px;
+}
+
+.dashboard-panels {
+  display: grid;
+
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+
+  gap:         16px;
+  align-items: start;
+}
+
+.panel-card {
+  padding:       18px;
+  border-radius: 14px;
+  background:    #ffffff;
+  border:        1px solid #d9e3e7;
+  min-height:    300px;
+  vertical-align: middle;
+}
+
+.panel-card--soft {
+  background: #f0f3f5;
+}
+
+.panel-card--channels {
+  min-height: 0;
+  align-self: start;
+}
+
+.panel-title {
+  margin-bottom: 16px;
+  font-size:     16px;
+  font-weight:   700;
+  color:         #08514c;
+}
+
+.channel-chart-wrap {
+  display:         flex;
+  justify-content: center;
+  padding:         8px 0 16px;
+}
+
+.channel-chart-box {
+  width:  min(240px, 100%);
+  height: 240px;
+}
+
+.channel-legend {
+  display: grid;
+
+  grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
+
+  gap:           14px;
+  justify-items: center;
+  text-align:    center;
+}
+
+.channel-legend-item {
+  display:        flex;
+  flex-direction: column;
+  align-items:    center;
+  gap:            4px;
+  vertical-align: middle;
+}
+
+.channel-dot {
+  display:       inline-flex;
+  width:         10px;
+  height:        10px;
+  border-radius: 50%;
+}
+
+.channel-name {
+  display:     inline-flex;
+  align-items: center;
+  gap:         8px;
+  font-size:   13px;
+  font-weight: 600;
+  color:       #273136;
+}
+
+.channel-total {
+  font-size: 14px;
+  color:     #1d2327;
+}
+
+.channel-caption {
+  font-size: 11px;
+  color:     #7b878c;
+}
+
+.availability-list {
+  display:        flex;
+  flex-direction: column;
+  gap:            16px;
+}
+
+.availability-item {
+  display:        flex;
+  flex-direction: column;
+  gap:            10px;
+}
+
+.availability-track {
+  width:      100%;
+  height:     38px;
+  overflow:   hidden;
+  background: #dde5e8;
+}
+
+.availability-bar {
+  height:    100%;
+  min-width: fit-content;
+}
+
+.availability-bar-content {
+  display:         flex;
+  align-items:     center;
+  justify-content: space-between;
+  gap:             12px;
+  min-width:       100%;
+  height:          100%;
+  padding:         0 12px;
+  color:           #1d2327;
+  font-size:       12px;
+  font-weight:     600;
+  white-space:     nowrap;
+}
+
+.availability-bar-value {
+  margin-left: auto;
+  text-align:  right;
+}
+
+.availability-total {
+  margin-top: 18px;
+  font-size:  12px;
+  color:      #657177;
+}
+
+.availability-total {
+  text-align: center;
+}
+
+.owner-dashboard-page :deep(.text-h6.text-bold) {
+  display: none;
+}
+
+.line-chart-wrap {
+  height: 235px;
+}
+
+@media (max-width: 1380px) {
+  .metrics-grid {
+    grid-template-columns: repeat(3, minmax(0, 1fr));
+  }
+}
+
+@media (max-width: 1024px) {
+  .dashboard-panels {
+    grid-template-columns: 1fr;
+  }
+}
+
+@media (max-width: 900px) {
+  .metrics-grid {
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+  }
+}
+
+@media (max-width: 640px) {
+  .dashboard-filters {
+    width:           100%;
+    margin-left:     0;
+    justify-content: stretch;
+  }
+
+  .dashboard-filter,
+  .dashboard-filter--property,
+  .dashboard-filter--month,
+  .dashboard-filter--year {
+    width:     100%;
+    min-width: 100%;
+  }
+
+  .metrics-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .availability-bar {
+    min-width: 0;
+  }
+}
+</style>

+ 65 - 0
src/pages/dashboard/components/DashboardMetricCard.vue

@@ -0,0 +1,65 @@
+<template>
+  <q-card class="metric-card" flat>
+    <span class="metric-label">
+      {{ label }}
+    </span>
+
+    <strong class="metric-value">
+      {{ value }}
+    </strong>
+
+    <span class="metric-caption">
+      {{ caption }}
+    </span>
+  </q-card>
+</template>
+
+<script setup>
+defineProps({
+  label: {
+    type: String,
+    required: true,
+  },
+  value: {
+    type: String,
+    required: true,
+  },
+  caption: {
+    type: String,
+    default: "",
+  },
+});
+</script>
+
+<style scoped lang="scss">
+.metric-card {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  gap: 6px;
+  min-height: 106px;
+  padding: 16px;
+  border: 1px solid #d9e3e7;
+  border-top: 3px solid #b7f35a;
+  border-radius: 12px;
+  background: #f0f3f5;
+  vertical-align: middle;
+}
+
+.metric-label {
+  font-size: 12px;
+  font-weight: 600;
+  color: #657177;
+}
+
+.metric-value {
+  font-size: 26px;
+  line-height: 1.15;
+  color: #1d2327;
+}
+
+.metric-caption {
+  font-size: 11px;
+  color: #7b878c;
+}
+</style>

+ 97 - 0
src/pages/dashboard/components/DashboardPayoutTable.vue

@@ -0,0 +1,97 @@
+<template>
+  <div class="table-wrap">
+    <table class="payout-table">
+      <thead>
+        <tr>
+          <th>Unidade</th>
+          <th>Reservas</th>
+          <th>Valor</th>
+        </tr>
+      </thead>
+
+      <tbody>
+        <tr
+          v-for="item in rows"
+          :key="item.property_id"
+        >
+          <td>{{ item.property_label }}</td>
+          <td>{{ formatInteger(item.reservations_count) }}</td>
+          <td>{{ formatCurrency(item.owner_payout_amount) }}</td>
+        </tr>
+
+        <tr class="payout-total-row">
+          <td>Total</td>
+          <td>{{ formatInteger(totalReservations) }}</td>
+          <td>{{ formatCurrency(totalValue) }}</td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</template>
+
+<script setup>
+defineProps({
+  rows: {
+    type: Array,
+    default: () => [],
+  },
+  totalReservations: {
+    type: Number,
+    default: 0,
+  },
+  totalValue: {
+    type: Number,
+    default: 0,
+  },
+});
+
+const formatCurrency = (value) => {
+  return new Intl.NumberFormat("pt-BR", {
+    style: "currency",
+    currency: "BRL",
+    minimumFractionDigits: 2,
+  }).format(Number(value ?? 0));
+};
+
+const formatInteger = (value) => {
+  return Number(value ?? 0).toLocaleString("pt-BR");
+};
+</script>
+
+<style scoped lang="scss">
+.table-wrap {
+  overflow-x: auto;
+}
+
+.payout-table {
+  width: 100%;
+  border-collapse: collapse;
+}
+
+.payout-table th,
+.payout-table td {
+  padding: 10px 0;
+  border-bottom: 1px solid rgba(8, 81, 76, 0.1);
+  color: #273136;
+  text-align: left;
+  vertical-align: middle;
+}
+
+.payout-table th:nth-child(2),
+.payout-table th:nth-child(3),
+.payout-table td:nth-child(2),
+.payout-table td:nth-child(3) {
+  text-align: right;
+}
+
+.payout-table th {
+  font-size: 12px;
+  font-weight: 700;
+  color: #657177;
+}
+
+.payout-total-row td {
+  font-weight: 700;
+  border-bottom: 0;
+}
+</style>

+ 42 - 0
src/pages/settings/SettingsPage.vue

@@ -0,0 +1,42 @@
+<template>
+  <q-page class="q-pa-md">
+    <SettingsTabsHeader />
+
+    <q-banner
+      class="bg-grey-2 text-primary"
+      inline-actions
+      rounded
+      style="border: 1px dashed rgba(14, 52, 91, 0.18)"
+    >
+      Redirecionando para a primeira aba disponível.
+    </q-banner>
+  </q-page>
+</template>
+
+<script setup>
+import { onMounted } from "vue";
+import { permissionStore } from "src/stores/permission";
+import { useRouter } from "vue-router";
+
+import SettingsTabsHeader from "./components/SettingsTabsHeader.vue";
+
+const router = useRouter();
+
+const { getAccess } = permissionStore();
+
+const redirectToFirstAllowedTab = () => {
+  if (getAccess("config.user", "view")) {
+    router.replace({ name: "SettingsUsersPage" });
+
+    return;
+  }
+
+  if (getAccess("config.permission", "view")) {
+    router.replace({ name: "SettingsUserTypesPage" });
+  }
+};
+
+onMounted(() => {
+  redirectToFirstAllowedTab();
+});
+</script>

+ 189 - 0
src/pages/settings/SettingsUserActionPage.vue

@@ -0,0 +1,189 @@
+<template>
+  <q-page class="q-pa-md">
+    <SettingsTabsHeader />
+
+    <q-card bordered class="settings-card" flat>
+      <q-card-section class="q-pb-none">
+        <div class="text-h6 text-weight-bold">
+          {{
+            isEditMode
+              ? $t("settings.users.edit_title")
+              : $t("settings.users.create_title")
+          }}
+        </div>
+
+        <div class="text-grey-7 q-mt-xs">
+          {{ $t("settings.users.form_description") }}
+        </div>
+      </q-card-section>
+
+      <q-card-section class="q-pt-lg">
+        <div class="row q-col-gutter-lg">
+          <q-input
+            v-model="form.name"
+            class="col-12 col-md-6"
+            :error="!!serverErrors.name"
+            :error-message="serverErrors.name"
+            :label="$t('common.terms.name')"
+          />
+
+          <q-input
+            v-model="form.email"
+            class="col-12 col-md-6"
+            type="email"
+            :error="!!serverErrors.email"
+            :error-message="serverErrors.email"
+            :label="$t('common.terms.email')"
+          />
+
+          <q-select
+            v-model="form.user_type_id"
+            class="col-12 col-md-6"
+            emit-value
+            map-options
+            :error="!!serverErrors.user_type_id"
+            :error-message="serverErrors.user_type_id"
+            :label="$t('settings.user_types.single')"
+            :options="userTypeOptions"
+          />
+
+          <q-input
+            v-model="form.password"
+            class="col-12 col-md-6"
+            type="password"
+            :error="!!serverErrors.password"
+            :error-message="serverErrors.password"
+            :hint="
+              isEditMode ? $t('settings.users.password_optional_hint') : ''
+            "
+            :label="$t('common.terms.password')"
+          />
+        </div>
+      </q-card-section>
+
+      <q-separator />
+
+      <q-card-actions align="right" class="q-pa-lg">
+        <q-btn
+          color="primary"
+          outline
+          padding="10px 24px"
+          :label="$t('common.actions.cancel')"
+          @click="router.push({ name: 'SettingsUsersPage' })"
+        />
+
+        <q-btn
+          class="btn-custom-default"
+          color="secondary"
+          padding="10px 28px"
+          :disable="isSaveDisabled"
+          :loading="loading"
+          @click="onSubmit"
+        >
+          <span class="text-primary">{{ $t("common.actions.save") }}</span>
+        </q-btn>
+      </q-card-actions>
+    </q-card>
+  </q-page>
+</template>
+
+<script setup>
+import { computed, onMounted, ref } from "vue";
+import { createUser, getUserById, updateUser, userTypes } from "src/api/user";
+import { normalizeUserTypeOptions } from "./utils";
+import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
+import { useI18n } from "vue-i18n";
+import { useRoute, useRouter } from "vue-router";
+import { useSubmitHandler } from "src/composables/useSubmitHandler";
+
+import SettingsTabsHeader from "./components/SettingsTabsHeader.vue";
+
+const route  = useRoute();
+const router = useRouter();
+
+const { t } = useI18n();
+
+const { execute, loading, serverErrors } = useSubmitHandler(() => {
+  router.push({ name: "SettingsUsersPage" });
+});
+
+const { form, getUpdatedFields, hasUpdatedFields, setUpdateFormAsOriginal } =
+  useFormUpdateTracker({
+    name:         "",
+    email:        "",
+    password:     "",
+    user_type_id: null,
+  });
+
+const userTypeOptions = ref([]);
+
+const isEditMode = computed(() => !!route.params.id);
+
+const isSaveDisabled = computed(() => {
+  if (!isEditMode.value) {
+    return !form.name || !form.email || !form.password || !form.user_type_id;
+  }
+
+  return !hasUpdatedFields.value;
+});
+
+const fetchUserTypeOptions = async () => {
+  const response = await userTypes();
+  userTypeOptions.value = normalizeUserTypeOptions(response, t);
+};
+
+const fetchUser = async () => {
+  const response = await getUserById(route.params.id);
+
+  form.name         = response.name  || "";
+  form.email        = response.email || "";
+  form.password     = "";
+  form.user_type_id = Number(response.user_type?.value || response.user_type_id);
+
+  setUpdateFormAsOriginal();
+};
+
+const sanitizePayload = (payload) => {
+  const nextPayload = { ...payload };
+
+  Object.keys(nextPayload).forEach((key) => {
+    if (
+      nextPayload[key] === null      ||
+      nextPayload[key] === undefined ||
+      nextPayload[key] === ""
+    ) {
+      delete nextPayload[key];
+    }
+  });
+
+  return nextPayload;
+};
+
+const onSubmit = async () => {
+  const payload = sanitizePayload(
+    isEditMode.value ? getUpdatedFields.value : form,
+  );
+
+  await execute(async () => {
+    if (isEditMode.value) {
+      return await updateUser(payload, route.params.id);
+    }
+
+    return await createUser(payload);
+  });
+};
+
+onMounted(async () => {
+  await fetchUserTypeOptions();
+
+  if (isEditMode.value) {
+    await fetchUser();
+  }
+});
+</script>
+
+<style scoped lang="scss">
+.settings-card {
+  border-radius: 18px;
+}
+</style>

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio