Repository: gbarillot/rails-vue-demo-app Branch: main Commit: 04ab3db3253c Files: 162 Total size: 342.8 KB Directory structure: gitextract_56eg6khq/ ├── .browserslistrc ├── .gitignore ├── .tool-versions ├── Gemfile ├── Procfile ├── README.md ├── Rakefile ├── app/ │ ├── assets/ │ │ ├── config/ │ │ │ └── manifest.js │ │ ├── images/ │ │ │ └── .keep │ │ └── stylesheets/ │ │ └── application.css │ ├── channels/ │ │ ├── application_cable/ │ │ │ ├── channel.rb │ │ │ └── connection.rb │ │ └── chat_channel.rb │ ├── controllers/ │ │ ├── admin_controller.rb │ │ ├── api/ │ │ │ ├── admin/ │ │ │ │ ├── admin_controller.rb │ │ │ │ ├── dashboard_controller.rb │ │ │ │ └── musicians_controller.rb │ │ │ ├── api_controller.rb │ │ │ └── musicians_controller.rb │ │ ├── application_controller.rb │ │ └── concerns/ │ │ └── .keep │ ├── helpers/ │ │ └── application_helper.rb │ ├── javascript/ │ │ ├── admin/ │ │ │ ├── routes.js │ │ │ ├── stores/ │ │ │ │ ├── dashboard_store.js │ │ │ │ └── musician_store.js │ │ │ └── views/ │ │ │ ├── dashboard/ │ │ │ │ └── index.vue │ │ │ ├── musicians/ │ │ │ │ ├── _filters.vue │ │ │ │ ├── _form.vue │ │ │ │ ├── edit.vue │ │ │ │ ├── index.vue │ │ │ │ └── new.vue │ │ │ ├── shared/ │ │ │ │ ├── _errors.vue │ │ │ │ ├── _footer.vue │ │ │ │ ├── _nav.vue │ │ │ │ ├── _pagination.vue │ │ │ │ └── layout.vue │ │ │ └── websockets/ │ │ │ └── index.vue │ │ ├── entrypoints/ │ │ │ ├── admin.js │ │ │ └── front.js │ │ ├── front/ │ │ │ ├── routes.js │ │ │ ├── stores/ │ │ │ │ └── musician_store.js │ │ │ └── views/ │ │ │ ├── musicians/ │ │ │ │ ├── index.vue │ │ │ │ └── show.vue │ │ │ ├── pages/ │ │ │ │ └── index.vue │ │ │ └── shared/ │ │ │ ├── _footer.vue │ │ │ ├── _nav.vue │ │ │ └── layout.vue │ │ └── plugins/ │ │ ├── api.js │ │ └── cable.js │ ├── jobs/ │ │ └── application_job.rb │ ├── mailers/ │ │ └── application_mailer.rb │ ├── models/ │ │ ├── application_record.rb │ │ ├── concerns/ │ │ │ └── .keep │ │ ├── musician.rb │ │ └── user.rb │ └── views/ │ ├── admin.html.erb │ ├── api/ │ │ ├── admin/ │ │ │ ├── musicians/ │ │ │ │ ├── edit.json.jbuilder │ │ │ │ ├── index.json.jbuilder │ │ │ │ └── new.json.jbuilder │ │ │ ├── shared/ │ │ │ │ └── _pagination.json.jbuilder │ │ │ └── users/ │ │ │ ├── edit.json.jbuilder │ │ │ ├── index.json.jbuilder │ │ │ └── new.json.jbuilder │ │ └── musicians/ │ │ ├── index.json.jbuilder │ │ └── show.json.jbuilder │ ├── application.html.erb │ ├── devise/ │ │ └── sessions/ │ │ └── new.html.erb │ └── layouts/ │ ├── devise.html.erb │ ├── mailer.html.erb │ └── mailer.text.erb ├── bin/ │ ├── bootsnap │ ├── bundle │ ├── foreman │ ├── importmap │ ├── irb │ ├── nokogiri │ ├── puma │ ├── pumactl │ ├── racc │ ├── rackup │ ├── rails │ ├── rake │ ├── rdbg │ ├── setup │ ├── spring │ ├── sprockets │ ├── thor │ ├── tilt │ └── vite ├── config/ │ ├── application.rb │ ├── boot.rb │ ├── cable.yml │ ├── credentials.yml.enc │ ├── database.yml │ ├── environment.rb │ ├── environments/ │ │ ├── development.rb │ │ ├── production.rb │ │ └── test.rb │ ├── importmap.rb │ ├── initializers/ │ │ ├── assets.rb │ │ ├── content_security_policy.rb │ │ ├── cypress_rails_initializer.rb │ │ ├── devise.rb │ │ ├── filter_parameter_logging.rb │ │ ├── inflections.rb │ │ ├── locales.rb │ │ ├── new_framework_defaults_7_1.rb │ │ └── permissions_policy.rb │ ├── locales/ │ │ ├── devise.en.yml │ │ ├── en.yml │ │ └── fr.yml │ ├── puma.rb │ ├── routes.rb │ ├── storage.yml │ └── vite.json ├── config.ru ├── cypress/ │ ├── e2e/ │ │ └── home.cy.js │ └── support/ │ └── e2e.js ├── cypress.config.js ├── db/ │ ├── migrate/ │ │ ├── 20220424120800_base_setup.rb │ │ ├── 20240102193807_add_service_name_to_active_storage_blobs.active_storage.rb │ │ ├── 20240102193808_create_active_storage_variant_records.active_storage.rb │ │ └── 20240102193809_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb │ ├── schema.rb │ └── seeds.rb ├── docker-compose.yml ├── lib/ │ ├── assets/ │ │ └── .keep │ └── tasks/ │ └── .keep ├── log/ │ └── .keep ├── package.json ├── public/ │ ├── 404.html │ ├── 422.html │ ├── 500.html │ ├── css/ │ │ └── development/ │ │ ├── admin/ │ │ │ └── forms.css │ │ ├── admin.css │ │ ├── devise.css │ │ ├── front.css │ │ ├── grid.css │ │ ├── main.css │ │ ├── themes/ │ │ │ ├── dark.css │ │ │ └── light.css │ │ └── utilities.css │ ├── robots.txt │ └── vite-test/ │ ├── assets/ │ │ ├── admin-ebb17751.js │ │ ├── front-f6acb49a.js │ │ └── vue-i18n-6b73e0ca.js │ ├── manifest-assets.json │ └── manifest.json ├── storage/ │ └── .keep ├── test/ │ ├── application_system_test_case.rb │ ├── controllers/ │ │ └── .keep │ ├── fixtures/ │ │ └── files/ │ │ └── .keep │ ├── helpers/ │ │ └── .keep │ ├── javascript/ │ │ └── app.test.js │ ├── mailers/ │ │ └── .keep │ ├── models/ │ │ └── .keep │ ├── system/ │ │ └── .keep │ └── test_helper.rb ├── tmp/ │ └── .keep ├── vendor/ │ ├── .keep │ └── javascript/ │ └── .keep └── vite.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .browserslistrc ================================================ defaults ================================================ FILE: .gitignore ================================================ # See https://help.github.com/articles/ignoring-files for more about ignoring files. # # If you find yourself ignoring temporary files generated by your text editor # or operating system, you probably want to add a global ignore instead: # git config --global core.excludesfile '~/.gitignore_global' # Ignore bundler config. /.bundle # Ignore the default SQLite database. /db/*.sqlite3 /db/*.sqlite3-journal /db/*.sqlite3-* # Ignore all logfiles and tempfiles. /log/* /tmp/* !/log/.keep !/tmp/.keep # Ignore uploaded files in development. /storage/* !/storage/.keep /public/assets .byebug_history # Ignore master key for decrypting credentials and more. /config/master.key # Ignore Redis dump /dump.rdb /public/packs /public/packs-test /node_modules /yarn-error.log yarn-debug.log* .yarn-integrity ================================================ FILE: .tool-versions ================================================ ruby 3.2.2 nodejs 20.2.0 ================================================ FILE: Gemfile ================================================ source "https://rubygems.org" git_source(:github) { |repo| "https://github.com/#{repo}.git" } # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" gem "rails", "~> 7.1.2" gem 'sprockets-rails' gem 'sqlite3' gem 'puma' gem 'jbuilder' gem 'redis' gem 'bootsnap', require: false gem 'vite_rails' gem 'foreman' gem 'route_translator' gem 'kaminari' gem 'ransack' gem 'devise' gem 'cypress-rails' # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ] group :development, :test do # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem gem "debug", platforms: %i[ mri mingw x64_mingw ] end group :development do # Use console on exceptions pages [https://github.com/rails/web-console] gem "web-console" end group :test do gem 'capybara' gem 'minitest' gem 'minitest-rails' gem 'minitest-spec-rails' gem 'minitest-focus' gem 'capybara-email' gem 'json-schema' gem 'warden' gem 'selenium-webdriver' gem 'webdrivers' end ================================================ FILE: Procfile ================================================ vite: bin/vite dev web: bin/rails s --port 3000 -b 0.0.0.0 ================================================ FILE: README.md ================================================ # Rails + Vite + Vue + Pina Demo App ### This repo is no longer maintained Feel free to grab some ideas, but I will no longer update this codebase. ## Description Demo Single Page Application based on Ruby on Rails 7.0.2, using Vue 3 + Pina, compiled with Vite. All the basic features you need to build a real world app with: - **Front / Admin namespaces** - **I18n** (server side + client side) - **Forms** (with progress and error handling) - **Authentication** (Devise) - **Pagination** (Kaminari) - **Dynamic search filters** (Ransack) - **Websockets** (ActionCable) - **Bootstrap like grid** (using CSS Grid layout) All of this is designed with maintainability and readability in mind, slightly inspired by the Rails conventions. This is the follow up of the previous Rails + Vue + Vuex app from 2017 which is still available on the Rails6 branch. A lot of things has been updated/rewrote for this version, notably: - Webpacker is now replaced by Vite - Vue app in using Composition API - Vuex is now replaced by Pinia to handle state management - No longer depends on JQuery for API calls (replaced by Axios) Nonetheless, a lot of opinions and conventions from the previous version remain valid, you may have a look at the original blog post for details (https://guillaume.barillot.me/2017/12/02/how-to-organize-your-vue-files-in-a-rails-5-1-project-using-webpack/). Boostrapping the plumbing for basic stuff can take some time, but once you get the basic it's pretty easy to extend and to get really efficient with Vue + Rails. With this example you have all you need to build up your new project in minutes. ## Installation ``` git clone git@github.com:gbarillot/rails-vue-demo-app.git cd rails-vue-demo-app bundle install yarn install bundle exec rails db:migrate bundle exec rails db:seed ``` ## Booting the app ``` foreman start ``` Hot Module Reloading (HMR) is enabled by default. If you prefer to turn it off, set "hmr" to false in /vite.config.ts. ## Running tests ### Rails side ``` rails test ``` ### JS side ``` yarn test ``` ## A note on CSS CSS is done right in the public/css/development directory. Pros: - No compile time, greatly speed up page load time in dev - Allows CSS editing + saving directly from Chrome Devtools - Easier / more fexible to manage imports Cons: - You should disable cache in DevTools in Dev - As of today, not suitable for production! The purpose of this repo is Vue + Vite + Rails, not CSS, so feel free to use whatever method you'd prefer to handle CSS. Sprocket is left as is and still works. ## Contributions PR and feedbacks welcome! ## Licence MIT ================================================ FILE: Rakefile ================================================ # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require_relative "config/application" Rails.application.load_tasks ================================================ FILE: app/assets/config/manifest.js ================================================ //= link_tree ../images //= link_directory ../stylesheets .css //= link_tree ../../javascript .js //= link_tree ../../../vendor/javascript .js ================================================ FILE: app/assets/images/.keep ================================================ ================================================ FILE: app/assets/stylesheets/application.css ================================================ /* * This is a manifest file that'll be compiled into application.css, which will include all the files * listed below. * * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's * vendor/assets/stylesheets directory can be referenced here using a relative path. * * You're free to add application-wide styles to this file and they'll appear at the bottom of the * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS * files in this directory. Styles in this file should be added after the last require_* statement. * It is generally better to create a new file per style scope. * *= require_self */ ================================================ FILE: app/channels/application_cable/channel.rb ================================================ module ApplicationCable class Channel < ActionCable::Channel::Base end end ================================================ FILE: app/channels/application_cable/connection.rb ================================================ module ApplicationCable class Connection < ActionCable::Connection::Base end end ================================================ FILE: app/channels/chat_channel.rb ================================================ class ChatChannel < ApplicationCable::Channel def subscribed stream_from "ChatChannel" end def receive(data) ActionCable.server.broadcast("ChatChannel", { message: data['message'].upcase }) end end ================================================ FILE: app/controllers/admin_controller.rb ================================================ class AdminController < ApplicationController before_action :auth_user! def index render template: 'admin' end private # Proper redirect using I18n.locale # Devise's authenticate_user! doesn't handle I18n properly here def auth_user! redirect_to new_user_session_path unless current_user end end ================================================ FILE: app/controllers/api/admin/admin_controller.rb ================================================ class Api::Admin::AdminController < Api::ApiController before_action :authenticate_user! def search_params params[:q] ||= {} if params[:q] != '' end end ================================================ FILE: app/controllers/api/admin/dashboard_controller.rb ================================================ class Api::Admin::DashboardController < Api::Admin::AdminController def index render json: {metrics: {musicians: Musician.count}} end end ================================================ FILE: app/controllers/api/admin/musicians_controller.rb ================================================ class Api::Admin::MusiciansController < Api::Admin::AdminController # DELETE ME: Dummy emulation of a slow network so you can see the UI animation in dev. mode before_action :slow, only: [:create, :update] before_action :load_musician, except: [:index, :new, :create] def index @musicians = Musician.ransack(search_params) .result .page(params[:page]) .per(params[:per_page]) end def new @musician = Musician.new end def create @musician = Musician.create(musician_params) if @musician.errors.empty? render template: '/api/admin/musicians/edit' else render json: {errors: @musician.errors.messages}.to_json, status: 422 end end def edit end def update if @musician.update(musician_params) head :ok else render json: {errors: @musician.errors.messages}.to_json, status: 422 end end def destroy if @musician.destroy head :ok else render json: {errors: @musician.errors.messages}.to_json, status: 422 end end private def musician_params params.require(:musician).permit( :name, :band ) end def load_musician @musician = Musician.find(params[:id]) end def slow sleep 1 end end ================================================ FILE: app/controllers/api/api_controller.rb ================================================ class Api::ApiController < ApplicationController end ================================================ FILE: app/controllers/api/musicians_controller.rb ================================================ class Api::MusiciansController < Api::ApiController def index @musicians = Musician.all end def show if params[:id] == "this-will-trigger-a-500" # Render a 500 to demonstrate how the front-end handles server side errors render json: {error: "Internal server error"}, status: 500 elsif params[:id] == "this-will-trigger-a-401" # Render a 401 to demonstrate how the front-end handles server side errors render json: {error: "Not authenticated"}, status: 401 else @musician = Musician.find(params[:id]) end end end ================================================ FILE: app/controllers/application_controller.rb ================================================ class ApplicationController < ActionController::Base protect_from_forgery with: :exception around_action :set_locale_from_url #rescue_from Exception, with: :render_error def index render template: 'application' end def set_locale I18n.locale = params[:locale] || session[:locale] || I18n.default_locale session[:locale] = I18n.locale end def self.default_url_options { locale: I18n.locale } end def after_sign_in_path_for(resource) admin_root_path end private def render_error(e) if e.class.name == "ActiveRecord::RecordNotFound" render json: {error: "Not found"}.to_json, status: 404 else render json: {error: "Internal server error"}.to_json, status: 500 end end end ================================================ FILE: app/controllers/concerns/.keep ================================================ ================================================ FILE: app/helpers/application_helper.rb ================================================ module ApplicationHelper def ui_translations(section) translations = {current: I18n.t('.')[:vue][section]} translations.to_json.html_safe end def paginate(scope, default_per_page = scope.default_per_page) collection = scope.page(params[:page]).per((params[:per_page] || default_per_page).to_i) current, total, per_page = collection.current_page, collection.total_pages, collection.limit_value { current: current, previous: (current > 1 ? (current - 1) : nil), next: (current == total ? nil : (current + 1)), per_page: per_page, pages: total, count: collection.total_count } end end ================================================ FILE: app/javascript/admin/routes.js ================================================ import { createWebHistory, createRouter } from 'vue-router' import DashboardIndex from '@/admin/views/dashboard/index.vue'; import MusicianIndex from '@/admin/views/musicians/index.vue'; import MusicianNew from '@/admin/views/musicians/new.vue'; import MusicianEdit from '@/admin/views/musicians/edit.vue'; import WebsocketIndex from '@/admin/views/websockets/index.vue'; const router = createRouter({ history: createWebHistory(`/${I18n.prefix}admin`), routes: [ { path: '/', component: DashboardIndex, name: 'root_path' }, { path: '/musicians', component: MusicianIndex, name: 'musicians_path' }, { path: '/musicians/new', component: MusicianNew, name: 'new_musician_path' }, { path: '/musicians/:id/edit', component: MusicianEdit, name: 'edit_musician_path' }, { path: '/websockets', component: WebsocketIndex, name: 'websockets_path' } ] }); // Handles 404 Not found router.beforeEach((to, from, next) => { if (!to.matched.length) { window.location.href = '/404' } else { next(); } }); export default router; ================================================ FILE: app/javascript/admin/stores/dashboard_store.js ================================================ import { defineStore } from 'pinia' export const DashboardStore = defineStore('dashboard', { state: () => { return { metrics: {} } }, actions: { async index() { return this.Api.get('/dashboard').then(response => { this.metrics = response.data.metrics; }) } } }) ================================================ FILE: app/javascript/admin/stores/musician_store.js ================================================ import { defineStore } from 'pinia' export const MusicianStore = defineStore('musicians', { state: () => { return { progress: '', errors: {}, bands: [], musician: {}, musicians: [], pagination: {} } }, actions: { async index(path) { return this.Api.get(path).then(response => { this.pagination = response.data.pagination; this.bands = response.data.bands; this.musicians = response.data.musicians; }) }, async new() { this.errors = {}; this.musician = {}; return this.Api.get(`/musicians/new`).then(response => { this.musician = response.data.musician; }) }, async create() { this.errors = {}; this.progress = 'loading'; return this.Api.post(`/musicians`, this.musician).then(response => { this.musician = response.data.musician; return true; }).catch(error => { this.errors = error.response.data.errors; return false; }).finally(() => { this.progress = ''; }) }, async edit(id) { this.errors = {}; this.musician = {}; return this.Api.get(`/musicians/${id}/edit`).then(response => { this.musician = response.data.musician; }) }, async update(id) { this.errors = {}; this.progress = 'loading'; return this.Api.put(`/musicians/${id}`, this.musician).then(response => { this.errors = {}; }).catch(error => { this.errors = error.response.data.errors; }).finally(() => { this.progress = ''; }) }, async destroy(id) { return this.Api.destroy(`/musicians/${id}`).then(response => { this.errors = {}; }).catch(error => { this.errors = error.response.data.errors; }) } } }) ================================================ FILE: app/javascript/admin/views/dashboard/index.vue ================================================ ================================================ FILE: app/javascript/admin/views/musicians/_filters.vue ================================================ ================================================ FILE: app/javascript/admin/views/musicians/_form.vue ================================================ ================================================ FILE: app/javascript/admin/views/musicians/edit.vue ================================================ ================================================ FILE: app/javascript/admin/views/musicians/index.vue ================================================ ================================================ FILE: app/javascript/admin/views/musicians/new.vue ================================================ ================================================ FILE: app/javascript/admin/views/shared/_errors.vue ================================================ ================================================ FILE: app/javascript/admin/views/shared/_footer.vue ================================================ ================================================ FILE: app/javascript/admin/views/shared/_nav.vue ================================================ ================================================ FILE: app/javascript/admin/views/shared/_pagination.vue ================================================ ================================================ FILE: app/javascript/admin/views/shared/layout.vue ================================================ ================================================ FILE: app/javascript/admin/views/websockets/index.vue ================================================ ================================================ FILE: app/javascript/entrypoints/admin.js ================================================ import { createApp } from 'vue'; const app = createApp(Layout); import Router from '@/admin/routes.js'; import Layout from '@/admin/views/shared/layout.vue'; import Axios from "axios"; // ActionCable setup import { createCable } from '@/plugins/cable'; const Cable = createCable({channel: 'ChatChannel'}) // Pinia + Axios setup import { createApi } from '@/plugins/api'; import { createPinia } from 'pinia'; const Pinia = createPinia(); Pinia.use(({ store }) => { store.Api = createApi({handler: Axios, namespace: '/admin'}) }) // I18n loader import { createI18n } from 'vue-i18n'; const I18n = createI18n({locale: 'current', messages: translations, legacy: false}); app.use(Router) .use(Pinia) .use(I18n) .use(Cable) .mount('#app') ================================================ FILE: app/javascript/entrypoints/front.js ================================================ import { createApp } from 'vue'; const app = createApp(Layout); import Router from '@/front/routes.js'; import Layout from '@/front/views/shared/layout.vue'; import Axios from "axios"; // API + Axios wrapper import { createApi } from '@/plugins/api'; const Api = createApi({handler: Axios, namespace: ''}); // Pinia + Axios setup import { createPinia } from 'pinia'; const Pinia = createPinia(); Pinia.use(({ store }) => { store.Api = Api }) // I18n loader import { createI18n } from 'vue-i18n'; const I18n = createI18n({locale: 'current', messages: translations, legacy: false}); app.use(Router) .use(Pinia) .use(I18n) .mount('#app') ================================================ FILE: app/javascript/front/routes.js ================================================ import { createWebHistory, createRouter } from 'vue-router' import PageIndex from './views/pages/index.vue'; import MusicianIndex from './views/musicians/index.vue'; import MusicianShow from './views/musicians/show.vue'; const router = createRouter({ history: createWebHistory(`/${I18n.prefix}`), routes: [ { path: '/', component: MusicianIndex, name: 'root_path' }, { path: '/pages', component: PageIndex, name: 'pages_path' }, { path: '/musicians', component: MusicianIndex, name: 'musicians_path' }, { path: '/musicians/:id', component: MusicianShow, name: 'musician_path' }, ] }); // Handles 404 Not found router.beforeEach((to, from, next) => { if (!to.matched.length) { window.location.href = '/404' } else { next(); } }); export default router; ================================================ FILE: app/javascript/front/stores/musician_store.js ================================================ import { defineStore } from 'pinia' export const MusicianStore = defineStore('musicians', { state: () => { return { musicians: [], musician: {} } }, actions: { async index(path) { return this.Api.get('/musicians').then(response => { this.musicians = response.data.musicians; }) }, async show(id) { return this.Api.get(`/musicians/${id}`).then(response => { this.musician = response.data.musician; }) } } }) ================================================ FILE: app/javascript/front/views/musicians/index.vue ================================================ ================================================ FILE: app/javascript/front/views/musicians/show.vue ================================================ ================================================ FILE: app/javascript/front/views/pages/index.vue ================================================ ================================================ FILE: app/javascript/front/views/shared/_footer.vue ================================================ ================================================ FILE: app/javascript/front/views/shared/_nav.vue ================================================ ================================================ FILE: app/javascript/front/views/shared/layout.vue ================================================ ================================================ FILE: app/javascript/plugins/api.js ================================================ import Axios from "axios"; function Api() { const get = function (route) { return Axios.get(route); }; const post = function (route, params) { return Axios.post(route, params); }; const put = function (route, params) { return Axios.put(route, params); }; const destroy = function (route) { return Axios.delete(route); }; return { get, post, put, destroy }; } export function createApi(args) { args.handler.defaults.baseURL = `/${window.I18n.prefix}api${args.namespace}/`; args.handler.defaults.headers.common["X-CSRF-Token"] = document .querySelector('meta[name="csrf-token"]') .getAttribute("content"); args.handler.interceptors.response.use( (response) => { return response; }, (error) => { switch (error.response.status) { case 500: window.location.href = "/500"; break; case 401: alert("not authenticated"); break; } return Promise.reject(error); } ); return new Api(); } ================================================ FILE: app/javascript/plugins/cable.js ================================================ import { createConsumer } from "@rails/actioncable" import mitt from 'mitt'; const protocol = window.location.protocol === 'https:' ? 'wss' : 'ws'; const consumer = createConsumer(`${protocol}://${window.location.host}/cable`); const emitter = mitt(); let channel = null; function Cable() {} Cable.prototype.on = function(channel, callback) { return emitter.on(channel, callback); }; Cable.prototype.send = function(message) { channel.send({message: message}) }; Cable.prototype.install = function(app) { app.plugin = this; app.provide('cable', this) } export function createCable(options) { channel = consumer.subscriptions.create({ channel: options.channel}, { received(data) { emitter.emit('chat', data) } }) return new Cable(); } ================================================ FILE: app/jobs/application_job.rb ================================================ class ApplicationJob < ActiveJob::Base # Automatically retry jobs that encountered a deadlock # retry_on ActiveRecord::Deadlocked # Most jobs are safe to ignore if the underlying records are no longer available # discard_on ActiveJob::DeserializationError end ================================================ FILE: app/mailers/application_mailer.rb ================================================ class ApplicationMailer < ActionMailer::Base default from: "from@example.com" layout "mailer" end ================================================ FILE: app/models/application_record.rb ================================================ class ApplicationRecord < ActiveRecord::Base primary_abstract_class end ================================================ FILE: app/models/concerns/.keep ================================================ ================================================ FILE: app/models/musician.rb ================================================ class Musician < ApplicationRecord paginates_per 5 validates_presence_of :name, :band enum band: [:rolling_stones, :beatles, :acdc] def self.ransackable_attributes(auth_object = nil) ["band", "name"] end end ================================================ FILE: app/models/user.rb ================================================ class User < ApplicationRecord paginates_per 10 devise :database_authenticatable validates_presence_of :email end ================================================ FILE: app/views/admin.html.erb ================================================ Boilerplate | Admin <%= csrf_meta_tags %>
<%= vite_javascript_tag 'admin' %> ================================================ FILE: app/views/api/admin/musicians/edit.json.jbuilder ================================================ json.musician do json.id @musician.id json.name @musician.name json.band @musician.band json.bands Musician.bands.each do |name, _| json.key name json.name t(name, scope: 'bands') end end ================================================ FILE: app/views/api/admin/musicians/index.json.jbuilder ================================================ json.musicians @musicians.each do |musician| json.id musician.id json.created_at l(musician.created_at, format: :default) json.name musician.name json.band t(musician.band, scope: 'bands') end json.bands Musician.bands.each do |band, key| json.key key json.name t(band, scope: 'bands') end json.partial! partial: '/api/admin/shared/pagination', locals: { kind: @musicians } ================================================ FILE: app/views/api/admin/musicians/new.json.jbuilder ================================================ json.musician do json.name @musician.name json.bands Musician.bands.each do |name, _| json.key name json.name t(name, scope: 'bands') end end ================================================ FILE: app/views/api/admin/shared/_pagination.json.jbuilder ================================================ obj = paginate(kind) json.pagination do json.current obj[:current] json.previous obj[:previous] json.next obj[:next] json.per_page obj[:per_page] json.pages obj[:pages] json.count obj[:count] end ================================================ FILE: app/views/api/admin/users/edit.json.jbuilder ================================================ json.user do json.id @user.id json.email @user.email end ================================================ FILE: app/views/api/admin/users/index.json.jbuilder ================================================ json.users @users.each do |user| json.id user.id json.created_at l(user.created_at, format: :default) json.email user.email end json.partial! partial: '/api/admin/shared/pagination', locals: { kind: @users, callback: 'UserStore/index' } ================================================ FILE: app/views/api/admin/users/new.json.jbuilder ================================================ json.user do json.email @user.email end ================================================ FILE: app/views/api/musicians/index.json.jbuilder ================================================ json.musicians @musicians.each do |musician| json.id musician.id json.created_at l(musician.created_at, format: :default) json.name musician.name json.band t(musician.band, scope: 'bands') end ================================================ FILE: app/views/api/musicians/show.json.jbuilder ================================================ json.musician do json.id @musician.id json.name @musician.name json.band t(@musician.band, scope: 'bands') end ================================================ FILE: app/views/application.html.erb ================================================ Boilerplate <%= csrf_meta_tags %>
<%= vite_javascript_tag 'front' %> ================================================ FILE: app/views/devise/sessions/new.html.erb ================================================

<%= t('devise.sign_in') %>

<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<%= f.label :email %> <%= f.email_field :email, value: "admin@domain.com", autofocus: true, class: "uk-input" %>
<%= f.label :password %> <%= f.password_field :password, value: "password", autocomplete: "off", class: "uk-input" %>
<%= f.submit t('devise.sign_in'), class: "button button-primary" %>
<% end %>
================================================ FILE: app/views/layouts/devise.html.erb ================================================ Boilerplate <%= csrf_meta_tags %> <%= yield %> ================================================ FILE: app/views/layouts/mailer.html.erb ================================================ <%= yield %> ================================================ FILE: app/views/layouts/mailer.text.erb ================================================ <%= yield %> ================================================ FILE: bin/bootsnap ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'bootsnap' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("bootsnap", "bootsnap") ================================================ FILE: bin/bundle ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'bundle' is installed as part of a gem, and # this file is here to facilitate running it. # require "rubygems" m = Module.new do module_function def invoked_as_script? File.expand_path($0) == File.expand_path(__FILE__) end def env_var_version ENV["BUNDLER_VERSION"] end def cli_arg_version return unless invoked_as_script? # don't want to hijack other binstubs return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` bundler_version = nil update_index = nil ARGV.each_with_index do |a, i| if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN bundler_version = a end next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ bundler_version = $1 update_index = i end bundler_version end def gemfile gemfile = ENV["BUNDLE_GEMFILE"] return gemfile if gemfile && !gemfile.empty? File.expand_path("../Gemfile", __dir__) end def lockfile lockfile = case File.basename(gemfile) when "gems.rb" then gemfile.sub(/\.rb$/, gemfile) else "#{gemfile}.lock" end File.expand_path(lockfile) end def lockfile_version return unless File.file?(lockfile) lockfile_contents = File.read(lockfile) return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ Regexp.last_match(1) end def bundler_requirement @bundler_requirement ||= env_var_version || cli_arg_version || bundler_requirement_for(lockfile_version) end def bundler_requirement_for(version) return "#{Gem::Requirement.default}.a" unless version bundler_gem_version = Gem::Version.new(version) requirement = bundler_gem_version.approximate_recommendation return requirement unless Gem.rubygems_version < Gem::Version.new("2.7.0") requirement += ".a" if bundler_gem_version.prerelease? requirement end def load_bundler! ENV["BUNDLE_GEMFILE"] ||= gemfile activate_bundler end def activate_bundler gem_error = activation_error_handling do gem "bundler", bundler_requirement end return if gem_error.nil? require_error = activation_error_handling do require "bundler/version" end return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" exit 42 end def activation_error_handling yield nil rescue StandardError, LoadError => e e end end m.load_bundler! if m.invoked_as_script? load Gem.bin_path("bundler", "bundle") end ================================================ FILE: bin/foreman ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'foreman' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("foreman", "foreman") ================================================ FILE: bin/importmap ================================================ #!/usr/bin/env ruby require_relative "../config/application" require "importmap/commands" ================================================ FILE: bin/irb ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'irb' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("irb", "irb") ================================================ FILE: bin/nokogiri ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'nokogiri' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("nokogiri", "nokogiri") ================================================ FILE: bin/puma ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'puma' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("puma", "puma") ================================================ FILE: bin/pumactl ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'pumactl' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("puma", "pumactl") ================================================ FILE: bin/racc ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'racc' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("racc", "racc") ================================================ FILE: bin/rackup ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'rackup' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("rack", "rackup") ================================================ FILE: bin/rails ================================================ #!/usr/bin/env ruby APP_PATH = File.expand_path("../config/application", __dir__) require_relative "../config/boot" require "rails/commands" ================================================ FILE: bin/rake ================================================ #!/usr/bin/env ruby require_relative "../config/boot" require "rake" Rake.application.run ================================================ FILE: bin/rdbg ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'rdbg' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("debug", "rdbg") ================================================ FILE: bin/setup ================================================ #!/usr/bin/env ruby require "fileutils" # path to your application root. APP_ROOT = File.expand_path("..", __dir__) def system!(*args) system(*args, exception: true) end FileUtils.chdir APP_ROOT do # This script is a way to set up or update your development environment automatically. # This script is idempotent, so that you can run it at any time and get an expectable outcome. # Add necessary setup steps to this file. puts "== Installing dependencies ==" system! "gem install bundler --conservative" system("bundle check") || system!("bundle install") # puts "\n== Copying sample files ==" # unless File.exist?("config/database.yml") # FileUtils.cp "config/database.yml.sample", "config/database.yml" # end puts "\n== Preparing database ==" system! "bin/rails db:prepare" puts "\n== Removing old logs and tempfiles ==" system! "bin/rails log:clear tmp:clear" puts "\n== Restarting application server ==" system! "bin/rails restart" end ================================================ FILE: bin/spring ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'spring' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("spring", "spring") ================================================ FILE: bin/sprockets ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'sprockets' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("sprockets", "sprockets") ================================================ FILE: bin/thor ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'thor' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("thor", "thor") ================================================ FILE: bin/tilt ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'tilt' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("tilt", "tilt") ================================================ FILE: bin/vite ================================================ #!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'vite' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("vite_ruby", "vite") ================================================ FILE: config/application.rb ================================================ require_relative "boot" require "rails/all" # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) module Next class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 7.0 # Please, add to the `ignore` list any other `lib` subdirectories that do # not contain `.rb` files, or that should not be reloaded or eager loaded. # Common ones are `templates`, `generators`, or `middleware`, for example. config.autoload_lib(ignore: %w(assets tasks)) # Configuration for the application, engines, and railties goes here. # # These settings can be overridden in specific environments using the files # in config/environments, which are processed later. # # config.time_zone = "Central Time (US & Canada)" # config.eager_load_paths << Rails.root.join("extras") end end ================================================ FILE: config/boot.rb ================================================ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) require "bundler/setup" # Set up gems listed in the Gemfile. require "bootsnap/setup" # Speed up boot time by caching expensive operations. ================================================ FILE: config/cable.yml ================================================ development: adapter: redis url: redis://<%= ENV["REDIS_URL"] || 'localhost' %>:6379/1 test: adapter: test production: adapter: redis url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> channel_prefix: next_production ================================================ FILE: config/credentials.yml.enc ================================================ z50kuuEHj1CEUcKRpJWPamB52/q1tUa818uvcrvMpkdqctOJIuFJlK1CSQvI9roMpaEdrydKRM2yubgNJX5C4Bj5qsI5uW3O77bkjiSbVjjSrMOCE4iogYxF2LS9aJ3OPny29Dgx3BzAtDR9GN6FiBytcvOjYIUNTYZrbqYFLFW2zjAeb8NElTqBdjePEHWitR5813D8e4VzQqLsaM/fcbiiwXs48YyFU1vN9uPCpL+Ljn54vyFmrAox1sbjtxYIr97YNsQNvouGdpt92zzkhckcnXQ6OWv1J/thPHzGbtJO5Ej9XmtlWnUWTFAI713C7SptEmyky/Q8OdO7ueKx16dZWucPAGoLm2lFst7OvVkWLM0r6sxGM4UrJLwG9IZhwt9UdxUyCd0VM/w9w+1bSdaUGsMAWnheTeLe--LR73FGyHeOp0ATJ0--+C76DQyMTGNE1y/Y8/G92Q== ================================================ FILE: config/database.yml ================================================ # SQLite version 3.x # gem install sqlite3 # # Ensure the SQLite 3 gem is defined in your Gemfile # gem 'sqlite3' # default: &default adapter: sqlite3 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: <<: *default database: db/development.sqlite3 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: db/test.sqlite3 production: <<: *default database: db/production.sqlite3 ================================================ FILE: config/environment.rb ================================================ # Load the Rails application. require_relative "application" # Initialize the Rails application. Rails.application.initialize! ================================================ FILE: config/environments/development.rb ================================================ require "active_support/core_ext/integer/time" Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # In the development environment your application's code is reloaded any time # it changes. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. config.enable_reloading = true # Do not eager load code on boot. config.eager_load = false # Show full error reports. config.consider_all_requests_local = true # Enable server timing config.server_timing = true # Enable/disable caching. By default caching is disabled. # Run rails dev:cache to toggle caching. if Rails.root.join("tmp/caching-dev.txt").exist? config.action_controller.perform_caching = true config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{2.days.to_i}" } else config.action_controller.perform_caching = false config.cache_store = :null_store end # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :local # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false config.action_mailer.perform_caching = false # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log # Raise exceptions for disallowed deprecations. config.active_support.disallowed_deprecation = :raise # Tell Active Support which deprecation messages to disallow. config.active_support.disallowed_deprecation_warnings = [] # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load # Highlight code that triggered database queries in logs. config.active_record.verbose_query_logs = true # Highlight code that enqueued background job in logs. config.active_job.verbose_enqueue_logs = true # Suppress logger output for asset requests. config.assets.quiet = true # Raises error for missing translations. # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names. # config.action_view.annotate_rendered_view_with_filenames = true # Uncomment if you wish to allow Action Cable access from any origin. # config.action_cable.disable_request_forgery_protection = true # Raise error when a before_action's only/except options reference missing actions config.action_controller.raise_on_missing_callback_actions = true end ================================================ FILE: config/environments/production.rb ================================================ require "active_support/core_ext/integer/time" Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # Code is not reloaded between requests. config.enable_reloading = false # Eager load code on boot. This eager loads most of Rails and # your application in memory, allowing both threaded web servers # and those relying on copy on write to perform better. # Rake tasks automatically ignore this option for performance. config.eager_load = true # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files). # config.require_master_key = true # Disable serving static files from `public/`, relying on NGINX/Apache to do so instead. # config.public_file_server.enabled = false # Compress CSS using a preprocessor. # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.asset_host = "http://assets.example.com" # Specifies the header that your server uses for sending files. # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :local # Mount Action Cable outside main process or domain. # config.action_cable.mount_path = nil # config.action_cable.url = "wss://example.com/cable" # config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ] # Assume all access to the app is happening through a SSL-terminating reverse proxy. # Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies. # config.assume_ssl = true # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. config.force_ssl = true # Log to STDOUT by default config.logger = ActiveSupport::Logger.new(STDOUT) .tap { |logger| logger.formatter = ::Logger::Formatter.new } .then { |logger| ActiveSupport::TaggedLogging.new(logger) } # Prepend all log lines with the following tags. config.log_tags = [ :request_id ] # Info include generic and useful information about system operation, but avoids logging too much # information to avoid inadvertent exposure of personally identifiable information (PII). If you # want to log everything, set the level to "debug". config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info") # Use a different cache store in production. # config.cache_store = :mem_cache_store # Use a real queuing backend for Active Job (and separate queues per environment). # config.active_job.queue_adapter = :resque # config.active_job.queue_name_prefix = "next_production" config.action_mailer.perform_caching = false # Ignore bad email addresses and do not raise email delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors. # config.action_mailer.raise_delivery_errors = false # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true # Don't log any deprecations. config.active_support.report_deprecations = false # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false # Enable DNS rebinding protection and other `Host` header attacks. # config.hosts = [ # "example.com", # Allow requests from example.com # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com` # ] # Skip DNS rebinding protection for the default health check endpoint. # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } end ================================================ FILE: config/environments/test.rb ================================================ require "active_support/core_ext/integer/time" # The test environment is used exclusively to run your application's # test suite. You never need to work with it otherwise. Remember that # your test database is "scratch space" for the test suite and is wiped # and recreated between test runs. Don't rely on the data there! Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # While tests run files are not watched, reloading is not necessary. config.enable_reloading = false # Eager loading loads your entire application. When running a single test locally, # this is usually not necessary, and can slow down your test suite. However, it's # recommended that you enable it in continuous integration systems to ensure eager # loading is working properly before deploying your code. config.eager_load = ENV["CI"].present? # Configure public file server for tests with Cache-Control for performance. config.public_file_server.enabled = true config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{1.hour.to_i}" } # Show full error reports and disable caching. config.consider_all_requests_local = true config.action_controller.perform_caching = false config.cache_store = :null_store # Render exception templates for rescuable exceptions and raise for other exceptions. config.action_dispatch.show_exceptions = :rescuable # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false # Store uploaded files on the local file system in a temporary directory. config.active_storage.service = :test config.action_mailer.perform_caching = false # Tell Action Mailer not to deliver emails to the real world. # The :test delivery method accumulates sent emails in the # ActionMailer::Base.deliveries array. config.action_mailer.delivery_method = :test # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr # Raise exceptions for disallowed deprecations. config.active_support.disallowed_deprecation = :raise # Tell Active Support which deprecation messages to disallow. config.active_support.disallowed_deprecation_warnings = [] # Raises error for missing translations. # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names. # config.action_view.annotate_rendered_view_with_filenames = true # Raise error when a before_action's only/except options reference missing actions config.action_controller.raise_on_missing_callback_actions = true end ================================================ FILE: config/importmap.rb ================================================ # Pin npm packages by running ./bin/importmap pin "application", preload: true pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true pin_all_from "app/javascript/controllers", under: "controllers" ================================================ FILE: config/initializers/assets.rb ================================================ # Be sure to restart your server when you modify this file. # Version of your assets, change this if you want to expire all your assets. Rails.application.config.assets.version = "1.0" # Add additional assets to the asset load path. # Rails.application.config.assets.paths << Emoji.images_path # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in the app/assets # folder are already added. # Rails.application.config.assets.precompile += %w( admin.js admin.css ) ================================================ FILE: config/initializers/content_security_policy.rb ================================================ # Be sure to restart your server when you modify this file. # Define an application-wide content security policy. # See the Securing Rails Applications Guide for more information: # https://guides.rubyonrails.org/security.html#content-security-policy-header # Rails.application.configure do # config.content_security_policy do |policy| # policy.default_src :self, :https # policy.font_src :self, :https, :data # policy.img_src :self, :https, :data # policy.object_src :none # policy.script_src :self, :https # policy.style_src :self, :https # # Specify URI for violation reports # # policy.report_uri "/csp-violation-report-endpoint" # end # # # Generate session nonces for permitted importmap, inline scripts, and inline styles. # config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } # config.content_security_policy_nonce_directives = %w(script-src style-src) # # # Report violations without enforcing the policy. # # config.content_security_policy_report_only = true # end ================================================ FILE: config/initializers/cypress_rails_initializer.rb ================================================ return unless Rails.env.test? #require "./lib/external_service" Rails.application.load_tasks unless defined?(Rake::Task) CypressRails.hooks.before_server_start do # Add our fixtures before the resettable transaction is started Rake::Task["db:fixtures:load"].invoke end CypressRails.hooks.after_server_start do # Start up external service #ExternalService.start_service end CypressRails.hooks.after_transaction_start do # After each transaction, add this compliment (will be rolled back on reset) #Compliment.create(text: "You are courageous") end CypressRails.hooks.after_state_reset do # if Compliment.count != 4 # raise "Wait I was expecting exactly 4 compliments!" # end end CypressRails.hooks.before_server_stop do # Purge and reload the test database so we don't leave our fixtures in there Rake::Task["db:test:prepare"].invoke end ================================================ FILE: config/initializers/devise.rb ================================================ # frozen_string_literal: true # Assuming you have not yet modified this file, each configuration option below # is set to its default value. Note that some are commented out while others # are not: uncommented lines are intended to protect your configuration from # breaking changes in upgrades (i.e., in the event that future versions of # Devise change the default values for those options). # # Use this hook to configure devise mailer, warden hooks and so forth. # Many of these configuration options can be set straight in your model. Devise.setup do |config| # The secret key used by Devise. Devise uses this key to generate # random tokens. Changing this key will render invalid all existing # confirmation, reset password and unlock tokens in the database. # Devise will use the `secret_key_base` as its `secret_key` # by default. You can change it below and use your own secret key. # config.secret_key = 'fe7dbda89d8b5e2b6f07c0b413456bb1ab362afc0bf446ddfe789c0819a46d2f14a779adc845025ac3db2900b0167c7b028b400c4343a1536ae7e1695cef1a66' # ==> Controller configuration # Configure the parent class to the devise controllers. # config.parent_controller = 'DeviseController' # ==> Mailer Configuration # Configure the e-mail address which will be shown in Devise::Mailer, # note that it will be overwritten if you use your own mailer class # with default "from" parameter. config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com' # Configure the class responsible to send e-mails. # config.mailer = 'Devise::Mailer' # Configure the parent class responsible to send e-mails. # config.parent_mailer = 'ActionMailer::Base' # ==> ORM configuration # Load and configure the ORM. Supports :active_record (default) and # :mongoid (bson_ext recommended) by default. Other ORMs may be # available as additional gems. require 'devise/orm/active_record' # ==> Configuration for any authentication mechanism # Configure which keys are used when authenticating a user. The default is # just :email. You can configure it to use [:username, :subdomain], so for # authenticating a user, both parameters are required. Remember that those # parameters are used only when authenticating and not when retrieving from # session. If you need permissions, you should implement that in a before filter. # You can also supply a hash where the value is a boolean determining whether # or not authentication should be aborted when the value is not present. # config.authentication_keys = [:email] # Configure parameters from the request object used for authentication. Each entry # given should be a request method and it will automatically be passed to the # find_for_authentication method and considered in your model lookup. For instance, # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. # The same considerations mentioned for authentication_keys also apply to request_keys. # config.request_keys = [] # Configure which authentication keys should be case-insensitive. # These keys will be downcased upon creating or modifying a user and when used # to authenticate or find a user. Default is :email. config.case_insensitive_keys = [:email] # Configure which authentication keys should have whitespace stripped. # These keys will have whitespace before and after removed upon creating or # modifying a user and when used to authenticate or find a user. Default is :email. config.strip_whitespace_keys = [:email] # Tell if authentication through request.params is enabled. True by default. # It can be set to an array that will enable params authentication only for the # given strategies, for example, `config.params_authenticatable = [:database]` will # enable it only for database (email + password) authentication. # config.params_authenticatable = true # Tell if authentication through HTTP Auth is enabled. False by default. # It can be set to an array that will enable http authentication only for the # given strategies, for example, `config.http_authenticatable = [:database]` will # enable it only for database authentication. # For API-only applications to support authentication "out-of-the-box", you will likely want to # enable this with :database unless you are using a custom strategy. # The supported strategies are: # :database = Support basic authentication with authentication key + password # config.http_authenticatable = false # If 401 status code should be returned for AJAX requests. True by default. # config.http_authenticatable_on_xhr = true # The realm used in Http Basic Authentication. 'Application' by default. # config.http_authentication_realm = 'Application' # It will change confirmation, password recovery and other workflows # to behave the same regardless if the e-mail provided was right or wrong. # Does not affect registerable. # config.paranoid = true # By default Devise will store the user in session. You can skip storage for # particular strategies by setting this option. # Notice that if you are skipping storage for all authentication paths, you # may want to disable generating routes to Devise's sessions controller by # passing skip: :sessions to `devise_for` in your config/routes.rb config.skip_session_storage = [:http_auth] # By default, Devise cleans up the CSRF token on authentication to # avoid CSRF token fixation attacks. This means that, when using AJAX # requests for sign in and sign up, you need to get a new CSRF token # from the server. You can disable this option at your own risk. # config.clean_up_csrf_token_on_authentication = true # When false, Devise will not attempt to reload routes on eager load. # This can reduce the time taken to boot the app but if your application # requires the Devise mappings to be loaded during boot time the application # won't boot properly. # config.reload_routes = true # ==> Configuration for :database_authenticatable # For bcrypt, this is the cost for hashing the password and defaults to 12. If # using other algorithms, it sets how many times you want the password to be hashed. # The number of stretches used for generating the hashed password are stored # with the hashed password. This allows you to change the stretches without # invalidating existing passwords. # # Limiting the stretches to just one in testing will increase the performance of # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use # a value less than 10 in other environments. Note that, for bcrypt (the default # algorithm), the cost increases exponentially with the number of stretches (e.g. # a value of 20 is already extremely slow: approx. 60 seconds for 1 calculation). config.stretches = Rails.env.test? ? 1 : 12 # Set up a pepper to generate the hashed password. # config.pepper = '8f57964ea0a55bf7585f2098daf8877ad19337cb2c530ffc776f792f0a13be6648060a3e0696b9652cf748a033fb512df777b2cf36f2423f6a7a4e17181c3c26' # Send a notification to the original email when the user's email is changed. # config.send_email_changed_notification = false # Send a notification email when the user's password is changed. # config.send_password_change_notification = false # ==> Configuration for :confirmable # A period that the user is allowed to access the website even without # confirming their account. For instance, if set to 2.days, the user will be # able to access the website for two days without confirming their account, # access will be blocked just in the third day. # You can also set it to nil, which will allow the user to access the website # without confirming their account. # Default is 0.days, meaning the user cannot access the website without # confirming their account. # config.allow_unconfirmed_access_for = 2.days # A period that the user is allowed to confirm their account before their # token becomes invalid. For example, if set to 3.days, the user can confirm # their account within 3 days after the mail was sent, but on the fourth day # their account can't be confirmed with the token any more. # Default is nil, meaning there is no restriction on how long a user can take # before confirming their account. # config.confirm_within = 3.days # If true, requires any email changes to be confirmed (exactly the same way as # initial account confirmation) to be applied. Requires additional unconfirmed_email # db field (see migrations). Until confirmed, new email is stored in # unconfirmed_email column, and copied to email column on successful confirmation. config.reconfirmable = true # Defines which key will be used when confirming an account # config.confirmation_keys = [:email] # ==> Configuration for :rememberable # The time the user will be remembered without asking for credentials again. # config.remember_for = 2.weeks # Invalidates all the remember me tokens when the user signs out. config.expire_all_remember_me_on_sign_out = true # If true, extends the user's remember period when remembered via cookie. # config.extend_remember_period = false # Options to be passed to the created cookie. For instance, you can set # secure: true in order to force SSL only cookies. # config.rememberable_options = {} # ==> Configuration for :validatable # Range for password length. config.password_length = 6..128 # Email regex used to validate email formats. It simply asserts that # one (and only one) @ exists in the given string. This is mainly # to give user feedback and not to assert the e-mail validity. config.email_regexp = /\A[^@\s]+@[^@\s]+\z/ # ==> Configuration for :timeoutable # The time you want to timeout the user session without activity. After this # time the user will be asked for credentials again. Default is 30 minutes. # config.timeout_in = 30.minutes # ==> Configuration for :lockable # Defines which strategy will be used to lock an account. # :failed_attempts = Locks an account after a number of failed attempts to sign in. # :none = No lock strategy. You should handle locking by yourself. # config.lock_strategy = :failed_attempts # Defines which key will be used when locking and unlocking an account # config.unlock_keys = [:email] # Defines which strategy will be used to unlock an account. # :email = Sends an unlock link to the user email # :time = Re-enables login after a certain amount of time (see :unlock_in below) # :both = Enables both strategies # :none = No unlock strategy. You should handle unlocking by yourself. # config.unlock_strategy = :both # Number of authentication tries before locking an account if lock_strategy # is failed attempts. # config.maximum_attempts = 20 # Time interval to unlock the account if :time is enabled as unlock_strategy. # config.unlock_in = 1.hour # Warn on the last attempt before the account is locked. # config.last_attempt_warning = true # ==> Configuration for :recoverable # # Defines which key will be used when recovering the password for an account # config.reset_password_keys = [:email] # Time interval you can reset your password with a reset password key. # Don't put a too small interval or your users won't have the time to # change their passwords. config.reset_password_within = 6.hours # When set to false, does not sign a user in automatically after their password is # reset. Defaults to true, so a user is signed in automatically after a reset. # config.sign_in_after_reset_password = true # ==> Configuration for :encryptable # Allow you to use another hashing or encryption algorithm besides bcrypt (default). # You can use :sha1, :sha512 or algorithms from others authentication tools as # :clearance_sha1, :authlogic_sha512 (then you should set stretches above to 20 # for default behavior) and :restful_authentication_sha1 (then you should set # stretches to 10, and copy REST_AUTH_SITE_KEY to pepper). # # Require the `devise-encryptable` gem when using anything other than bcrypt # config.encryptor = :sha512 # ==> Scopes configuration # Turn scoped views on. Before rendering "sessions/new", it will first check for # "users/sessions/new". It's turned off by default because it's slower if you # are using only default views. # config.scoped_views = false # Configure the default scope given to Warden. By default it's the first # devise role declared in your routes (usually :user). # config.default_scope = :user # Set this configuration to false if you want /users/sign_out to sign out # only the current scope. By default, Devise signs out all scopes. # config.sign_out_all_scopes = true # ==> Navigation configuration # Lists the formats that should be treated as navigational. Formats like # :html, should redirect to the sign in page when the user does not have # access, but formats like :xml or :json, should return 401. # # If you have any extra navigational formats, like :iphone or :mobile, you # should add them to the navigational formats lists. # # The "*/*" below is required to match Internet Explorer requests. # config.navigational_formats = ['*/*', :html] # The default HTTP method used to sign out a resource. Default is :delete. config.sign_out_via = :get # ==> OmniAuth # Add a new OmniAuth provider. Check the wiki for more information on setting # up on your models and hooks. # config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo' # ==> Warden configuration # If you want to use other strategies, that are not supported by Devise, or # change the failure app, you can configure them inside the config.warden block. # # config.warden do |manager| # manager.intercept_401 = false # manager.default_strategies(scope: :user).unshift :some_external_strategy # end # ==> Mountable engine configurations # When using Devise inside an engine, let's call it `MyEngine`, and this engine # is mountable, there are some extra configurations to be taken into account. # The following options are available, assuming the engine is mounted as: # # mount MyEngine, at: '/my_engine' # # The router that invoked `devise_for`, in the example above, would be: # config.router_name = :my_engine # # When using OmniAuth, Devise cannot automatically set OmniAuth path, # so you need to do it manually. For the users scope, it would be: # config.omniauth_path_prefix = '/my_engine/users/auth' # ==> Turbolinks configuration # If your app is using Turbolinks, Turbolinks::Controller needs to be included to make redirection work correctly: # # ActiveSupport.on_load(:devise_failure_app) do # include Turbolinks::Controller # end # ==> Configuration for :registerable # When set to false, does not sign a user in automatically after their password is # changed. Defaults to true, so a user is signed in automatically after changing a password. # config.sign_in_after_change_password = true end ================================================ FILE: config/initializers/filter_parameter_logging.rb ================================================ # Be sure to restart your server when you modify this file. # Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. # Use this to limit dissemination of sensitive information. # See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. Rails.application.config.filter_parameters += [ :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn ] ================================================ FILE: config/initializers/inflections.rb ================================================ # Be sure to restart your server when you modify this file. # Add new inflection rules using the following format. Inflections # are locale specific, and you may define rules for as many different # locales as you wish. All of these examples are active by default: # ActiveSupport::Inflector.inflections(:en) do |inflect| # inflect.plural /^(ox)$/i, "\\1en" # inflect.singular /^(ox)en/i, "\\1" # inflect.irregular "person", "people" # inflect.uncountable %w( fish sheep ) # end # These inflection rules are supported but not enabled by default: # ActiveSupport::Inflector.inflections(:en) do |inflect| # inflect.acronym "RESTful" # end ================================================ FILE: config/initializers/locales.rb ================================================ I18n.available_locales = [:en, :fr] ================================================ FILE: config/initializers/new_framework_defaults_7_1.rb ================================================ # Be sure to restart your server when you modify this file. # # This file eases your Rails 7.1 framework defaults upgrade. # # Uncomment each configuration one by one to switch to the new default. # Once your application is ready to run with all new defaults, you can remove # this file and set the `config.load_defaults` to `7.1`. # # Read the Guide for Upgrading Ruby on Rails for more info on each option. # https://guides.rubyonrails.org/upgrading_ruby_on_rails.html ### # No longer add autoloaded paths into `$LOAD_PATH`. This means that you won't be able # to manually require files that are managed by the autoloader, which you shouldn't do anyway. # # This will reduce the size of the load path, making `require` faster if you don't use bootsnap, or reduce the size # of the bootsnap cache if you use it. #++ # Rails.application.config.add_autoload_paths_to_load_path = false ### # Remove the default X-Download-Options headers since it is used only by Internet Explorer. # If you need to support Internet Explorer, add back `"X-Download-Options" => "noopen"`. #++ # Rails.application.config.action_dispatch.default_headers = { # "X-Frame-Options" => "SAMEORIGIN", # "X-XSS-Protection" => "0", # "X-Content-Type-Options" => "nosniff", # "X-Permitted-Cross-Domain-Policies" => "none", # "Referrer-Policy" => "strict-origin-when-cross-origin" # } ### # Do not treat an `ActionController::Parameters` instance # as equal to an equivalent `Hash` by default. #++ # Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality = false ### # Active Record Encryption now uses SHA-256 as its hash digest algorithm. # # There are 3 scenarios to consider. # # 1. If you have data encrypted with previous Rails versions, and you have # +config.active_support.key_generator_hash_digest_class+ configured as SHA1 (the default # before Rails 7.0), you need to configure SHA-1 for Active Record Encryption too: #++ # Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA1 # # 2. If you have +config.active_support.key_generator_hash_digest_class+ configured as SHA256 (the new default # in 7.0), then you need to configure SHA-256 for Active Record Encryption: #++ # Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA256 # # 3. If you don't currently have data encrypted with Active Record encryption, you can disable this setting to # configure the default behavior starting 7.1+: #++ # Rails.application.config.active_record.encryption.support_sha1_for_non_deterministic_encryption = false ### # No longer run after_commit callbacks on the first of multiple Active Record # instances to save changes to the same database row within a transaction. # Instead, run these callbacks on the instance most likely to have internal # state which matches what was committed to the database, typically the last # instance to save. #++ # Rails.application.config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction = false ### # Configures SQLite with a strict strings mode, which disables double-quoted string literals. # # SQLite has some quirks around double-quoted string literals. # It first tries to consider double-quoted strings as identifier names, but if they don't exist # it then considers them as string literals. Because of this, typos can silently go unnoticed. # For example, it is possible to create an index for a non existing column. # See https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted for more details. #++ # Rails.application.config.active_record.sqlite3_adapter_strict_strings_by_default = true ### # Disable deprecated singular associations names. #++ # Rails.application.config.active_record.allow_deprecated_singular_associations_name = false ### # Enable the Active Job `BigDecimal` argument serializer, which guarantees # roundtripping. Without this serializer, some queue adapters may serialize # `BigDecimal` arguments as simple (non-roundtrippable) strings. # # When deploying an application with multiple replicas, old (pre-Rails 7.1) # replicas will not be able to deserialize `BigDecimal` arguments from this # serializer. Therefore, this setting should only be enabled after all replicas # have been successfully upgraded to Rails 7.1. #++ # Rails.application.config.active_job.use_big_decimal_serializer = true ### # Specify if an `ArgumentError` should be raised if `Rails.cache` `fetch` or # `write` are given an invalid `expires_at` or `expires_in` time. # Options are `true`, and `false`. If `false`, the exception will be reported # as `handled` and logged instead. #++ # Rails.application.config.active_support.raise_on_invalid_cache_expiration_time = true ### # Specify whether Query Logs will format tags using the SQLCommenter format # (https://open-telemetry.github.io/opentelemetry-sqlcommenter/), or using the legacy format. # Options are `:legacy` and `:sqlcommenter`. #++ # Rails.application.config.active_record.query_log_tags_format = :sqlcommenter ### # Specify the default serializer used by `MessageEncryptor` and `MessageVerifier` # instances. # # The legacy default is `:marshal`, which is a potential vector for # deserialization attacks in cases where a message signing secret has been # leaked. # # In Rails 7.1, the new default is `:json_allow_marshal` which serializes and # deserializes with `ActiveSupport::JSON`, but can fall back to deserializing # with `Marshal` so that legacy messages can still be read. # # In Rails 7.2, the default will become `:json` which serializes and # deserializes with `ActiveSupport::JSON` only. # # Alternatively, you can choose `:message_pack` or `:message_pack_allow_marshal`, # which serialize with `ActiveSupport::MessagePack`. `ActiveSupport::MessagePack` # can roundtrip some Ruby types that are not supported by JSON, and may provide # improved performance, but it requires the `msgpack` gem. # # For more information, see # https://guides.rubyonrails.org/v7.1/configuring.html#config-active-support-message-serializer # # If you are performing a rolling deploy of a Rails 7.1 upgrade, wherein servers # that have not yet been upgraded must be able to read messages from upgraded # servers, first deploy without changing the serializer, then set the serializer # in a subsequent deploy. #++ # Rails.application.config.active_support.message_serializer = :json_allow_marshal ### # Enable a performance optimization that serializes message data and metadata # together. This changes the message format, so messages serialized this way # cannot be read by older versions of Rails. However, messages that use the old # format can still be read, regardless of whether this optimization is enabled. # # To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have # not yet been upgraded must be able to read messages from upgraded servers, # leave this optimization off on the first deploy, then enable it on a # subsequent deploy. #++ # Rails.application.config.active_support.use_message_serializer_for_metadata = true ### # Set the maximum size for Rails log files. # # `config.load_defaults 7.1` does not set this value for environments other than # development and test. #++ # if Rails.env.local? # Rails.application.config.log_file_size = 100 * 1024 * 1024 # end ### # Enable raising on assignment to attr_readonly attributes. The previous # behavior would allow assignment but silently not persist changes to the # database. #++ # Rails.application.config.active_record.raise_on_assign_to_attr_readonly = true ### # Enable validating only parent-related columns for presence when the parent is mandatory. # The previous behavior was to validate the presence of the parent record, which performed an extra query # to get the parent every time the child record was updated, even when parent has not changed. #++ # Rails.application.config.active_record.belongs_to_required_validates_foreign_key = false ### # Enable precompilation of `config.filter_parameters`. Precompilation can # improve filtering performance, depending on the quantity and types of filters. #++ # Rails.application.config.precompile_filter_parameters = true ### # Enable before_committed! callbacks on all enrolled records in a transaction. # The previous behavior was to only run the callbacks on the first copy of a record # if there were multiple copies of the same record enrolled in the transaction. #++ # Rails.application.config.active_record.before_committed_on_all_records = true ### # Disable automatic column serialization into YAML. # To keep the historic behavior, you can set it to `YAML`, however it is # recommended to explicitly define the serialization method for each column # rather than to rely on a global default. #++ # Rails.application.config.active_record.default_column_serializer = nil ### # Enable a performance optimization that serializes Active Record models # in a faster and more compact way. # # To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have # not yet been upgraded must be able to read caches from upgraded servers, # leave this optimization off on the first deploy, then enable it on a # subsequent deploy. #++ # Rails.application.config.active_record.marshalling_format_version = 7.1 ### # Run `after_commit` and `after_*_commit` callbacks in the order they are defined in a model. # This matches the behaviour of all other callbacks. # In previous versions of Rails, they ran in the inverse order. #++ # Rails.application.config.active_record.run_after_transaction_callbacks_in_order_defined = true ### # Whether a `transaction` block is committed or rolled back when exited via `return`, `break` or `throw`. #++ # Rails.application.config.active_record.commit_transaction_on_non_local_return = true ### # Controls when to generate a value for has_secure_token declarations. #++ # Rails.application.config.active_record.generate_secure_token_on = :initialize ### # ** Please read carefully, this must be configured in config/application.rb ** # # Change the format of the cache entry. # # Changing this default means that all new cache entries added to the cache # will have a different format that is not supported by Rails 7.0 # applications. # # Only change this value after your application is fully deployed to Rails 7.1 # and you have no plans to rollback. # When you're ready to change format, add this to `config/application.rb` (NOT # this file): # config.active_support.cache_format_version = 7.1 ### # Configure Action View to use HTML5 standards-compliant sanitizers when they are supported on your # platform. # # `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action View to use HTML5-compliant # sanitizers if they are supported, else fall back to HTML4 sanitizers. # # In previous versions of Rails, Action View always used `Rails::HTML4::Sanitizer` as its vendor. #++ # Rails.application.config.action_view.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor ### # Configure Action Text to use an HTML5 standards-compliant sanitizer when it is supported on your # platform. # # `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action Text to use HTML5-compliant # sanitizers if they are supported, else fall back to HTML4 sanitizers. # # In previous versions of Rails, Action Text always used `Rails::HTML4::Sanitizer` as its vendor. #++ # Rails.application.config.action_text.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor ### # Configure the log level used by the DebugExceptions middleware when logging # uncaught exceptions during requests. #++ # Rails.application.config.action_dispatch.debug_exception_log_level = :error ### # Configure the test helpers in Action View, Action Dispatch, and rails-dom-testing to use HTML5 # parsers. # # Nokogiri::HTML5 isn't supported on JRuby, so JRuby applications must set this to :html4. # # In previous versions of Rails, these test helpers always used an HTML4 parser. #++ # Rails.application.config.dom_testing_default_html_version = :html5 ================================================ FILE: config/initializers/permissions_policy.rb ================================================ # Be sure to restart your server when you modify this file. # Define an application-wide HTTP permissions policy. For further # information see: https://developers.google.com/web/updates/2018/06/feature-policy # Rails.application.config.permissions_policy do |policy| # policy.camera :none # policy.gyroscope :none # policy.microphone :none # policy.usb :none # policy.fullscreen :self # policy.payment :self, "https://secure.example.com" # end ================================================ FILE: config/locales/devise.en.yml ================================================ # Additional translations at https://github.com/plataformatec/devise/wiki/I18n en: devise: confirmations: confirmed: "Your email address has been successfully confirmed." send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes." send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes." failure: already_authenticated: "You are already signed in." inactive: "Your account is not activated yet." invalid: "Invalid %{authentication_keys} or password." locked: "Your account is locked." last_attempt: "You have one more attempt before your account is locked." not_found_in_database: "Invalid %{authentication_keys} or password." timeout: "Your session expired. Please sign in again to continue." unauthenticated: "You need to sign in or sign up before continuing." unconfirmed: "You have to confirm your email address before continuing." mailer: confirmation_instructions: subject: "Confirmation instructions" reset_password_instructions: subject: "Reset password instructions" unlock_instructions: subject: "Unlock instructions" email_changed: subject: "Email Changed" password_change: subject: "Password Changed" omniauth_callbacks: failure: "Could not authenticate you from %{kind} because \"%{reason}\"." success: "Successfully authenticated from %{kind} account." passwords: no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided." send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes." send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." updated: "Your password has been changed successfully. You are now signed in." updated_not_active: "Your password has been changed successfully." registrations: destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon." signed_up: "Welcome! You have signed up successfully." signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated." signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked." signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account." update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address." updated: "Your account has been updated successfully." sessions: signed_in: "Signed in successfully." signed_out: "Signed out successfully." already_signed_out: "Signed out successfully." unlocks: send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes." send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes." unlocked: "Your account has been unlocked successfully. Please sign in to continue." errors: messages: already_confirmed: "was already confirmed, please try signing in" confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one" expired: "has expired, please request a new one" not_found: "not found" not_locked: "was not locked" not_saved: one: "1 error prohibited this %{resource} from being saved:" other: "%{count} errors prohibited this %{resource} from being saved:" ================================================ FILE: config/locales/en.yml ================================================ en: time: formats: default: "%B %d %Y %H:%M" bands: rolling_stones: "The Rolling Stones" beatles: "The Beatles" acdc: "AC/DC" devise: sign_in: "Sign in" vue: front: title: "Front end" nav: homepage: "Home" pages: "Pages" home: title: "Musicians" breadcrumb: "All musicians" pages: title: "Pages" server_404: "This link triggers a Server side routing 404" client_404: "This link triggers a Client side routing 404" server_401: "This link performs an API call that responds a 401" server_500: "This link performs an API call that responds a 500" admin_link: "» Wanna go to the admin?" musicians: title: "Details about this musician" id: "Id" name: "Name" band: "Band" errors: title: "Error pages" admin: title: "Admin" save: "Save" cancel: "Cancel" filter: "Filter" reset_filters: "Reset filters" delete: "Delete" no_result: "No result :-/" any: "Any" nav: dashboard: "Dashboard" musicians: "Musicians" websockets: "Websockets" logout: "Logout" dashboard: title: "Dashboard" musicians: "No musician | 1 musician | musicians" musicians: create: "+ Add a new musician" new: "New musician" form: id: "Id" name: "Name" band: "Band" comment: "This whole CRUD section is deliberatly slowed down so you can actually see the animations. Comment out the \"slow\" method in Api::Admin::MusiciansController to use the app at full speed" confirm: "Are you sure?" websockets: placeholder: "Type your message..." publish: "Publish" comment1: "You can also publish straight out from the Rails console:" # Beware of string containing: {} @ $ | # See: https://vue-i18n.intlify.dev/guide/essentials/syntax#special-characters code_example: "{'ActionCable.server.broadcast(\"ChatChannel\", { message: \"hey!\" })'}" comment2: "All messages are upcased" server_side: " server side. " comment3: "If you open up multiple tabs, you messsages will be upcased in each of these tabs" waiting_messages: "Waiting for messages..." activerecord: attributes: user: email: "Email address" password: "Password" errors: models: musician: attributes: name: blank: "Mandatory field" band: blank: "Please select a band" ================================================ FILE: config/locales/fr.yml ================================================ fr: time: formats: default: "%B %d %Y %H:%M" bands: rolling_stones: "The Rolling Stones" beatles: "The Beatles" acdc: "AC/DC" devise: sign_in: "Authentification" vue: front: title: "Front end" nav: homepage: "Accueil" pages: "Pages" home: title: "Musiciens" breadcrumb: "Tous les musiciens" pages: title: "Pages" server_404: "Ce lien provoque une 404 venant du routage serveur" client_404: "Ce lien provoque un 404 venant du routage côté client" server_401: "Ce lien appelle l'API qui lui répond une 401" server_500: "Ce lien appelle l'API qui lui répond une 500" admin_link: "» Envie de voir l'admin ?" musicians: title: "Details concernant ce musicien" id: "Id" name: "Nom" band: "Groupe" errors: title: "Pages d'erreurs" admin: title: "Admin" save: "Enregistrer" cancel: "Annuler" filter: "Filtrer" reset_filters: "Reseter les filtres" delete: "Supprimer" no_result: "Aucun resultat :-/" any: "Tous" nav: dashboard: "Dashboard" musicians: "Musiciens" websockets: "Websockets" logout: "Déconnection" dashboard: title: "Dashboard" musicians: "Aucun musician | Un musicien | musiciens" musicians: create: "+ Ajouter un musicien" new: "Nouveau musicien" form: id: "Id" name: "Nom" band: "Groupe" comment: "This whole CRUD section is deliberatly slowed down so you can actually see the animations. Comment out the \"slow\" method in Api::Admin::MusiciansController to use the app at full speed" confirm: "Etes-vous sur ?" websockets: placeholder: "Tapez un message..." publish: "Publier" comment1: "Vous pouvez aussi publier un message depuis la console Rails :" # Beware of string containing: {} @ $ | # See: https://vue-i18n.intlify.dev/guide/essentials/syntax#special-characters code_example: "{'ActionCable.server.broadcast(\"ChatChannel\", { message: \"hey!\" })'}" comment2: "Tous les messages que vous publiez sont passés en majuscule" server_side: " côté serveur. " comment3: "Si vous ouvrez plusieurs onglets, les messages seront en majuscules sur chacun d'eux." waiting_messages: "En attente de messages..." activerecord: attributes: user: email: "Adresse Email" password: "Mot de passe" errors: models: musician: attributes: name: blank: "Saisie requise" band: blank: "Merci de sélectionner un groupe" ================================================ FILE: config/puma.rb ================================================ # Puma can serve each request in a thread from an internal thread pool. # The `threads` method setting takes two numbers: a minimum and maximum. # Any libraries that use thread pools should be configured to match # the maximum value specified for Puma. Default is set to 5 threads for minimum # and maximum; this matches the default thread size of Active Record. # max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } threads min_threads_count, max_threads_count # Specifies the `worker_timeout` threshold that Puma will use to wait before # terminating a worker in development environments. # worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" # Specifies the `port` that Puma will listen on to receive requests; default is 3000. # port ENV.fetch("PORT") { 3000 } # Specifies the `environment` that Puma will run in. # environment ENV.fetch("RAILS_ENV") { "development" } # Specifies the `pidfile` that Puma will use. pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } # Specifies the number of `workers` to boot in clustered mode. # Workers are forked web server processes. If using threads and workers together # the concurrency of the application would be max `threads` * `workers`. # Workers do not work on JRuby or Windows (both of which do not support # processes). # # workers ENV.fetch("WEB_CONCURRENCY") { 2 } # Use the `preload_app!` method when specifying a `workers` number. # This directive tells Puma to first boot the application and load code # before forking the application. This takes advantage of Copy On Write # process behavior so workers use less memory. # # preload_app! # Allow puma to be restarted by `bin/rails restart` command. plugin :tmp_restart ================================================ FILE: config/routes.rb ================================================ Rails.application.routes.draw do mount ActionCable.server => '/cable' localized do devise_for :users, only: [:sessions] namespace :api, :defaults => { :format => 'json' } do resources :musicians, only: [:index, :show] namespace :admin do resources :dashboard, only: :index resources :musicians, except: :show end end get '/admin', to: 'admin#index', as: 'admin_root' match "/admin/*path", to: "admin#index", format: false, via: :get root :to => "application#index" match "*path", to: "application#index", format: false, via: :get end end ================================================ FILE: config/storage.yml ================================================ test: service: Disk root: <%= Rails.root.join("tmp/storage") %> local: service: Disk root: <%= Rails.root.join("storage") %> # Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) # amazon: # service: S3 # access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> # secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> # region: us-east-1 # bucket: your_own_bucket-<%= Rails.env %> # Remember not to checkin your GCS keyfile to a repository # google: # service: GCS # project: your_project # credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> # bucket: your_own_bucket-<%= Rails.env %> # Use bin/rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) # microsoft: # service: AzureStorage # storage_account_name: your_account_name # storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> # container: your_container_name-<%= Rails.env %> # mirror: # service: Mirror # primary: local # mirrors: [ amazon, google, microsoft ] ================================================ FILE: config/vite.json ================================================ { "all": { "sourceCodeDir": "app/javascript", "watchAdditionalPaths": [] }, "development": { "autoBuild": true, "publicOutputDir": "vite-dev", "port": 3036, "host": "0.0.0.0" }, "test": { "autoBuild": true, "publicOutputDir": "vite-test", "port": 3037 } } ================================================ FILE: config.ru ================================================ # This file is used by Rack-based servers to start the application. require_relative "config/environment" run Rails.application Rails.application.load_server ================================================ FILE: cypress/e2e/home.cy.js ================================================ describe('Main navigation', () => { it('passes', () => { cy.visit('http://localhost:5100') cy.get('.row > :nth-child(1) > a').click(); cy.get('.breadcrumb > :nth-child(1) > a').click(); cy.get('ul > :nth-child(2) > a').click(); cy.get(':nth-child(1) > a').click(); cy.get('.row > :nth-child(1) > a').click(); cy.get('p').click(); cy.get('p').should('have.text', 'Id: 1Name: John LennonBand: The Beatles'); cy.get('.active > a').click(); cy.get('ul > :nth-child(2) > a').click(); cy.get('section.container > :nth-child(2) > a').should('have.text', 'This link triggers a Server side routing 404'); cy.get('section.container > :nth-child(2) > a').click(); cy.get(':nth-child(1) > a').click(); cy.get('h1').should('have.text', 'Musicians'); cy.visit('http://localhost:5100/'); cy.get('select').select('fr'); cy.get('h1').click(); cy.get('h1').should('have.text', 'Musiciens'); cy.get('span').click(); cy.get('span').should('have.text', 'Tous les musiciens'); cy.get('select').select('en'); cy.get('.row > :nth-child(1) > a').click(); cy.get('.breadcrumb > :nth-child(1) > a').click(); }) }) ================================================ FILE: cypress/support/e2e.js ================================================ ================================================ FILE: cypress.config.js ================================================ const { defineConfig } = require('cypress') module.exports = defineConfig({ // setupNodeEvents can be defined in either // the e2e or component configuration e2e: { experimentalStudio: true, setupNodeEvents(on, config) { on('before:browser:launch', (browser = {}, launchOptions) => { /* ... */ }) }, }, screenshotsFolder: "tmp/cypress_screenshots", videosFolder: "tmp/cypress_videos", trashAssetsBeforeRuns: false }) ================================================ FILE: db/migrate/20220424120800_base_setup.rb ================================================ class BaseSetup < ActiveRecord::Migration[7.0] def change create_table :users do |t| t.timestamps t.string :email end create_table :musicians do |t| t.timestamps t.string :name t.integer :band end change_table :users do |t| ## Database authenticatable t.string :encrypted_password, null: false, default: "" ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at ## Trackable t.integer :sign_in_count, default: 0, null: false t.datetime :current_sign_in_at t.datetime :last_sign_in_at t.string :current_sign_in_ip t.string :last_sign_in_ip end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true end end ================================================ FILE: db/migrate/20240102193807_add_service_name_to_active_storage_blobs.active_storage.rb ================================================ # This migration comes from active_storage (originally 20190112182829) class AddServiceNameToActiveStorageBlobs < ActiveRecord::Migration[6.0] def up return unless table_exists?(:active_storage_blobs) unless column_exists?(:active_storage_blobs, :service_name) add_column :active_storage_blobs, :service_name, :string if configured_service = ActiveStorage::Blob.service.name ActiveStorage::Blob.unscoped.update_all(service_name: configured_service) end change_column :active_storage_blobs, :service_name, :string, null: false end end def down return unless table_exists?(:active_storage_blobs) remove_column :active_storage_blobs, :service_name end end ================================================ FILE: db/migrate/20240102193808_create_active_storage_variant_records.active_storage.rb ================================================ # This migration comes from active_storage (originally 20191206030411) class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0] def change return unless table_exists?(:active_storage_blobs) # Use Active Record's configured type for primary key create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t| t.belongs_to :blob, null: false, index: false, type: blobs_primary_key_type t.string :variation_digest, null: false t.index %i[ blob_id variation_digest ], name: "index_active_storage_variant_records_uniqueness", unique: true t.foreign_key :active_storage_blobs, column: :blob_id end end private def primary_key_type config = Rails.configuration.generators config.options[config.orm][:primary_key_type] || :primary_key end def blobs_primary_key_type pkey_name = connection.primary_key(:active_storage_blobs) pkey_column = connection.columns(:active_storage_blobs).find { |c| c.name == pkey_name } pkey_column.bigint? ? :bigint : pkey_column.type end end ================================================ FILE: db/migrate/20240102193809_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb ================================================ # This migration comes from active_storage (originally 20211119233751) class RemoveNotNullOnActiveStorageBlobsChecksum < ActiveRecord::Migration[6.0] def change return unless table_exists?(:active_storage_blobs) change_column_null(:active_storage_blobs, :checksum, true) end end ================================================ FILE: db/schema.rb ================================================ # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # # This file is the source Rails uses to define your schema when running `bin/rails # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to # be faster and is potentially less error prone than running all of your # migrations from scratch. Old migrations may fail to apply correctly if those # migrations use external dependencies or application code. # # It's strongly recommended that you check this file into your version control system. ActiveRecord::Schema[7.1].define(version: 2024_01_02_193809) do create_table "musicians", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "name" t.integer "band" end create_table "users", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "email" t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end end ================================================ FILE: db/seeds.rb ================================================ User.create!(email: "admin@domain.com", password: "password", password_confirmation: "password") Musician.create!(name: "John Lennon", band: "beatles") Musician.create!(name: "Paul McCartney", band: "beatles") Musician.create!(name: "Georges Harrison", band: "beatles") Musician.create!(name: "Ringo Starr", band: "beatles") Musician.create!(name: "Mick Jagger", band: "rolling_stones") Musician.create!(name: "Keith Richards", band: "rolling_stones") Musician.create!(name: "Mick Taylor", band: "rolling_stones") Musician.create!(name: "Bill Wyman", band: "rolling_stones") Musician.create!(name: "Charlie Watts", band: "rolling_stones") Musician.create!(name: "Angus Young", band: "acdc") Musician.create!(name: "Malcom Young", band: "acdc") Musician.create!(name: "Bon Scott", band: "acdc") Musician.create!(name: "Phil Rudd", band: "acdc") ================================================ FILE: docker-compose.yml ================================================ version: "3.9" services: redis: image: 'redis' restart: always command: redis-server ports: - 6379:6379 environment: - ALLOW_EMPTY_PASSWORD=yes web: build: context: . image: 'rails-vue-demo-app' working_dir: /app command: sh -c "yarn install && rm -rf tmp/pids && export REDIS_URL='redis' && foreman start" volumes: - type: bind source: . target: /app ports: - 3000:3000 - 3036:3036 ================================================ FILE: lib/assets/.keep ================================================ ================================================ FILE: lib/tasks/.keep ================================================ ================================================ FILE: log/.keep ================================================ ================================================ FILE: package.json ================================================ { "type": "module", "devDependencies": { "cypress": "^13.6.0", "eslint": "^8.7.0", "lightningcss-cli": "^1.22.1", "prettier": "^2.5.1", "vite": "^5.0.0", "vite-plugin-ruby": "^5.0.0", "vue-eslint-parser": "^8.0.0" }, "dependencies": { "@rails/actioncable": "^7.0.2-4", "@vitejs/plugin-vue": "^2.3.1", "axios": "^1.6.2", "lightningcss": "^1.22.1", "mitt": "^3.0.1", "pinia": "^2.0.13", "rollup": "^4.9.5", "unplugin-auto-import": "^0.17.2", "vue": "^3.2.33", "vue-axios": "^3.4.1", "vue-i18n": "^9.1.9", "vue-router": "^4.0.14", "yarn": "^1.22.21" } } ================================================ FILE: public/404.html ================================================ The page you were looking for doesn't exist (404)

The page you were looking for doesn't exist.

You may have mistyped the address or the page may have moved.

If you are the application owner check the logs for more information.

================================================ FILE: public/422.html ================================================ The change you wanted was rejected (422)

The change you wanted was rejected.

Maybe you tried to change something you didn't have access to.

If you are the application owner check the logs for more information.

================================================ FILE: public/500.html ================================================ We're sorry, but something went wrong (500)

We're sorry, but something went wrong.

If you are the application owner check the logs for more information.

================================================ FILE: public/css/development/admin/forms.css ================================================ .loading:not(form) * { display: none; } .loading:not(form) { width: 100%; height: 40px; margin: 100px auto 100px auto; position: relative; &::before, &::after{ content: ''; position: absolute; top: 50%; left: 50%; width: 4em; height: 4em; border-radius: 50%; transform: translate(-50%, -50%) scale(0); } &::before { background: #2c6ed1; animation: pulse 2s ease-in-out infinite; } &::after { background: #2c6ed1; animation: pulse 2s 1s ease-in-out infinite; } } @keyframes pulse { 0%, 100%{ transform: translate(-50%, -50%) scale(0); opacity: 1; } 50%{ transform: translate(-50%, -50%) scale(1.0); opacity: 0; } } form { position: relative; z-index: 1; fieldset { border: none; padding: 0; position: relative; } fieldset { position: relative; } label { color: var(--text-color); font-weight: bold; } input, select { background-color: var(--body-bg); color: var(--text-color); } .error { position: absolute; top: 0; right: 0; color: red; } &.loading { display: block; } /* Create a screen so the user cannot double submit/interact */ &.loading:after { content: " "; display: block; position: absolute; z-index: 2; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(255, 255, 255, 0.3); } /* Facebook style spinner: processing */ &.loading input[type=submit] { color: transparent; background-image: url(data:image/gif;utf8;base64,R0lGODlhEAALAPQAAP////////7+/v7+/v7+/v7+/v////7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA); background-position: center; background-repeat: no-repeat; } /* Check icon: success */ &.success input[type=submit] { background-color: lime !important; color: transparent; background-repeat: no-repeat; background-position: center 16px; background-size: 25px; background-image: url(data:image/svg+xml;utf8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTcgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgY2xhc3M9InNpLWdseXBoIHNpLWdseXBoLWNoZWNrZWQiPg0KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPg0KICAgICAgICA8cGF0aCBkPSJNMy40MzIsNi4xODkgQzMuODI0LDUuNzk4IDQuNDU1LDUuNzk4IDQuODQ3LDYuMTg5IEw2Ljk2OCw4LjMxIEwxMy4xNDcsMi4xMzEgQzEzLjUzMSwxLjc0NyAxNC4xNTcsMS43NTMgMTQuNTQ4LDIuMTQ0IEwxNi42Nyw0LjI2NiBDMTcuMDYsNC42NTcgMTcuMDY2LDUuMjg0IDE2LjY4NCw1LjY2NiBMNy42NjIsMTQuNjg3IEM3LjI3OCwxNS4wNyA2LjY1MSwxNS4wNjQgNi4yNjEsMTQuNjczIEwxLjMxMSw5LjcyMyBDMC45Miw5LjMzMyAwLjkyLDguNyAxLjMxMSw4LjMxIEwzLjQzMiw2LjE4OSBaIiBmaWxsPSIjZmZmIiBjbGFzcz0ic2ktZ2x5cGgtZmlsbCI+PC9wYXRoPg0KICAgIDwvZz4NCjwvc3ZnPg==); } /* Cross icon: failure */ &.failed input[type=submit] { background-color: red !important; color: transparent; background-repeat: no-repeat; background-position: center; background-size: 21px; background-image: url(data:image/svg+xml;utf8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTcgMTciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgY2xhc3M9InNpLWdseXBoIHNpLWdseXBoLWRlbGV0ZSI+DQogICAgPGcgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+DQogICAgICAgIDxwYXRoIGQ9Ik0xMi41NjYsOCBMMTUuNjExLDQuOTU2IEMxNi4wMzEsNC41MzUgMTYuMDMxLDMuODUzIDE1LjYxMSwzLjQzNCBMMTIuNTY2LDAuMzg5IEMxMi4xNDYsLTAuMDMxIDExLjQ2NCwtMC4wMzEgMTEuMDQzLDAuMzg5IEw3Ljk5OSwzLjQzMyBMNC45NTUsMC4zODkgQzQuNTM0LC0wLjAzMSAzLjg1MiwtMC4wMzEgMy40MzIsMC4zODkgTDAuMzg4LDMuNDM0IEMtMC4wMzQsMy44NTQgLTAuMDM0LDQuNTM2IDAuMzg3LDQuOTU2IEwzLjQzMSw4IEwwLjM4NywxMS4wNDQgQy0wLjAzNCwxMS40NjUgLTAuMDM0LDEyLjE0NyAwLjM4OCwxMi41NjcgTDMuNDMyLDE1LjYxMSBDMy44NTIsMTYuMDMyIDQuNTM0LDE2LjAzMiA0Ljk1NSwxNS42MTEgTDcuOTk5LDEyLjU2NyBMMTEuMDQzLDE1LjYxMSBDMTEuNDY0LDE2LjAzMiAxMi4xNDYsMTYuMDMyIDEyLjU2NiwxNS42MTEgTDE1LjYxMSwxMi41NjcgQzE2LjAzMSwxMi4xNDYgMTYuMDMxLDExLjQ2NCAxNS42MTEsMTEuMDQ0IEwxMi41NjYsOCBMMTIuNTY2LDggWiIgZmlsbD0iI2ZmZmZmZiIgY2xhc3M9InNpLWdseXBoLWZpbGwiPjwvcGF0aD4NCiAgICA8L2c+DQo8L3N2Zz4=); } } ================================================ FILE: public/css/development/admin.css ================================================ @import url("grid.css"); @import url("themes/light.css"); @import url("themes/dark.css"); @import url("main.css"); @import url("admin/forms.css"); @import url("utilities.css"); ================================================ FILE: public/css/development/devise.css ================================================ .devise { > .row { margin-top: 50px; @media (min-width: 576px) and (max-width: 991px) { > div { grid-column: 2/span 10 !important; } } @media (min-width: 992px) { > div { grid-column: 4/span 6 !important; } } } } ================================================ FILE: public/css/development/front.css ================================================ @import url("grid.css"); @import url("themes/light.css"); @import url("themes/dark.css"); @import url("main.css"); @import url("devise.css"); @import url("utilities.css"); ================================================ FILE: public/css/development/grid.css ================================================ :root { --gutter: 20px; } [class^="col-"] { position: relative; } .wrapper { width: calc(100% - var(--gutter)); margin: 0 auto; } .row { clear: both; display: grid; grid-template-columns: repeat(12,1fr); grid-gap: var(--gutter); } @media (max-width: 575px) { :root { --gutter: 10px; } } .col-xs-1 { grid-column-start: span 1 } .col-xs-2 { grid-column-start: span 2 } .col-xs-3 { grid-column-start: span 3 } .col-xs-4 { grid-column-start: span 4 } .col-xs-5 { grid-column-start: span 5 } .col-xs-6 { grid-column-start: span 6 } .col-xs-7 { grid-column-start: span 7 } .col-xs-8 { grid-column-start: span 8 } .col-xs-9 { grid-column-start: span 9 } .col-xs-10 { grid-column-start: span 10 } .col-xs-11 { grid-column-start: span 11 } .col-xs-12 { grid-column-start: span 12 } @media (min-width: 576px) { .col-sm-1 { grid-column-start: span 1 !important } .col-sm-2 { grid-column-start: span 2 !important } .col-sm-3 { grid-column-start: span 3 !important } .col-sm-4 { grid-column-start: span 4 !important } .col-sm-5 { grid-column-start: span 5 !important } .col-sm-6 { grid-column-start: span 6 !important } .col-sm-7 { grid-column-start: span 7 !important } .col-sm-8 { grid-column-start: span 8 !important } .col-sm-9 { grid-column-start: span 9 !important } .col-sm-10 { grid-column-start: span 10 !important } .col-sm-11 { grid-column-start: span 11 !important } .col-sm-12 { grid-column-start: span 12 !important } } @media (min-width: 768px) { .col-md-1 { grid-column-start: span 1 !important } .col-md-2 { grid-column-start: span 2 !important } .col-md-3 { grid-column-start: span 3 !important } .col-md-4 { grid-column-start: span 4 !important } .col-md-5 { grid-column-start: span 5 !important } .col-md-6 { grid-column-start: span 6 !important } .col-md-7 { grid-column-start: span 7 !important } .col-md-8 { grid-column-start: span 8 !important } .col-md-9 { grid-column-start: span 9 !important } .col-md-10 { grid-column-start: span 10 !important } .col-md-11 { grid-column-start: span 11 !important } .col-md-12 { grid-column-start: span 12 !important } } @media (min-width: 992px) { .col-lg-1 { grid-column-start: span 1 !important } .col-lg-2 { grid-column-start: span 2 !important } .col-lg-3 { grid-column-start: span 3 !important } .col-lg-4 { grid-column-start: span 4 !important} .col-lg-5 { grid-column-start: span 5 !important } .col-lg-6 { grid-column-start: span 6 !important } .col-lg-7 { grid-column-start: span 7 !important } .col-lg-8 { grid-column-start: span 8 !important } .col-lg-9 { grid-column-start: span 9 !important } .col-lg-10 { grid-column-start: span 10 !important } .col-lg-11 { grid-column-start: span 11 !important } .col-lg-12 { grid-column-start: span 12 !important } } @media (min-width: 1200px) { .col-xl-1 { grid-column-start: span 1 !important } .col-xl-2 { grid-column-start: span 2 !important } .col-xl-3 { grid-column-start: span 3 !important } .col-xl-4 { grid-column-start: span 4 !important } .col-xl-5 { grid-column-start: span 5 !important } .col-xl-6 { grid-column-start: span 6 !important } .col-xl-7 { grid-column-start: span 7 !important } .col-xl-8 { grid-column-start: span 8 !important } .col-xl-9 { grid-column-start: span 9 !important } .col-xl-10 { grid-column-start: span 10 !important } .col-xl-11 { grid-column-start: span 11 !important } .col-xl-12 { grid-column-start: span 12 !important } } @media (min-width: 1400px) { .col-xxl-1 { grid-column-start: span 1 !important } .col-xxl-2 { grid-column-start: span 2 !important } .col-xxl-3 { grid-column-start: span 3 !important } .col-xxl-4 { grid-column-start: span 4 !important } .col-xxl-5 { grid-column-start: span 5 !important } .col-xxl-6 { grid-column-start: span 6 !important } .col-xxl-7 { grid-column-start: span 7 !important } .col-xxl-8 { grid-column-start: span 8 !important } .col-xxl-9 { grid-column-start: span 9 !important } .col-xxl-10 { grid-column-start: span 10 !important } .col-xxl-11 { grid-column-start: span 11 !important } .col-xxl-12 { grid-column-start: span 12 !important } } .visible-xs { display: none; } .visible-sm { display: none; } .visible-md { display: none; } .visible-lg { display: none; } .visible-xl { display: none; } .visible-xxl { display: none; } @media (min-width: 0) and (max-width: 575px) { .hidden-xs { display: none; } .visible-xs { display: block; } } @media (min-width: 576px) and (max-width: 767px) { .hidden-sm { display: none; } .visible-sm { display: block; } } @media (min-width: 768px) and (max-width: 992px) { .hidden-md { display: none; } .visible-md { display: block; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-lg { display: none; } .visible-lg { display: block; } } @media (min-width: 1200px) and (max-width: 1399px) { .hidden-xl { display: none; } .visible-xl { display: block; } } @media (min-width: 1400px) { .hidden-xxl { display: none; } .visible-xxl { display: block; } } ================================================ FILE: public/css/development/main.css ================================================ html { min-width: 375px; } body, html { background-color: var(--body-bg); } h1, h2, h3, h4, h5, h6 { color: var(--title-color); } p, span, li, table, tr, td, th, label { color: var(--text-color); } .top-nav { background-color: var(--accent); select { top: 5px; right: 0; position: absolute; max-width: 100px; } ul li.active { border-bottom: 1px solid var(--border-active); } } .filters { @media(max-width: 992px) { margin-top: 30px; } } .breadcrumb { display: inline-block; height: 40px; margin: 0 auto 20px auto; background-color: var(--accent); li { list-style-type: none; display: inline-block; padding-top: 5px; color: var(--light-text-color); } li:after { content: '/'; margin: 0 10px 0 10px; } li:last-child { &:after { content: ''; } } } .card { background-color: var(--accent); padding: 20px; box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.2); } .pagination { list-style-type: none; float: right; padding: 0; height: 40px; li { list-style-type: none; display: inline-block; width: 40px; height: 40px; line-height: 20px; text-align: center; padding: 10px; margin-left: 5px; a { text-decoration: none !important; } } } main { min-height: calc(100vh - 60px); } footer { height: 50px; text-align: left; padding-top: 8px; color: var(--light-text-color); font-size: 14px; & a { color: var(--light-text-color); text-decoration: underline; } @media(max-width: 991px) { * { text-align: center !important; } } } ================================================ FILE: public/css/development/themes/dark.css ================================================ [data-theme="dark"] { --body-bg: #000; --title-color: #fff; --text-color: #ddd; --light-text-color: #666; --accent: rgb(37, 45, 52); --border-active: #fffe; } ================================================ FILE: public/css/development/themes/light.css ================================================ [data-theme="light"] { --body-bg: #f5f5f5; --title-color: #333; --text-color: #666; --light-text-color: #999; --accent: #fff; --border-active: blue; } ================================================ FILE: public/css/development/utilities.css ================================================ .hidden { display: none; } .ta-left { text-align: left; } .ta-center { text-align: center; } .ta-right { text-align: right; } .openable { position: relative; padding-left: 20px; &:before { width: 10px; height: 10px; display: inline-block; border: solid black; content: ''; border-width: 0 1px 1px 0; transform: rotate(-45deg); margin-right: 10px; position: absolute; top: 7px; left: 0; } &.open:before { top: 5px; transform: rotate(45deg); } } ================================================ FILE: public/robots.txt ================================================ # See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file ================================================ FILE: public/vite-test/assets/admin-ebb17751.js ================================================ import{d as q,_ as v,o as r,c,a as t,t as i,b as V,w,e as g,v as S,f as F,F as y,r as k,g as p,h as d,i as m,j as x,k as f,l as _,m as I,n as T,E as L,p as C,q as O,s as P,u as E,x as R,A as M,y as B}from"./vue-i18n-6b73e0ca.js";const D=q("dashboard",{state:()=>({metrics:{}}),actions:{async index(){this.axios.get("/dashboard").then(e=>{this.metrics=e.data.metrics})}}}),Q={setup(){return{store:D()}},created(){this.$api.call(this.store.index())}},W={class:"container"},z={class:"row"},J=V('

Rails 7

An awesome server side Framework

Vue 3

SPA without the pain

Pinia

State manager

Vue Router

Flexible

Axios

Handles AJAX requests, no JQuery

Vite

Next generation Frontend tooling

Devise

Simple authentication using regular cookies that just works

',7),G={class:"col-xs-24 col-md-6 card"},H=t("h3",null,"I18n",-1),K={href:"https://kazupon.github.io/vue-i18n/",target:"_blank"},X=V('

ActionCable

Websockets with 2 way bindings

Kaminari

Efficient Pagination

Ransack

ActiveRecord wizardry for dynamic search filters

Bootstrap grid

... but using native CSS Grid layout

',4);function Y(e,s,o,u,h,l){return r(),c("section",W,[t("div",z,[J,t("div",G,[H,t("p",null,[t("a",K,i(e.$tc("dashboard.musicians",0))+", "+i(e.$tc("dashboard.musicians",1))+", "+i(u.store.metrics.musicians+" "+e.$tc("dashboard.musicians",u.store.metrics.musicians)),1)])]),X])])}const Z=v(Q,[["render",Y]]),A=q("musicians",{state:()=>({errors:{},bands:[],musician:{},musicians:[],pagination:{}}),actions:{async index(e){return this.axios.get(e).then(s=>{this.pagination=s.data.pagination,this.bands=s.data.bands,this.musicians=s.data.musicians})},async new(){return this.errors={},this.musician={},this.axios.get("/musicians/new").then(e=>{this.musician=e.data.musician})},async create(){return this.errors={},this.axios.post("/musicians",this.musician).then(e=>(this.musician=e.data.musician,!0)).catch(e=>(this.errors=e.response.data.errors,!1))},async edit(e){return this.errors={},this.musician={},this.axios.get(`/musicians/${e}/edit`).then(s=>{this.musician=s.data.musician})},async update(e){return this.errors={},this.axios.put(`/musicians/${e}`,this.musician).then(s=>!0).catch(s=>(this.errors=s.response.data.errors,!1))},async destroy(e){return this.errors={},this.axios.delete(`/musicians/${e}`).then(s=>!0).catch(s=>(this.errors=s.response.data.errors,!1))}}}),tt={props:["bands"],data:function(){return{form:{name_cont:"",band_eq:null}}},methods:{toggleForm(){this.$refs.filters.classList.toggle("hidden")},search(){const e=Object.fromEntries(Object.entries(this.form).map(s=>[`q[${s[0]}]`,s[1]]));this.$router.push({path:this.$route.path,query:e}),this.$emit("index")},reset(){this.form={name_cont:"",band_eq:null},this.$router.push({path:this.$route.path,query:""})}}},et={class:"row"},st={class:"col-xs-24 col-md-10"},at={class:"col-xs-24 col-md-10"},nt={value:null},it=["value"],ot={class:"row"},rt={class:"col-xs-24 col-md-5"},ct=["value"],lt={class:"col-xs-24 col-md-5"};function ut(e,s,o,u,h,l){return r(),c("section",null,[t("a",{href:"#",onClick:s[0]||(s[0]=w((...n)=>l.toggleForm&&l.toggleForm(...n),["prevent"]))}," "+i(e.$t("filter")),1),t("form",{onSubmit:s[4]||(s[4]=w((...n)=>l.search&&l.search(...n),["prevent"])),ref:"filters","accept-charset":"UTF-8",class:"card hidden"},[t("div",et,[t("div",st,[t("label",null,i(e.$t("musicians.form.name")),1),g(t("input",{type:"text","onUpdate:modelValue":s[1]||(s[1]=n=>e.form.name_cont=n),placeholder:"name"},null,512),[[S,e.form.name_cont]])]),t("div",at,[t("label",null,i(e.$t("musicians.form.band")),1),g(t("select",{"onUpdate:modelValue":s[2]||(s[2]=n=>e.form.band_eq=n)},[t("option",nt,i(e.$t("any")),1),(r(!0),c(y,null,k(o.bands,n=>(r(),c("option",{key:n.key,value:n.key},i(n.name),9,it))),128))],512),[[F,e.form.band_eq]])])]),t("div",ot,[t("div",rt,[t("input",{type:"submit",role:"button",class:"button button-primary",value:e.$t("filter")},null,8,ct)]),t("div",lt,[t("a",{onClick:s[3]||(s[3]=(...n)=>l.reset&&l.reset(...n)),href:"#",role:"button",class:"secondary outline fill"},i(e.$t("reset_filters")),1)])])],544)])}const dt=v(tt,[["render",ut]]),ht={components:{Filters:dt},setup(){return{store:A()}},mounted(){this.index()},methods:{index(){this.$api.call(this.store.index(this.$route.fullPath),this.$refs.listing)}}},mt={class:"container"},_t={class:"row"},pt={class:"col-xs-12"},ft={class:"breadcrumb"},vt={class:"col-xs-12 ta-right"},$t={ref:"listing"},bt={key:0},gt={key:1},yt={class:"card ta-center"},kt=t("p",null,'This whole CRUD section is deliberatly slowed down so you can actually see the animations. Comment out the "slow" method in Api::Admin::MusiciansController to use the app at full speed',-1);function wt(e,s,o,u,h,l){const n=p("router-link"),a=p("filters"),$=p("pagination");return r(),c("section",mt,[t("div",_t,[t("div",pt,[t("ul",ft,[t("li",null,[d(n,{to:{name:"root_path"}},{default:m(()=>[_(i(e.$t("title")),1)]),_:1})]),t("li",null,i(e.$t("nav.musicians")),1)])]),t("div",vt,[d(n,{to:{name:"new_musician_path"},role:"button",class:"outline"},{default:m(()=>[_(i(e.$t("musicians.create")),1)]),_:1})])]),d(a,{bands:u.store.bands},null,8,["bands"]),t("div",$t,[u.store.musicians&&u.store.musicians.length>0?(r(),c("table",bt,[t("thead",null,[t("tr",null,[t("th",null,i(e.$t("musicians.form.id")),1),t("th",null,i(e.$t("musicians.form.name")),1),t("th",null,i(e.$t("musicians.form.band")),1)])]),t("tbody",null,[(r(!0),c(y,null,k(u.store.musicians,b=>(r(),c("tr",{key:b.id},[t("td",null,[d(n,{to:{name:"edit_musician_path",params:{id:b.id}}},{default:m(()=>[_(i(b.id),1)]),_:2},1032,["to"])]),t("td",null,[d(n,{to:{name:"edit_musician_path",params:{id:b.id}}},{default:m(()=>[_(i(b.name),1)]),_:2},1032,["to"])]),t("td",null,[d(n,{to:{name:"edit_musician_path",params:{id:b.id}}},{default:m(()=>[_(i(b.band),1)]),_:2},1032,["to"])])]))),128))])])):(r(),c("div",gt,[t("h3",yt,i(e.$t("no_result")),1)])),u.store.pagination?(r(),x($,{key:2,store:u.store,onClicked:l.index},null,8,["store","onClicked"])):f("",!0)],512),kt])}const xt=v(ht,[["render",wt]]),Ct={props:["attr","messages"],data(){return{message:""}},watch:{messages:function(){this.message="",this.messages[this.attr]&&(this.message=this.messages[this.attr].join(","))}}},St={key:0,class:"error"};function Ft(e,s,o,u,h,l){return h.message!=""?(r(),c("span",St,i(h.message),1)):f("",!0)}const At=v(Ct,[["render",Ft]]),qt={props:["data"],components:{Errors:At}},Vt=["aria-invalid"],Mt=["aria-invalid"],Ut=["value"];function Nt(e,s,o,u,h,l){const n=p("errors");return r(),c("section",null,[t("fieldset",null,[t("label",null,i(e.$t("musicians.form.name")),1),d(n,{attr:"name",messages:o.data.errors},null,8,["messages"]),g(t("input",{type:"text","onUpdate:modelValue":s[0]||(s[0]=a=>o.data.musician.name=a),"aria-invalid":o.data.errors.name?!0:""},null,8,Vt),[[S,o.data.musician.name]])]),t("fieldset",null,[t("label",null,i(e.$t("musicians.form.band")),1),d(n,{attr:"band",messages:o.data.errors},null,8,["messages"]),g(t("select",{"onUpdate:modelValue":s[1]||(s[1]=a=>o.data.musician.band=a),"aria-invalid":o.data.errors.band?!0:""},[(r(!0),c(y,null,k(o.data.musician.bands,a=>(r(),c("option",{key:a.key,value:a.key},i(a.name),9,Ut))),128))],8,Mt),[[F,o.data.musician.band]])])])}const U=v(qt,[["render",Nt]]),jt={components:{MusicianForm:U},setup(){return{store:A()}},mounted(){this.$api.call(this.store.new(),this.$refs.animation)},methods:{create(e){this.$api.call(this.store.create(),e.target).then(s=>{s===!0&&this.$router.push({name:"edit_musician_path",params:{id:this.store.musician.id}})})}}},It={class:"container"},Tt={class:"breadcrumb"},Lt={ref:"animation"},Ot={class:"row"},Pt={class:"col-sm-4 col-start-sm-21 ta-right"},Et=["value"];function Rt(e,s,o,u,h,l){const n=p("router-link"),a=p("MusicianForm");return r(),c("section",It,[t("ul",Tt,[t("li",null,[d(n,{to:{name:"root_path"}},{default:m(()=>[_(i(e.$t("title")),1)]),_:1})]),t("li",null,[d(n,{to:{name:"musicians_path"}},{default:m(()=>[_(i(e.$t("nav.musicians")),1)]),_:1})]),t("li",null,[t("span",null,i(e.$t("musicians.new")),1)])]),t("div",Lt,[t("form",{onSubmit:s[0]||(s[0]=w((...$)=>l.create&&l.create(...$),["prevent"])),"accept-charset":"UTF-8",class:"card"},[d(a,{data:u.store},null,8,["data"]),t("div",Ot,[t("div",Pt,[t("input",{type:"submit",value:e.$t("save")},null,8,Et)])])],32)],512)])}const Bt=v(jt,[["render",Rt]]),Dt={components:{MusicianForm:U},setup(){return{store:A()}},mounted(){this.$api.call(this.store.edit(this.$route.params.id),this.$refs.animation)},methods:{update(e){this.$api.call(this.store.update(this.$route.params.id),e.target)},destroy(){confirm(this.$t("confirm"))&&this.$api.call(this.store.destroy(this.$route.params.id),this.$refs.animation).then(e=>{e===!0&&this.$router.push({name:"musicians_path"})})}}},Qt={class:"container"},Wt={class:"breadcrumb"},zt={ref:"animation"},Jt={class:"row"},Gt={class:"col-sm-4 secondary outline"},Ht={class:"col-sm-4 col-start-sm-21 ta-right"},Kt=["value"];function Xt(e,s,o,u,h,l){const n=p("router-link"),a=p("MusicianForm");return r(),c("section",Qt,[t("ul",Wt,[t("li",null,[d(n,{to:{name:"root_path"}},{default:m(()=>[_(i(e.$t("title")),1)]),_:1})]),t("li",null,[d(n,{to:{name:"musicians_path"}},{default:m(()=>[_(i(e.$t("nav.musicians")),1)]),_:1})]),t("li",null,i(u.store.musician.name),1)]),t("div",zt,[t("form",{ref:"form",onSubmit:s[1]||(s[1]=w((...$)=>l.update&&l.update(...$),["prevent"])),"accept-charset":"UTF-8",class:"card"},[d(a,{data:u.store},null,8,["data"]),t("div",Jt,[t("div",Gt,[t("a",{onClick:s[0]||(s[0]=(...$)=>l.destroy&&l.destroy(...$)),href:"#",role:"button",class:"secondary outline"},i(e.$t("delete")),1)]),t("div",Ht,[t("input",{type:"submit",value:e.$t("save")},null,8,Kt)])])],544)],512)])}const Yt=v(Dt,[["render",Xt]]),Zt={data(){return{message:"",messages:[]}},created(){this.$cable.on("chat",e=>{this.messages.unshift(e.message)})},methods:{publish(){this.$cable.send(this.message),this.message=""}}},te={class:"container"},ee={class:"breadcrumb"},se={class:"row"},ae={class:"col-xs-24 col-sm-12 card"},ne=t("br",null,null,-1),ie=t("br",null,null,-1),oe=t("input",{type:"submit",value:"Publish"},null,-1),re=t("div",{class:"card"},[t("p",null,"You can also push messages here from the server using the Rails console:"),t("code",null,'ActionCable.server.broadcast("ChatChannel", { message: "hey!" })')],-1),ce={class:"col-xs-24 col-sm-12 card"},le=t("p",null,[_("All messages you type are upcased "),t("b",null,"server side"),_(" after a round trip. If you open multiple tabs, messages are broadcasted on all tabs.")],-1),ue={key:0},de={key:1},he=t("p",null,[t("i",null,"Waiting for messages...")],-1),me=[he];function _e(e,s,o,u,h,l){const n=p("router-link");return r(),c("section",te,[t("ul",ee,[t("li",null,[d(n,{to:{name:"root_path"}},{default:m(()=>[_(i(e.$t("title")),1)]),_:1})]),t("li",null,i(e.$t("nav.websockets")),1)]),t("div",se,[t("div",ae,[t("form",{onSubmit:s[1]||(s[1]=w((...a)=>l.publish&&l.publish(...a),["prevent"])),"accept-charset":"UTF-8"},[g(t("input",{type:"input","onUpdate:modelValue":s[0]||(s[0]=a=>h.message=a),placeholder:"Type in a message"},null,512),[[S,h.message]]),ne,ie,oe],32),re]),t("div",ce,[le,h.messages.length>0?(r(),c("div",ue,[(r(!0),c(y,null,k(h.messages,(a,$)=>(r(),c("p",{key:$},[t("i",null,i(a),1)]))),128))])):(r(),c("div",de,me))])])])}const pe=v(Zt,[["render",_e]]),fe=I({history:T(`/${I18n.prefix}admin`),routes:[{path:"/",component:Z,name:"root_path"},{path:"/musicians",component:xt,name:"musicians_path"},{path:"/musicians/new",component:Bt,name:"new_musician_path"},{path:"/musicians/:id/edit",component:Yt,name:"edit_musician_path"},{path:"/websockets",component:pe,name:"websockets_path"},{path:"/404",component:L},{path:"/:catchAll(.*)",redirect:"/404"}]}),ve={data(){return{availableLocales:window.I18n.availableLocales,locale:window.I18n.locale}},methods:{activeOn(e){return e.includes(this.$route.name)?"active":""}},watch:{locale:function(e){let s=`/${e}${this.$route.path}`;e==this.availableLocales[0]&&(s=`${this.$route.path}`),window.location.href=s}}},$e={class:"top-nav"},be={class:"container"},ge={class:"row"},ye={class:"col-md-16 col-lg-21"},ke={href:"/users/sign_out"},we={class:"col-md-8 col-lg-3"},xe=["value"];function Ce(e,s,o,u,h,l){const n=p("router-link");return r(),c("section",$e,[t("div",be,[t("div",ge,[t("div",ye,[t("nav",null,[t("ul",null,[t("li",{class:C(l.activeOn(["root_path"]))},[d(n,{to:{name:"root_path"}},{default:m(()=>[_(i(e.$t("nav.dashboard")),1)]),_:1})],2),t("li",{class:C(l.activeOn(["musicians_path","edit_musician_path","new_musician_path"]))},[d(n,{to:{name:"musicians_path"}},{default:m(()=>[_(i(e.$t("nav.musicians")),1)]),_:1})],2),t("li",{class:C(l.activeOn(["websockets_path"]))},[d(n,{to:{name:"websockets_path"}},{default:m(()=>[_(i(e.$t("nav.websockets")),1)]),_:1})],2),t("li",null,[t("a",ke,i(e.$t("nav.logout")),1)])])])]),t("div",we,[g(t("select",{"onUpdate:modelValue":s[0]||(s[0]=a=>h.locale=a)},[(r(!0),c(y,null,k(h.availableLocales,a=>(r(),c("option",{value:a,key:a},i(a.toUpperCase()),9,xe))),128))],512),[[F,h.locale]])])])])])}const Se=v(ve,[["render",Ce]]),Fe={components:{"nav-bar":Se}};function Ae(e,s,o,u,h,l){const n=p("nav-bar"),a=p("router-view");return r(),c("section",null,[d(n),d(a)])}const qe=v(Fe,[["render",Ae]]),Ve={props:["store"],methods:{setQuery(e){let s=JSON.parse(JSON.stringify(this.$route.query));return s.page=e,s}},watch:{"$route.query":function(){this.$emit("clicked")}}},Me={clas:"container"},Ue={key:0},Ne={class:"pagination"},je={key:0},Ie=t("span",null,"«",-1),Te={key:1},Le={key:2},Oe={key:3},Pe={key:1},Ee=t("span",null,"»",-1);function Re(e,s,o,u,h,l){const n=p("router-link");return r(),c("section",Me,[o.store.pagination.next||o.store.pagination.previous?(r(),c("div",Ue,[t("ul",Ne,[o.store.pagination.previous!=null?(r(),c("li",je,[o.store.pagination.previous?(r(),x(n,{key:0,to:{path:e.$route.path,query:l.setQuery(o.store.pagination.previous)}},{default:m(()=>[Ie]),_:1},8,["to"])):f("",!0)])):f("",!0),(r(!0),c(y,null,k(o.store.pagination.pages,a=>(r(),c("li",{key:a,class:C([o.store.pagination.current==a?"active":""])},[a!=o.store.pagination.current&&(a==1||a==2||a==3||a==o.store.pagination.pages||a==o.store.pagination.pages-1||a==o.store.pagination.pages-2)?(r(),x(n,{key:0,to:{path:e.$route.path,query:l.setQuery(a)}},{default:m(()=>[_(i(a),1)]),_:2},1032,["to"])):f("",!0),a!=o.store.pagination.current&&a==4?(r(),c("span",Te,"...")):f("",!0),a==o.store.pagination.current?(r(),c("span",Le,i(a),1)):f("",!0),a==o.store.pagination.current&&a==4?(r(),c("span",Oe,"...")):f("",!0)],2))),128)),o.store.pagination.next!=null&&o.store.pagination.pages>0?(r(),c("li",Pe,[o.store.pagination.next?(r(),x(n,{key:0,to:{path:e.$route.path,query:l.setQuery(o.store.pagination.next)}},{default:m(()=>[Ee]),_:1},8,["to"])):f("",!0)])):f("",!0)])])):f("",!0)])}const Be=v(Ve,[["render",Re]]),N=O(qe),De=P({channel:"ChatChannel"}),Qe=E({handler:M,namespace:"/admin"}),j=R();j.use(({store:e})=>{e.axios=M});const We=B({locale:"current",messages:translations});N.component("pagination",Be);N.use(fe).use(j).use(We).use(Qe).use(De).mount("#app"); ================================================ FILE: public/vite-test/assets/front-f6acb49a.js ================================================ import{d as I,_ as m,g as p,o as c,c as l,a as e,t as s,h,i as _,w as f,l as u,F as w,r as k,m as A,n as L,E as M,p as b,e as S,f as z,q as B,s as N,u as V,x,A as C,y as E}from"./vue-i18n-6b73e0ca.js";const v=I("musicians",{state:()=>({musician:{},musicians:[]}),actions:{async index(){return this.axios.get("/musicians").then(t=>{this.musicians=t.data.musicians})},async show(t){return this.axios.get(`/musicians/${t}`).then(n=>{this.musician=n.data.musician})}}}),O={setup(){return{store:v()}},methods:{unauthorized(){this.$api.call(this.store.show("this-will-trigger-a-401"))},crash(){this.$api.call(this.store.show("this-will-trigger-a-500"))}}},P={class:"container"},D={href:"/dead-link"},F=e("br",null,null,-1),T={href:"/admin"};function U(t,n,$,r,d,o){const i=p("router-link");return c(),l("section",P,[e("h1",null,s(t.$t("pages.title")),1),e("p",null,[e("a",D,s(t.$t("pages.server_404")),1)]),e("p",null,[h(i,{to:"/dead-link"},{default:_(()=>[u(s(t.$t("pages.client_404")),1)]),_:1})]),e("p",null,[e("a",{onClick:n[0]||(n[0]=f((...a)=>o.unauthorized&&o.unauthorized(...a),["prevent"])),href:"#"},s(t.$t("pages.server_401")),1)]),e("p",null,[e("a",{onClick:n[1]||(n[1]=f((...a)=>o.crash&&o.crash(...a),["prevent"])),href:"#"},s(t.$t("pages.server_500")),1)]),F,e("p",null,[e("a",T,s(t.$t("pages.admin_link")),1)])])}const q=m(O,[["render",U]]),H={setup(){return{store:v()}},created(){this.$api.call(this.store.index())}},R={class:"container"},W={class:"breadcrumb"},j={class:"row"};function G(t,n,$,r,d,o){const i=p("router-link");return c(),l("section",R,[e("h1",null,s(t.$t("home.title")),1),e("ul",W,[e("li",null,[e("span",null,s(t.$t("home.breadcrumb")),1)])]),e("div",j,[(c(!0),l(w,null,k(r.store.musicians,a=>(c(),l("div",{key:a.id,class:"col-xs-24 col-md-6 card"},[h(i,{to:{name:"musician_path",params:{id:a.id}}},{default:_(()=>[u(s(a.name),1)]),_:2},1032,["to"])]))),128))])])}const g=m(H,[["render",G]]),J={setup(){return{store:v()}},created(){this.$api.call(this.store.show(this.$route.params.id))}},K={class:"container"},Q={class:"breadcrumb"},X=e("br",null,null,-1),Y=e("br",null,null,-1);function Z(t,n,$,r,d,o){const i=p("router-link");return c(),l("section",K,[e("h1",null,s(t.$t("home.title")),1),e("ul",Q,[e("li",null,[h(i,{to:{name:"root_path"}},{default:_(()=>[u(s(t.$t("home.breadcrumb")),1)]),_:1})]),e("li",null,s(r.store.musician.name),1)]),e("h2",null,s(t.$t("musicians.title")),1),e("p",null,[e("b",null,s(t.$t("musicians.id"))+":",1),u(" "+s(r.store.musician.id),1),X,e("b",null,s(t.$t("musicians.name"))+":",1),u(" "+s(r.store.musician.name),1),Y,e("b",null,s(t.$t("musicians.band"))+":",1),u(" "+s(r.store.musician.band),1)])])}const ee=m(J,[["render",Z]]),te=A({history:L(`/${I18n.prefix}`),routes:[{path:"/",component:g,name:"root_path"},{path:"/pages",component:q,name:"pages_path"},{path:"/musicians",component:g,name:"musicians_path"},{path:"/musicians/:id",component:ee,name:"musician_path"},{path:"/404",component:M},{path:"/:catchAll(.*)",redirect:"/404"}]}),se={data(){return{availableLocales:window.I18n.availableLocales,locale:window.I18n.locale}},methods:{activeOn(t){return t.includes(this.$route.name)?"active":""}},watch:{locale:function(t){let n=`/${t}${this.$route.path}`;t==this.availableLocales[0]&&(n=`${this.$route.path}`),window.location.href=n}}},ne={class:"top-nav"},ae={class:"container"},oe={class:"row"},ie={class:"col-md-16 col-lg-21"},re={class:"col-md-8 col-lg-3"},ce=["value"];function le(t,n,$,r,d,o){const i=p("router-link");return c(),l("section",ne,[e("div",ae,[e("div",oe,[e("div",ie,[e("nav",null,[e("ul",null,[e("li",{class:b(o.activeOn(["root_path","musicians_path","musician_path"]))},[h(i,{to:"/"},{default:_(()=>[u(s(t.$t("nav.homepage")),1)]),_:1})],2),e("li",{class:b(o.activeOn(["pages_path"]))},[h(i,{to:{name:"pages_path"}},{default:_(()=>[u(s(t.$t("nav.pages")),1)]),_:1})],2)])])]),e("div",re,[S(e("select",{"onUpdate:modelValue":n[0]||(n[0]=a=>d.locale=a)},[(c(!0),l(w,null,k(d.availableLocales,a=>(c(),l("option",{value:a,key:a},s(a.toUpperCase()),9,ce))),128))],512),[[z,d.locale]])])])])])}const ue=m(se,[["render",le]]),de={components:{"nav-bar":ue}};function he(t,n,$,r,d,o){const i=p("nav-bar"),a=p("router-view");return c(),l("div",null,[h(i),h(a)])}const pe=m(de,[["render",he]]),_e=B(pe),me=N({channel:"ChatChannel"}),$e=V({handler:C,namespace:""}),y=x();y.use(({store:t})=>{t.axios=C});const ve=E({locale:"current",messages:translations});_e.use(te).use(y).use(ve).use($e).use(me).mount("#app"); ================================================ FILE: public/vite-test/assets/vue-i18n-6b73e0ca.js ================================================ function Xs(e,t){const n=Object.create(null),r=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const _e={},nn=[],nt=()=>{},xc=()=>!1,Pr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Js=e=>e.startsWith("onUpdate:"),ke=Object.assign,zs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Fc=Object.prototype.hasOwnProperty,ie=(e,t)=>Fc.call(e,t),G=Array.isArray,rn=e=>Jn(e)==="[object Map]",Ir=e=>Jn(e)==="[object Set]",Uo=e=>Jn(e)==="[object Date]",Q=e=>typeof e=="function",Le=e=>typeof e=="string",an=e=>typeof e=="symbol",he=e=>e!==null&&typeof e=="object",Al=e=>(he(e)||Q(e))&&Q(e.then)&&Q(e.catch),Ll=Object.prototype.toString,Jn=e=>Ll.call(e),Mc=e=>Jn(e).slice(8,-1),Cl=e=>Jn(e)==="[object Object]",Qs=e=>Le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ur=Xs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),wr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Dc=/-(\w)/g,ht=wr(e=>e.replace(Dc,(t,n)=>n?n.toUpperCase():"")),Uc=/\B([A-Z])/g,bn=wr(e=>e.replace(Uc,"-$1").toLowerCase()),kr=wr(e=>e.charAt(0).toUpperCase()+e.slice(1)),ts=wr(e=>e?`on${kr(e)}`:""),Xt=(e,t)=>!Object.is(e,t),fr=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Or=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let $o;const ps=()=>$o||($o=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Zs(e){if(G(e)){const t={};for(let n=0;n{if(n){const r=n.split(jc);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function eo(e){let t="";if(Le(e))t=e;else if(G(e))for(let n=0;nxr(n,t))}const j_=e=>Le(e)?e:e==null?"":G(e)||he(e)&&(e.toString===Ll||!Q(e.toString))?JSON.stringify(e,Il,2):String(e),Il=(e,t)=>t&&t.__v_isRef?Il(e,t.value):rn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o])=>(n[`${r} =>`]=o,n),{})}:Ir(t)?{[`Set(${t.size})`]:[...t.values()]}:he(t)&&!G(t)&&!Cl(t)?String(t):t;let Ge;class wl{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ge,!t&&Ge&&(this.index=(Ge.scopes||(Ge.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ge;try{return Ge=this,t()}finally{Ge=n}}}on(){Ge=this}off(){Ge=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},xl=e=>(e.w&Mt)>0,Fl=e=>(e.n&Mt)>0,Xc=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(d==="length"||!an(d)&&d>=a)&&l.push(f)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":G(e)?Qs(n)&&l.push(i.get("length")):(l.push(i.get(Gt)),rn(e)&&l.push(i.get(gs)));break;case"delete":G(e)||(l.push(i.get(Gt)),rn(e)&&l.push(i.get(gs)));break;case"set":rn(e)&&l.push(i.get(Gt));break}if(l.length===1)l[0]&&bs(l[0]);else{const a=[];for(const f of l)f&&a.push(...f);bs(no(a))}}function bs(e,t){const n=G(e)?e:[...e];for(const r of n)r.computed&&Ho(r);for(const r of n)r.computed||Ho(r)}function Ho(e,t){(e!==Ze||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function zc(e,t){var n;return(n=Tr.get(e))==null?void 0:n.get(t)}const Qc=Xs("__proto__,__v_isRef,__isVue"),Ul=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(an)),Wo=Zc();function Zc(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=le(this);for(let s=0,i=this.length;s{e[t]=function(...n){En();const r=le(this)[t].apply(this,n);return yn(),r}}),e}function eu(e){const t=le(this);return Ve(t,"has",e),t.hasOwnProperty(e)}class $l{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,r){const o=this._isReadonly,s=this._shallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw"&&r===(o?s?hu:Bl:s?Wl:Hl).get(t))return t;const i=G(t);if(!o){if(i&&ie(Wo,n))return Reflect.get(Wo,n,r);if(n==="hasOwnProperty")return eu}const l=Reflect.get(t,n,r);return(an(n)?Ul.has(n):Qc(n))||(o||Ve(t,"get",n),s)?l:Te(l)?i&&Qs(n)?l:l.value:he(l)?o?Kl(l):zn(l):l}}class jl extends $l{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(cn(s)&&Te(s)&&!Te(r))return!1;if(!this._shallow&&(!vr(r)&&!cn(r)&&(s=le(s),r=le(r)),!G(t)&&Te(s)&&!Te(r)))return s.value=r,!0;const i=G(t)&&Qs(n)?Number(n)e,Fr=e=>Reflect.getPrototypeOf(e);function nr(e,t,n=!1,r=!1){e=e.__v_raw;const o=le(e),s=le(t);n||(Xt(t,s)&&Ve(o,"get",t),Ve(o,"get",s));const{has:i}=Fr(o),l=r?so:n?lo:Un;if(i.call(o,t))return l(e.get(t));if(i.call(o,s))return l(e.get(s));e!==o&&e.get(t)}function rr(e,t=!1){const n=this.__v_raw,r=le(n),o=le(e);return t||(Xt(e,o)&&Ve(r,"has",e),Ve(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function sr(e,t=!1){return e=e.__v_raw,!t&&Ve(le(e),"iterate",Gt),Reflect.get(e,"size",e)}function Bo(e){e=le(e);const t=le(this);return Fr(t).has.call(t,e)||(t.add(e),yt(t,"add",e,e)),this}function Vo(e,t){t=le(t);const n=le(this),{has:r,get:o}=Fr(n);let s=r.call(n,e);s||(e=le(e),s=r.call(n,e));const i=o.call(n,e);return n.set(e,t),s?Xt(t,i)&&yt(n,"set",e,t):yt(n,"add",e,t),this}function Ko(e){const t=le(this),{has:n,get:r}=Fr(t);let o=n.call(t,e);o||(e=le(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&yt(t,"delete",e,void 0),s}function Yo(){const e=le(this),t=e.size!==0,n=e.clear();return t&&yt(e,"clear",void 0,void 0),n}function or(e,t){return function(r,o){const s=this,i=s.__v_raw,l=le(i),a=t?so:e?lo:Un;return!e&&Ve(l,"iterate",Gt),i.forEach((f,d)=>r.call(o,a(f),a(d),s))}}function ir(e,t,n){return function(...r){const o=this.__v_raw,s=le(o),i=rn(s),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,f=o[e](...r),d=n?so:t?lo:Un;return!t&&Ve(s,"iterate",a?gs:Gt),{next(){const{value:h,done:m}=f.next();return m?{value:h,done:m}:{value:l?[d(h[0]),d(h[1])]:d(h),done:m}},[Symbol.iterator](){return this}}}}function St(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function ou(){const e={get(s){return nr(this,s)},get size(){return sr(this)},has:rr,add:Bo,set:Vo,delete:Ko,clear:Yo,forEach:or(!1,!1)},t={get(s){return nr(this,s,!1,!0)},get size(){return sr(this)},has:rr,add:Bo,set:Vo,delete:Ko,clear:Yo,forEach:or(!1,!0)},n={get(s){return nr(this,s,!0)},get size(){return sr(this,!0)},has(s){return rr.call(this,s,!0)},add:St("add"),set:St("set"),delete:St("delete"),clear:St("clear"),forEach:or(!0,!1)},r={get(s){return nr(this,s,!0,!0)},get size(){return sr(this,!0)},has(s){return rr.call(this,s,!0)},add:St("add"),set:St("set"),delete:St("delete"),clear:St("clear"),forEach:or(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=ir(s,!1,!1),n[s]=ir(s,!0,!1),t[s]=ir(s,!1,!0),r[s]=ir(s,!0,!0)}),[e,n,t,r]}const[iu,lu,au,cu]=ou();function oo(e,t){const n=t?e?cu:au:e?lu:iu;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(ie(n,o)&&o in r?n:r,o,s)}const uu={get:oo(!1,!1)},fu={get:oo(!1,!0)},du={get:oo(!0,!1)},Hl=new WeakMap,Wl=new WeakMap,Bl=new WeakMap,hu=new WeakMap;function mu(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function pu(e){return e.__v_skip||!Object.isExtensible(e)?0:mu(Mc(e))}function zn(e){return cn(e)?e:io(e,!1,nu,uu,Hl)}function Vl(e){return io(e,!1,su,fu,Wl)}function Kl(e){return io(e,!0,ru,du,Bl)}function io(e,t,n,r,o){if(!he(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=pu(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return o.set(e,l),l}function kt(e){return cn(e)?kt(e.__v_raw):!!(e&&e.__v_isReactive)}function cn(e){return!!(e&&e.__v_isReadonly)}function vr(e){return!!(e&&e.__v_isShallow)}function Yl(e){return kt(e)||cn(e)}function le(e){const t=e&&e.__v_raw;return t?le(t):e}function Mr(e){return yr(e,"__v_skip",!0),e}const Un=e=>he(e)?zn(e):e,lo=e=>he(e)?Kl(e):e;function Gl(e){wt&&Ze&&(e=le(e),Dl(e.dep||(e.dep=no())))}function ql(e,t){e=le(e);const n=e.dep;n&&bs(n)}function Te(e){return!!(e&&e.__v_isRef===!0)}function qe(e){return Jl(e,!1)}function Xl(e){return Jl(e,!0)}function Jl(e,t){return Te(e)?e:new _u(e,t)}class _u{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:le(t),this._value=n?t:Un(t)}get value(){return Gl(this),this._value}set value(t){const n=this.__v_isShallow||vr(t)||cn(t);t=n?t:le(t),Xt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Un(t),ql(this))}}function sn(e){return Te(e)?e.value:e}const gu={get:(e,t,n)=>sn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Te(o)&&!Te(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function zl(e){return kt(e)?e:new Proxy(e,gu)}function bu(e){const t=G(e)?new Array(e.length):{};for(const n in e)t[n]=yu(e,n);return t}class Eu{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return zc(le(this._object),this._key)}}function yu(e,t,n){const r=e[t];return Te(r)?r:new Eu(e,t,n)}class Ou{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new ro(t,()=>{this._dirty||(this._dirty=!0,ql(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=le(this);return Gl(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Tu(e,t,n=!1){let r,o;const s=Q(e);return s?(r=e,o=nt):(r=e.get,o=e.set),new Ou(r,o,s||!o,n)}function xt(e,t,n,r){let o;try{o=r?e(...r):e()}catch(s){Dr(s,t,n)}return o}function rt(e,t,n,r){if(Q(e)){const s=xt(e,t,n,r);return s&&Al(s)&&s.catch(i=>{Dr(i,t,n)}),s}const o=[];for(let s=0;s>>1,o=Fe[r],s=jn(o);sut&&Fe.splice(t,1)}function Ru(e){G(e)?on.push(...e):(!bt||!bt.includes(e,e.allowRecurse?Bt+1:Bt))&&on.push(e),Zl()}function Go(e,t=$n?ut+1:0){for(;tjn(n)-jn(r)),Bt=0;Bte.id==null?1/0:e.id,Au=(e,t)=>{const n=jn(e)-jn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function ta(e){Es=!1,$n=!0,Fe.sort(Au);const t=nt;try{for(ut=0;utLe(b)?b.trim():b)),h&&(o=n.map(Or))}let l,a=r[l=ts(t)]||r[l=ts(ht(t))];!a&&s&&(a=r[l=ts(bn(t))]),a&&rt(a,e,6,o);const f=r[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,rt(f,e,6,o)}}function na(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},l=!1;if(!Q(e)){const a=f=>{const d=na(f,t,!0);d&&(l=!0,ke(i,d))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!s&&!l?(he(e)&&r.set(e,null),null):(G(s)?s.forEach(a=>i[a]=null):ke(i,s),he(e)&&r.set(e,i),i)}function Ur(e,t){return!e||!Pr(t)?!1:(t=t.slice(2).replace(/Once$/,""),ie(e,t[0].toLowerCase()+t.slice(1))||ie(e,bn(t))||ie(e,t))}let Be=null,ra=null;function Sr(e){const t=Be;return Be=e,ra=e&&e.type.__scopeId||null,t}function Cu(e,t=Be,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&si(-1);const s=Sr(t);let i;try{i=e(...o)}finally{Sr(s),r._d&&si(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function ns(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:s,propsOptions:[i],slots:l,attrs:a,emit:f,render:d,renderCache:h,data:m,setupState:b,ctx:y,inheritAttrs:S}=e;let A,g;const v=Sr(e);try{if(n.shapeFlag&4){const T=o||r,k=T;A=ct(d.call(k,T,h,s,b,m,y)),g=a}else{const T=t;A=ct(T.length>1?T(s,{attrs:a,slots:l,emit:f}):T(s,null)),g=t.props?a:Pu(a)}}catch(T){kn.length=0,Dr(T,e,1),A=$e(Jt)}let L=A;if(g&&S!==!1){const T=Object.keys(g),{shapeFlag:k}=L;T.length&&k&7&&(i&&T.some(Js)&&(g=Iu(g,i)),L=un(L,g))}return n.dirs&&(L=un(L),L.dirs=L.dirs?L.dirs.concat(n.dirs):n.dirs),n.transition&&(L.transition=n.transition),A=L,Sr(v),A}const Pu=e=>{let t;for(const n in e)(n==="class"||n==="style"||Pr(n))&&((t||(t={}))[n]=e[n]);return t},Iu=(e,t)=>{const n={};for(const r in e)(!Js(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function wu(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:l,patchFlag:a}=t,f=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return r?qo(r,i,f):!!i;if(a&8){const d=t.dynamicProps;for(let h=0;he.__isSuspense;function Du(e,t){t&&t.pendingBranch?G(e)?t.effects.push(...e):t.effects.push(e):Ru(e)}const lr={};function Ft(e,t,n){return oa(e,t,n)}function oa(e,t,{immediate:n,deep:r,flush:o,onTrack:s,onTrigger:i}=_e){var l;const a=kl()===((l=Ne)==null?void 0:l.scope)?Ne:null;let f,d=!1,h=!1;if(Te(e)?(f=()=>e.value,d=vr(e)):kt(e)?(f=()=>e,r=!0):G(e)?(h=!0,d=e.some(T=>kt(T)||vr(T)),f=()=>e.map(T=>{if(Te(T))return T.value;if(kt(T))return Yt(T);if(Q(T))return xt(T,a,2)})):Q(e)?t?f=()=>xt(e,a,2):f=()=>{if(!(a&&a.isUnmounted))return m&&m(),rt(e,a,3,[b])}:f=nt,t&&r){const T=f;f=()=>Yt(T())}let m,b=T=>{m=v.onStop=()=>{xt(T,a,4),m=v.onStop=void 0}},y;if(Vn)if(b=nt,t?n&&rt(t,a,3,[f(),h?[]:void 0,b]):f(),o==="sync"){const T=wf();y=T.__watcherHandles||(T.__watcherHandles=[])}else return nt;let S=h?new Array(e.length).fill(lr):lr;const A=()=>{if(v.active)if(t){const T=v.run();(r||d||(h?T.some((k,M)=>Xt(k,S[M])):Xt(T,S)))&&(m&&m(),rt(t,a,3,[T,S===lr?void 0:h&&S[0]===lr?[]:S,b]),S=T)}else v.run()};A.allowRecurse=!!t;let g;o==="sync"?g=A:o==="post"?g=()=>We(A,a&&a.suspense):(A.pre=!0,a&&(A.id=a.uid),g=()=>uo(A));const v=new ro(f,g);t?n?A():S=v.run():o==="post"?We(v.run.bind(v),a&&a.suspense):v.run();const L=()=>{v.stop(),a&&a.scope&&zs(a.scope.effects,v)};return y&&y.push(L),L}function Uu(e,t,n){const r=this.proxy,o=Le(e)?e.includes(".")?ia(r,e):()=>r[e]:e.bind(r,r);let s;Q(t)?s=t:(s=t.handler,n=t);const i=Ne;fn(this);const l=oa(o,s.bind(r),n);return i?fn(i):qt(),l}function ia(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Yt(n,t)});else if(Cl(e))for(const n in e)Yt(e[n],t);return e}function W_(e,t){const n=Be;if(n===null)return e;const r=Hr(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let s=0;ske({name:e.name},t,{setup:e}))():e}const dr=e=>!!e.type.__asyncLoader,la=e=>e.type.__isKeepAlive;function $u(e,t){aa(e,"a",t)}function ju(e,t){aa(e,"da",t)}function aa(e,t,n=Ne){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if($r(t,r,n),n){let o=n.parent;for(;o&&o.parent;)la(o.parent.vnode)&&Hu(r,t,n,o),o=o.parent}}function Hu(e,t,n,r){const o=$r(t,e,r,!0);fo(()=>{zs(r[t],o)},n)}function $r(e,t,n=Ne,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;En(),fn(n);const l=rt(t,n,e,i);return qt(),yn(),l});return r?o.unshift(s):o.push(s),s}}const Tt=e=>(t,n=Ne)=>(!Vn||e==="sp")&&$r(e,(...r)=>t(...r),n),ca=Tt("bm"),ua=Tt("m"),Wu=Tt("bu"),Bu=Tt("u"),Vu=Tt("bum"),fo=Tt("um"),Ku=Tt("sp"),Yu=Tt("rtg"),Gu=Tt("rtc");function qu(e,t=Ne){$r("ec",e,t)}function B_(e,t,n,r){let o;const s=n&&n[r];if(G(e)||Le(e)){o=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,s&&s[l]));else{const i=Object.keys(e);o=new Array(i.length);for(let l=0,a=i.length;le?Ta(e)?Hr(e)||e.proxy:ys(e.parent):null,wn=ke(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ys(e.parent),$root:e=>ys(e.root),$emit:e=>e.emit,$options:e=>ho(e),$forceUpdate:e=>e.f||(e.f=()=>uo(e.update)),$nextTick:e=>e.n||(e.n=co.bind(e.proxy)),$watch:e=>Uu.bind(e)}),rs=(e,t)=>e!==_e&&!e.__isScriptSetup&&ie(e,t),Xu={get({_:e},t){const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:l,appContext:a}=e;let f;if(t[0]!=="$"){const b=i[t];if(b!==void 0)switch(b){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(rs(r,t))return i[t]=1,r[t];if(o!==_e&&ie(o,t))return i[t]=2,o[t];if((f=e.propsOptions[0])&&ie(f,t))return i[t]=3,s[t];if(n!==_e&&ie(n,t))return i[t]=4,n[t];Os&&(i[t]=0)}}const d=wn[t];let h,m;if(d)return t==="$attrs"&&Ve(e,"get",t),d(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==_e&&ie(n,t))return i[t]=4,n[t];if(m=a.config.globalProperties,ie(m,t))return m[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return rs(o,t)?(o[t]=n,!0):r!==_e&&ie(r,t)?(r[t]=n,!0):ie(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let l;return!!n[i]||e!==_e&&ie(e,i)||rs(t,i)||(l=s[0])&&ie(l,i)||ie(r,i)||ie(wn,i)||ie(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ie(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Jo(e){return G(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Os=!0;function Ju(e){const t=ho(e),n=e.proxy,r=e.ctx;Os=!1,t.beforeCreate&&zo(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:l,provide:a,inject:f,created:d,beforeMount:h,mounted:m,beforeUpdate:b,updated:y,activated:S,deactivated:A,beforeDestroy:g,beforeUnmount:v,destroyed:L,unmounted:T,render:k,renderTracked:M,renderTriggered:I,errorCaptured:V,serverPrefetch:K,expose:te,inheritAttrs:fe,components:ae,directives:me,filters:je}=t;if(f&&zu(f,r,null),i)for(const se in i){const ne=i[se];Q(ne)&&(r[se]=ne.bind(n))}if(o){const se=o.call(n,n);he(se)&&(e.data=zn(se))}if(Os=!0,s)for(const se in s){const ne=s[se],Ee=Q(ne)?ne.bind(n,n):Q(ne.get)?ne.get.bind(n,n):nt,Me=!Q(ne)&&Q(ne.set)?ne.set.bind(n):nt,xe=Oe({get:Ee,set:Me});Object.defineProperty(r,se,{enumerable:!0,configurable:!0,get:()=>xe.value,set:ve=>xe.value=ve})}if(l)for(const se in l)fa(l[se],r,n,se);if(a){const se=Q(a)?a.call(n):a;Reflect.ownKeys(se).forEach(ne=>{hr(ne,se[ne])})}d&&zo(d,e,"c");function z(se,ne){G(ne)?ne.forEach(Ee=>se(Ee.bind(n))):ne&&se(ne.bind(n))}if(z(ca,h),z(ua,m),z(Wu,b),z(Bu,y),z($u,S),z(ju,A),z(qu,V),z(Gu,M),z(Yu,I),z(Vu,v),z(fo,T),z(Ku,K),G(te))if(te.length){const se=e.exposed||(e.exposed={});te.forEach(ne=>{Object.defineProperty(se,ne,{get:()=>n[ne],set:Ee=>n[ne]=Ee})})}else e.exposed||(e.exposed={});k&&e.render===nt&&(e.render=k),fe!=null&&(e.inheritAttrs=fe),ae&&(e.components=ae),me&&(e.directives=me)}function zu(e,t,n=nt){G(e)&&(e=Ts(e));for(const r in e){const o=e[r];let s;he(o)?"default"in o?s=st(o.from||r,o.default,!0):s=st(o.from||r):s=st(o),Te(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function zo(e,t,n){rt(G(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function fa(e,t,n,r){const o=r.includes(".")?ia(n,r):()=>n[r];if(Le(e)){const s=t[e];Q(s)&&Ft(o,s)}else if(Q(e))Ft(o,e.bind(n));else if(he(e))if(G(e))e.forEach(s=>fa(s,t,n,r));else{const s=Q(e.handler)?e.handler.bind(n):t[e.handler];Q(s)&&Ft(o,s,e)}}function ho(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,l=s.get(t);let a;return l?a=l:!o.length&&!n&&!r?a=t:(a={},o.length&&o.forEach(f=>Nr(a,f,i,!0)),Nr(a,t,i)),he(t)&&s.set(t,a),a}function Nr(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&Nr(e,s,n,!0),o&&o.forEach(i=>Nr(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Qu[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Qu={data:Qo,props:Zo,emits:Zo,methods:Pn,computed:Pn,beforeCreate:De,created:De,beforeMount:De,mounted:De,beforeUpdate:De,updated:De,beforeDestroy:De,beforeUnmount:De,destroyed:De,unmounted:De,activated:De,deactivated:De,errorCaptured:De,serverPrefetch:De,components:Pn,directives:Pn,watch:ef,provide:Qo,inject:Zu};function Qo(e,t){return t?e?function(){return ke(Q(e)?e.call(this,this):e,Q(t)?t.call(this,this):t)}:t:e}function Zu(e,t){return Pn(Ts(e),Ts(t))}function Ts(e){if(G(e)){const t={};for(let n=0;n1)return n&&Q(t)?t.call(r&&r.proxy):t}}function rf(){return!!(Ne||Be||Hn)}function sf(e,t,n,r=!1){const o={},s={};yr(s,jr,1),e.propsDefaults=Object.create(null),ha(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:Vl(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function of(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,l=le(o),[a]=e.propsOptions;let f=!1;if((r||i>0)&&!(i&16)){if(i&8){const d=e.vnode.dynamicProps;for(let h=0;h{a=!0;const[m,b]=ma(h,t,!0);ke(i,m),b&&l.push(...b)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!s&&!a)return he(e)&&r.set(e,nn),nn;if(G(s))for(let d=0;d-1,b[1]=S<0||y-1||ie(b,"default"))&&l.push(h)}}}const f=[i,l];return he(e)&&r.set(e,f),f}function ei(e){return e[0]!=="$"}function ti(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function ni(e,t){return ti(e)===ti(t)}function ri(e,t){return G(t)?t.findIndex(n=>ni(n,e)):Q(t)&&ni(t,e)?0:-1}const pa=e=>e[0]==="_"||e==="$stable",mo=e=>G(e)?e.map(ct):[ct(e)],lf=(e,t,n)=>{if(t._n)return t;const r=Cu((...o)=>mo(t(...o)),n);return r._c=!1,r},_a=(e,t,n)=>{const r=e._ctx;for(const o in e){if(pa(o))continue;const s=e[o];if(Q(s))t[o]=lf(o,s,r);else if(s!=null){const i=mo(s);t[o]=()=>i}}},ga=(e,t)=>{const n=mo(t);e.slots.default=()=>n},af=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=le(t),yr(t,"_",n)):_a(t,e.slots={})}else e.slots={},t&&ga(e,t);yr(e.slots,jr,1)},cf=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=_e;if(r.shapeFlag&32){const l=t._;l?n&&l===1?s=!1:(ke(o,t),!n&&l===1&&delete o._):(s=!t.$stable,_a(t,o)),i=t}else t&&(ga(e,t),i={default:1});if(s)for(const l in o)!pa(l)&&i[l]==null&&delete o[l]};function Ss(e,t,n,r,o=!1){if(G(e)){e.forEach((m,b)=>Ss(m,t&&(G(t)?t[b]:t),n,r,o));return}if(dr(r)&&!o)return;const s=r.shapeFlag&4?Hr(r.component)||r.component.proxy:r.el,i=o?null:s,{i:l,r:a}=e,f=t&&t.r,d=l.refs===_e?l.refs={}:l.refs,h=l.setupState;if(f!=null&&f!==a&&(Le(f)?(d[f]=null,ie(h,f)&&(h[f]=null)):Te(f)&&(f.value=null)),Q(a))xt(a,l,12,[i,d]);else{const m=Le(a),b=Te(a);if(m||b){const y=()=>{if(e.f){const S=m?ie(h,a)?h[a]:d[a]:a.value;o?G(S)&&zs(S,s):G(S)?S.includes(s)||S.push(s):m?(d[a]=[s],ie(h,a)&&(h[a]=d[a])):(a.value=[s],e.k&&(d[e.k]=a.value))}else m?(d[a]=i,ie(h,a)&&(h[a]=i)):b&&(a.value=i,e.k&&(d[e.k]=i))};i?(y.id=-1,We(y,n)):y()}}}const We=Du;function uf(e){return ff(e)}function ff(e,t){const n=ps();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:l,createComment:a,setText:f,setElementText:d,parentNode:h,nextSibling:m,setScopeId:b=nt,insertStaticContent:y}=e,S=(_,c,u,p=null,E=null,N=null,w=!1,F=null,D=!!c.dynamicChildren)=>{if(_===c)return;_&&!Sn(_,c)&&(p=C(_),ve(_,E,N,!0),_=null),c.patchFlag===-2&&(D=!1,c.dynamicChildren=null);const{type:x,ref:Y,shapeFlag:$}=c;switch(x){case Zn:A(_,c,u,p);break;case Jt:g(_,c,u,p);break;case mr:_==null&&v(c,u,p,w);break;case Qe:ae(_,c,u,p,E,N,w,F,D);break;default:$&1?k(_,c,u,p,E,N,w,F,D):$&6?me(_,c,u,p,E,N,w,F,D):($&64||$&128)&&x.process(_,c,u,p,E,N,w,F,D,U)}Y!=null&&E&&Ss(Y,_&&_.ref,N,c||_,!c)},A=(_,c,u,p)=>{if(_==null)r(c.el=l(c.children),u,p);else{const E=c.el=_.el;c.children!==_.children&&f(E,c.children)}},g=(_,c,u,p)=>{_==null?r(c.el=a(c.children||""),u,p):c.el=_.el},v=(_,c,u,p)=>{[_.el,_.anchor]=y(_.children,c,u,p,_.el,_.anchor)},L=({el:_,anchor:c},u,p)=>{let E;for(;_&&_!==c;)E=m(_),r(_,u,p),_=E;r(c,u,p)},T=({el:_,anchor:c})=>{let u;for(;_&&_!==c;)u=m(_),o(_),_=u;o(c)},k=(_,c,u,p,E,N,w,F,D)=>{w=w||c.type==="svg",_==null?M(c,u,p,E,N,w,F,D):K(_,c,E,N,w,F,D)},M=(_,c,u,p,E,N,w,F)=>{let D,x;const{type:Y,props:$,shapeFlag:O,transition:R,dirs:B}=_;if(D=_.el=i(_.type,N,$&&$.is,$),O&8?d(D,_.children):O&16&&V(_.children,D,null,p,E,N&&Y!=="foreignObject",w,F),B&&jt(_,null,p,"created"),I(D,_,_.scopeId,w,p),$){for(const re in $)re!=="value"&&!ur(re)&&s(D,re,null,$[re],N,_.children,p,E,ye);"value"in $&&s(D,"value",null,$.value),(x=$.onVnodeBeforeMount)&<(x,p,_)}B&&jt(_,null,p,"beforeMount");const X=df(E,R);X&&R.beforeEnter(D),r(D,c,u),((x=$&&$.onVnodeMounted)||X||B)&&We(()=>{x&<(x,p,_),X&&R.enter(D),B&&jt(_,null,p,"mounted")},E)},I=(_,c,u,p,E)=>{if(u&&b(_,u),p)for(let N=0;N{for(let x=D;x<_.length;x++){const Y=_[x]=F?Pt(_[x]):ct(_[x]);S(null,Y,c,u,p,E,N,w,F)}},K=(_,c,u,p,E,N,w)=>{const F=c.el=_.el;let{patchFlag:D,dynamicChildren:x,dirs:Y}=c;D|=_.patchFlag&16;const $=_.props||_e,O=c.props||_e;let R;u&&Ht(u,!1),(R=O.onVnodeBeforeUpdate)&<(R,u,c,_),Y&&jt(c,_,u,"beforeUpdate"),u&&Ht(u,!0);const B=E&&c.type!=="foreignObject";if(x?te(_.dynamicChildren,x,F,u,p,B,N):w||ne(_,c,F,null,u,p,B,N,!1),D>0){if(D&16)fe(F,c,$,O,u,p,E);else if(D&2&&$.class!==O.class&&s(F,"class",null,O.class,E),D&4&&s(F,"style",$.style,O.style,E),D&8){const X=c.dynamicProps;for(let re=0;re{R&<(R,u,c,_),Y&&jt(c,_,u,"updated")},p)},te=(_,c,u,p,E,N,w)=>{for(let F=0;F{if(u!==p){if(u!==_e)for(const F in u)!ur(F)&&!(F in p)&&s(_,F,u[F],null,w,c.children,E,N,ye);for(const F in p){if(ur(F))continue;const D=p[F],x=u[F];D!==x&&F!=="value"&&s(_,F,x,D,w,c.children,E,N,ye)}"value"in p&&s(_,"value",u.value,p.value)}},ae=(_,c,u,p,E,N,w,F,D)=>{const x=c.el=_?_.el:l(""),Y=c.anchor=_?_.anchor:l("");let{patchFlag:$,dynamicChildren:O,slotScopeIds:R}=c;R&&(F=F?F.concat(R):R),_==null?(r(x,u,p),r(Y,u,p),V(c.children,u,Y,E,N,w,F,D)):$>0&&$&64&&O&&_.dynamicChildren?(te(_.dynamicChildren,O,u,E,N,w,F),(c.key!=null||E&&c===E.subTree)&&ba(_,c,!0)):ne(_,c,u,Y,E,N,w,F,D)},me=(_,c,u,p,E,N,w,F,D)=>{c.slotScopeIds=F,_==null?c.shapeFlag&512?E.ctx.activate(c,u,p,w,D):je(c,u,p,E,N,w,D):Ce(_,c,D)},je=(_,c,u,p,E,N,w)=>{const F=_.component=Sf(_,p,E);if(la(_)&&(F.ctx.renderer=U),Nf(F),F.asyncDep){if(E&&E.registerDep(F,z),!_.el){const D=F.subTree=$e(Jt);g(null,D,c,u)}return}z(F,_,c,u,E,N,w)},Ce=(_,c,u)=>{const p=c.component=_.component;if(wu(_,c,u))if(p.asyncDep&&!p.asyncResolved){se(p,c,u);return}else p.next=c,Nu(p.update),p.update();else c.el=_.el,p.vnode=c},z=(_,c,u,p,E,N,w)=>{const F=()=>{if(_.isMounted){let{next:Y,bu:$,u:O,parent:R,vnode:B}=_,X=Y,re;Ht(_,!1),Y?(Y.el=B.el,se(_,Y,w)):Y=B,$&&fr($),(re=Y.props&&Y.props.onVnodeBeforeUpdate)&<(re,R,Y,B),Ht(_,!0);const pe=ns(_),Pe=_.subTree;_.subTree=pe,S(Pe,pe,h(Pe.el),C(Pe),_,E,N),Y.el=pe.el,X===null&&ku(_,pe.el),O&&We(O,E),(re=Y.props&&Y.props.onVnodeUpdated)&&We(()=>lt(re,R,Y,B),E)}else{let Y;const{el:$,props:O}=c,{bm:R,m:B,parent:X}=_,re=dr(c);if(Ht(_,!1),R&&fr(R),!re&&(Y=O&&O.onVnodeBeforeMount)&<(Y,X,c),Ht(_,!0),$&&Z){const pe=()=>{_.subTree=ns(_),Z($,_.subTree,_,E,null)};re?c.type.__asyncLoader().then(()=>!_.isUnmounted&&pe()):pe()}else{const pe=_.subTree=ns(_);S(null,pe,u,p,_,E,N),c.el=pe.el}if(B&&We(B,E),!re&&(Y=O&&O.onVnodeMounted)){const pe=c;We(()=>lt(Y,X,pe),E)}(c.shapeFlag&256||X&&dr(X.vnode)&&X.vnode.shapeFlag&256)&&_.a&&We(_.a,E),_.isMounted=!0,c=u=p=null}},D=_.effect=new ro(F,()=>uo(x),_.scope),x=_.update=()=>D.run();x.id=_.uid,Ht(_,!0),x()},se=(_,c,u)=>{c.component=_;const p=_.vnode.props;_.vnode=c,_.next=null,of(_,c.props,p,u),cf(_,c.children,u),En(),Go(),yn()},ne=(_,c,u,p,E,N,w,F,D=!1)=>{const x=_&&_.children,Y=_?_.shapeFlag:0,$=c.children,{patchFlag:O,shapeFlag:R}=c;if(O>0){if(O&128){Me(x,$,u,p,E,N,w,F,D);return}else if(O&256){Ee(x,$,u,p,E,N,w,F,D);return}}R&8?(Y&16&&ye(x,E,N),$!==x&&d(u,$)):Y&16?R&16?Me(x,$,u,p,E,N,w,F,D):ye(x,E,N,!0):(Y&8&&d(u,""),R&16&&V($,u,p,E,N,w,F,D))},Ee=(_,c,u,p,E,N,w,F,D)=>{_=_||nn,c=c||nn;const x=_.length,Y=c.length,$=Math.min(x,Y);let O;for(O=0;O<$;O++){const R=c[O]=D?Pt(c[O]):ct(c[O]);S(_[O],R,u,null,E,N,w,F,D)}x>Y?ye(_,E,N,!0,!1,$):V(c,u,p,E,N,w,F,D,$)},Me=(_,c,u,p,E,N,w,F,D)=>{let x=0;const Y=c.length;let $=_.length-1,O=Y-1;for(;x<=$&&x<=O;){const R=_[x],B=c[x]=D?Pt(c[x]):ct(c[x]);if(Sn(R,B))S(R,B,u,null,E,N,w,F,D);else break;x++}for(;x<=$&&x<=O;){const R=_[$],B=c[O]=D?Pt(c[O]):ct(c[O]);if(Sn(R,B))S(R,B,u,null,E,N,w,F,D);else break;$--,O--}if(x>$){if(x<=O){const R=O+1,B=RO)for(;x<=$;)ve(_[x],E,N,!0),x++;else{const R=x,B=x,X=new Map;for(x=B;x<=O;x++){const Ye=c[x]=D?Pt(c[x]):ct(c[x]);Ye.key!=null&&X.set(Ye.key,x)}let re,pe=0;const Pe=O-B+1;let vt=!1,es=0;const vn=new Array(Pe);for(x=0;x=Pe){ve(Ye,E,N,!0);continue}let it;if(Ye.key!=null)it=X.get(Ye.key);else for(re=B;re<=O;re++)if(vn[re-B]===0&&Sn(Ye,c[re])){it=re;break}it===void 0?ve(Ye,E,N,!0):(vn[it-B]=x+1,it>=es?es=it:vt=!0,S(Ye,c[it],u,null,E,N,w,F,D),pe++)}const Mo=vt?hf(vn):nn;for(re=Mo.length-1,x=Pe-1;x>=0;x--){const Ye=B+x,it=c[Ye],Do=Ye+1{const{el:N,type:w,transition:F,children:D,shapeFlag:x}=_;if(x&6){xe(_.component.subTree,c,u,p);return}if(x&128){_.suspense.move(c,u,p);return}if(x&64){w.move(_,c,u,U);return}if(w===Qe){r(N,c,u);for(let $=0;$F.enter(N),E);else{const{leave:$,delayLeave:O,afterLeave:R}=F,B=()=>r(N,c,u),X=()=>{$(N,()=>{B(),R&&R()})};O?O(N,B,X):X()}else r(N,c,u)},ve=(_,c,u,p=!1,E=!1)=>{const{type:N,props:w,ref:F,children:D,dynamicChildren:x,shapeFlag:Y,patchFlag:$,dirs:O}=_;if(F!=null&&Ss(F,null,u,_,!0),Y&256){c.ctx.deactivate(_);return}const R=Y&1&&O,B=!dr(_);let X;if(B&&(X=w&&w.onVnodeBeforeUnmount)&<(X,c,_),Y&6)pt(_.component,u,p);else{if(Y&128){_.suspense.unmount(u,p);return}R&&jt(_,null,c,"beforeUnmount"),Y&64?_.type.remove(_,c,u,E,U,p):x&&(N!==Qe||$>0&&$&64)?ye(x,c,u,!1,!0):(N===Qe&&$&384||!E&&Y&16)&&ye(D,c,u),p&&Xe(_)}(B&&(X=w&&w.onVnodeUnmounted)||R)&&We(()=>{X&<(X,c,_),R&&jt(_,null,c,"unmounted")},u)},Xe=_=>{const{type:c,el:u,anchor:p,transition:E}=_;if(c===Qe){Ke(u,p);return}if(c===mr){T(_);return}const N=()=>{o(u),E&&!E.persisted&&E.afterLeave&&E.afterLeave()};if(_.shapeFlag&1&&E&&!E.persisted){const{leave:w,delayLeave:F}=E,D=()=>w(u,N);F?F(_.el,N,D):D()}else N()},Ke=(_,c)=>{let u;for(;_!==c;)u=m(_),o(_),_=u;o(c)},pt=(_,c,u)=>{const{bum:p,scope:E,update:N,subTree:w,um:F}=_;p&&fr(p),E.stop(),N&&(N.active=!1,ve(w,_,c,u)),F&&We(F,c),We(()=>{_.isUnmounted=!0},c),c&&c.pendingBranch&&!c.isUnmounted&&_.asyncDep&&!_.asyncResolved&&_.suspenseId===c.pendingId&&(c.deps--,c.deps===0&&c.resolve())},ye=(_,c,u,p=!1,E=!1,N=0)=>{for(let w=N;w<_.length;w++)ve(_[w],c,u,p,E)},C=_=>_.shapeFlag&6?C(_.component.subTree):_.shapeFlag&128?_.suspense.next():m(_.anchor||_.el),j=(_,c,u)=>{_==null?c._vnode&&ve(c._vnode,null,null,!0):S(c._vnode||null,_,c,null,null,null,u),Go(),ea(),c._vnode=_},U={p:S,um:ve,m:xe,r:Xe,mt:je,mc:V,pc:ne,pbc:te,n:C,o:e};let W,Z;return t&&([W,Z]=t(U)),{render:j,hydrate:W,createApp:nf(j,W)}}function Ht({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function df(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ba(e,t,n=!1){const r=e.children,o=t.children;if(G(r)&&G(o))for(let s=0;s>1,e[n[l]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}const mf=e=>e.__isTeleport,Qe=Symbol.for("v-fgt"),Zn=Symbol.for("v-txt"),Jt=Symbol.for("v-cmt"),mr=Symbol.for("v-stc"),kn=[];let et=null;function Ea(e=!1){kn.push(et=e?null:[])}function pf(){kn.pop(),et=kn[kn.length-1]||null}let Wn=1;function si(e){Wn+=e}function ya(e){return e.dynamicChildren=Wn>0?et||nn:null,pf(),Wn>0&&et&&et.push(e),e}function _f(e,t,n,r,o,s){return ya(po(e,t,n,r,o,s,!0))}function gf(e,t,n,r,o){return ya($e(e,t,n,r,o,!0))}function Ns(e){return e?e.__v_isVNode===!0:!1}function Sn(e,t){return e.type===t.type&&e.key===t.key}const jr="__vInternal",Oa=({key:e})=>e??null,pr=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Le(e)||Te(e)||Q(e)?{i:Be,r:e,k:t,f:!!n}:e:null);function po(e,t=null,n=null,r=0,o=null,s=e===Qe?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Oa(t),ref:t&&pr(t),scopeId:ra,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Be};return l?(_o(a,n),s&128&&e.normalize(a)):n&&(a.shapeFlag|=Le(n)?8:16),Wn>0&&!i&&et&&(a.patchFlag>0||s&6)&&a.patchFlag!==32&&et.push(a),a}const $e=bf;function bf(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===xu)&&(e=Jt),Ns(e)){const l=un(e,t,!0);return n&&_o(l,n),Wn>0&&!s&&et&&(l.shapeFlag&6?et[et.indexOf(e)]=l:et.push(l)),l.patchFlag|=-2,l}if(Pf(e)&&(e=e.__vccOpts),t){t=Ef(t);let{class:l,style:a}=t;l&&!Le(l)&&(t.class=eo(l)),he(a)&&(Yl(a)&&!G(a)&&(a=ke({},a)),t.style=Zs(a))}const i=Le(e)?1:Mu(e)?128:mf(e)?64:he(e)?4:Q(e)?2:0;return po(e,t,n,r,o,i,s,!0)}function Ef(e){return e?Yl(e)||jr in e?ke({},e):e:null}function un(e,t,n=!1){const{props:r,ref:o,patchFlag:s,children:i}=e,l=t?Of(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Oa(l),ref:t&&t.ref?n&&o?G(o)?o.concat(pr(t)):[o,pr(t)]:pr(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Qe?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&un(e.ssContent),ssFallback:e.ssFallback&&un(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function yf(e=" ",t=0){return $e(Zn,null,e,t)}function V_(e,t){const n=$e(mr,null,e);return n.staticCount=t,n}function K_(e="",t=!1){return t?(Ea(),gf(Jt,null,e)):$e(Jt,null,e)}function ct(e){return e==null||typeof e=="boolean"?$e(Jt):G(e)?$e(Qe,null,e.slice()):typeof e=="object"?Pt(e):$e(Zn,null,String(e))}function Pt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:un(e)}function _o(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(G(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),_o(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(jr in t)?t._ctx=Be:o===3&&Be&&(Be.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Q(t)?(t={default:t,_ctx:Be},n=32):(t=String(t),r&64?(n=16,t=[yf(t)]):n=8);e.children=t,e.shapeFlag|=n}function Of(...e){const t={};for(let n=0;nNe||Be;let go,zt,oi="__VUE_INSTANCE_SETTERS__";(zt=ps()[oi])||(zt=ps()[oi]=[]),zt.push(e=>Ne=e),go=e=>{zt.length>1?zt.forEach(t=>t(e)):zt[0](e)};const fn=e=>{go(e),e.scope.on()},qt=()=>{Ne&&Ne.scope.off(),go(null)};function Ta(e){return e.vnode.shapeFlag&4}let Vn=!1;function Nf(e,t=!1){Vn=t;const{props:n,children:r}=e.vnode,o=Ta(e);sf(e,n,o,t),af(e,r);const s=o?Rf(e,t):void 0;return Vn=!1,s}function Rf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Mr(new Proxy(e.ctx,Xu));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?Lf(e):null;fn(e),En();const s=xt(r,e,0,[e.props,o]);if(yn(),qt(),Al(s)){if(s.then(qt,qt),t)return s.then(i=>{ii(e,i,t)}).catch(i=>{Dr(i,e,0)});e.asyncDep=s}else ii(e,s,t)}else va(e,t)}function ii(e,t,n){Q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:he(t)&&(e.setupState=zl(t)),va(e,n)}let li;function va(e,t,n){const r=e.type;if(!e.render){if(!t&&li&&!r.render){const o=r.template||ho(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:a}=r,f=ke(ke({isCustomElement:s,delimiters:l},i),a);r.render=li(o,f)}}e.render=r.render||nt}{fn(e),En();try{Ju(e)}finally{yn(),qt()}}}function Af(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return Ve(e,"get","$attrs"),t[n]}}))}function Lf(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Af(e)},slots:e.slots,emit:e.emit,expose:t}}function Hr(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(zl(Mr(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in wn)return wn[n](e)},has(t,n){return n in t||n in wn}}))}function Cf(e,t=!0){return Q(e)?e.displayName||e.name:e.name||t&&e.__name}function Pf(e){return Q(e)&&"__vccOpts"in e}const Oe=(e,t)=>Tu(e,t,Vn);function Wr(e,t,n){const r=arguments.length;return r===2?he(t)&&!G(t)?Ns(t)?$e(e,null,[t]):$e(e,t):$e(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Ns(n)&&(n=[n]),$e(e,t,n))}const If=Symbol.for("v-scx"),wf=()=>st(If),kf="3.3.10",xf="http://www.w3.org/2000/svg",Vt=typeof document<"u"?document:null,ai=Vt&&Vt.createElement("template"),Ff={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?Vt.createElementNS(xf,e):Vt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Vt.createTextNode(e),createComment:e=>Vt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Vt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{ai.innerHTML=r?`${e}`:e;const l=ai.content;if(r){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Mf=Symbol("_vtc");function Df(e,t,n){const r=e[Mf];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Uf=Symbol("_vod");function $f(e,t,n){const r=e.style,o=Le(n);if(n&&!o){if(t&&!Le(t))for(const s in t)n[s]==null&&Rs(r,s,"");for(const s in n)Rs(r,s,n[s])}else{const s=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),Uf in e&&(r.display=s)}}const ci=/\s*!important$/;function Rs(e,t,n){if(G(n))n.forEach(r=>Rs(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=jf(e,t);ci.test(n)?e.setProperty(bn(r),n.replace(ci,""),"important"):e[r]=n}}const ui=["Webkit","Moz","ms"],ss={};function jf(e,t){const n=ss[t];if(n)return n;let r=ht(t);if(r!=="filter"&&r in e)return ss[t]=r;r=kr(r);for(let o=0;oos||(Yf.then(()=>os=0),os=Date.now());function qf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;rt(Xf(r,n.value),t,5,[r])};return n.value=e,n.attached=Gf(),n}function Xf(e,t){if(G(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const mi=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Jf=(e,t,n,r,o=!1,s,i,l,a)=>{t==="class"?Df(e,r,o):t==="style"?$f(e,n,r):Pr(t)?Js(t)||Vf(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):zf(e,t,r,o))?Wf(e,t,r,s,i,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Hf(e,t,r,o))};function zf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&mi(t)&&Q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;return!(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")}return mi(t)&&Le(n)?!1:t in e}const Rr=e=>{const t=e.props["onUpdate:modelValue"]||!1;return G(t)?n=>fr(t,n):t};function Qf(e){e.target.composing=!0}function pi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ln=Symbol("_assign"),Y_={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[ln]=Rr(o);const s=r||o.props&&o.props.type==="number";Kt(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),s&&(l=Or(l)),e[ln](l)}),n&&Kt(e,"change",()=>{e.value=e.value.trim()}),t||(Kt(e,"compositionstart",Qf),Kt(e,"compositionend",pi),Kt(e,"change",pi))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},s){if(e[ln]=Rr(s),e.composing)return;const i=o||e.type==="number"?Or(e.value):e.value,l=t??"";i!==l&&(document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===l)||(e.value=l))}},G_={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=Ir(t);Kt(e,"change",()=>{const s=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?Or(Ar(i)):Ar(i));e[ln](e.multiple?o?new Set(s):s:s[0])}),e[ln]=Rr(r)},mounted(e,{value:t}){_i(e,t)},beforeUpdate(e,t,n){e[ln]=Rr(n)},updated(e,{value:t}){_i(e,t)}};function _i(e,t){const n=e.multiple;if(!(n&&!G(t)&&!Ir(t))){for(let r=0,o=e.options.length;r-1:s.selected=t.has(i);else if(xr(Ar(s),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Ar(e){return"_value"in e?e._value:e.value}const Zf=["ctrl","shift","alt","meta"],ed={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Zf.some(n=>e[`${n}Key`]&&!t.includes(n))},q_=(e,t)=>e._withMods||(e._withMods=(n,...r)=>{for(let o=0;o{const t=nd().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=rd(r);if(!o)return;const s=t._component;!Q(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,o instanceof SVGElement);return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function rd(e){return Le(e)?document.querySelector(e):e}/*! * vue-router v4.2.5 * (c) 2023 Eduardo San Martin Morote * @license MIT */const Zt=typeof window<"u";function sd(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const ue=Object.assign;function is(e,t){const n={};for(const r in t){const o=t[r];n[r]=ot(o)?o.map(e):e(o)}return n}const xn=()=>{},ot=Array.isArray,od=/\/$/,id=e=>e.replace(od,"");function ls(e,t,n="/"){let r,o={},s="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return l=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),o=e(s)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=ud(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:i}}function ld(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function bi(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function ad(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&dn(t.matched[r],n.matched[o])&&Sa(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function dn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Sa(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!cd(e[n],t[n]))return!1;return!0}function cd(e,t){return ot(e)?Ei(e,t):ot(t)?Ei(t,e):e===t}function Ei(e,t){return ot(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function ud(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,l;for(i=0;i1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i-(i===r.length?1:0)).join("/")}var Kn;(function(e){e.pop="pop",e.push="push"})(Kn||(Kn={}));var Fn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Fn||(Fn={}));function fd(e){if(!e)if(Zt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),id(e)}const dd=/^[^#]+#/;function hd(e,t){return e.replace(dd,"#")+t}function md(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const Br=()=>({left:window.pageXOffset,top:window.pageYOffset});function pd(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=md(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function yi(e,t){return(history.state?history.state.position-t:-1)+e}const As=new Map;function _d(e,t){As.set(e,t)}function gd(e){const t=As.get(e);return As.delete(e),t}let bd=()=>location.protocol+"//"+location.host;function Na(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let l=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(l);return a[0]!=="/"&&(a="/"+a),bi(a,"")}return bi(n,e)+r+o}function Ed(e,t,n,r){let o=[],s=[],i=null;const l=({state:m})=>{const b=Na(e,location),y=n.value,S=t.value;let A=0;if(m){if(n.value=b,t.value=m,i&&i===y){i=null;return}A=S?m.position-S.position:0}else r(b);o.forEach(g=>{g(n.value,y,{delta:A,type:Kn.pop,direction:A?A>0?Fn.forward:Fn.back:Fn.unknown})})};function a(){i=n.value}function f(m){o.push(m);const b=()=>{const y=o.indexOf(m);y>-1&&o.splice(y,1)};return s.push(b),b}function d(){const{history:m}=window;m.state&&m.replaceState(ue({},m.state,{scroll:Br()}),"")}function h(){for(const m of s)m();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",d)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",d,{passive:!0}),{pauseListeners:a,listen:f,destroy:h}}function Oi(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?Br():null}}function yd(e){const{history:t,location:n}=window,r={value:Na(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,f,d){const h=e.indexOf("#"),m=h>-1?(n.host&&document.querySelector("base")?e:e.slice(h))+a:bd()+e+a;try{t[d?"replaceState":"pushState"](f,"",m),o.value=f}catch(b){console.error(b),n[d?"replace":"assign"](m)}}function i(a,f){const d=ue({},t.state,Oi(o.value.back,a,o.value.forward,!0),f,{position:o.value.position});s(a,d,!0),r.value=a}function l(a,f){const d=ue({},o.value,t.state,{forward:a,scroll:Br()});s(d.current,d,!0);const h=ue({},Oi(r.value,a,null),{position:d.position+1},f);s(a,h,!1),r.value=a}return{location:r,state:o,push:l,replace:i}}function J_(e){e=fd(e);const t=yd(e),n=Ed(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=ue({location:"",base:e,go:r,createHref:hd.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Od(e){return typeof e=="string"||e&&typeof e=="object"}function Ra(e){return typeof e=="string"||typeof e=="symbol"}const Nt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Aa=Symbol("");var Ti;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Ti||(Ti={}));function hn(e,t){return ue(new Error,{type:e,[Aa]:!0},t)}function _t(e,t){return e instanceof Error&&Aa in e&&(t==null||!!(e.type&t))}const vi="[^/]+?",Td={sensitive:!1,strict:!1,start:!0,end:!0},vd=/[.+*?^${}()[\]/\\]/g;function Sd(e,t){const n=ue({},Td,t),r=[];let o=n.start?"^":"";const s=[];for(const f of e){const d=f.length?[]:[90];n.strict&&!f.length&&(o+="/");for(let h=0;ht.length?t.length===1&&t[0]===40+40?1:-1:0}function Rd(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Ad={type:0,value:""},Ld=/[a-zA-Z0-9_]/;function Cd(e){if(!e)return[[]];if(e==="/")return[[Ad]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(b){throw new Error(`ERR (${n})/"${f}": ${b}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let l=0,a,f="",d="";function h(){f&&(n===0?s.push({type:0,value:f}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:f,regexp:d,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),f="")}function m(){f+=a}for(;l{i(v)}:xn}function i(d){if(Ra(d)){const h=r.get(d);h&&(r.delete(d),n.splice(n.indexOf(h),1),h.children.forEach(i),h.alias.forEach(i))}else{const h=n.indexOf(d);h>-1&&(n.splice(h,1),d.record.name&&r.delete(d.record.name),d.children.forEach(i),d.alias.forEach(i))}}function l(){return n}function a(d){let h=0;for(;h=0&&(d.record.path!==n[h].record.path||!La(d,n[h]));)h++;n.splice(h,0,d),d.record.name&&!Ri(d)&&r.set(d.record.name,d)}function f(d,h){let m,b={},y,S;if("name"in d&&d.name){if(m=r.get(d.name),!m)throw hn(1,{location:d});S=m.record.name,b=ue(Ni(h.params,m.keys.filter(v=>!v.optional).map(v=>v.name)),d.params&&Ni(d.params,m.keys.map(v=>v.name))),y=m.stringify(b)}else if("path"in d)y=d.path,m=n.find(v=>v.re.test(y)),m&&(b=m.parse(y),S=m.record.name);else{if(m=h.name?r.get(h.name):n.find(v=>v.re.test(h.path)),!m)throw hn(1,{location:d,currentLocation:h});S=m.record.name,b=ue({},h.params,d.params),y=m.stringify(b)}const A=[];let g=m;for(;g;)A.unshift(g.record),g=g.parent;return{name:S,path:y,params:b,matched:A,meta:xd(A)}}return e.forEach(d=>s(d)),{addRoute:s,resolve:f,removeRoute:i,getRoutes:l,getRecordMatcher:o}}function Ni(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function wd(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:kd(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function kd(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function Ri(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function xd(e){return e.reduce((t,n)=>ue(t,n.meta),{})}function Ai(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function La(e,t){return t.children.some(n=>n===e||La(e,n))}const Ca=/#/g,Fd=/&/g,Md=/\//g,Dd=/=/g,Ud=/\?/g,Pa=/\+/g,$d=/%5B/g,jd=/%5D/g,Ia=/%5E/g,Hd=/%60/g,wa=/%7B/g,Wd=/%7C/g,ka=/%7D/g,Bd=/%20/g;function bo(e){return encodeURI(""+e).replace(Wd,"|").replace($d,"[").replace(jd,"]")}function Vd(e){return bo(e).replace(wa,"{").replace(ka,"}").replace(Ia,"^")}function Ls(e){return bo(e).replace(Pa,"%2B").replace(Bd,"+").replace(Ca,"%23").replace(Fd,"%26").replace(Hd,"`").replace(wa,"{").replace(ka,"}").replace(Ia,"^")}function Kd(e){return Ls(e).replace(Dd,"%3D")}function Yd(e){return bo(e).replace(Ca,"%23").replace(Ud,"%3F")}function Gd(e){return e==null?"":Yd(e).replace(Md,"%2F")}function Lr(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function qd(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&Ls(s)):[r&&Ls(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function Xd(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=ot(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const Jd=Symbol(""),Ci=Symbol(""),Eo=Symbol(""),xa=Symbol(""),Cs=Symbol("");function Nn(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function It(e,t,n,r,o){const s=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((i,l)=>{const a=h=>{h===!1?l(hn(4,{from:n,to:t})):h instanceof Error?l(h):Od(h)?l(hn(2,{from:t,to:h})):(s&&r.enterCallbacks[o]===s&&typeof h=="function"&&s.push(h),i())},f=e.call(r&&r.instances[o],t,n,a);let d=Promise.resolve(f);e.length<3&&(d=d.then(a)),d.catch(h=>l(h))})}function as(e,t,n,r){const o=[];for(const s of e)for(const i in s.components){let l=s.components[i];if(!(t!=="beforeRouteEnter"&&!s.instances[i]))if(zd(l)){const f=(l.__vccOpts||l)[t];f&&o.push(It(f,n,r,s,i))}else{let a=l();o.push(()=>a.then(f=>{if(!f)return Promise.reject(new Error(`Couldn't resolve component "${i}" at "${s.path}"`));const d=sd(f)?f.default:f;s.components[i]=d;const m=(d.__vccOpts||d)[t];return m&&It(m,n,r,s,i)()}))}}return o}function zd(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Pi(e){const t=st(Eo),n=st(xa),r=Oe(()=>t.resolve(sn(e.to))),o=Oe(()=>{const{matched:a}=r.value,{length:f}=a,d=a[f-1],h=n.matched;if(!d||!h.length)return-1;const m=h.findIndex(dn.bind(null,d));if(m>-1)return m;const b=Ii(a[f-2]);return f>1&&Ii(d)===b&&h[h.length-1].path!==b?h.findIndex(dn.bind(null,a[f-2])):m}),s=Oe(()=>o.value>-1&&th(n.params,r.value.params)),i=Oe(()=>o.value>-1&&o.value===n.matched.length-1&&Sa(n.params,r.value.params));function l(a={}){return eh(a)?t[sn(e.replace)?"replace":"push"](sn(e.to)).catch(xn):Promise.resolve()}return{route:r,href:Oe(()=>r.value.href),isActive:s,isExactActive:i,navigate:l}}const Qd=Qn({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Pi,setup(e,{slots:t}){const n=zn(Pi(e)),{options:r}=st(Eo),o=Oe(()=>({[wi(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[wi(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:Wr("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),Zd=Qd;function eh(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function th(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!ot(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function Ii(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const wi=(e,t,n)=>e??t??n,nh=Qn({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=st(Cs),o=Oe(()=>e.route||r.value),s=st(Ci,0),i=Oe(()=>{let f=sn(s);const{matched:d}=o.value;let h;for(;(h=d[f])&&!h.components;)f++;return f}),l=Oe(()=>o.value.matched[i.value]);hr(Ci,Oe(()=>i.value+1)),hr(Jd,l),hr(Cs,o);const a=qe();return Ft(()=>[a.value,l.value,e.name],([f,d,h],[m,b,y])=>{d&&(d.instances[h]=f,b&&b!==d&&f&&f===m&&(d.leaveGuards.size||(d.leaveGuards=b.leaveGuards),d.updateGuards.size||(d.updateGuards=b.updateGuards))),f&&d&&(!b||!dn(d,b)||!m)&&(d.enterCallbacks[h]||[]).forEach(S=>S(f))},{flush:"post"}),()=>{const f=o.value,d=e.name,h=l.value,m=h&&h.components[d];if(!m)return ki(n.default,{Component:m,route:f});const b=h.props[d],y=b?b===!0?f.params:typeof b=="function"?b(f):b:null,A=Wr(m,ue({},y,t,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(h.instances[d]=null)},ref:a}));return ki(n.default,{Component:A,route:f})||A}}});function ki(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const rh=nh;function z_(e){const t=Id(e.routes,e),n=e.parseQuery||qd,r=e.stringifyQuery||Li,o=e.history,s=Nn(),i=Nn(),l=Nn(),a=Xl(Nt);let f=Nt;Zt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=is.bind(null,C=>""+C),h=is.bind(null,Gd),m=is.bind(null,Lr);function b(C,j){let U,W;return Ra(C)?(U=t.getRecordMatcher(C),W=j):W=C,t.addRoute(W,U)}function y(C){const j=t.getRecordMatcher(C);j&&t.removeRoute(j)}function S(){return t.getRoutes().map(C=>C.record)}function A(C){return!!t.getRecordMatcher(C)}function g(C,j){if(j=ue({},j||a.value),typeof C=="string"){const u=ls(n,C,j.path),p=t.resolve({path:u.path},j),E=o.createHref(u.fullPath);return ue(u,p,{params:m(p.params),hash:Lr(u.hash),redirectedFrom:void 0,href:E})}let U;if("path"in C)U=ue({},C,{path:ls(n,C.path,j.path).path});else{const u=ue({},C.params);for(const p in u)u[p]==null&&delete u[p];U=ue({},C,{params:h(u)}),j.params=h(j.params)}const W=t.resolve(U,j),Z=C.hash||"";W.params=d(m(W.params));const _=ld(r,ue({},C,{hash:Vd(Z),path:W.path})),c=o.createHref(_);return ue({fullPath:_,hash:Z,query:r===Li?Xd(C.query):C.query||{}},W,{redirectedFrom:void 0,href:c})}function v(C){return typeof C=="string"?ls(n,C,a.value.path):ue({},C)}function L(C,j){if(f!==C)return hn(8,{from:j,to:C})}function T(C){return I(C)}function k(C){return T(ue(v(C),{replace:!0}))}function M(C){const j=C.matched[C.matched.length-1];if(j&&j.redirect){const{redirect:U}=j;let W=typeof U=="function"?U(C):U;return typeof W=="string"&&(W=W.includes("?")||W.includes("#")?W=v(W):{path:W},W.params={}),ue({query:C.query,hash:C.hash,params:"path"in W?{}:C.params},W)}}function I(C,j){const U=f=g(C),W=a.value,Z=C.state,_=C.force,c=C.replace===!0,u=M(U);if(u)return I(ue(v(u),{state:typeof u=="object"?ue({},Z,u.state):Z,force:_,replace:c}),j||U);const p=U;p.redirectedFrom=j;let E;return!_&&ad(r,W,U)&&(E=hn(16,{to:p,from:W}),xe(W,W,!0,!1)),(E?Promise.resolve(E):te(p,W)).catch(N=>_t(N)?_t(N,2)?N:Me(N):ne(N,p,W)).then(N=>{if(N){if(_t(N,2))return I(ue({replace:c},v(N.to),{state:typeof N.to=="object"?ue({},Z,N.to.state):Z,force:_}),j||p)}else N=ae(p,W,!0,c,Z);return fe(p,W,N),N})}function V(C,j){const U=L(C,j);return U?Promise.reject(U):Promise.resolve()}function K(C){const j=Ke.values().next().value;return j&&typeof j.runWithContext=="function"?j.runWithContext(C):C()}function te(C,j){let U;const[W,Z,_]=sh(C,j);U=as(W.reverse(),"beforeRouteLeave",C,j);for(const u of W)u.leaveGuards.forEach(p=>{U.push(It(p,C,j))});const c=V.bind(null,C,j);return U.push(c),ye(U).then(()=>{U=[];for(const u of s.list())U.push(It(u,C,j));return U.push(c),ye(U)}).then(()=>{U=as(Z,"beforeRouteUpdate",C,j);for(const u of Z)u.updateGuards.forEach(p=>{U.push(It(p,C,j))});return U.push(c),ye(U)}).then(()=>{U=[];for(const u of _)if(u.beforeEnter)if(ot(u.beforeEnter))for(const p of u.beforeEnter)U.push(It(p,C,j));else U.push(It(u.beforeEnter,C,j));return U.push(c),ye(U)}).then(()=>(C.matched.forEach(u=>u.enterCallbacks={}),U=as(_,"beforeRouteEnter",C,j),U.push(c),ye(U))).then(()=>{U=[];for(const u of i.list())U.push(It(u,C,j));return U.push(c),ye(U)}).catch(u=>_t(u,8)?u:Promise.reject(u))}function fe(C,j,U){l.list().forEach(W=>K(()=>W(C,j,U)))}function ae(C,j,U,W,Z){const _=L(C,j);if(_)return _;const c=j===Nt,u=Zt?history.state:{};U&&(W||c?o.replace(C.fullPath,ue({scroll:c&&u&&u.scroll},Z)):o.push(C.fullPath,Z)),a.value=C,xe(C,j,U,c),Me()}let me;function je(){me||(me=o.listen((C,j,U)=>{if(!pt.listening)return;const W=g(C),Z=M(W);if(Z){I(ue(Z,{replace:!0}),W).catch(xn);return}f=W;const _=a.value;Zt&&_d(yi(_.fullPath,U.delta),Br()),te(W,_).catch(c=>_t(c,12)?c:_t(c,2)?(I(c.to,W).then(u=>{_t(u,20)&&!U.delta&&U.type===Kn.pop&&o.go(-1,!1)}).catch(xn),Promise.reject()):(U.delta&&o.go(-U.delta,!1),ne(c,W,_))).then(c=>{c=c||ae(W,_,!1),c&&(U.delta&&!_t(c,8)?o.go(-U.delta,!1):U.type===Kn.pop&&_t(c,20)&&o.go(-1,!1)),fe(W,_,c)}).catch(xn)}))}let Ce=Nn(),z=Nn(),se;function ne(C,j,U){Me(C);const W=z.list();return W.length?W.forEach(Z=>Z(C,j,U)):console.error(C),Promise.reject(C)}function Ee(){return se&&a.value!==Nt?Promise.resolve():new Promise((C,j)=>{Ce.add([C,j])})}function Me(C){return se||(se=!C,je(),Ce.list().forEach(([j,U])=>C?U(C):j()),Ce.reset()),C}function xe(C,j,U,W){const{scrollBehavior:Z}=e;if(!Zt||!Z)return Promise.resolve();const _=!U&&gd(yi(C.fullPath,0))||(W||!U)&&history.state&&history.state.scroll||null;return co().then(()=>Z(C,j,_)).then(c=>c&&pd(c)).catch(c=>ne(c,C,j))}const ve=C=>o.go(C);let Xe;const Ke=new Set,pt={currentRoute:a,listening:!0,addRoute:b,removeRoute:y,hasRoute:A,getRoutes:S,resolve:g,options:e,push:T,replace:k,go:ve,back:()=>ve(-1),forward:()=>ve(1),beforeEach:s.add,beforeResolve:i.add,afterEach:l.add,onError:z.add,isReady:Ee,install(C){const j=this;C.component("RouterLink",Zd),C.component("RouterView",rh),C.config.globalProperties.$router=j,Object.defineProperty(C.config.globalProperties,"$route",{enumerable:!0,get:()=>sn(a)}),Zt&&!Xe&&a.value===Nt&&(Xe=!0,T(o.location).catch(Z=>{}));const U={};for(const Z in Nt)Object.defineProperty(U,Z,{get:()=>a.value[Z],enumerable:!0});C.provide(Eo,j),C.provide(xa,Vl(U)),C.provide(Cs,a);const W=C.unmount;Ke.add(C),C.unmount=function(){Ke.delete(C),Ke.size<1&&(f=Nt,me&&me(),me=null,a.value=Nt,Xe=!1,se=!1),W()}}};function ye(C){return C.reduce((j,U)=>j.then(()=>K(U)),Promise.resolve())}return pt}function sh(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;idn(f,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(f=>dn(f,a))||o.push(a))}return[n,r,o]}var oh=!1;/*! * pinia v2.1.7 * (c) 2023 Eduardo San Martin Morote * @license MIT */let Fa;const Vr=e=>Fa=e,Ma=Symbol();function Ps(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Mn;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Mn||(Mn={}));function Q_(){const e=to(!0),t=e.run(()=>qe({}));let n=[],r=[];const o=Mr({install(s){Vr(o),o._a=s,s.provide(Ma,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!oh?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const Da=()=>{};function xi(e,t,n,r=Da){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&kl()&&qc(o),o}function Qt(e,...t){e.slice().forEach(n=>{n(...t)})}const ih=e=>e();function Is(e,t){e instanceof Map&&t instanceof Map&&t.forEach((n,r)=>e.set(r,n)),e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],o=e[n];Ps(o)&&Ps(r)&&e.hasOwnProperty(n)&&!Te(r)&&!kt(r)?e[n]=Is(o,r):e[n]=r}return e}const lh=Symbol();function ah(e){return!Ps(e)||!e.hasOwnProperty(lh)}const{assign:Ct}=Object;function ch(e){return!!(Te(e)&&e.effect)}function uh(e,t,n,r){const{state:o,actions:s,getters:i}=t,l=n.state.value[e];let a;function f(){l||(n.state.value[e]=o?o():{});const d=bu(n.state.value[e]);return Ct(d,s,Object.keys(i||{}).reduce((h,m)=>(h[m]=Mr(Oe(()=>{Vr(n);const b=n._s.get(e);return i[m].call(b,b)})),h),{}))}return a=Ua(e,f,t,n,r,!0),a}function Ua(e,t,n={},r,o,s){let i;const l=Ct({actions:{}},n),a={deep:!0};let f,d,h=[],m=[],b;const y=r.state.value[e];!s&&!y&&(r.state.value[e]={}),qe({});let S;function A(V){let K;f=d=!1,typeof V=="function"?(V(r.state.value[e]),K={type:Mn.patchFunction,storeId:e,events:b}):(Is(r.state.value[e],V),K={type:Mn.patchObject,payload:V,storeId:e,events:b});const te=S=Symbol();co().then(()=>{S===te&&(f=!0)}),d=!0,Qt(h,K,r.state.value[e])}const g=s?function(){const{state:K}=n,te=K?K():{};this.$patch(fe=>{Ct(fe,te)})}:Da;function v(){i.stop(),h=[],m=[],r._s.delete(e)}function L(V,K){return function(){Vr(r);const te=Array.from(arguments),fe=[],ae=[];function me(z){fe.push(z)}function je(z){ae.push(z)}Qt(m,{args:te,name:V,store:k,after:me,onError:je});let Ce;try{Ce=K.apply(this&&this.$id===e?this:k,te)}catch(z){throw Qt(ae,z),z}return Ce instanceof Promise?Ce.then(z=>(Qt(fe,z),z)).catch(z=>(Qt(ae,z),Promise.reject(z))):(Qt(fe,Ce),Ce)}}const T={_p:r,$id:e,$onAction:xi.bind(null,m),$patch:A,$reset:g,$subscribe(V,K={}){const te=xi(h,V,K.detached,()=>fe()),fe=i.run(()=>Ft(()=>r.state.value[e],ae=>{(K.flush==="sync"?d:f)&&V({storeId:e,type:Mn.direct,events:b},ae)},Ct({},a,K)));return te},$dispose:v},k=zn(T);r._s.set(e,k);const I=(r._a&&r._a.runWithContext||ih)(()=>r._e.run(()=>(i=to()).run(t)));for(const V in I){const K=I[V];if(Te(K)&&!ch(K)||kt(K))s||(y&&ah(K)&&(Te(K)?K.value=y[V]:Is(K,y[V])),r.state.value[e][V]=K);else if(typeof K=="function"){const te=L(V,K);I[V]=te,l.actions[V]=K}}return Ct(k,I),Ct(le(k),I),Object.defineProperty(k,"$state",{get:()=>r.state.value[e],set:V=>{A(K=>{Ct(K,V)})}}),r._p.forEach(V=>{Ct(k,i.run(()=>V({store:k,app:r._a,pinia:r,options:l})))}),y&&s&&n.hydrate&&n.hydrate(k.$state,y),f=!0,d=!0,k}function Z_(e,t,n){let r,o;const s=typeof t=="function";typeof e=="string"?(r=e,o=s?n:t):(o=e,r=e.id);function i(l,a){const f=rf();return l=l||(f?st(Ma,null):null),l&&Vr(l),l=Fa,l._s.has(r)||(s?Ua(r,t,o,l):uh(r,o,l)),l._s.get(r)}return i.$id=r,i}const fh=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},dh={},hh={class:"container"},mh=po("h1",null,"Oooops... not found. This is a 404",-1),ph=[mh];function _h(e,t){return Ea(),_f("div",hh,ph)}const eg=fh(dh,[["render",_h]]);function $a(e,t){return function(){return e.apply(t,arguments)}}const{toString:gh}=Object.prototype,{getPrototypeOf:yo}=Object,Kr=(e=>t=>{const n=gh.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),mt=e=>(e=e.toLowerCase(),t=>Kr(t)===e),Yr=e=>t=>typeof t===e,{isArray:On}=Array,Yn=Yr("undefined");function bh(e){return e!==null&&!Yn(e)&&e.constructor!==null&&!Yn(e.constructor)&&ze(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const ja=mt("ArrayBuffer");function Eh(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&ja(e.buffer),t}const yh=Yr("string"),ze=Yr("function"),Ha=Yr("number"),Gr=e=>e!==null&&typeof e=="object",Oh=e=>e===!0||e===!1,_r=e=>{if(Kr(e)!=="object")return!1;const t=yo(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},Th=mt("Date"),vh=mt("File"),Sh=mt("Blob"),Nh=mt("FileList"),Rh=e=>Gr(e)&&ze(e.pipe),Ah=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||ze(e.append)&&((t=Kr(e))==="formdata"||t==="object"&&ze(e.toString)&&e.toString()==="[object FormData]"))},Lh=mt("URLSearchParams"),Ch=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function er(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),On(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const Ba=(()=>typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global)(),Va=e=>!Yn(e)&&e!==Ba;function ws(){const{caseless:e}=Va(this)&&this||{},t={},n=(r,o)=>{const s=e&&Wa(t,o)||o;_r(t[s])&&_r(r)?t[s]=ws(t[s],r):_r(r)?t[s]=ws({},r):On(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(er(t,(o,s)=>{n&&ze(o)?e[s]=$a(o,n):e[s]=o},{allOwnKeys:r}),e),Ih=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),wh=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},kh=(e,t,n,r)=>{let o,s,i;const l={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),s=o.length;s-- >0;)i=o[s],(!r||r(i,e,t))&&!l[i]&&(t[i]=e[i],l[i]=!0);e=n!==!1&&yo(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},xh=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},Fh=e=>{if(!e)return null;if(On(e))return e;let t=e.length;if(!Ha(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Mh=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&yo(Uint8Array)),Dh=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let o;for(;(o=r.next())&&!o.done;){const s=o.value;t.call(e,s[0],s[1])}},Uh=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},$h=mt("HTMLFormElement"),jh=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),Fi=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Hh=mt("RegExp"),Ka=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};er(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},Wh=e=>{Ka(e,(t,n)=>{if(ze(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(ze(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},Bh=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return On(e)?r(e):r(String(e).split(t)),n},Vh=()=>{},Kh=(e,t)=>(e=+e,Number.isFinite(e)?e:t),cs="abcdefghijklmnopqrstuvwxyz",Mi="0123456789",Ya={DIGIT:Mi,ALPHA:cs,ALPHA_DIGIT:cs+cs.toUpperCase()+Mi},Yh=(e=16,t=Ya.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function Gh(e){return!!(e&&ze(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const qh=e=>{const t=new Array(10),n=(r,o)=>{if(Gr(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=On(r)?[]:{};return er(r,(i,l)=>{const a=n(i,o+1);!Yn(a)&&(s[l]=a)}),t[o]=void 0,s}}return r};return n(e,0)},Xh=mt("AsyncFunction"),Jh=e=>e&&(Gr(e)||ze(e))&&ze(e.then)&&ze(e.catch),P={isArray:On,isArrayBuffer:ja,isBuffer:bh,isFormData:Ah,isArrayBufferView:Eh,isString:yh,isNumber:Ha,isBoolean:Oh,isObject:Gr,isPlainObject:_r,isUndefined:Yn,isDate:Th,isFile:vh,isBlob:Sh,isRegExp:Hh,isFunction:ze,isStream:Rh,isURLSearchParams:Lh,isTypedArray:Mh,isFileList:Nh,forEach:er,merge:ws,extend:Ph,trim:Ch,stripBOM:Ih,inherits:wh,toFlatObject:kh,kindOf:Kr,kindOfTest:mt,endsWith:xh,toArray:Fh,forEachEntry:Dh,matchAll:Uh,isHTMLForm:$h,hasOwnProperty:Fi,hasOwnProp:Fi,reduceDescriptors:Ka,freezeMethods:Wh,toObjectSet:Bh,toCamelCase:jh,noop:Vh,toFiniteNumber:Kh,findKey:Wa,global:Ba,isContextDefined:Va,ALPHABET:Ya,generateString:Yh,isSpecCompliantForm:Gh,toJSONObject:qh,isAsyncFn:Xh,isThenable:Jh};function oe(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}P.inherits(oe,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:P.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Ga=oe.prototype,qa={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{qa[e]={value:e}});Object.defineProperties(oe,qa);Object.defineProperty(Ga,"isAxiosError",{value:!0});oe.from=(e,t,n,r,o,s)=>{const i=Object.create(Ga);return P.toFlatObject(e,i,function(a){return a!==Error.prototype},l=>l!=="isAxiosError"),oe.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const zh=null;function ks(e){return P.isPlainObject(e)||P.isArray(e)}function Xa(e){return P.endsWith(e,"[]")?e.slice(0,-2):e}function Di(e,t,n){return e?e.concat(t).map(function(o,s){return o=Xa(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function Qh(e){return P.isArray(e)&&!e.some(ks)}const Zh=P.toFlatObject(P,{},null,function(t){return/^is[A-Z]/.test(t)});function qr(e,t,n){if(!P.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=P.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(S,A){return!P.isUndefined(A[S])});const r=n.metaTokens,o=n.visitor||d,s=n.dots,i=n.indexes,a=(n.Blob||typeof Blob<"u"&&Blob)&&P.isSpecCompliantForm(t);if(!P.isFunction(o))throw new TypeError("visitor must be a function");function f(y){if(y===null)return"";if(P.isDate(y))return y.toISOString();if(!a&&P.isBlob(y))throw new oe("Blob is not supported. Use a Buffer instead.");return P.isArrayBuffer(y)||P.isTypedArray(y)?a&&typeof Blob=="function"?new Blob([y]):Buffer.from(y):y}function d(y,S,A){let g=y;if(y&&!A&&typeof y=="object"){if(P.endsWith(S,"{}"))S=r?S:S.slice(0,-2),y=JSON.stringify(y);else if(P.isArray(y)&&Qh(y)||(P.isFileList(y)||P.endsWith(S,"[]"))&&(g=P.toArray(y)))return S=Xa(S),g.forEach(function(L,T){!(P.isUndefined(L)||L===null)&&t.append(i===!0?Di([S],T,s):i===null?S:S+"[]",f(L))}),!1}return ks(y)?!0:(t.append(Di(A,S,s),f(y)),!1)}const h=[],m=Object.assign(Zh,{defaultVisitor:d,convertValue:f,isVisitable:ks});function b(y,S){if(!P.isUndefined(y)){if(h.indexOf(y)!==-1)throw Error("Circular reference detected in "+S.join("."));h.push(y),P.forEach(y,function(g,v){(!(P.isUndefined(g)||g===null)&&o.call(t,g,P.isString(v)?v.trim():v,S,m))===!0&&b(g,S?S.concat(v):[v])}),h.pop()}}if(!P.isObject(e))throw new TypeError("data must be an object");return b(e),t}function Ui(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Oo(e,t){this._pairs=[],e&&qr(e,this,t)}const Ja=Oo.prototype;Ja.append=function(t,n){this._pairs.push([t,n])};Ja.toString=function(t){const n=t?function(r){return t.call(this,r,Ui)}:Ui;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function em(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function za(e,t,n){if(!t)return e;const r=n&&n.encode||em,o=n&&n.serialize;let s;if(o?s=o(t,n):s=P.isURLSearchParams(t)?t.toString():new Oo(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class tm{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){P.forEach(this.handlers,function(r){r!==null&&t(r)})}}const $i=tm,Qa={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},nm=typeof URLSearchParams<"u"?URLSearchParams:Oo,rm=typeof FormData<"u"?FormData:null,sm=typeof Blob<"u"?Blob:null,om={isBrowser:!0,classes:{URLSearchParams:nm,FormData:rm,Blob:sm},protocols:["http","https","file","blob","url","data"]},Za=typeof window<"u"&&typeof document<"u",im=(e=>Za&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),lm=(()=>typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function")(),am=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Za,hasStandardBrowserEnv:im,hasStandardBrowserWebWorkerEnv:lm},Symbol.toStringTag,{value:"Module"})),ft={...am,...om};function cm(e,t){return qr(e,new ft.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return ft.isNode&&P.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function um(e){return P.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function fm(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&P.isArray(o)?o.length:i,a?(P.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!l):((!o[i]||!P.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&P.isArray(o[i])&&(o[i]=fm(o[i])),!l)}if(P.isFormData(e)&&P.isFunction(e.entries)){const n={};return P.forEachEntry(e,(r,o)=>{t(um(r),o,n,0)}),n}return null}function dm(e,t,n){if(P.isString(e))try{return(t||JSON.parse)(e),P.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const To={transitional:Qa,adapter:["xhr","http"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=P.isObject(t);if(s&&P.isHTMLForm(t)&&(t=new FormData(t)),P.isFormData(t))return o&&o?JSON.stringify(ec(t)):t;if(P.isArrayBuffer(t)||P.isBuffer(t)||P.isStream(t)||P.isFile(t)||P.isBlob(t))return t;if(P.isArrayBufferView(t))return t.buffer;if(P.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let l;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return cm(t,this.formSerializer).toString();if((l=P.isFileList(t))||r.indexOf("multipart/form-data")>-1){const a=this.env&&this.env.FormData;return qr(l?{"files[]":t}:t,a&&new a,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),dm(t)):t}],transformResponse:[function(t){const n=this.transitional||To.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(t&&P.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(l){if(i)throw l.name==="SyntaxError"?oe.from(l,oe.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ft.classes.FormData,Blob:ft.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};P.forEach(["delete","get","head","post","put","patch"],e=>{To.headers[e]={}});const vo=To,hm=P.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),mm=e=>{const t={};let n,r,o;return e&&e.split(` `).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),r=i.substring(o+1).trim(),!(!n||t[n]&&hm[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},ji=Symbol("internals");function Rn(e){return e&&String(e).trim().toLowerCase()}function gr(e){return e===!1||e==null?e:P.isArray(e)?e.map(gr):String(e)}function pm(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const _m=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function us(e,t,n,r,o){if(P.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!P.isString(t)){if(P.isString(r))return t.indexOf(r)!==-1;if(P.isRegExp(r))return r.test(t)}}function gm(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function bm(e,t){const n=P.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(o,s,i){return this[r].call(this,t,o,s,i)},configurable:!0})})}class Xr{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(l,a,f){const d=Rn(a);if(!d)throw new Error("header name must be a non-empty string");const h=P.findKey(o,d);(!h||o[h]===void 0||f===!0||f===void 0&&o[h]!==!1)&&(o[h||a]=gr(l))}const i=(l,a)=>P.forEach(l,(f,d)=>s(f,d,a));return P.isPlainObject(t)||t instanceof this.constructor?i(t,n):P.isString(t)&&(t=t.trim())&&!_m(t)?i(mm(t),n):t!=null&&s(n,t,r),this}get(t,n){if(t=Rn(t),t){const r=P.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return pm(o);if(P.isFunction(n))return n.call(this,o,r);if(P.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Rn(t),t){const r=P.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||us(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(i){if(i=Rn(i),i){const l=P.findKey(r,i);l&&(!n||us(r,r[l],l,n))&&(delete r[l],o=!0)}}return P.isArray(t)?t.forEach(s):s(t),o}clear(t){const n=Object.keys(this);let r=n.length,o=!1;for(;r--;){const s=n[r];(!t||us(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return P.forEach(this,(o,s)=>{const i=P.findKey(r,s);if(i){n[i]=gr(o),delete n[s];return}const l=t?gm(s):String(s).trim();l!==s&&delete n[s],n[l]=gr(o),r[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return P.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&P.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` `)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(o=>r.set(o)),r}static accessor(t){const r=(this[ji]=this[ji]={accessors:{}}).accessors,o=this.prototype;function s(i){const l=Rn(i);r[l]||(bm(o,i),r[l]=!0)}return P.isArray(t)?t.forEach(s):s(t),this}}Xr.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);P.reduceDescriptors(Xr.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});P.freezeMethods(Xr);const Ot=Xr;function fs(e,t){const n=this||vo,r=t||n,o=Ot.from(r.headers);let s=r.data;return P.forEach(e,function(l){s=l.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function tc(e){return!!(e&&e.__CANCEL__)}function tr(e,t,n){oe.call(this,e??"canceled",oe.ERR_CANCELED,t,n),this.name="CanceledError"}P.inherits(tr,oe,{__CANCEL__:!0});function Em(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new oe("Request failed with status code "+n.status,[oe.ERR_BAD_REQUEST,oe.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}const ym=ft.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];P.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),P.isString(r)&&i.push("path="+r),P.isString(o)&&i.push("domain="+o),s===!0&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function Om(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Tm(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}function nc(e,t){return e&&!Om(t)?Tm(e,t):t}const vm=ft.hasStandardBrowserEnv?function(){const t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");let r;function o(s){let i=s;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)==="/"?n.pathname:"/"+n.pathname}}return r=o(window.location.href),function(i){const l=P.isString(i)?o(i):i;return l.protocol===r.protocol&&l.host===r.host}}():function(){return function(){return!0}}();function Sm(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Nm(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o=0,s=0,i;return t=t!==void 0?t:1e3,function(a){const f=Date.now(),d=r[s];i||(i=f),n[o]=a,r[o]=f;let h=s,m=0;for(;h!==o;)m+=n[h++],h=h%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),f-i{const s=o.loaded,i=o.lengthComputable?o.total:void 0,l=s-n,a=r(l),f=s<=i;n=s;const d={loaded:s,total:i,progress:i?s/i:void 0,bytes:l,rate:a||void 0,estimated:a&&i&&f?(i-s)/a:void 0,event:o};d[t?"download":"upload"]=!0,e(d)}}const Rm=typeof XMLHttpRequest<"u",Am=Rm&&function(e){return new Promise(function(n,r){let o=e.data;const s=Ot.from(e.headers).normalize();let{responseType:i,withXSRFToken:l}=e,a;function f(){e.cancelToken&&e.cancelToken.unsubscribe(a),e.signal&&e.signal.removeEventListener("abort",a)}let d;if(P.isFormData(o)){if(ft.hasStandardBrowserEnv||ft.hasStandardBrowserWebWorkerEnv)s.setContentType(!1);else if((d=s.getContentType())!==!1){const[S,...A]=d?d.split(";").map(g=>g.trim()).filter(Boolean):[];s.setContentType([S||"multipart/form-data",...A].join("; "))}}let h=new XMLHttpRequest;if(e.auth){const S=e.auth.username||"",A=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";s.set("Authorization","Basic "+btoa(S+":"+A))}const m=nc(e.baseURL,e.url);h.open(e.method.toUpperCase(),za(m,e.params,e.paramsSerializer),!0),h.timeout=e.timeout;function b(){if(!h)return;const S=Ot.from("getAllResponseHeaders"in h&&h.getAllResponseHeaders()),g={data:!i||i==="text"||i==="json"?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:S,config:e,request:h};Em(function(L){n(L),f()},function(L){r(L),f()},g),h=null}if("onloadend"in h?h.onloadend=b:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf("file:")===0)||setTimeout(b)},h.onabort=function(){h&&(r(new oe("Request aborted",oe.ECONNABORTED,e,h)),h=null)},h.onerror=function(){r(new oe("Network Error",oe.ERR_NETWORK,e,h)),h=null},h.ontimeout=function(){let A=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const g=e.transitional||Qa;e.timeoutErrorMessage&&(A=e.timeoutErrorMessage),r(new oe(A,g.clarifyTimeoutError?oe.ETIMEDOUT:oe.ECONNABORTED,e,h)),h=null},ft.hasStandardBrowserEnv&&(l&&P.isFunction(l)&&(l=l(e)),l||l!==!1&&vm(m))){const S=e.xsrfHeaderName&&e.xsrfCookieName&&ym.read(e.xsrfCookieName);S&&s.set(e.xsrfHeaderName,S)}o===void 0&&s.setContentType(null),"setRequestHeader"in h&&P.forEach(s.toJSON(),function(A,g){h.setRequestHeader(g,A)}),P.isUndefined(e.withCredentials)||(h.withCredentials=!!e.withCredentials),i&&i!=="json"&&(h.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&h.addEventListener("progress",Hi(e.onDownloadProgress,!0)),typeof e.onUploadProgress=="function"&&h.upload&&h.upload.addEventListener("progress",Hi(e.onUploadProgress)),(e.cancelToken||e.signal)&&(a=S=>{h&&(r(!S||S.type?new tr(null,e,h):S),h.abort(),h=null)},e.cancelToken&&e.cancelToken.subscribe(a),e.signal&&(e.signal.aborted?a():e.signal.addEventListener("abort",a)));const y=Sm(m);if(y&&ft.protocols.indexOf(y)===-1){r(new oe("Unsupported protocol "+y+":",oe.ERR_BAD_REQUEST,e));return}h.send(o||null)})},xs={http:zh,xhr:Am};P.forEach(xs,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Wi=e=>`- ${e}`,Lm=e=>P.isFunction(e)||e===null||e===!1,rc={getAdapter:e=>{e=P.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${l} `+(a===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : `+s.map(Wi).join(` `):" "+Wi(s[0]):"as no adapter specified";throw new oe("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:xs};function ds(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new tr(null,e)}function Bi(e){return ds(e),e.headers=Ot.from(e.headers),e.data=fs.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),rc.getAdapter(e.adapter||vo.adapter)(e).then(function(r){return ds(e),r.data=fs.call(e,e.transformResponse,r),r.headers=Ot.from(r.headers),r},function(r){return tc(r)||(ds(e),r&&r.response&&(r.response.data=fs.call(e,e.transformResponse,r.response),r.response.headers=Ot.from(r.response.headers))),Promise.reject(r)})}const Vi=e=>e instanceof Ot?e.toJSON():e;function mn(e,t){t=t||{};const n={};function r(f,d,h){return P.isPlainObject(f)&&P.isPlainObject(d)?P.merge.call({caseless:h},f,d):P.isPlainObject(d)?P.merge({},d):P.isArray(d)?d.slice():d}function o(f,d,h){if(P.isUndefined(d)){if(!P.isUndefined(f))return r(void 0,f,h)}else return r(f,d,h)}function s(f,d){if(!P.isUndefined(d))return r(void 0,d)}function i(f,d){if(P.isUndefined(d)){if(!P.isUndefined(f))return r(void 0,f)}else return r(void 0,d)}function l(f,d,h){if(h in t)return r(f,d);if(h in e)return r(void 0,f)}const a={url:s,method:s,data:s,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:l,headers:(f,d)=>o(Vi(f),Vi(d),!0)};return P.forEach(Object.keys(Object.assign({},e,t)),function(d){const h=a[d]||o,m=h(e[d],t[d],d);P.isUndefined(m)&&h!==l||(n[d]=m)}),n}const sc="1.6.2",So={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{So[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const Ki={};So.transitional=function(t,n,r){function o(s,i){return"[Axios v"+sc+"] Transitional option '"+s+"'"+i+(r?". "+r:"")}return(s,i,l)=>{if(t===!1)throw new oe(o(i," has been removed"+(n?" in "+n:"")),oe.ERR_DEPRECATED);return n&&!Ki[i]&&(Ki[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,i,l):!0}};function Cm(e,t,n){if(typeof e!="object")throw new oe("options must be an object",oe.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const s=r[o],i=t[s];if(i){const l=e[s],a=l===void 0||i(l,s,e);if(a!==!0)throw new oe("option "+s+" must be "+a,oe.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new oe("Unknown option "+s,oe.ERR_BAD_OPTION)}}const Fs={assertOptions:Cm,validators:So},Rt=Fs.validators;let Cr=class{constructor(t){this.defaults=t,this.interceptors={request:new $i,response:new $i}}request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=mn(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&Fs.assertOptions(r,{silentJSONParsing:Rt.transitional(Rt.boolean),forcedJSONParsing:Rt.transitional(Rt.boolean),clarifyTimeoutError:Rt.transitional(Rt.boolean)},!1),o!=null&&(P.isFunction(o)?n.paramsSerializer={serialize:o}:Fs.assertOptions(o,{encode:Rt.function,serialize:Rt.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=s&&P.merge(s.common,s[n.method]);s&&P.forEach(["delete","get","head","post","put","patch","common"],y=>{delete s[y]}),n.headers=Ot.concat(i,s);const l=[];let a=!0;this.interceptors.request.forEach(function(S){typeof S.runWhen=="function"&&S.runWhen(n)===!1||(a=a&&S.synchronous,l.unshift(S.fulfilled,S.rejected))});const f=[];this.interceptors.response.forEach(function(S){f.push(S.fulfilled,S.rejected)});let d,h=0,m;if(!a){const y=[Bi.bind(this),void 0];for(y.unshift.apply(y,l),y.push.apply(y,f),m=y.length,d=Promise.resolve(n);h{if(!r._listeners)return;let s=r._listeners.length;for(;s-- >0;)r._listeners[s](o);r._listeners=null}),this.promise.then=o=>{let s;const i=new Promise(l=>{r.subscribe(l),s=l}).then(o);return i.cancel=function(){r.unsubscribe(s)},i},t(function(s,i,l){r.reason||(r.reason=new tr(s,i,l),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}static source(){let t;return{token:new No(function(o){t=o}),cancel:t}}}const Pm=No;function Im(e){return function(n){return e.apply(null,n)}}function wm(e){return P.isObject(e)&&e.isAxiosError===!0}const Ms={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Ms).forEach(([e,t])=>{Ms[t]=e});const km=Ms;function oc(e){const t=new br(e),n=$a(br.prototype.request,t);return P.extend(n,br.prototype,t,{allOwnKeys:!0}),P.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return oc(mn(e,o))},n}const Se=oc(vo);Se.Axios=br;Se.CanceledError=tr;Se.CancelToken=Pm;Se.isCancel=tc;Se.VERSION=sc;Se.toFormData=qr;Se.AxiosError=oe;Se.Cancel=Se.CanceledError;Se.all=function(t){return Promise.all(t)};Se.spread=Im;Se.isAxiosError=wm;Se.mergeConfig=mn;Se.AxiosHeaders=Ot;Se.formToJSON=e=>ec(P.isHTMLForm(e)?new FormData(e):e);Se.getAdapter=rc.getAdapter;Se.HttpStatusCode=km;Se.default=Se;const ng=Se;var Er={logger:self.console,WebSocket:self.WebSocket},be={log(...e){this.enabled&&(e.push(Date.now()),Er.logger.log("[ActionCable]",...e))}};const In=()=>new Date().getTime(),ar=e=>(In()-e)/1e3;class Ro{constructor(t){this.visibilityDidChange=this.visibilityDidChange.bind(this),this.connection=t,this.reconnectAttempts=0}start(){this.isRunning()||(this.startedAt=In(),delete this.stoppedAt,this.startPolling(),addEventListener("visibilitychange",this.visibilityDidChange),be.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`))}stop(){this.isRunning()&&(this.stoppedAt=In(),this.stopPolling(),removeEventListener("visibilitychange",this.visibilityDidChange),be.log("ConnectionMonitor stopped"))}isRunning(){return this.startedAt&&!this.stoppedAt}recordPing(){this.pingedAt=In()}recordConnect(){this.reconnectAttempts=0,this.recordPing(),delete this.disconnectedAt,be.log("ConnectionMonitor recorded connect")}recordDisconnect(){this.disconnectedAt=In(),be.log("ConnectionMonitor recorded disconnect")}startPolling(){this.stopPolling(),this.poll()}stopPolling(){clearTimeout(this.pollTimeout)}poll(){this.pollTimeout=setTimeout(()=>{this.reconnectIfStale(),this.poll()},this.getPollInterval())}getPollInterval(){const{staleThreshold:t,reconnectionBackoffRate:n}=this.constructor,r=Math.pow(1+n,Math.min(this.reconnectAttempts,10)),s=(this.reconnectAttempts===0?1:n)*Math.random();return t*1e3*r*(1+s)}reconnectIfStale(){this.connectionIsStale()&&(be.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${ar(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`),this.reconnectAttempts++,this.disconnectedRecently()?be.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${ar(this.disconnectedAt)} s`):(be.log("ConnectionMonitor reopening"),this.connection.reopen()))}get refreshedAt(){return this.pingedAt?this.pingedAt:this.startedAt}connectionIsStale(){return ar(this.refreshedAt)>this.constructor.staleThreshold}disconnectedRecently(){return this.disconnectedAt&&ar(this.disconnectedAt){(this.connectionIsStale()||!this.connection.isOpen())&&(be.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`),this.connection.reopen())},200)}}Ro.staleThreshold=6;Ro.reconnectionBackoffRate=.15;var ic={message_types:{welcome:"welcome",disconnect:"disconnect",ping:"ping",confirmation:"confirm_subscription",rejection:"reject_subscription"},disconnect_reasons:{unauthorized:"unauthorized",invalid_request:"invalid_request",server_restart:"server_restart",remote:"remote"},default_mount_path:"/cable",protocols:["actioncable-v1-json","actioncable-unsupported"]};const{message_types:An,protocols:Ds}=ic,xm=Ds.slice(0,Ds.length-1),Yi=[].indexOf;class Ao{constructor(t){this.open=this.open.bind(this),this.consumer=t,this.subscriptions=this.consumer.subscriptions,this.monitor=new Ro(this),this.disconnected=!0}send(t){return this.isOpen()?(this.webSocket.send(JSON.stringify(t)),!0):!1}open(){if(this.isActive())return be.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`),!1;{const t=[...Ds,...this.consumer.subprotocols||[]];return be.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${t}`),this.webSocket&&this.uninstallEventHandlers(),this.webSocket=new Er.WebSocket(this.consumer.url,t),this.installEventHandlers(),this.monitor.start(),!0}}close({allowReconnect:t}={allowReconnect:!0}){if(t||this.monitor.stop(),this.isOpen())return this.webSocket.close()}reopen(){if(be.log(`Reopening WebSocket, current state is ${this.getState()}`),this.isActive())try{return this.close()}catch(t){be.log("Failed to reopen WebSocket",t)}finally{be.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`),setTimeout(this.open,this.constructor.reopenDelay)}else return this.open()}getProtocol(){if(this.webSocket)return this.webSocket.protocol}isOpen(){return this.isState("open")}isActive(){return this.isState("open","connecting")}triedToReconnect(){return this.monitor.reconnectAttempts>0}isProtocolSupported(){return Yi.call(xm,this.getProtocol())>=0}isState(...t){return Yi.call(t,this.getState())>=0}getState(){if(this.webSocket){for(let t in Er.WebSocket)if(Er.WebSocket[t]===this.webSocket.readyState)return t.toLowerCase()}return null}installEventHandlers(){for(let t in this.events){const n=this.events[t].bind(this);this.webSocket[`on${t}`]=n}}uninstallEventHandlers(){for(let t in this.events)this.webSocket[`on${t}`]=function(){}}}Ao.reopenDelay=500;Ao.prototype.events={message(e){if(!this.isProtocolSupported())return;const{identifier:t,message:n,reason:r,reconnect:o,type:s}=JSON.parse(e.data);switch(s){case An.welcome:return this.triedToReconnect()&&(this.reconnectAttempted=!0),this.monitor.recordConnect(),this.subscriptions.reload();case An.disconnect:return be.log(`Disconnecting. Reason: ${r}`),this.close({allowReconnect:o});case An.ping:return this.monitor.recordPing();case An.confirmation:return this.subscriptions.confirmSubscription(t),this.reconnectAttempted?(this.reconnectAttempted=!1,this.subscriptions.notify(t,"connected",{reconnected:!0})):this.subscriptions.notify(t,"connected",{reconnected:!1});case An.rejection:return this.subscriptions.reject(t);default:return this.subscriptions.notify(t,"received",n)}},open(){if(be.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`),this.disconnected=!1,!this.isProtocolSupported())return be.log("Protocol is unsupported. Stopping monitor and disconnecting."),this.close({allowReconnect:!1})},close(e){if(be.log("WebSocket onclose event"),!this.disconnected)return this.disconnected=!0,this.monitor.recordDisconnect(),this.subscriptions.notifyAll("disconnected",{willAttemptReconnect:this.monitor.isRunning()})},error(){be.log("WebSocket onerror event")}};const Fm=function(e,t){if(t!=null)for(let n in t){const r=t[n];e[n]=r}return e};class Mm{constructor(t,n={},r){this.consumer=t,this.identifier=JSON.stringify(n),Fm(this,r)}perform(t,n={}){return n.action=t,this.send(n)}send(t){return this.consumer.send({command:"message",identifier:this.identifier,data:JSON.stringify(t)})}unsubscribe(){return this.consumer.subscriptions.remove(this)}}class Dm{constructor(t){this.subscriptions=t,this.pendingSubscriptions=[]}guarantee(t){this.pendingSubscriptions.indexOf(t)==-1?(be.log(`SubscriptionGuarantor guaranteeing ${t.identifier}`),this.pendingSubscriptions.push(t)):be.log(`SubscriptionGuarantor already guaranteeing ${t.identifier}`),this.startGuaranteeing()}forget(t){be.log(`SubscriptionGuarantor forgetting ${t.identifier}`),this.pendingSubscriptions=this.pendingSubscriptions.filter(n=>n!==t)}startGuaranteeing(){this.stopGuaranteeing(),this.retrySubscribing()}stopGuaranteeing(){clearTimeout(this.retryTimeout)}retrySubscribing(){this.retryTimeout=setTimeout(()=>{this.subscriptions&&typeof this.subscriptions.subscribe=="function"&&this.pendingSubscriptions.map(t=>{be.log(`SubscriptionGuarantor resubscribing ${t.identifier}`),this.subscriptions.subscribe(t)})},500)}}class Um{constructor(t){this.consumer=t,this.guarantor=new Dm(this),this.subscriptions=[]}create(t,n){const r=t,o=typeof r=="object"?r:{channel:r},s=new Mm(this.consumer,o,n);return this.add(s)}add(t){return this.subscriptions.push(t),this.consumer.ensureActiveConnection(),this.notify(t,"initialized"),this.subscribe(t),t}remove(t){return this.forget(t),this.findAll(t.identifier).length||this.sendCommand(t,"unsubscribe"),t}reject(t){return this.findAll(t).map(n=>(this.forget(n),this.notify(n,"rejected"),n))}forget(t){return this.guarantor.forget(t),this.subscriptions=this.subscriptions.filter(n=>n!==t),t}findAll(t){return this.subscriptions.filter(n=>n.identifier===t)}reload(){return this.subscriptions.map(t=>this.subscribe(t))}notifyAll(t,...n){return this.subscriptions.map(r=>this.notify(r,t,...n))}notify(t,n,...r){let o;return typeof t=="string"?o=this.findAll(t):o=[t],o.map(s=>typeof s[n]=="function"?s[n](...r):void 0)}subscribe(t){this.sendCommand(t,"subscribe")&&this.guarantor.guarantee(t)}confirmSubscription(t){be.log(`Subscription confirmed ${t}`),this.findAll(t).map(n=>this.guarantor.forget(n))}sendCommand(t,n){const{identifier:r}=t;return this.consumer.send({command:n,identifier:r})}}class $m{constructor(t){this._url=t,this.subscriptions=new Um(this),this.connection=new Ao(this),this.subprotocols=[]}get url(){return jm(this._url)}send(t){return this.connection.send(t)}connect(){return this.connection.open()}disconnect(){return this.connection.close({allowReconnect:!1})}ensureActiveConnection(){if(!this.connection.isActive())return this.connection.open()}addSubProtocol(t){this.subprotocols=[...this.subprotocols,t]}}function jm(e){if(typeof e=="function"&&(e=e()),e&&!/^wss?:/i.test(e)){const t=document.createElement("a");return t.href=e,t.href=t.href,t.protocol=t.protocol.replace("http","ws"),t.href}else return e}function Hm(e=Wm("url")||ic.default_mount_path){return new $m(e)}function Wm(e){const t=document.head.querySelector(`meta[name='action-cable-${e}']`);if(t)return t.getAttribute("content")}function Bm(e){return{all:e=e||new Map,on:function(t,n){var r=e.get(t);r?r.push(n):e.set(t,[n])},off:function(t,n){var r=e.get(t);r&&(n?r.splice(r.indexOf(n)>>>0,1):e.set(t,[]))},emit:function(t,n){var r=e.get(t);r&&r.slice().map(function(o){o(n)}),(r=e.get("*"))&&r.slice().map(function(o){o(t,n)})}}}const Vm=window.location.protocol==="https:"?"wss":"ws",Km=Hm(`${Vm}://${window.location.host}/cable`),lc=Bm();let ac=null;function Jr(){}Jr.prototype.on=function(e,t){return lc.on(e,t)};Jr.prototype.send=function(e){ac.send({message:e})};Jr.prototype.install=function(e){e.plugin=this,e.config.globalProperties.$cable=this};function rg(e){return ac=Km.subscriptions.create({channel:e.channel},{received(t){lc.emit("chat",t)}}),new Jr}function Lo(){}Lo.prototype.call=function(e,t){let n=null;try{t.classList.add("loading"),n=!0}catch{n=!1}return new Promise(r=>{e.then(o=>{if(n===!0){t.classList.remove("loading");let s=null;o===!0&&(s="success"),o===!1&&(s="failed"),t.classList.add(s),setTimeout(function(){t.classList.remove(s)},1e3)}r(o)})})};Lo.prototype.install=function(e){e.plugin=this,e.config.globalProperties.$api=this};function sg(e){return e.handler.defaults.baseURL=`${window.location.protocol}/${window.I18n.prefix}api${e.namespace}/`,e.handler.defaults.headers.common["X-CSRF-Token"]=document.querySelector('meta[name="csrf-token"]').getAttribute("content"),e.handler.interceptors.response.use(t=>t,t=>{switch(t.response.status){case 500:window.location.href="/500";break;case 401:alert("not authenticated");break}return Promise.reject(t)}),new Lo}/*! * shared v9.8.0 * (c) 2023 kazuya kawaguchi * Released under the MIT License. */const Us=typeof window<"u",Ut=(e,t=!1)=>t?Symbol.for(e):Symbol(e),Ym=(e,t,n)=>Gm({l:e,k:t,s:n}),Gm=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Re=e=>typeof e=="number"&&isFinite(e),qm=e=>uc(e)==="[object Date]",Dt=e=>uc(e)==="[object RegExp]",zr=e=>J(e)&&Object.keys(e).length===0,we=Object.assign;let Gi;const Et=()=>Gi||(Gi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function qi(e){return e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const Xm=Object.prototype.hasOwnProperty;function Gn(e,t){return Xm.call(e,t)}const ge=Array.isArray,de=e=>typeof e=="function",H=e=>typeof e=="string",ee=e=>typeof e=="boolean",ce=e=>e!==null&&typeof e=="object",Jm=e=>ce(e)&&de(e.then)&&de(e.catch),cc=Object.prototype.toString,uc=e=>cc.call(e),J=e=>{if(!ce(e))return!1;const t=Object.getPrototypeOf(e);return t===null||t.constructor===Object},zm=e=>e==null?"":ge(e)||J(e)&&e.toString===cc?JSON.stringify(e,null,2):String(e);function Qm(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}function Co(e){let t=e;return()=>++t}function Zm(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const cr=e=>!ce(e)||ge(e);function Dn(e,t){if(cr(e)||cr(t))throw new Error("Invalid value");for(const n in e)Gn(e,n)&&(cr(e[n])||cr(t[n])?t[n]=e[n]:Dn(e[n],t[n]))}/*! * message-compiler v9.8.0 * (c) 2023 kazuya kawaguchi * Released under the MIT License. */function ep(e,t,n){return{line:e,column:t,offset:n}}function $s(e,t,n){const r={start:e,end:t};return n!=null&&(r.source=n),r}const tp=/\{([0-9a-zA-Z]+)\}/g;function np(e,...t){return t.length===1&&rp(t[0])&&(t=t[0]),(!t||!t.hasOwnProperty)&&(t={}),e.replace(tp,(n,r)=>t.hasOwnProperty(r)?t[r]:"")}const fc=Object.assign,Xi=e=>typeof e=="string",rp=e=>e!==null&&typeof e=="object";function dc(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}const q={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,UNHANDLED_CODEGEN_NODE_TYPE:15,UNHANDLED_MINIFIER_NODE_TYPE:16,__EXTEND_POINT__:17},sp={[q.EXPECTED_TOKEN]:"Expected token: '{0}'",[q.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[q.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[q.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[q.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[q.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[q.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[q.EMPTY_PLACEHOLDER]:"Empty placeholder",[q.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[q.INVALID_LINKED_FORMAT]:"Invalid linked format",[q.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[q.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[q.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[q.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[q.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[q.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function Tn(e,t,n={}){const{domain:r,messages:o,args:s}=n,i=np((o||sp)[e]||"",...s||[]),l=new SyntaxError(String(i));return l.code=e,t&&(l.location=t),l.domain=r,l}function op(e){throw e}const gt=" ",ip="\r",Ue=` `,lp=String.fromCharCode(8232),ap=String.fromCharCode(8233);function cp(e){const t=e;let n=0,r=1,o=1,s=0;const i=I=>t[I]===ip&&t[I+1]===Ue,l=I=>t[I]===Ue,a=I=>t[I]===ap,f=I=>t[I]===lp,d=I=>i(I)||l(I)||a(I)||f(I),h=()=>n,m=()=>r,b=()=>o,y=()=>s,S=I=>i(I)||a(I)||f(I)?Ue:t[I],A=()=>S(n),g=()=>S(n+s);function v(){return s=0,d(n)&&(r++,o=0),i(n)&&n++,n++,o++,t[n]}function L(){return i(n+s)&&s++,s++,t[n+s]}function T(){n=0,r=1,o=1,s=0}function k(I=0){s=I}function M(){const I=n+s;for(;I!==n;)v();s=0}return{index:h,line:m,column:b,peekOffset:y,charAt:S,currentChar:A,currentPeek:g,next:v,peek:L,reset:T,resetPeek:k,skipToPeek:M}}const At=void 0,up=".",Ji="'",fp="tokenizer";function dp(e,t={}){const n=t.location!==!1,r=cp(e),o=()=>r.index(),s=()=>ep(r.line(),r.column(),r.index()),i=s(),l=o(),a={currentType:14,offset:l,startLoc:i,endLoc:i,lastType:14,lastOffset:l,lastStartLoc:i,lastEndLoc:i,braceNest:0,inLinked:!1,text:""},f=()=>a,{onError:d}=t;function h(c,u,p,...E){const N=f();if(u.column+=p,u.offset+=p,d){const w=n?$s(N.startLoc,u):null,F=Tn(c,w,{domain:fp,args:E});d(F)}}function m(c,u,p){c.endLoc=s(),c.currentType=u;const E={type:u};return n&&(E.loc=$s(c.startLoc,c.endLoc)),p!=null&&(E.value=p),E}const b=c=>m(c,14);function y(c,u){return c.currentChar()===u?(c.next(),u):(h(q.EXPECTED_TOKEN,s(),0,u),"")}function S(c){let u="";for(;c.currentPeek()===gt||c.currentPeek()===Ue;)u+=c.currentPeek(),c.peek();return u}function A(c){const u=S(c);return c.skipToPeek(),u}function g(c){if(c===At)return!1;const u=c.charCodeAt(0);return u>=97&&u<=122||u>=65&&u<=90||u===95}function v(c){if(c===At)return!1;const u=c.charCodeAt(0);return u>=48&&u<=57}function L(c,u){const{currentType:p}=u;if(p!==2)return!1;S(c);const E=g(c.currentPeek());return c.resetPeek(),E}function T(c,u){const{currentType:p}=u;if(p!==2)return!1;S(c);const E=c.currentPeek()==="-"?c.peek():c.currentPeek(),N=v(E);return c.resetPeek(),N}function k(c,u){const{currentType:p}=u;if(p!==2)return!1;S(c);const E=c.currentPeek()===Ji;return c.resetPeek(),E}function M(c,u){const{currentType:p}=u;if(p!==8)return!1;S(c);const E=c.currentPeek()===".";return c.resetPeek(),E}function I(c,u){const{currentType:p}=u;if(p!==9)return!1;S(c);const E=g(c.currentPeek());return c.resetPeek(),E}function V(c,u){const{currentType:p}=u;if(!(p===8||p===12))return!1;S(c);const E=c.currentPeek()===":";return c.resetPeek(),E}function K(c,u){const{currentType:p}=u;if(p!==10)return!1;const E=()=>{const w=c.currentPeek();return w==="{"?g(c.peek()):w==="@"||w==="%"||w==="|"||w===":"||w==="."||w===gt||!w?!1:w===Ue?(c.peek(),E()):g(w)},N=E();return c.resetPeek(),N}function te(c){S(c);const u=c.currentPeek()==="|";return c.resetPeek(),u}function fe(c){const u=S(c),p=c.currentPeek()==="%"&&c.peek()==="{";return c.resetPeek(),{isModulo:p,hasSpace:u.length>0}}function ae(c,u=!0){const p=(N=!1,w="",F=!1)=>{const D=c.currentPeek();return D==="{"?w==="%"?!1:N:D==="@"||!D?w==="%"?!0:N:D==="%"?(c.peek(),p(N,"%",!0)):D==="|"?w==="%"||F?!0:!(w===gt||w===Ue):D===gt?(c.peek(),p(!0,gt,F)):D===Ue?(c.peek(),p(!0,Ue,F)):!0},E=p();return u&&c.resetPeek(),E}function me(c,u){const p=c.currentChar();return p===At?At:u(p)?(c.next(),p):null}function je(c){return me(c,p=>{const E=p.charCodeAt(0);return E>=97&&E<=122||E>=65&&E<=90||E>=48&&E<=57||E===95||E===36})}function Ce(c){return me(c,p=>{const E=p.charCodeAt(0);return E>=48&&E<=57})}function z(c){return me(c,p=>{const E=p.charCodeAt(0);return E>=48&&E<=57||E>=65&&E<=70||E>=97&&E<=102})}function se(c){let u="",p="";for(;u=Ce(c);)p+=u;return p}function ne(c){A(c);const u=c.currentChar();return u!=="%"&&h(q.EXPECTED_TOKEN,s(),0,u),c.next(),"%"}function Ee(c){let u="";for(;;){const p=c.currentChar();if(p==="{"||p==="}"||p==="@"||p==="|"||!p)break;if(p==="%")if(ae(c))u+=p,c.next();else break;else if(p===gt||p===Ue)if(ae(c))u+=p,c.next();else{if(te(c))break;u+=p,c.next()}else u+=p,c.next()}return u}function Me(c){A(c);let u="",p="";for(;u=je(c);)p+=u;return c.currentChar()===At&&h(q.UNTERMINATED_CLOSING_BRACE,s(),0),p}function xe(c){A(c);let u="";return c.currentChar()==="-"?(c.next(),u+=`-${se(c)}`):u+=se(c),c.currentChar()===At&&h(q.UNTERMINATED_CLOSING_BRACE,s(),0),u}function ve(c){A(c),y(c,"'");let u="",p="";const E=w=>w!==Ji&&w!==Ue;for(;u=me(c,E);)u==="\\"?p+=Xe(c):p+=u;const N=c.currentChar();return N===Ue||N===At?(h(q.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,s(),0),N===Ue&&(c.next(),y(c,"'")),p):(y(c,"'"),p)}function Xe(c){const u=c.currentChar();switch(u){case"\\":case"'":return c.next(),`\\${u}`;case"u":return Ke(c,u,4);case"U":return Ke(c,u,6);default:return h(q.UNKNOWN_ESCAPE_SEQUENCE,s(),0,u),""}}function Ke(c,u,p){y(c,u);let E="";for(let N=0;NN!=="{"&&N!=="}"&&N!==gt&&N!==Ue;for(;u=me(c,E);)p+=u;return p}function ye(c){let u="",p="";for(;u=je(c);)p+=u;return p}function C(c){const u=(p=!1,E)=>{const N=c.currentChar();return N==="{"||N==="%"||N==="@"||N==="|"||N==="("||N===")"||!N||N===gt?E:N===Ue||N===up?(E+=N,c.next(),u(p,E)):(E+=N,c.next(),u(!0,E))};return u(!1,"")}function j(c){A(c);const u=y(c,"|");return A(c),u}function U(c,u){let p=null;switch(c.currentChar()){case"{":return u.braceNest>=1&&h(q.NOT_ALLOW_NEST_PLACEHOLDER,s(),0),c.next(),p=m(u,2,"{"),A(c),u.braceNest++,p;case"}":return u.braceNest>0&&u.currentType===2&&h(q.EMPTY_PLACEHOLDER,s(),0),c.next(),p=m(u,3,"}"),u.braceNest--,u.braceNest>0&&A(c),u.inLinked&&u.braceNest===0&&(u.inLinked=!1),p;case"@":return u.braceNest>0&&h(q.UNTERMINATED_CLOSING_BRACE,s(),0),p=W(c,u)||b(u),u.braceNest=0,p;default:let N=!0,w=!0,F=!0;if(te(c))return u.braceNest>0&&h(q.UNTERMINATED_CLOSING_BRACE,s(),0),p=m(u,1,j(c)),u.braceNest=0,u.inLinked=!1,p;if(u.braceNest>0&&(u.currentType===5||u.currentType===6||u.currentType===7))return h(q.UNTERMINATED_CLOSING_BRACE,s(),0),u.braceNest=0,Z(c,u);if(N=L(c,u))return p=m(u,5,Me(c)),A(c),p;if(w=T(c,u))return p=m(u,6,xe(c)),A(c),p;if(F=k(c,u))return p=m(u,7,ve(c)),A(c),p;if(!N&&!w&&!F)return p=m(u,13,pt(c)),h(q.INVALID_TOKEN_IN_PLACEHOLDER,s(),0,p.value),A(c),p;break}return p}function W(c,u){const{currentType:p}=u;let E=null;const N=c.currentChar();switch((p===8||p===9||p===12||p===10)&&(N===Ue||N===gt)&&h(q.INVALID_LINKED_FORMAT,s(),0),N){case"@":return c.next(),E=m(u,8,"@"),u.inLinked=!0,E;case".":return A(c),c.next(),m(u,9,".");case":":return A(c),c.next(),m(u,10,":");default:return te(c)?(E=m(u,1,j(c)),u.braceNest=0,u.inLinked=!1,E):M(c,u)||V(c,u)?(A(c),W(c,u)):I(c,u)?(A(c),m(u,12,ye(c))):K(c,u)?(A(c),N==="{"?U(c,u)||E:m(u,11,C(c))):(p===8&&h(q.INVALID_LINKED_FORMAT,s(),0),u.braceNest=0,u.inLinked=!1,Z(c,u))}}function Z(c,u){let p={type:14};if(u.braceNest>0)return U(c,u)||b(u);if(u.inLinked)return W(c,u)||b(u);switch(c.currentChar()){case"{":return U(c,u)||b(u);case"}":return h(q.UNBALANCED_CLOSING_BRACE,s(),0),c.next(),m(u,3,"}");case"@":return W(c,u)||b(u);default:if(te(c))return p=m(u,1,j(c)),u.braceNest=0,u.inLinked=!1,p;const{isModulo:N,hasSpace:w}=fe(c);if(N)return w?m(u,0,Ee(c)):m(u,4,ne(c));if(ae(c))return m(u,0,Ee(c));break}return p}function _(){const{currentType:c,offset:u,startLoc:p,endLoc:E}=a;return a.lastType=c,a.lastOffset=u,a.lastStartLoc=p,a.lastEndLoc=E,a.offset=o(),a.startLoc=s(),r.currentChar()===At?m(a,14):Z(r,a)}return{nextToken:_,currentOffset:o,currentPosition:s,context:f}}const hp="parser",mp=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function pp(e,t,n){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const r=parseInt(t||n,16);return r<=55295||r>=57344?String.fromCodePoint(r):"�"}}}function _p(e={}){const t=e.location!==!1,{onError:n}=e;function r(g,v,L,T,...k){const M=g.currentPosition();if(M.offset+=T,M.column+=T,n){const I=t?$s(L,M):null,V=Tn(v,I,{domain:hp,args:k});n(V)}}function o(g,v,L){const T={type:g};return t&&(T.start=v,T.end=v,T.loc={start:L,end:L}),T}function s(g,v,L,T){T&&(g.type=T),t&&(g.end=v,g.loc&&(g.loc.end=L))}function i(g,v){const L=g.context(),T=o(3,L.offset,L.startLoc);return T.value=v,s(T,g.currentOffset(),g.currentPosition()),T}function l(g,v){const L=g.context(),{lastOffset:T,lastStartLoc:k}=L,M=o(5,T,k);return M.index=parseInt(v,10),g.nextToken(),s(M,g.currentOffset(),g.currentPosition()),M}function a(g,v){const L=g.context(),{lastOffset:T,lastStartLoc:k}=L,M=o(4,T,k);return M.key=v,g.nextToken(),s(M,g.currentOffset(),g.currentPosition()),M}function f(g,v){const L=g.context(),{lastOffset:T,lastStartLoc:k}=L,M=o(9,T,k);return M.value=v.replace(mp,pp),g.nextToken(),s(M,g.currentOffset(),g.currentPosition()),M}function d(g){const v=g.nextToken(),L=g.context(),{lastOffset:T,lastStartLoc:k}=L,M=o(8,T,k);return v.type!==12?(r(g,q.UNEXPECTED_EMPTY_LINKED_MODIFIER,L.lastStartLoc,0),M.value="",s(M,T,k),{nextConsumeToken:v,node:M}):(v.value==null&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,L.lastStartLoc,0,at(v)),M.value=v.value||"",s(M,g.currentOffset(),g.currentPosition()),{node:M})}function h(g,v){const L=g.context(),T=o(7,L.offset,L.startLoc);return T.value=v,s(T,g.currentOffset(),g.currentPosition()),T}function m(g){const v=g.context(),L=o(6,v.offset,v.startLoc);let T=g.nextToken();if(T.type===9){const k=d(g);L.modifier=k.node,T=k.nextConsumeToken||g.nextToken()}switch(T.type!==10&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,at(T)),T=g.nextToken(),T.type===2&&(T=g.nextToken()),T.type){case 11:T.value==null&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,at(T)),L.key=h(g,T.value||"");break;case 5:T.value==null&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,at(T)),L.key=a(g,T.value||"");break;case 6:T.value==null&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,at(T)),L.key=l(g,T.value||"");break;case 7:T.value==null&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,at(T)),L.key=f(g,T.value||"");break;default:r(g,q.UNEXPECTED_EMPTY_LINKED_KEY,v.lastStartLoc,0);const k=g.context(),M=o(7,k.offset,k.startLoc);return M.value="",s(M,k.offset,k.startLoc),L.key=M,s(L,k.offset,k.startLoc),{nextConsumeToken:T,node:L}}return s(L,g.currentOffset(),g.currentPosition()),{node:L}}function b(g){const v=g.context(),L=v.currentType===1?g.currentOffset():v.offset,T=v.currentType===1?v.endLoc:v.startLoc,k=o(2,L,T);k.items=[];let M=null;do{const K=M||g.nextToken();switch(M=null,K.type){case 0:K.value==null&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,at(K)),k.items.push(i(g,K.value||""));break;case 6:K.value==null&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,at(K)),k.items.push(l(g,K.value||""));break;case 5:K.value==null&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,at(K)),k.items.push(a(g,K.value||""));break;case 7:K.value==null&&r(g,q.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,at(K)),k.items.push(f(g,K.value||""));break;case 8:const te=m(g);k.items.push(te.node),M=te.nextConsumeToken||null;break}}while(v.currentType!==14&&v.currentType!==1);const I=v.currentType===1?v.lastOffset:g.currentOffset(),V=v.currentType===1?v.lastEndLoc:g.currentPosition();return s(k,I,V),k}function y(g,v,L,T){const k=g.context();let M=T.items.length===0;const I=o(1,v,L);I.cases=[],I.cases.push(T);do{const V=b(g);M||(M=V.items.length===0),I.cases.push(V)}while(k.currentType!==14);return M&&r(g,q.MUST_HAVE_MESSAGES_IN_PLURAL,L,0),s(I,g.currentOffset(),g.currentPosition()),I}function S(g){const v=g.context(),{offset:L,startLoc:T}=v,k=b(g);return v.currentType===14?k:y(g,L,T,k)}function A(g){const v=dp(g,fc({},e)),L=v.context(),T=o(0,L.offset,L.startLoc);return t&&T.loc&&(T.loc.source=g),T.body=S(v),e.onCacheKey&&(T.cacheKey=e.onCacheKey(g)),L.currentType!==14&&r(v,q.UNEXPECTED_LEXICAL_ANALYSIS,L.lastStartLoc,0,g[L.offset]||""),s(T,v.currentOffset(),v.currentPosition()),T}return{parse:A}}function at(e){if(e.type===14)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function gp(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:s=>(n.helpers.add(s),s)}}function zi(e,t){for(let n=0;nQi(n)),e}function Qi(e){if(e.items.length===1){const t=e.items[0];(t.type===3||t.type===9)&&(e.static=t.value,delete t.value)}else{const t=[];for(let n=0;nl;function f(A,g){l.code+=A}function d(A,g=!0){const v=g?o:"";f(s?v+" ".repeat(A):v)}function h(A=!0){const g=++l.indentLevel;A&&d(g)}function m(A=!0){const g=--l.indentLevel;A&&d(g)}function b(){d(l.indentLevel)}return{context:a,push:f,indent:h,deindent:m,newline:b,helper:A=>`_${A}`,needIndent:()=>l.needIndent}}function vp(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),pn(e,t.key),t.modifier?(e.push(", "),pn(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function Sp(e,t){const{helper:n,needIndent:r}=e;e.push(`${n("normalize")}([`),e.indent(r());const o=t.items.length;for(let s=0;s1){e.push(`${n("plural")}([`),e.indent(r());const o=t.cases.length;for(let s=0;s{const n=Xi(t.mode)?t.mode:"normal",r=Xi(t.filename)?t.filename:"message.intl",o=!!t.sourceMap,s=t.breakLineCode!=null?t.breakLineCode:n==="arrow"?";":` `,i=t.needIndent?t.needIndent:n!=="arrow",l=e.helpers||[],a=Tp(e,{mode:n,filename:r,sourceMap:o,breakLineCode:s,needIndent:i});a.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),a.indent(i),l.length>0&&(a.push(`const { ${dc(l.map(h=>`${h}: _${h}`),", ")} } = ctx`),a.newline()),a.push("return "),pn(a,e),a.deindent(i),a.push("}"),delete e.helpers;const{code:f,map:d}=a.context();return{ast:e,code:f,map:d?d.toJSON():void 0}};function Lp(e,t={}){const n=fc({},t),r=!!n.jit,o=!!n.minify,s=n.optimize==null?!0:n.optimize,l=_p(n).parse(e);return r?(s&&Ep(l),o&&en(l),{ast:l,code:""}):(bp(l,n),Ap(l,n))}/*! * core-base v9.8.0 * (c) 2023 kazuya kawaguchi * Released under the MIT License. */function Cp(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Et().__INTLIFY_PROD_DEVTOOLS__=!1),typeof __INTLIFY_JIT_COMPILATION__!="boolean"&&(Et().__INTLIFY_JIT_COMPILATION__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(Et().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}const $t=[];$t[0]={w:[0],i:[3,0],"[":[4],o:[7]};$t[1]={w:[1],".":[2],"[":[4],o:[7]};$t[2]={w:[2],i:[3,0],0:[3,0]};$t[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};$t[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};$t[5]={"'":[4,0],o:8,l:[5,0]};$t[6]={'"':[4,0],o:8,l:[6,0]};const Pp=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function Ip(e){return Pp.test(e)}function wp(e){const t=e.charCodeAt(0),n=e.charCodeAt(e.length-1);return t===n&&(t===34||t===39)?e.slice(1,-1):e}function kp(e){if(e==null)return"o";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return"i";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"w"}return"i"}function xp(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:Ip(t)?wp(t):"*"+t}function Fp(e){const t=[];let n=-1,r=0,o=0,s,i,l,a,f,d,h;const m=[];m[0]=()=>{i===void 0?i=l:i+=l},m[1]=()=>{i!==void 0&&(t.push(i),i=void 0)},m[2]=()=>{m[0](),o++},m[3]=()=>{if(o>0)o--,r=4,m[0]();else{if(o=0,i===void 0||(i=xp(i),i===!1))return!1;m[1]()}};function b(){const y=e[n+1];if(r===5&&y==="'"||r===6&&y==='"')return n++,l="\\"+y,m[0](),!0}for(;r!==null;)if(n++,s=e[n],!(s==="\\"&&b())){if(a=kp(s),h=$t[r],f=h[a]||h.l||8,f===8||(r=f[0],f[1]!==void 0&&(d=m[f[1]],d&&(l=s,d()===!1))))return;if(r===7)return t}}const Zi=new Map;function Mp(e,t){return ce(e)?e[t]:null}function Dp(e,t){if(!ce(e))return null;let n=Zi.get(t);if(n||(n=Fp(t),n&&Zi.set(t,n)),!n)return null;const r=n.length;let o=e,s=0;for(;se,$p=e=>"",jp="text",Hp=e=>e.length===0?"":Qm(e),Wp=zm;function el(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function Bp(e){const t=Re(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Re(e.named.count)||Re(e.named.n))?Re(e.named.count)?e.named.count:Re(e.named.n)?e.named.n:t:t}function Vp(e,t){t.count||(t.count=e),t.n||(t.n=e)}function Kp(e={}){const t=e.locale,n=Bp(e),r=ce(e.pluralRules)&&H(t)&&de(e.pluralRules[t])?e.pluralRules[t]:el,o=ce(e.pluralRules)&&H(t)&&de(e.pluralRules[t])?el:void 0,s=g=>g[r(n,g.length,o)],i=e.list||[],l=g=>i[g],a=e.named||{};Re(e.pluralIndex)&&Vp(n,a);const f=g=>a[g];function d(g){const v=de(e.messages)?e.messages(g):ce(e.messages)?e.messages[g]:!1;return v||(e.parent?e.parent.message(g):$p)}const h=g=>e.modifiers?e.modifiers[g]:Up,m=J(e.processor)&&de(e.processor.normalize)?e.processor.normalize:Hp,b=J(e.processor)&&de(e.processor.interpolate)?e.processor.interpolate:Wp,y=J(e.processor)&&H(e.processor.type)?e.processor.type:jp,A={list:l,named:f,plural:s,linked:(g,...v)=>{const[L,T]=v;let k="text",M="";v.length===1?ce(L)?(M=L.modifier||M,k=L.type||k):H(L)&&(M=L||M):v.length===2&&(H(L)&&(M=L||M),H(T)&&(k=T||k));const I=d(g)(A),V=k==="vnode"&&ge(I)&&M?I[0]:I;return M?h(M)(V,k):V},message:d,type:y,interpolate:b,normalize:m,values:we({},i,a)};return A}let qn=null;function Yp(e){qn=e}function Gp(e,t,n){qn&&qn.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const qp=Xp("function:translate");function Xp(e){return t=>qn&&qn.emit(e,t)}const Jp={NOT_FOUND_KEY:1,FALLBACK_TO_TRANSLATE:2,CANNOT_FORMAT_NUMBER:3,FALLBACK_TO_NUMBER_FORMAT:4,CANNOT_FORMAT_DATE:5,FALLBACK_TO_DATE_FORMAT:6,EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:7,__EXTEND_POINT__:8},hc=q.__EXTEND_POINT__,Wt=Co(hc),tt={INVALID_ARGUMENT:hc,INVALID_DATE_ARGUMENT:Wt(),INVALID_ISO_DATE_ARGUMENT:Wt(),NOT_SUPPORT_NON_STRING_MESSAGE:Wt(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:Wt(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:Wt(),NOT_SUPPORT_LOCALE_TYPE:Wt(),__EXTEND_POINT__:Wt()};function dt(e){return Tn(e,null,void 0)}function Io(e,t){return t.locale!=null?tl(t.locale):tl(e.locale)}let hs;function tl(e){if(H(e))return e;if(de(e)){if(e.resolvedOnce&&hs!=null)return hs;if(e.constructor.name==="Function"){const t=e();if(Jm(t))throw dt(tt.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return hs=t}else throw dt(tt.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw dt(tt.NOT_SUPPORT_LOCALE_TYPE)}function zp(e,t,n){return[...new Set([n,...ge(t)?t:ce(t)?Object.keys(t):H(t)?[t]:[n]])]}function mc(e,t,n){const r=H(n)?n:_n,o=e;o.__localeChainCache||(o.__localeChainCache=new Map);let s=o.__localeChainCache.get(r);if(!s){s=[];let i=[n];for(;ge(i);)i=nl(s,i,t);const l=ge(t)||!J(t)?t:t.default?t.default:null;i=H(l)?[l]:l,ge(i)&&nl(s,i,!1),o.__localeChainCache.set(r,s)}return s}function nl(e,t,n){let r=!0;for(let o=0;o`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function t_(){return{upper:(e,t)=>t==="text"&&H(e)?e.toUpperCase():t==="vnode"&&ce(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&H(e)?e.toLowerCase():t==="vnode"&&ce(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&H(e)?sl(e):t==="vnode"&&ce(e)&&"__v_isVNode"in e?sl(e.children):e}}let pc;function ol(e){pc=e}let _c;function n_(e){_c=e}let gc;function r_(e){gc=e}let bc=null;const s_=e=>{bc=e},o_=()=>bc;let Ec=null;const il=e=>{Ec=e},i_=()=>Ec;let ll=0;function l_(e={}){const t=de(e.onWarn)?e.onWarn:Zm,n=H(e.version)?e.version:e_,r=H(e.locale)||de(e.locale)?e.locale:_n,o=de(r)?_n:r,s=ge(e.fallbackLocale)||J(e.fallbackLocale)||H(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:o,i=J(e.messages)?e.messages:{[o]:{}},l=J(e.datetimeFormats)?e.datetimeFormats:{[o]:{}},a=J(e.numberFormats)?e.numberFormats:{[o]:{}},f=we({},e.modifiers||{},t_()),d=e.pluralRules||{},h=de(e.missing)?e.missing:null,m=ee(e.missingWarn)||Dt(e.missingWarn)?e.missingWarn:!0,b=ee(e.fallbackWarn)||Dt(e.fallbackWarn)?e.fallbackWarn:!0,y=!!e.fallbackFormat,S=!!e.unresolving,A=de(e.postTranslation)?e.postTranslation:null,g=J(e.processor)?e.processor:null,v=ee(e.warnHtmlMessage)?e.warnHtmlMessage:!0,L=!!e.escapeParameter,T=de(e.messageCompiler)?e.messageCompiler:pc,k=de(e.messageResolver)?e.messageResolver:_c||Mp,M=de(e.localeFallbacker)?e.localeFallbacker:gc||zp,I=ce(e.fallbackContext)?e.fallbackContext:void 0,V=e,K=ce(V.__datetimeFormatters)?V.__datetimeFormatters:new Map,te=ce(V.__numberFormatters)?V.__numberFormatters:new Map,fe=ce(V.__meta)?V.__meta:{};ll++;const ae={version:n,cid:ll,locale:r,fallbackLocale:s,messages:i,modifiers:f,pluralRules:d,missing:h,missingWarn:m,fallbackWarn:b,fallbackFormat:y,unresolving:S,postTranslation:A,processor:g,warnHtmlMessage:v,escapeParameter:L,messageCompiler:T,messageResolver:k,localeFallbacker:M,fallbackContext:I,onWarn:t,__meta:fe};return ae.datetimeFormats=l,ae.numberFormats=a,ae.__datetimeFormatters=K,ae.__numberFormatters=te,__INTLIFY_PROD_DEVTOOLS__&&Gp(ae,n,fe),ae}function wo(e,t,n,r,o){const{missing:s,onWarn:i}=e;if(s!==null){const l=s(e,n,t,o);return H(l)?l:t}else return t}function Ln(e,t,n){const r=e;r.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function ms(e){return n=>a_(n,e)}function a_(e,t){const n=t.b||t.body;if((n.t||n.type)===1){const r=n,o=r.c||r.cases;return e.plural(o.reduce((s,i)=>[...s,al(e,i)],[]))}else return al(e,n)}function al(e,t){const n=t.s||t.static;if(n)return e.type==="text"?n:e.normalize([n]);{const r=(t.i||t.items).reduce((o,s)=>[...o,js(e,s)],[]);return e.normalize(r)}}function js(e,t){const n=t.t||t.type;switch(n){case 3:const r=t;return r.v||r.value;case 9:const o=t;return o.v||o.value;case 4:const s=t;return e.interpolate(e.named(s.k||s.key));case 5:const i=t;return e.interpolate(e.list(i.i!=null?i.i:i.index));case 6:const l=t,a=l.m||l.modifier;return e.linked(js(e,l.k||l.key),a?js(e,a):void 0,e.type);case 7:const f=t;return f.v||f.value;case 8:const d=t;return d.v||d.value;default:throw new Error(`unhandled node type on format message part: ${n}`)}}const yc=e=>e;let tn=Object.create(null);const gn=e=>ce(e)&&(e.t===0||e.type===0)&&("b"in e||"body"in e);function Oc(e,t={}){let n=!1;const r=t.onError||op;return t.onError=o=>{n=!0,r(o)},{...Lp(e,t),detectError:n}}const c_=(e,t)=>{if(!H(e))throw dt(tt.NOT_SUPPORT_NON_STRING_MESSAGE);{ee(t.warnHtmlMessage)&&t.warnHtmlMessage;const r=(t.onCacheKey||yc)(e),o=tn[r];if(o)return o;const{code:s,detectError:i}=Oc(e,t),l=new Function(`return ${s}`)();return i?l:tn[r]=l}};function u_(e,t){if(__INTLIFY_JIT_COMPILATION__&&!__INTLIFY_DROP_MESSAGE_COMPILER__&&H(e)){ee(t.warnHtmlMessage)&&t.warnHtmlMessage;const r=(t.onCacheKey||yc)(e),o=tn[r];if(o)return o;const{ast:s,detectError:i}=Oc(e,{...t,location:!1,jit:!0}),l=ms(s);return i?l:tn[r]=l}else{const n=e.cacheKey;if(n){const r=tn[n];return r||(tn[n]=ms(e))}else return ms(e)}}const cl=()=>"",Je=e=>de(e);function ul(e,...t){const{fallbackFormat:n,postTranslation:r,unresolving:o,messageCompiler:s,fallbackLocale:i,messages:l}=e,[a,f]=Hs(...t),d=ee(f.missingWarn)?f.missingWarn:e.missingWarn,h=ee(f.fallbackWarn)?f.fallbackWarn:e.fallbackWarn,m=ee(f.escapeParameter)?f.escapeParameter:e.escapeParameter,b=!!f.resolvedMessage,y=H(f.default)||ee(f.default)?ee(f.default)?s?a:()=>a:f.default:n?s?a:()=>a:"",S=n||y!=="",A=Io(e,f);m&&f_(f);let[g,v,L]=b?[a,A,l[A]||{}]:Tc(e,a,A,i,h,d),T=g,k=a;if(!b&&!(H(T)||gn(T)||Je(T))&&S&&(T=y,k=T),!b&&(!(H(T)||gn(T)||Je(T))||!H(v)))return o?Qr:a;let M=!1;const I=()=>{M=!0},V=Je(T)?T:vc(e,a,v,T,k,I);if(M)return T;const K=m_(e,v,L,f),te=Kp(K),fe=d_(e,V,te),ae=r?r(fe,a):fe;if(__INTLIFY_PROD_DEVTOOLS__){const me={timestamp:Date.now(),key:H(a)?a:Je(T)?T.key:"",locale:v||(Je(T)?T.locale:""),format:H(T)?T:Je(T)?T.source:"",message:ae};me.meta=we({},e.__meta,o_()||{}),qp(me)}return ae}function f_(e){ge(e.list)?e.list=e.list.map(t=>H(t)?qi(t):t):ce(e.named)&&Object.keys(e.named).forEach(t=>{H(e.named[t])&&(e.named[t]=qi(e.named[t]))})}function Tc(e,t,n,r,o,s){const{messages:i,onWarn:l,messageResolver:a,localeFallbacker:f}=e,d=f(e,r,n);let h={},m,b=null;const y="translate";for(let S=0;Sr;return f.locale=n,f.key=t,f}const a=i(r,h_(e,n,o,r,l,s));return a.locale=n,a.key=t,a.source=r,a}function d_(e,t,n){return t(n)}function Hs(...e){const[t,n,r]=e,o={};if(!H(t)&&!Re(t)&&!Je(t)&&!gn(t))throw dt(tt.INVALID_ARGUMENT);const s=Re(t)?String(t):(Je(t),t);return Re(n)?o.plural=n:H(n)?o.default=n:J(n)&&!zr(n)?o.named=n:ge(n)&&(o.list=n),Re(r)?o.plural=r:H(r)?o.default=r:J(r)&&we(o,r),[s,o]}function h_(e,t,n,r,o,s){return{locale:t,key:n,warnHtmlMessage:o,onError:i=>{throw s&&s(i),i},onCacheKey:i=>Ym(t,n,i)}}function m_(e,t,n,r){const{modifiers:o,pluralRules:s,messageResolver:i,fallbackLocale:l,fallbackWarn:a,missingWarn:f,fallbackContext:d}=e,m={locale:t,modifiers:o,pluralRules:s,messages:b=>{let y=i(n,b);if(y==null&&d){const[,,S]=Tc(d,b,t,l,a,f);y=i(S,b)}if(H(y)||gn(y)){let S=!1;const g=vc(e,b,t,y,b,()=>{S=!0});return S?cl:g}else return Je(y)?y:cl}};return e.processor&&(m.processor=e.processor),r.list&&(m.list=r.list),r.named&&(m.named=r.named),Re(r.plural)&&(m.pluralIndex=r.plural),m}function fl(e,...t){const{datetimeFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__datetimeFormatters:l}=e,[a,f,d,h]=Ws(...t),m=ee(d.missingWarn)?d.missingWarn:e.missingWarn;ee(d.fallbackWarn)?d.fallbackWarn:e.fallbackWarn;const b=!!d.part,y=Io(e,d),S=i(e,o,y);if(!H(a)||a==="")return new Intl.DateTimeFormat(y,h).format(f);let A={},g,v=null;const L="datetime format";for(let M=0;M{Sc.includes(a)?i[a]=n[a]:s[a]=n[a]}),H(r)?s.locale=r:J(r)&&(i=r),J(o)&&(i=o),[s.key||"",l,s,i]}function dl(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__datetimeFormatters.has(s)&&r.__datetimeFormatters.delete(s)}}function hl(e,...t){const{numberFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__numberFormatters:l}=e,[a,f,d,h]=Bs(...t),m=ee(d.missingWarn)?d.missingWarn:e.missingWarn;ee(d.fallbackWarn)?d.fallbackWarn:e.fallbackWarn;const b=!!d.part,y=Io(e,d),S=i(e,o,y);if(!H(a)||a==="")return new Intl.NumberFormat(y,h).format(f);let A={},g,v=null;const L="number format";for(let M=0;M{Nc.includes(a)?i[a]=n[a]:s[a]=n[a]}),H(r)?s.locale=r:J(r)&&(i=r),J(o)&&(i=o),[s.key||"",l,s,i]}function ml(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__numberFormatters.has(s)&&r.__numberFormatters.delete(s)}}Cp();/*! * vue-i18n v9.8.0 * (c) 2023 kazuya kawaguchi * Released under the MIT License. */const p_="9.8.0";function __(){typeof __VUE_I18N_FULL_INSTALL__!="boolean"&&(Et().__VUE_I18N_FULL_INSTALL__=!0),typeof __VUE_I18N_LEGACY_API__!="boolean"&&(Et().__VUE_I18N_LEGACY_API__=!0),typeof __INTLIFY_JIT_COMPILATION__!="boolean"&&(Et().__INTLIFY_JIT_COMPILATION__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(Et().__INTLIFY_DROP_MESSAGE_COMPILER__=!1),typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Et().__INTLIFY_PROD_DEVTOOLS__=!1)}const Rc=Jp.__EXTEND_POINT__,Lt=Co(Rc);Lt(),Lt(),Lt(),Lt(),Lt(),Lt(),Lt(),Lt();const Ac=tt.__EXTEND_POINT__,He=Co(Ac),Ae={UNEXPECTED_RETURN_TYPE:Ac,INVALID_ARGUMENT:He(),MUST_BE_CALL_SETUP_TOP:He(),NOT_INSTALLED:He(),NOT_AVAILABLE_IN_LEGACY_MODE:He(),REQUIRED_VALUE:He(),INVALID_VALUE:He(),CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN:He(),NOT_INSTALLED_WITH_PROVIDE:He(),UNEXPECTED_ERROR:He(),NOT_COMPATIBLE_LEGACY_VUE_I18N:He(),BRIDGE_SUPPORT_VUE_2_ONLY:He(),MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION:He(),NOT_AVAILABLE_COMPOSITION_IN_LEGACY:He(),__EXTEND_POINT__:He()};function Ie(e,...t){return Tn(e,null,void 0)}const Vs=Ut("__translateVNode"),Ks=Ut("__datetimeParts"),Ys=Ut("__numberParts"),Lc=Ut("__setPluralRules"),Cc=Ut("__injectWithOption"),Gs=Ut("__dispose");function Xn(e){if(!ce(e))return e;for(const t in e)if(Gn(e,t))if(!t.includes("."))ce(e[t])&&Xn(e[t]);else{const n=t.split("."),r=n.length-1;let o=e,s=!1;for(let i=0;i{if("locale"in l&&"resource"in l){const{locale:a,resource:f}=l;a?(i[a]=i[a]||{},Dn(f,i[a])):Dn(f,i)}else H(l)&&Dn(JSON.parse(l),i)}),o==null&&s)for(const l in i)Gn(i,l)&&Xn(i[l]);return i}function Pc(e){return e.type}function Ic(e,t,n){let r=ce(t.messages)?t.messages:{};"__i18nGlobal"in n&&(r=Zr(e.locale.value,{messages:r,__i18n:n.__i18nGlobal}));const o=Object.keys(r);o.length&&o.forEach(s=>{e.mergeLocaleMessage(s,r[s])});{if(ce(t.datetimeFormats)){const s=Object.keys(t.datetimeFormats);s.length&&s.forEach(i=>{e.mergeDateTimeFormat(i,t.datetimeFormats[i])})}if(ce(t.numberFormats)){const s=Object.keys(t.numberFormats);s.length&&s.forEach(i=>{e.mergeNumberFormat(i,t.numberFormats[i])})}}}function pl(e){return $e(Zn,null,e,0)}const _l="__INTLIFY_META__",gl=()=>[],g_=()=>!1;let bl=0;function El(e){return(t,n,r,o)=>e(n,r,Bn()||void 0,o)}const b_=()=>{const e=Bn();let t=null;return e&&(t=Pc(e)[_l])?{[_l]:t}:null};function ko(e={},t){const{__root:n,__injectWithOption:r}=e,o=n===void 0,s=e.flatJson;let i=ee(e.inheritLocale)?e.inheritLocale:!0;const l=qe(n&&i?n.locale.value:H(e.locale)?e.locale:_n),a=qe(n&&i?n.fallbackLocale.value:H(e.fallbackLocale)||ge(e.fallbackLocale)||J(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:l.value),f=qe(Zr(l.value,e)),d=qe(J(e.datetimeFormats)?e.datetimeFormats:{[l.value]:{}}),h=qe(J(e.numberFormats)?e.numberFormats:{[l.value]:{}});let m=n?n.missingWarn:ee(e.missingWarn)||Dt(e.missingWarn)?e.missingWarn:!0,b=n?n.fallbackWarn:ee(e.fallbackWarn)||Dt(e.fallbackWarn)?e.fallbackWarn:!0,y=n?n.fallbackRoot:ee(e.fallbackRoot)?e.fallbackRoot:!0,S=!!e.fallbackFormat,A=de(e.missing)?e.missing:null,g=de(e.missing)?El(e.missing):null,v=de(e.postTranslation)?e.postTranslation:null,L=n?n.warnHtmlMessage:ee(e.warnHtmlMessage)?e.warnHtmlMessage:!0,T=!!e.escapeParameter;const k=n?n.modifiers:J(e.modifiers)?e.modifiers:{};let M=e.pluralRules||n&&n.pluralRules,I;I=(()=>{o&&il(null);const O={version:p_,locale:l.value,fallbackLocale:a.value,messages:f.value,modifiers:k,pluralRules:M,missing:g===null?void 0:g,missingWarn:m,fallbackWarn:b,fallbackFormat:S,unresolving:!0,postTranslation:v===null?void 0:v,warnHtmlMessage:L,escapeParameter:T,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};O.datetimeFormats=d.value,O.numberFormats=h.value,O.__datetimeFormatters=J(I)?I.__datetimeFormatters:void 0,O.__numberFormatters=J(I)?I.__numberFormatters:void 0;const R=l_(O);return o&&il(R),R})(),Ln(I,l.value,a.value);function K(){return[l.value,a.value,f.value,d.value,h.value]}const te=Oe({get:()=>l.value,set:O=>{l.value=O,I.locale=l.value}}),fe=Oe({get:()=>a.value,set:O=>{a.value=O,I.fallbackLocale=a.value,Ln(I,l.value,O)}}),ae=Oe(()=>f.value),me=Oe(()=>d.value),je=Oe(()=>h.value);function Ce(){return de(v)?v:null}function z(O){v=O,I.postTranslation=O}function se(){return A}function ne(O){O!==null&&(g=El(O)),A=O,I.missing=g}const Ee=(O,R,B,X,re,pe)=>{K();let Pe;try{__INTLIFY_PROD_DEVTOOLS__,o||(I.fallbackContext=n?i_():void 0),Pe=O(I)}finally{__INTLIFY_PROD_DEVTOOLS__,o||(I.fallbackContext=void 0)}if(B!=="translate exists"&&Re(Pe)&&Pe===Qr||B==="translate exists"&&!Pe){const[vt,es]=R();return n&&y?X(n):re(vt)}else{if(pe(Pe))return Pe;throw Ie(Ae.UNEXPECTED_RETURN_TYPE)}};function Me(...O){return Ee(R=>Reflect.apply(ul,null,[R,...O]),()=>Hs(...O),"translate",R=>Reflect.apply(R.t,R,[...O]),R=>R,R=>H(R))}function xe(...O){const[R,B,X]=O;if(X&&!ce(X))throw Ie(Ae.INVALID_ARGUMENT);return Me(R,B,we({resolvedMessage:!0},X||{}))}function ve(...O){return Ee(R=>Reflect.apply(fl,null,[R,...O]),()=>Ws(...O),"datetime format",R=>Reflect.apply(R.d,R,[...O]),()=>rl,R=>H(R))}function Xe(...O){return Ee(R=>Reflect.apply(hl,null,[R,...O]),()=>Bs(...O),"number format",R=>Reflect.apply(R.n,R,[...O]),()=>rl,R=>H(R))}function Ke(O){return O.map(R=>H(R)||Re(R)||ee(R)?pl(String(R)):R)}const ye={normalize:Ke,interpolate:O=>O,type:"vnode"};function C(...O){return Ee(R=>{let B;const X=R;try{X.processor=ye,B=Reflect.apply(ul,null,[X,...O])}finally{X.processor=null}return B},()=>Hs(...O),"translate",R=>R[Vs](...O),R=>[pl(R)],R=>ge(R))}function j(...O){return Ee(R=>Reflect.apply(hl,null,[R,...O]),()=>Bs(...O),"number format",R=>R[Ys](...O),gl,R=>H(R)||ge(R))}function U(...O){return Ee(R=>Reflect.apply(fl,null,[R,...O]),()=>Ws(...O),"datetime format",R=>R[Ks](...O),gl,R=>H(R)||ge(R))}function W(O){M=O,I.pluralRules=M}function Z(O,R){return Ee(()=>{if(!O)return!1;const B=H(R)?R:l.value,X=u(B),re=I.messageResolver(X,O);return gn(re)||Je(re)||H(re)},()=>[O],"translate exists",B=>Reflect.apply(B.te,B,[O,R]),g_,B=>ee(B))}function _(O){let R=null;const B=mc(I,a.value,l.value);for(let X=0;X{i&&(l.value=O,I.locale=O,Ln(I,l.value,a.value))}),Ft(n.fallbackLocale,O=>{i&&(a.value=O,I.fallbackLocale=O,Ln(I,l.value,a.value))}));const $={id:bl,locale:te,fallbackLocale:fe,get inheritLocale(){return i},set inheritLocale(O){i=O,O&&n&&(l.value=n.locale.value,a.value=n.fallbackLocale.value,Ln(I,l.value,a.value))},get availableLocales(){return Object.keys(f.value).sort()},messages:ae,get modifiers(){return k},get pluralRules(){return M||{}},get isGlobal(){return o},get missingWarn(){return m},set missingWarn(O){m=O,I.missingWarn=m},get fallbackWarn(){return b},set fallbackWarn(O){b=O,I.fallbackWarn=b},get fallbackRoot(){return y},set fallbackRoot(O){y=O},get fallbackFormat(){return S},set fallbackFormat(O){S=O,I.fallbackFormat=S},get warnHtmlMessage(){return L},set warnHtmlMessage(O){L=O,I.warnHtmlMessage=O},get escapeParameter(){return T},set escapeParameter(O){T=O,I.escapeParameter=O},t:Me,getLocaleMessage:u,setLocaleMessage:p,mergeLocaleMessage:E,getPostTranslationHandler:Ce,setPostTranslationHandler:z,getMissingHandler:se,setMissingHandler:ne,[Lc]:W};return $.datetimeFormats=me,$.numberFormats=je,$.rt=xe,$.te=Z,$.tm=c,$.d=ve,$.n=Xe,$.getDateTimeFormat=N,$.setDateTimeFormat=w,$.mergeDateTimeFormat=F,$.getNumberFormat=D,$.setNumberFormat=x,$.mergeNumberFormat=Y,$[Cc]=r,$[Vs]=C,$[Ks]=U,$[Ys]=j,$}function E_(e){const t=H(e.locale)?e.locale:_n,n=H(e.fallbackLocale)||ge(e.fallbackLocale)||J(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:t,r=de(e.missing)?e.missing:void 0,o=ee(e.silentTranslationWarn)||Dt(e.silentTranslationWarn)?!e.silentTranslationWarn:!0,s=ee(e.silentFallbackWarn)||Dt(e.silentFallbackWarn)?!e.silentFallbackWarn:!0,i=ee(e.fallbackRoot)?e.fallbackRoot:!0,l=!!e.formatFallbackMessages,a=J(e.modifiers)?e.modifiers:{},f=e.pluralizationRules,d=de(e.postTranslation)?e.postTranslation:void 0,h=H(e.warnHtmlInMessage)?e.warnHtmlInMessage!=="off":!0,m=!!e.escapeParameterHtml,b=ee(e.sync)?e.sync:!0;let y=e.messages;if(J(e.sharedMessages)){const k=e.sharedMessages;y=Object.keys(k).reduce((I,V)=>{const K=I[V]||(I[V]={});return we(K,k[V]),I},y||{})}const{__i18n:S,__root:A,__injectWithOption:g}=e,v=e.datetimeFormats,L=e.numberFormats,T=e.flatJson;return{locale:t,fallbackLocale:n,messages:y,flatJson:T,datetimeFormats:v,numberFormats:L,missing:r,missingWarn:o,fallbackWarn:s,fallbackRoot:i,fallbackFormat:l,modifiers:a,pluralRules:f,postTranslation:d,warnHtmlMessage:h,escapeParameter:m,messageResolver:e.messageResolver,inheritLocale:b,__i18n:S,__root:A,__injectWithOption:g}}function qs(e={},t){{const n=ko(E_(e)),{__extender:r}=e,o={id:n.id,get locale(){return n.locale.value},set locale(s){n.locale.value=s},get fallbackLocale(){return n.fallbackLocale.value},set fallbackLocale(s){n.fallbackLocale.value=s},get messages(){return n.messages.value},get datetimeFormats(){return n.datetimeFormats.value},get numberFormats(){return n.numberFormats.value},get availableLocales(){return n.availableLocales},get formatter(){return{interpolate(){return[]}}},set formatter(s){},get missing(){return n.getMissingHandler()},set missing(s){n.setMissingHandler(s)},get silentTranslationWarn(){return ee(n.missingWarn)?!n.missingWarn:n.missingWarn},set silentTranslationWarn(s){n.missingWarn=ee(s)?!s:s},get silentFallbackWarn(){return ee(n.fallbackWarn)?!n.fallbackWarn:n.fallbackWarn},set silentFallbackWarn(s){n.fallbackWarn=ee(s)?!s:s},get modifiers(){return n.modifiers},get formatFallbackMessages(){return n.fallbackFormat},set formatFallbackMessages(s){n.fallbackFormat=s},get postTranslation(){return n.getPostTranslationHandler()},set postTranslation(s){n.setPostTranslationHandler(s)},get sync(){return n.inheritLocale},set sync(s){n.inheritLocale=s},get warnHtmlInMessage(){return n.warnHtmlMessage?"warn":"off"},set warnHtmlInMessage(s){n.warnHtmlMessage=s!=="off"},get escapeParameterHtml(){return n.escapeParameter},set escapeParameterHtml(s){n.escapeParameter=s},get preserveDirectiveContent(){return!0},set preserveDirectiveContent(s){},get pluralizationRules(){return n.pluralRules||{}},__composer:n,t(...s){const[i,l,a]=s,f={};let d=null,h=null;if(!H(i))throw Ie(Ae.INVALID_ARGUMENT);const m=i;return H(l)?f.locale=l:ge(l)?d=l:J(l)&&(h=l),ge(a)?d=a:J(a)&&(h=a),Reflect.apply(n.t,n,[m,d||h||{},f])},rt(...s){return Reflect.apply(n.rt,n,[...s])},tc(...s){const[i,l,a]=s,f={plural:1};let d=null,h=null;if(!H(i))throw Ie(Ae.INVALID_ARGUMENT);const m=i;return H(l)?f.locale=l:Re(l)?f.plural=l:ge(l)?d=l:J(l)&&(h=l),H(a)?f.locale=a:ge(a)?d=a:J(a)&&(h=a),Reflect.apply(n.t,n,[m,d||h||{},f])},te(s,i){return n.te(s,i)},tm(s){return n.tm(s)},getLocaleMessage(s){return n.getLocaleMessage(s)},setLocaleMessage(s,i){n.setLocaleMessage(s,i)},mergeLocaleMessage(s,i){n.mergeLocaleMessage(s,i)},d(...s){return Reflect.apply(n.d,n,[...s])},getDateTimeFormat(s){return n.getDateTimeFormat(s)},setDateTimeFormat(s,i){n.setDateTimeFormat(s,i)},mergeDateTimeFormat(s,i){n.mergeDateTimeFormat(s,i)},n(...s){return Reflect.apply(n.n,n,[...s])},getNumberFormat(s){return n.getNumberFormat(s)},setNumberFormat(s,i){n.setNumberFormat(s,i)},mergeNumberFormat(s,i){n.mergeNumberFormat(s,i)},getChoiceIndex(s,i){return-1}};return o.__extender=r,o}}const xo={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e==="parent"||e==="global",default:"parent"},i18n:{type:Object}};function y_({slots:e},t){return t.length===1&&t[0]==="default"?(e.default?e.default():[]).reduce((r,o)=>[...r,...o.type===Qe?o.children:[o]],[]):t.reduce((n,r)=>{const o=e[r];return o&&(n[r]=o()),n},{})}function wc(e){return Qe}const O_=Qn({name:"i18n-t",props:we({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>Re(e)||!isNaN(e)}},xo),setup(e,t){const{slots:n,attrs:r}=t,o=e.i18n||Fo({useScope:e.scope,__useComponent:!0});return()=>{const s=Object.keys(n).filter(h=>h!=="_"),i={};e.locale&&(i.locale=e.locale),e.plural!==void 0&&(i.plural=H(e.plural)?+e.plural:e.plural);const l=y_(t,s),a=o[Vs](e.keypath,l,i),f=we({},r),d=H(e.tag)||ce(e.tag)?e.tag:wc();return Wr(d,f,a)}}}),yl=O_;function T_(e){return ge(e)&&!H(e[0])}function kc(e,t,n,r){const{slots:o,attrs:s}=t;return()=>{const i={part:!0};let l={};e.locale&&(i.locale=e.locale),H(e.format)?i.key=e.format:ce(e.format)&&(H(e.format.key)&&(i.key=e.format.key),l=Object.keys(e.format).reduce((m,b)=>n.includes(b)?we({},m,{[b]:e.format[b]}):m,{}));const a=r(e.value,i,l);let f=[i.key];ge(a)?f=a.map((m,b)=>{const y=o[m.type],S=y?y({[m.type]:m.value,index:b,parts:a}):[m.value];return T_(S)&&(S[0].key=`${m.type}-${b}`),S}):H(a)&&(f=[a]);const d=we({},s),h=H(e.tag)||ce(e.tag)?e.tag:wc();return Wr(h,d,f)}}const v_=Qn({name:"i18n-n",props:we({value:{type:Number,required:!0},format:{type:[String,Object]}},xo),setup(e,t){const n=e.i18n||Fo({useScope:"parent",__useComponent:!0});return kc(e,t,Nc,(...r)=>n[Ys](...r))}}),Ol=v_,S_=Qn({name:"i18n-d",props:we({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},xo),setup(e,t){const n=e.i18n||Fo({useScope:"parent",__useComponent:!0});return kc(e,t,Sc,(...r)=>n[Ks](...r))}}),Tl=S_;function N_(e,t){const n=e;if(e.mode==="composition")return n.__getInstance(t)||e.global;{const r=n.__getInstance(t);return r!=null?r.__composer:e.global.__composer}}function R_(e){const t=i=>{const{instance:l,modifiers:a,value:f}=i;if(!l||!l.$)throw Ie(Ae.UNEXPECTED_ERROR);const d=N_(e,l.$),h=vl(f);return[Reflect.apply(d.t,d,[...Sl(h)]),d]};return{created:(i,l)=>{const[a,f]=t(l);Us&&e.global===f&&(i.__i18nWatcher=Ft(f.locale,()=>{l.instance&&l.instance.$forceUpdate()})),i.__composer=f,i.textContent=a},unmounted:i=>{Us&&i.__i18nWatcher&&(i.__i18nWatcher(),i.__i18nWatcher=void 0,delete i.__i18nWatcher),i.__composer&&(i.__composer=void 0,delete i.__composer)},beforeUpdate:(i,{value:l})=>{if(i.__composer){const a=i.__composer,f=vl(l);i.textContent=Reflect.apply(a.t,a,[...Sl(f)])}},getSSRProps:i=>{const[l]=t(i);return{textContent:l}}}}function vl(e){if(H(e))return{path:e};if(J(e)){if(!("path"in e))throw Ie(Ae.REQUIRED_VALUE,"path");return e}else throw Ie(Ae.INVALID_VALUE)}function Sl(e){const{path:t,locale:n,args:r,choice:o,plural:s}=e,i={},l=r||{};return H(n)&&(i.locale=n),Re(o)&&(i.plural=o),Re(s)&&(i.plural=s),[t,l,i]}function A_(e,t,...n){const r=J(n[0])?n[0]:{},o=!!r.useI18nComponentName;(ee(r.globalInstall)?r.globalInstall:!0)&&([o?"i18n":yl.name,"I18nT"].forEach(i=>e.component(i,yl)),[Ol.name,"I18nN"].forEach(i=>e.component(i,Ol)),[Tl.name,"I18nD"].forEach(i=>e.component(i,Tl))),e.directive("t",R_(t))}function L_(e,t,n){return{beforeCreate(){const r=Bn();if(!r)throw Ie(Ae.UNEXPECTED_ERROR);const o=this.$options;if(o.i18n){const s=o.i18n;if(o.__i18n&&(s.__i18n=o.__i18n),s.__root=t,this===this.$root)this.$i18n=Nl(e,s);else{s.__injectWithOption=!0,s.__extender=n.__vueI18nExtend,this.$i18n=qs(s);const i=this.$i18n;i.__extender&&(i.__disposer=i.__extender(this.$i18n))}}else if(o.__i18n)if(this===this.$root)this.$i18n=Nl(e,o);else{this.$i18n=qs({__i18n:o.__i18n,__injectWithOption:!0,__extender:n.__vueI18nExtend,__root:t});const s=this.$i18n;s.__extender&&(s.__disposer=s.__extender(this.$i18n))}else this.$i18n=e;o.__i18nGlobal&&Ic(t,o,o),this.$t=(...s)=>this.$i18n.t(...s),this.$rt=(...s)=>this.$i18n.rt(...s),this.$tc=(...s)=>this.$i18n.tc(...s),this.$te=(s,i)=>this.$i18n.te(s,i),this.$d=(...s)=>this.$i18n.d(...s),this.$n=(...s)=>this.$i18n.n(...s),this.$tm=s=>this.$i18n.tm(s),n.__setInstance(r,this.$i18n)},mounted(){},unmounted(){const r=Bn();if(!r)throw Ie(Ae.UNEXPECTED_ERROR);const o=this.$i18n;delete this.$t,delete this.$rt,delete this.$tc,delete this.$te,delete this.$d,delete this.$n,delete this.$tm,o.__disposer&&(o.__disposer(),delete o.__disposer,delete o.__extender),n.__deleteInstance(r),delete this.$i18n}}}function Nl(e,t){e.locale=t.locale||e.locale,e.fallbackLocale=t.fallbackLocale||e.fallbackLocale,e.missing=t.missing||e.missing,e.silentTranslationWarn=t.silentTranslationWarn||e.silentFallbackWarn,e.silentFallbackWarn=t.silentFallbackWarn||e.silentFallbackWarn,e.formatFallbackMessages=t.formatFallbackMessages||e.formatFallbackMessages,e.postTranslation=t.postTranslation||e.postTranslation,e.warnHtmlInMessage=t.warnHtmlInMessage||e.warnHtmlInMessage,e.escapeParameterHtml=t.escapeParameterHtml||e.escapeParameterHtml,e.sync=t.sync||e.sync,e.__composer[Lc](t.pluralizationRules||e.pluralizationRules);const n=Zr(e.locale,{messages:t.messages,__i18n:t.__i18n});return Object.keys(n).forEach(r=>e.mergeLocaleMessage(r,n[r])),t.datetimeFormats&&Object.keys(t.datetimeFormats).forEach(r=>e.mergeDateTimeFormat(r,t.datetimeFormats[r])),t.numberFormats&&Object.keys(t.numberFormats).forEach(r=>e.mergeNumberFormat(r,t.numberFormats[r])),e}const C_=Ut("global-vue-i18n");function og(e={},t){const n=__VUE_I18N_LEGACY_API__&&ee(e.legacy)?e.legacy:__VUE_I18N_LEGACY_API__,r=ee(e.globalInjection)?e.globalInjection:!0,o=__VUE_I18N_LEGACY_API__&&n?!!e.allowComposition:!0,s=new Map,[i,l]=P_(e,n),a=Ut("");function f(m){return s.get(m)||null}function d(m,b){s.set(m,b)}function h(m){s.delete(m)}{const m={get mode(){return __VUE_I18N_LEGACY_API__&&n?"legacy":"composition"},get allowComposition(){return o},async install(b,...y){if(b.__VUE_I18N_SYMBOL__=a,b.provide(b.__VUE_I18N_SYMBOL__,m),J(y[0])){const g=y[0];m.__composerExtend=g.__composerExtend,m.__vueI18nExtend=g.__vueI18nExtend}let S=null;!n&&r&&(S=$_(b,m.global)),__VUE_I18N_FULL_INSTALL__&&A_(b,m,...y),__VUE_I18N_LEGACY_API__&&n&&b.mixin(L_(l,l.__composer,m));const A=b.unmount;b.unmount=()=>{S&&S(),m.dispose(),A()}},get global(){return l},dispose(){i.stop()},__instances:s,__getInstance:f,__setInstance:d,__deleteInstance:h};return m}}function Fo(e={}){const t=Bn();if(t==null)throw Ie(Ae.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw Ie(Ae.NOT_INSTALLED);const n=I_(t),r=k_(n),o=Pc(t),s=w_(e,o);if(__VUE_I18N_LEGACY_API__&&n.mode==="legacy"&&!e.__useComponent){if(!n.allowComposition)throw Ie(Ae.NOT_AVAILABLE_IN_LEGACY_MODE);return D_(t,s,r,e)}if(s==="global")return Ic(r,e,o),r;if(s==="parent"){let a=x_(n,t,e.__useComponent);return a==null&&(a=r),a}const i=n;let l=i.__getInstance(t);if(l==null){const a=we({},e);"__i18n"in o&&(a.__i18n=o.__i18n),r&&(a.__root=r),l=ko(a),i.__composerExtend&&(l[Gs]=i.__composerExtend(l)),M_(i,t,l),i.__setInstance(t,l)}return l}function P_(e,t,n){const r=to();{const o=__VUE_I18N_LEGACY_API__&&t?r.run(()=>qs(e)):r.run(()=>ko(e));if(o==null)throw Ie(Ae.UNEXPECTED_ERROR);return[r,o]}}function I_(e){{const t=st(e.isCE?C_:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw Ie(e.isCE?Ae.NOT_INSTALLED_WITH_PROVIDE:Ae.UNEXPECTED_ERROR);return t}}function w_(e,t){return zr(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function k_(e){return e.mode==="composition"?e.global:e.global.__composer}function x_(e,t,n=!1){let r=null;const o=t.root;let s=F_(t,n);for(;s!=null;){const i=e;if(e.mode==="composition")r=i.__getInstance(s);else if(__VUE_I18N_LEGACY_API__){const l=i.__getInstance(s);l!=null&&(r=l.__composer,n&&r&&!r[Cc]&&(r=null))}if(r!=null||o===s)break;s=s.parent}return r}function F_(e,t=!1){return e==null?null:t&&e.vnode.ctx||e.parent}function M_(e,t,n){ua(()=>{},t),fo(()=>{const r=n;e.__deleteInstance(t);const o=r[Gs];o&&(o(),delete r[Gs])},t)}function D_(e,t,n,r={}){const o=t==="local",s=Xl(null);if(o&&e.proxy&&!(e.proxy.$options.i18n||e.proxy.$options.__i18n))throw Ie(Ae.MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION);const i=ee(r.inheritLocale)?r.inheritLocale:!H(r.locale),l=qe(!o||i?n.locale.value:H(r.locale)?r.locale:_n),a=qe(!o||i?n.fallbackLocale.value:H(r.fallbackLocale)||ge(r.fallbackLocale)||J(r.fallbackLocale)||r.fallbackLocale===!1?r.fallbackLocale:l.value),f=qe(Zr(l.value,r)),d=qe(J(r.datetimeFormats)?r.datetimeFormats:{[l.value]:{}}),h=qe(J(r.numberFormats)?r.numberFormats:{[l.value]:{}}),m=o?n.missingWarn:ee(r.missingWarn)||Dt(r.missingWarn)?r.missingWarn:!0,b=o?n.fallbackWarn:ee(r.fallbackWarn)||Dt(r.fallbackWarn)?r.fallbackWarn:!0,y=o?n.fallbackRoot:ee(r.fallbackRoot)?r.fallbackRoot:!0,S=!!r.fallbackFormat,A=de(r.missing)?r.missing:null,g=de(r.postTranslation)?r.postTranslation:null,v=o?n.warnHtmlMessage:ee(r.warnHtmlMessage)?r.warnHtmlMessage:!0,L=!!r.escapeParameter,T=o?n.modifiers:J(r.modifiers)?r.modifiers:{},k=r.pluralRules||o&&n.pluralRules;function M(){return[l.value,a.value,f.value,d.value,h.value]}const I=Oe({get:()=>s.value?s.value.locale.value:l.value,set:u=>{s.value&&(s.value.locale.value=u),l.value=u}}),V=Oe({get:()=>s.value?s.value.fallbackLocale.value:a.value,set:u=>{s.value&&(s.value.fallbackLocale.value=u),a.value=u}}),K=Oe(()=>s.value?s.value.messages.value:f.value),te=Oe(()=>d.value),fe=Oe(()=>h.value);function ae(){return s.value?s.value.getPostTranslationHandler():g}function me(u){s.value&&s.value.setPostTranslationHandler(u)}function je(){return s.value?s.value.getMissingHandler():A}function Ce(u){s.value&&s.value.setMissingHandler(u)}function z(u){return M(),u()}function se(...u){return s.value?z(()=>Reflect.apply(s.value.t,null,[...u])):z(()=>"")}function ne(...u){return s.value?Reflect.apply(s.value.rt,null,[...u]):""}function Ee(...u){return s.value?z(()=>Reflect.apply(s.value.d,null,[...u])):z(()=>"")}function Me(...u){return s.value?z(()=>Reflect.apply(s.value.n,null,[...u])):z(()=>"")}function xe(u){return s.value?s.value.tm(u):{}}function ve(u,p){return s.value?s.value.te(u,p):!1}function Xe(u){return s.value?s.value.getLocaleMessage(u):{}}function Ke(u,p){s.value&&(s.value.setLocaleMessage(u,p),f.value[u]=p)}function pt(u,p){s.value&&s.value.mergeLocaleMessage(u,p)}function ye(u){return s.value?s.value.getDateTimeFormat(u):{}}function C(u,p){s.value&&(s.value.setDateTimeFormat(u,p),d.value[u]=p)}function j(u,p){s.value&&s.value.mergeDateTimeFormat(u,p)}function U(u){return s.value?s.value.getNumberFormat(u):{}}function W(u,p){s.value&&(s.value.setNumberFormat(u,p),h.value[u]=p)}function Z(u,p){s.value&&s.value.mergeNumberFormat(u,p)}const _={get id(){return s.value?s.value.id:-1},locale:I,fallbackLocale:V,messages:K,datetimeFormats:te,numberFormats:fe,get inheritLocale(){return s.value?s.value.inheritLocale:i},set inheritLocale(u){s.value&&(s.value.inheritLocale=u)},get availableLocales(){return s.value?s.value.availableLocales:Object.keys(f.value)},get modifiers(){return s.value?s.value.modifiers:T},get pluralRules(){return s.value?s.value.pluralRules:k},get isGlobal(){return s.value?s.value.isGlobal:!1},get missingWarn(){return s.value?s.value.missingWarn:m},set missingWarn(u){s.value&&(s.value.missingWarn=u)},get fallbackWarn(){return s.value?s.value.fallbackWarn:b},set fallbackWarn(u){s.value&&(s.value.missingWarn=u)},get fallbackRoot(){return s.value?s.value.fallbackRoot:y},set fallbackRoot(u){s.value&&(s.value.fallbackRoot=u)},get fallbackFormat(){return s.value?s.value.fallbackFormat:S},set fallbackFormat(u){s.value&&(s.value.fallbackFormat=u)},get warnHtmlMessage(){return s.value?s.value.warnHtmlMessage:v},set warnHtmlMessage(u){s.value&&(s.value.warnHtmlMessage=u)},get escapeParameter(){return s.value?s.value.escapeParameter:L},set escapeParameter(u){s.value&&(s.value.escapeParameter=u)},t:se,getPostTranslationHandler:ae,setPostTranslationHandler:me,getMissingHandler:je,setMissingHandler:Ce,rt:ne,d:Ee,n:Me,tm:xe,te:ve,getLocaleMessage:Xe,setLocaleMessage:Ke,mergeLocaleMessage:pt,getDateTimeFormat:ye,setDateTimeFormat:C,mergeDateTimeFormat:j,getNumberFormat:U,setNumberFormat:W,mergeNumberFormat:Z};function c(u){u.locale.value=l.value,u.fallbackLocale.value=a.value,Object.keys(f.value).forEach(p=>{u.mergeLocaleMessage(p,f.value[p])}),Object.keys(d.value).forEach(p=>{u.mergeDateTimeFormat(p,d.value[p])}),Object.keys(h.value).forEach(p=>{u.mergeNumberFormat(p,h.value[p])}),u.escapeParameter=L,u.fallbackFormat=S,u.fallbackRoot=y,u.fallbackWarn=b,u.missingWarn=m,u.warnHtmlMessage=v}return ca(()=>{if(e.proxy==null||e.proxy.$i18n==null)throw Ie(Ae.NOT_AVAILABLE_COMPOSITION_IN_LEGACY);const u=s.value=e.proxy.$i18n.__composer;t==="global"?(l.value=u.locale.value,a.value=u.fallbackLocale.value,f.value=u.messages.value,d.value=u.datetimeFormats.value,h.value=u.numberFormats.value):o&&c(u)}),_}const U_=["locale","fallbackLocale","availableLocales"],Rl=["t","rt","d","n","tm","te"];function $_(e,t){const n=Object.create(null);return U_.forEach(o=>{const s=Object.getOwnPropertyDescriptor(t,o);if(!s)throw Ie(Ae.UNEXPECTED_ERROR);const i=Te(s.value)?{get(){return s.value.value},set(l){s.value.value=l}}:{get(){return s.get&&s.get()}};Object.defineProperty(n,o,i)}),e.config.globalProperties.$i18n=n,Rl.forEach(o=>{const s=Object.getOwnPropertyDescriptor(t,o);if(!s||!s.value)throw Ie(Ae.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${o}`,s)}),()=>{delete e.config.globalProperties.$i18n,Rl.forEach(o=>{delete e.config.globalProperties[`$${o}`]})}}__();__INTLIFY_JIT_COMPILATION__?ol(u_):ol(c_);n_(Dp);r_(mc);if(__INTLIFY_PROD_DEVTOOLS__){const e=Et();e.__INTLIFY__=!0,Yp(e.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}export{ng as A,eg as E,Qe as F,fh as _,po as a,V_ as b,_f as c,Z_ as d,W_ as e,G_ as f,H_ as g,$e as h,Cu as i,gf as j,K_ as k,yf as l,z_ as m,J_ as n,Ea as o,eo as p,X_ as q,B_ as r,rg as s,j_ as t,sg as u,Y_ as v,q_ as w,Q_ as x,og as y}; ================================================ FILE: public/vite-test/manifest-assets.json ================================================ {} ================================================ FILE: public/vite-test/manifest.json ================================================ { "_vue-i18n-6b73e0ca.js": { "file": "assets/vue-i18n-6b73e0ca.js" }, "entrypoints/admin.js": { "file": "assets/admin-ebb17751.js", "imports": [ "_vue-i18n-6b73e0ca.js" ], "isEntry": true, "src": "entrypoints/admin.js" }, "entrypoints/front.js": { "file": "assets/front-f6acb49a.js", "imports": [ "_vue-i18n-6b73e0ca.js" ], "isEntry": true, "src": "entrypoints/front.js" } } ================================================ FILE: storage/.keep ================================================ ================================================ FILE: test/application_system_test_case.rb ================================================ require "test_helper" class ApplicationSystemTestCase < ActionDispatch::SystemTestCase driven_by :selenium, using: :chrome, screen_size: [1400, 1400] end ================================================ FILE: test/controllers/.keep ================================================ ================================================ FILE: test/fixtures/files/.keep ================================================ ================================================ FILE: test/helpers/.keep ================================================ ================================================ FILE: test/javascript/app.test.js ================================================ const chai = require('chai') const expect = chai.expect describe('first test', () => { it('is true', () => { expect(true).to.equal(true) }) }) ================================================ FILE: test/mailers/.keep ================================================ ================================================ FILE: test/models/.keep ================================================ ================================================ FILE: test/system/.keep ================================================ ================================================ FILE: test/test_helper.rb ================================================ require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' ENV['RAILS_ENV'] ||= 'test' require 'rails/test_help' require 'rack/test' require 'capybara/rails' require 'minitest' require 'minitest/rails' require 'minitest-metadata' require 'capybara/email' require 'json-schema' include Rails.application.routes.url_helpers include ActionDispatch::TestProcess include Warden::Test::Helpers Rails.logger.level = 5 Dir[Rails.root.join('test/support/**/*.rb')].each { |f| require f } class ActiveSupport::TestCase parallelize(workers: 1) ActiveJob::Base.queue_adapter = :test fixtures :all self.use_transactional_tests = true def json_response JSON.parse(response.body) end end class ActionController::TestCase include Rails.application.routes.url_helpers include Devise::Test::ControllerHelpers include ActionCable::TestHelper self.use_transactional_tests = true Capybara.default_driver = :headless_chrome Capybara.javascript_driver = :headless_chrome Capybara.default_max_wait_time = 5 # seconds end class ActionDispatch::IntegrationTest include ResponseAssertions include Devise::Test::IntegrationHelpers include Rails.application.routes.url_helpers Capybara.register_driver :headless_chrome do |app| Capybara::Selenium::Driver.new(app, browser: :chrome) end Capybara.configure do |config| config.default_max_wait_time = 5 # seconds config.default_driver = :headless_chrome config.javascript_driver = :headless_chrome end end ================================================ FILE: tmp/.keep ================================================ ================================================ FILE: vendor/.keep ================================================ ================================================ FILE: vendor/javascript/.keep ================================================ ================================================ FILE: vite.config.ts ================================================ import { defineConfig } from 'vite' import RubyPlugin from 'vite-plugin-ruby' import Vue from '@vitejs/plugin-vue' import AutoImport from 'unplugin-auto-import/vite' export default defineConfig({ plugins: [ AutoImport({ // targets to transform include: [ /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx /\.vue$/, /\.vue\?vue/, // .vue /\.md$/, // .md ], imports: [ 'vue', 'vue-router', 'vue-i18n' ] }), RubyPlugin(), Vue() ], server: { hmr: { port: 3036 }, } })