From 3c99e5a35cc974d70147d71453361cbb3eefadad Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Thu, 12 Sep 2024 17:15:48 +0200 Subject: [PATCH 01/65] [mpd] Set protocol version back 0.20.0 Announcing 0.22.4 without supporting the newer protocol's filters breaks Rigelian --- src/mpd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mpd.c b/src/mpd.c index d7acdd70..50c02b7c 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -4615,7 +4615,7 @@ mpd_accept_conn_cb(struct evconnlistener *listener, * According to the mpd protocol send "OK MPD \n" to the client, where version is the version * of the supported mpd protocol and not the server version. */ - evbuffer_add(bufferevent_get_output(bev), "OK MPD 0.22.4\n", 14); + evbuffer_add(bufferevent_get_output(bev), "OK MPD 0.20.0\n", 14); client_ctx->evbuffer = bufferevent_get_output(bev); DPRINTF(E_INFO, L_MPD, "New mpd client connection accepted\n"); From 1bee7e0d4b3ec8b57e8426f5a4c29684e6a3ccb6 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Thu, 12 Sep 2024 17:21:51 +0200 Subject: [PATCH 02/65] ChangeLog for OwnTone 28.10 --- ChangeLog | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ChangeLog b/ChangeLog index 1df24e65..b1c587b2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,26 @@ ChangeLog for OwnTone --------------------- +version 28.10 + - fix: playlist scanner ignoring lines starting with non-ascii chars + - fix: last seconds of a track sometimes being skipped + - fix: Apple Music password-based auth + - fix: missing file scan when modified multiple times within a second + - fix: Roku M1001 crash + - fix: speakers changing IP addresses (error "Got RR type A size 16") + - fix: playlist rename not registered + - fix: problems with DAAP and old dates ("Integer value too large") + - fix: compability with ffmpeg 7 (fixes build error) + - web UI: many smaller improvements, e.g. sort by release date + - web UI: traditional Chinese translation + - new: ALAC transcoding for RSP/DAAP streaming + - new: ability to save id3 metadata + - config: change "trusted_networks" to have new value "lan" as default + - config: new option to announce a MPD httpd plugin (stream from server) + - config: set ipv6 to disabled by default due to unknown Airplay issue + - config: deprecate "cache_path", replaced by "cache_dir" + - dependency: libxml2 instead of mxml + version 28.9 - web UI improvements: display lyrics metadata From e9485d34ae2674c63b801d2f4b66a0e3fcc2b21a Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Thu, 12 Sep 2024 17:23:08 +0200 Subject: [PATCH 03/65] Bump to version 28.10 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index e387c9dd..7a71f7bf 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.60]) -AC_INIT([owntone], [28.9]) +AC_INIT([owntone], [28.10]) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_MACRO_DIR([m4]) From e1628ff1a9b1bca6cf6fd4390ba2ad7c38d29442 Mon Sep 17 00:00:00 2001 From: gd Date: Wed, 17 May 2023 19:47:25 +0300 Subject: [PATCH 04/65] [mpd,db] MPD protocol fixes to handling of idle/noidle command and command list. Command handling: 1. Changed mpd_read_cb() to delegate to mpd_process_line() for each received command line. 2. mpd_process_line() handles idle state and command list state and delegates to mpd_process_command() to handle each command line. If the command was successful it sends OK to the client according the the command list state. Error responses are sent by mpd_process_command(). 3. mpd_process_command() parses the args and delegates to the individual command handler. mpd_input_filter: 1. Removed handling of command lists. They are handled by mpd_process_line(). 2. Return BEV_OK if there's at least one complete line of input even if there's more data in the input buffer. Idle/noidle: 1. Changed mpd_command_idle() to never write OK to the output buffer. Instead it is the responsibility of the caller to decide on the response. 2. Removed mpd_command_noidle() instead it is handled in mpd_process_line(). If the client is not in idle state noidle is ignored (no response sent) If the client is in idle state then it changes idle state to false and sends OK as the response to the idle command. Command lists: 1. Added command list state to the client context so commands in the list are buffered and only executed after receiving command_list_end. Connection state: 1. Added is_closing flag in the client context to ignore messages received after freeing the events buffer in intent to close the client connection. Command arguments parsing: 1. Updated COMMAND_ARGV_MAX to 70 to match current MPD. 2. Changed mpd_pars_range_arg to handle open-ended range. Command pause: 1. pause is ignored in stopped state instead returning error. Command move: 1. Changed mpd_command_move() to support moving a range. 2. Added db_queue_move_bypos_range() to support moving a range. Command password: 1. Password authentication flag set in handler mpd_command_password() instead of in command processor. Config: 1. Added config value: "max_command_list_size". The maximum allowed size of buffered commands in command list. --- owntone.conf.in | 5 + src/conffile.c | 1 + src/db.c | 59 ++++ src/db.h | 3 + src/mpd.c | 827 ++++++++++++++++++++++++++++++++---------------- 5 files changed, 624 insertions(+), 271 deletions(-) diff --git a/owntone.conf.in b/owntone.conf.in index 8f44e30a..06e6b7ac 100644 --- a/owntone.conf.in +++ b/owntone.conf.in @@ -441,6 +441,11 @@ mpd { # Whether to emit an output with plugin type "httpd" to tell clients # that a stream is available for local playback. # enable_httpd_plugin = false + + # The maximum size of a command list in KB. + # It is the sum of lengths of all the command lines between command list begin and end. + # Default is 2048 (2 MiB). +# max_command_list_size = KBYTES } # SQLite configuration (allows to modify the operation of the SQLite databases) diff --git a/src/conffile.c b/src/conffile.c index da49f03d..31dbe6f4 100644 --- a/src/conffile.c +++ b/src/conffile.c @@ -239,6 +239,7 @@ static cfg_opt_t sec_mpd[] = CFG_INT("port", 6600, CFGF_NONE), CFG_INT("http_port", 0, CFGF_NONE), CFG_BOOL("enable_httpd_plugin", cfg_false, CFGF_NONE), + CFG_INT("max_command_list_size", 2048, CFGF_NONE), CFG_BOOL("clear_queue_on_stop_disable", cfg_false, CFGF_NODEFAULT | CFGF_DEPRECATED), CFG_BOOL("allow_modifying_stored_playlists", cfg_false, CFGF_NODEFAULT | CFGF_DEPRECATED), CFG_STR("default_playlist_directory", NULL, CFGF_NODEFAULT | CFGF_DEPRECATED), diff --git a/src/db.c b/src/db.c index 0dc32c38..0c8c70b2 100644 --- a/src/db.c +++ b/src/db.c @@ -6002,6 +6002,65 @@ db_queue_move_bypos(int pos_from, int pos_to) return ret; } +int +db_queue_move_bypos_range(int range_begin, int range_end, int pos_to) +{ + int queue_version; + char *query; + int ret; + int changes = 0; + + queue_version = queue_transaction_begin(); + + int count = range_end - range_begin; + int update_begin = MIN(range_begin, pos_to); + int update_end = MAX(range_begin + count, pos_to + count); + int cut_off, offset_up, offset_down; + + if (range_begin < pos_to) { + cut_off = range_begin + count; + offset_up = pos_to - range_begin; + offset_down = count; + } else { + cut_off = range_begin; + offset_up = count; + offset_down = range_begin - pos_to; + } + + DPRINTF(E_DBG, L_DB, "db_queue_move_bypos_range: from = %d, to = %d," + " count = %d, cut_off = %d, offset_up = %d, offset_down = %d," + " begin = %d, end = %d\n", + range_begin, pos_to, count, cut_off, offset_up, offset_down, update_begin, update_end); + + query = "UPDATE queue SET pos =" + " CASE" + " WHEN pos < :cut_off THEN pos + :offset_up" + " ELSE pos - :offset_down" + " END," + " queue_version = :queue_version" + " WHERE" + " pos >= :update_begin AND pos < :update_end;"; + + sqlite3_stmt *stmt; + if (SQLITE_OK != (ret = sqlite3_prepare_v2(hdl, query, -1, &stmt, NULL))) goto end_transaction; + + if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 1, cut_off))) goto end_transaction; + if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 2, offset_up))) goto end_transaction; + if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 3, offset_down))) goto end_transaction; + if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 4, queue_version))) goto end_transaction; + if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 5, update_begin))) goto end_transaction; + if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 6, update_end))) goto end_transaction; + + changes = db_statement_run(stmt, 0); + + end_transaction: + DPRINTF(E_LOG, L_DB, "db_queue_move_bypos_range: changes = %d, res = %d: %s\n", + changes, ret, sqlite3_errstr(ret)); + queue_transaction_end(ret, queue_version); + + return ret == SQLITE_OK && changes != -1 ? 0 : -1; +} + /* * Moves the queue item at the given position to the given target position. The positions * are relavtive to the given base item (item id). diff --git a/src/db.h b/src/db.h index 7b3cf631..ef0663f3 100644 --- a/src/db.h +++ b/src/db.h @@ -955,6 +955,9 @@ db_queue_move_byitemid(uint32_t item_id, int pos_to, char shuffle); int db_queue_move_bypos(int pos_from, int pos_to); +int +db_queue_move_bypos_range(int range_begin, int range_end, int pos_to); + int db_queue_move_byposrelativetoitem(uint32_t from_pos, uint32_t to_offset, uint32_t item_id, char shuffle); diff --git a/src/mpd.c b/src/mpd.c index 50c02b7c..5538d2bd 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -30,10 +30,6 @@ #include #include #include -#include -#include -#include -#include #include #include @@ -43,7 +39,6 @@ #include #include - #include "artwork.h" #include "commands.h" #include "conffile.h" @@ -85,7 +80,40 @@ static bool mpd_plugin_httpd; static char *default_pl_dir; static bool allow_modifying_stored_playlists; -#define COMMAND_ARGV_MAX 37 + +/** + * from MPD source: + * * + * * The most we ever use is for search/find, and that limits it to the + * * number of tags we can have. Add one for the command, and one extra + * * to catch errors clients may send us + * * + * static constexpr std::size_t COMMAND_ARGV_MAX = 2 + TAG_NUM_OF_ITEM_TYPES * 2; + * + * https://github.com/MusicPlayerDaemon/MPD/blob/master/src/command/AllCommands.cxx + */ +#define COMMAND_ARGV_MAX 70 + +/** + * config: + * max_command_list_size KBYTES + * The maximum size a command list. Default is 2048 (2 MiB). + * + * https://github.com/MusicPlayerDaemon/MPD/blob/master/src/client/Config.cxx + */ +#define CLIENT_MAX_COMMAND_LIST_DEFAULT (2048*1024) + +static struct { + /** + * Max size in bytes allowed in command list. + * "max_command_list_size" + */ + uint32_t MaxCommandListSize; +} +Config = { + .MaxCommandListSize = CLIENT_MAX_COMMAND_LIST_DEFAULT +}; + /* MPD error codes (taken from ack.h) */ enum ack @@ -105,6 +133,9 @@ enum ack ACK_ERROR_EXIST = 56, }; +/** + * Flag for command list state + */ enum command_list_type { COMMAND_LIST = 1, @@ -237,6 +268,36 @@ struct mpd_client_ctx // The output buffer for the client (used to send data to the client) struct evbuffer *evbuffer; + /** + * command list type flag: + * is set to: + * COMMAND_LIST_NONE by default and when receiving command_list_end + * COMMAND_LIST when receiving command_list_begin + * COMMAND_OK_LIST when receiving command_list_ok_begin + */ + enum command_list_type cmd_list_type; + + /** + * current command list: + *

+ * When cmd_list_type is either COMMAND_LIST or COMMAND_OK_LIST + * received commands are added to this buffer. + *

+ * When command_list_end is received, the commands save + * in this buffer are processed, and then the buffer is freed. + * + * @see mpd_command_list_add + */ + struct evbuffer *cmd_list_buffer; + + /** + * closing flag + * + * set to true in mpd_read_cb() when we want to close + * the client connection by freeing the evbuffer. + */ + bool is_closing; + struct mpd_client_ctx *next; }; @@ -253,6 +314,11 @@ free_mpd_client_ctx(void *ctx) if (!client_ctx) return; + if (client_ctx->cmd_list_buffer != NULL) + { + evbuffer_free(client_ctx->cmd_list_buffer); + } + client = mpd_clients; prev = NULL; @@ -368,31 +434,50 @@ mpd_time(char *buffer, size_t bufferlen, time_t t) * * @param range the range argument * @param start_pos set by this method to the start position - * @param end_pos set by this method to the end postion + * @param end_pos set by this method to the end position * @return 0 on success, -1 on failure + * + * @see https://github.com/MusicPlayerDaemon/MPD/blob/master/src/protocol/RangeArg.hxx + * + * For "window START:END" The end index can be omitted, which means the range is open-ended. */ static int -mpd_pars_range_arg(char *range, int *start_pos, int *end_pos) +mpd_pars_range_arg(const char *range, int *start_pos, int *end_pos) { int ret; - if (strchr(range, ':')) + static char separator = ':'; + char* sep_pos = strchr(range, separator); + + if (sep_pos) { - ret = sscanf(range, "%d:%d", start_pos, end_pos); - if (ret < 0) - { - DPRINTF(E_LOG, L_MPD, "Error parsing range argument '%s' (return code = %d)\n", range, ret); - return -1; - } + *sep_pos++ = '\0'; + // range start + if (safe_atoi32(range, start_pos) != 0) + { + DPRINTF(E_LOG, L_MPD, "Error parsing range argument '%s'\n", range); + return -1; + } + // range end + if (*sep_pos == 0) + { + DPRINTF(E_LOG, L_MPD, "Open ended range not supported: '%s'\n", range); + return -1; + } + else if (safe_atoi32(sep_pos, end_pos) != 0) + { + DPRINTF(E_LOG, L_MPD, "Error parsing range argument '%s'\n", range); + return -1; + } } else { ret = safe_atoi32(range, start_pos); if (ret < 0) - { - DPRINTF(E_LOG, L_MPD, "Error parsing integer argument '%s' (return code = %d)\n", range, ret); - return -1; - } + { + DPRINTF(E_LOG, L_MPD, "Error parsing integer argument '%s' (return code = %d)\n", range, ret); + return -1; + } *end_pos = (*start_pos) + 1; } @@ -468,53 +553,8 @@ mpd_pars_quoted(char **input) } /* - * Parses the argument string into an array of strings. - * Arguments are seperated by a whitespace character and may be wrapped in double quotes. - * - * @param args the arguments - * @param argc the number of arguments in the argument string - * @param argv the array containing the found arguments - */ -static int -mpd_parse_args(char *args, int *argc, char **argv, int argvsz) -{ - char *input; - - input = args; - *argc = 0; - - while (*input != 0 && *argc < argvsz) - { - // Ignore whitespace characters - if (*input == ' ') - { - input++; - continue; - } - - // Check if the parameter is wrapped in double quotes - if (*input == '"') - { - argv[*argc] = mpd_pars_quoted(&input); - if (argv[*argc] == NULL) - { - return -1; - } - *argc = *argc + 1; - } - else - { - argv[*argc] = mpd_pars_unquoted(&input); - *argc = *argc + 1; - } - } - - return 0; -} - -/* - * Adds the informations (path, id, tags, etc.) for the given song to the given buffer - * with additional information for the position of this song in the playqueue. + * Adds the information (path, id, tags, etc.) for the given song to the given buffer + * with additional information for the position of this song in the player queue. * * Example output: * file: foo/bar/song.mp3 @@ -585,7 +625,7 @@ mpd_add_db_queue_item(struct evbuffer *evbuf, struct db_queue_item *queue_item) } /* - * Adds the informations (path, id, tags, etc.) for the given song to the given buffer. + * Adds the information (path, id, tags, etc.) for the given song to the given buffer. * * Example output: * file: foo/bar/song.mp3 @@ -685,7 +725,7 @@ append_string(char **a, const char *b, const char *separator) * * @param argc Number of arguments in argv * @param argv Pointer to the first filter parameter - * @param exact_match If true, creates filter for exact matches (e. g. find command) otherwise matches substrings (e. g. search command) + * @param exact_match If true, creates filter for exact matches (e.g. find command) otherwise matches substrings (e.g. search command) * @param qp Query parameters */ static int @@ -930,29 +970,13 @@ mpd_command_idle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s // If events the client listens to occurred since the last idle call (or since the client connected, // if it is the first idle call), notify immediately. if (ctx->events & ctx->idle_events) - mpd_notify_idle_client(ctx, ctx->events); + { + mpd_notify_idle_client(ctx, ctx->events); + } return 0; } -static int -mpd_command_noidle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) -{ - /* - * The protocol specifies: "The idle command can be canceled by - * sending the command noidle (no other commands are allowed). MPD - * will then leave idle mode and print results immediately; might be - * empty at this time." - */ - if (ctx->events) - mpd_notify_idle_client(ctx, ctx->events); - else - evbuffer_add(ctx->evbuffer, "OK\n", 3); - - ctx->is_idle = false; - return 0; -} - /* * Command handler function for 'status' * @@ -1344,27 +1368,23 @@ mpd_command_pause(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct player_status status; int ret; - pause = 1; + player_get_status(&status); + + pause = status.status == PLAY_PLAYING ? 1 : 0; if (argc > 1) { ret = safe_atoi32(argv[1], &pause); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - } - else - { - player_get_status(&status); - - if (status.status != PLAY_PLAYING) - pause = 0; + { + *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); + return ACK_ERROR_ARG; + } } - if (pause == 1) + // MPD ignores pause in stopped state + if (pause == 1 && status.status == PLAY_PLAYING) ret = player_playback_pause(); - else + else if (pause == 0 && status.status == PLAY_PAUSED) ret = player_playback_start(); if (ret < 0) @@ -1833,7 +1853,7 @@ mpd_command_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, int count; int ret; - // If argv[1] is ommited clear the whole queue + // If argv[1] is omitted clear the whole queue if (argc < 2) { db_queue_clear(0); @@ -1893,7 +1913,6 @@ mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s { int start_pos; int end_pos; - int count; uint32_t to_pos; int ret; @@ -1904,9 +1923,8 @@ mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_ARG; } - count = end_pos - start_pos; - if (count > 1) - DPRINTF(E_WARN, L_MPD, "Moving ranges is not supported, only the first item will be moved\n"); +// if (count > 1) +// DPRINTF(E_WARN, L_MPD, "Moving ranges is not supported, only the first item will be moved\n"); ret = safe_atou32(argv[2], &to_pos); if (ret < 0) @@ -1915,7 +1933,24 @@ mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_ARG; } - ret = db_queue_move_bypos(start_pos, to_pos); + uint32_t queue_length; + db_queue_get_count(&queue_length); + + int count = end_pos - start_pos; + // valid move pos and range is: + // 0 <= start < queue_len + // start < end <= queue_len + // 0 <= to <= queue_len - count + if (!(start_pos >= 0 && start_pos < queue_length + && end_pos > start_pos && end_pos <= queue_length + && to_pos >= 0 && to_pos <= queue_length - count)) + { + *errmsg = safe_asprintf((to_pos > queue_length - count) + ? "Range too large for target position" : "Bad song index"); + return ACK_ERROR_ARG; + } + + ret = db_queue_move_bypos_range(start_pos, end_pos, to_pos); if (ret < 0) { *errmsg = safe_asprintf("Failed to move song at position %d to %d", start_pos, to_pos); @@ -3583,6 +3618,7 @@ mpd_command_password(struct evbuffer *evbuf, int argc, char **argv, char **errms "Authentication succeeded with supplied password: %s%s\n", supplied_password, unrequired ? " although no password is required" : ""); + ctx->authenticated = true; return 0; } @@ -4161,7 +4197,6 @@ static struct mpd_command mpd_handlers[] = { "clearerror", mpd_command_ignore, -1 }, { "currentsong", mpd_command_currentsong, -1 }, { "idle", mpd_command_idle, -1 }, - { "noidle", mpd_command_noidle, -1 }, { "status", mpd_command_status, -1 }, { "stats", mpd_command_stats, -1 }, @@ -4324,6 +4359,358 @@ mpd_command_commands(struct evbuffer *evbuf, int argc, char **argv, char **errms return 0; } +static inline int +mpd_ack_response(struct evbuffer *output, int err_code, int cmd_num, char *cmd_name, char *errmsg) +{ + return evbuffer_add_printf(output, "ACK [%d@%d] {%s} %s\n", err_code, cmd_num, cmd_name, errmsg); +} + +static inline int +mpd_ok_response(struct evbuffer *output) +{ + return evbuffer_add_printf(output, "OK\n"); +} + +/** + * Add a command line, including null terminator, into the command list buffer. + * These command lines will be processed when command_list_end is received. + */ +static int +mpd_command_list_add(struct mpd_client_ctx *client_ctx, char* line) +{ + if (client_ctx->cmd_list_buffer == NULL) + { + client_ctx->cmd_list_buffer = evbuffer_new(); + } + + return evbuffer_add(client_ctx->cmd_list_buffer, line, strlen(line) + 1); +} + +/** + * The result returned by mpd_process_command() and mpd_process_line() + */ +typedef enum mpd_command_result { + /** + * command handled with success. + * the connection should stay open. + * no response was sent. + * the caller of mpd_process_command sends OK or list_OK. + */ + CMD_RESULT_OK = 0, + + /** + * command handled with error. + * ack response was send by the command handler. + * the connection should stay open. + */ + CMD_RESULT_ERROR = 1, + + /** + * the client entered idle state. + * no response should be sent to the client. + */ + CMD_RESULT_IDLE = 2, + + /** + * the client connection should be closed + */ + CMD_RESULT_CLOSE = 3, +} +MpdCommandResult; + +typedef enum mpd_parse_args_result { + ARGS_OK, + ARGS_EMPTY, + ARGS_TOO_MANY, + ARGS_ERROR +} +MpdParseArgsResult; + +/* + * Parses the argument string into an array of strings. + * Arguments are seperated by a whitespace character and may be wrapped in double quotes. + * + * @param args the arguments + * @param argc the number of arguments in the argument string + * @param argv the array containing the found arguments + */ +static MpdParseArgsResult +mpd_parse_args(char *args, int *argc, char **argv, int argv_size) +{ + char *input = args; + int arg_count = 0; + + DPRINTF(E_SPAM, L_MPD, "Parse args: args = \"%s\"\n", input); + + while (*input != 0 && arg_count < argv_size) + { + // Ignore whitespace characters + if (*input == ' ') + { + input++; + continue; + } + + // Check if the parameter is wrapped in double quotes + if (*input == '"') + { + argv[arg_count] = mpd_pars_quoted(&input); + if (argv[arg_count] == NULL) + { + return ARGS_ERROR; + } + arg_count += 1; + } + else + { + argv[arg_count++] = mpd_pars_unquoted(&input); + } + } + + DPRINTF(E_SPAM, L_MPD, "Parse args: args count = \"%d\"\n", arg_count); + *argc = arg_count; + + if (arg_count == 0) + return ARGS_EMPTY; + + if (*input != 0 && arg_count == argv_size) + return ARGS_TOO_MANY; + + return ARGS_OK; +} + +/** + * Process one command line. + * @param line + * @param output + * @param cmd_num + * @param client_ctx + * @return + */ +static MpdCommandResult +mpd_process_command(char *line, struct evbuffer *output, int cmd_num, struct mpd_client_ctx *client_ctx) +{ + char *argv[COMMAND_ARGV_MAX]; + int argc = 0; + char *errmsg = NULL; + int mpd_err_code = 0; + char *cmd_name = "unknown"; + MpdCommandResult cmd_result = CMD_RESULT_OK; + + // Split the read line into command name and arguments + MpdParseArgsResult args_result = mpd_parse_args(line, &argc, argv, COMMAND_ARGV_MAX); + + switch (args_result) + { + case ARGS_EMPTY: + DPRINTF(E_LOG, L_MPD, "No command given\n"); + errmsg = safe_asprintf("No command given"); + mpd_err_code = ACK_ERROR_ARG; + // in this case MPD disconnects the client + cmd_result = CMD_RESULT_CLOSE; + break; + + case ARGS_TOO_MANY: + DPRINTF(E_LOG, L_MPD, "Number of arguments exceeds max of %d: %s\n", COMMAND_ARGV_MAX, line); + errmsg = safe_asprintf("Too many arguments: %d allowed", COMMAND_ARGV_MAX); + mpd_err_code = ACK_ERROR_ARG; + // in this case MPD doesn't disconnect the client + cmd_result = CMD_RESULT_ERROR; + break; + + case ARGS_ERROR: + // Error handling for argument parsing error + DPRINTF(E_LOG, L_MPD, "Error parsing arguments for MPD message: %s\n", line); + errmsg = safe_asprintf("Error parsing arguments"); + mpd_err_code = ACK_ERROR_UNKNOWN; + // in this case MPD disconnects the client + cmd_result = CMD_RESULT_CLOSE; + break; + + case ARGS_OK: + cmd_name = argv[0]; + /* + * Find the command handler and execute the command function + */ + struct mpd_command *command = mpd_find_command(cmd_name); + + if (command == NULL) + { + errmsg = safe_asprintf("unknown command \"%s\"", cmd_name); + mpd_err_code = ACK_ERROR_UNKNOWN; + } + else if (command->min_argc > argc) + { + errmsg = safe_asprintf("Missing argument(s) for command '%s', expected %d, given %d", argv[0], + command->min_argc, argc); + mpd_err_code = ACK_ERROR_ARG; + } + else if (!client_ctx->authenticated) + { + errmsg = safe_asprintf("Not authenticated"); + mpd_err_code = ACK_ERROR_PERMISSION; + } + else + { + mpd_err_code = command->handler(output, argc, argv, &errmsg, client_ctx); + } + break; + } + + /* + * If an error occurred, add the ACK line to the response buffer + */ + if (mpd_err_code != 0) + { + DPRINTF(E_LOG, L_MPD, "Error executing command '%s': %s\n", line, errmsg); + mpd_ack_response(output, mpd_err_code, cmd_num, cmd_name, errmsg); + if (cmd_result == CMD_RESULT_OK) + { + cmd_result = CMD_RESULT_ERROR; + } + } + else if (0 == strcmp(cmd_name, "idle")) + { + cmd_result = CMD_RESULT_IDLE; + } + else if (0 == strcmp(cmd_name, "close")) + { + cmd_result = CMD_RESULT_CLOSE; + } + + if (errmsg != NULL) + free(errmsg); + + return cmd_result; +} + +static MpdCommandResult +mpd_process_line(char *line, struct evbuffer *output, struct mpd_client_ctx *client_ctx) +{ + /* + * "noidle" is ignored unless the client is in idle state + */ + if (0 == strcmp(line, "noidle")) + { + if (client_ctx->is_idle) + { + // leave idle state and send OK + client_ctx->is_idle = false; + mpd_ok_response(output); + } + + return CMD_RESULT_OK; + } + + /* + * in idle state the only allowed command is "noidle" + */ + if (client_ctx->is_idle) + { + // during idle state client must not send anything except "noidle" + DPRINTF(E_FATAL, L_MPD, "Only \"noidle\" is allowed during idle. received: %s\n", line); + return CMD_RESULT_CLOSE; + } + + MpdCommandResult res = CMD_RESULT_OK; + + if (client_ctx->cmd_list_type == COMMAND_LIST_NONE) + { + // not in command list + + if (0 == strcmp(line, "command_list_begin")) + { + client_ctx->cmd_list_type = COMMAND_LIST; + return CMD_RESULT_OK; + } + + if (0 == strcmp(line, "command_list_ok_begin")) + { + client_ctx->cmd_list_type = COMMAND_LIST_OK; + return CMD_RESULT_OK; + } + + res = mpd_process_command(line, output, 0, client_ctx); + + DPRINTF(E_DBG, L_MPD, "Command \"%s\" returned: %d\n", line, res); + + if (res == CMD_RESULT_OK) + { + mpd_ok_response(output); + } + } + else + { + // in command list + if (0 == strcmp(line, "command_list_end")) + { + // end of command list: + // process the commands that were added to client_ctx->cmd_list_buffer + // From MPD documentation (https://mpd.readthedocs.io/en/latest/protocol.html#command-lists): + // It does not execute any commands until the list has ended. The response is + // a concatenation of all individual responses. + // On success for all commands, OK is returned. + // If a command fails, no more commands are executed and the appropriate ACK error is returned. + // If command_list_ok_begin is used, list_OK is returned + // for each successful command executed in the command list. + + DPRINTF(E_DBG, L_MPD, "process command list\n"); + + bool ok_mode = (client_ctx->cmd_list_type == COMMAND_LIST_OK); + struct evbuffer *commands_buffer = client_ctx->cmd_list_buffer; + + client_ctx->cmd_list_type = COMMAND_LIST_NONE; + client_ctx->cmd_list_buffer = NULL; + + int cmd_num = 0; + char *cmd_line; + + if (commands_buffer != NULL) + { + while ((cmd_line = evbuffer_readln(commands_buffer, NULL, EVBUFFER_EOL_NUL))) + { + res = mpd_process_command(cmd_line, output, cmd_num++, client_ctx); + + free(cmd_line); + + if (res != CMD_RESULT_OK) break; + + if (ok_mode) + evbuffer_add_printf(output, "list_OK\n"); + } + + evbuffer_free(commands_buffer); + } + + DPRINTF(E_DBG, L_MPD, "Command list returned: %d\n", res); + + if (res == CMD_RESULT_OK) + { + mpd_ok_response(output); + } + } + else + { + // in command list: + // save commands in the client context + if (-1 == mpd_command_list_add(client_ctx, line)) + { + DPRINTF(E_FATAL, L_MPD, "Failed to add to command list\n"); + res = CMD_RESULT_CLOSE; + } + else if (evbuffer_get_length(client_ctx->cmd_list_buffer) > Config.MaxCommandListSize) + { + DPRINTF(E_FATAL, L_MPD, "Max command list size (%uKB) exceeded\n", (Config.MaxCommandListSize / 1024)); + res = CMD_RESULT_CLOSE; + } + else + { + res = CMD_RESULT_OK; + } + } + } + return res; +} /* * The read callback function is invoked if a complete command sequence was received from the client @@ -4337,158 +4724,52 @@ mpd_read_cb(struct bufferevent *bev, void *ctx) { struct evbuffer *input; struct evbuffer *output; - int ret; - int ncmd; char *line; - char *errmsg; - struct mpd_command *command; - enum command_list_type listtype; - int idle_cmd; - int close_cmd; - char *argv[COMMAND_ARGV_MAX]; - int argc; struct mpd_client_ctx *client_ctx = (struct mpd_client_ctx *)ctx; + if (client_ctx->is_closing) + { + // after freeing the bev ignore any reads + return; + } + /* Get the input evbuffer, contains the command sequence received from the client */ input = bufferevent_get_input(bev); /* Get the output evbuffer, used to send the server response to the client */ output = bufferevent_get_output(bev); - DPRINTF(E_SPAM, L_MPD, "Received MPD command sequence\n"); - - idle_cmd = 0; - close_cmd = 0; - - listtype = COMMAND_LIST_NONE; - ncmd = 0; - ret = -1; - while ((line = evbuffer_readln(input, NULL, EVBUFFER_EOL_ANY))) { - DPRINTF(E_DBG, L_MPD, "MPD message: %s\n", line); + DPRINTF(E_DBG, L_MPD, "MPD message: \"%s\"\n", line); - // Split the read line into command name and arguments - ret = mpd_parse_args(line, &argc, argv, COMMAND_ARGV_MAX); - if (ret != 0 || argc <= 0) - { - // Error handling for argument parsing error - DPRINTF(E_LOG, L_MPD, "Error parsing arguments for MPD message: %s\n", line); - errmsg = safe_asprintf("Error parsing arguments"); - ret = ACK_ERROR_ARG; - evbuffer_add_printf(output, "ACK [%d@%d] {%s} %s\n", ret, ncmd, "unkown", errmsg); - free(errmsg); - free(line); - break; - } + enum mpd_command_result res = mpd_process_line(line, output, client_ctx); - /* - * Check if it is a list command - */ - if (0 == strcmp(argv[0], "command_list_ok_begin")) - { - listtype = COMMAND_LIST_OK; - free(line); - continue; - } - else if (0 == strcmp(argv[0], "command_list_begin")) - { - listtype = COMMAND_LIST; - free(line); - continue; - } - else if (0 == strcmp(argv[0], "command_list_end")) - { - listtype = COMMAND_LIST_END; - free(line); - break; - } - else if (0 == strcmp(argv[0], "idle")) - idle_cmd = 1; - else if (0 == strcmp(argv[0], "noidle")) - idle_cmd = 1; - else if (0 == strcmp(argv[0], "close")) - close_cmd = 1; - - /* - * Find the command handler and execute the command function - */ - command = mpd_find_command(argv[0]); - - if (command == NULL) - { - errmsg = safe_asprintf("Unsupported command '%s'", argv[0]); - ret = ACK_ERROR_UNKNOWN; - } - else if (command->min_argc > argc) - { - errmsg = safe_asprintf("Missing argument(s) for command '%s', expected %d, given %d", argv[0], command->min_argc, argc); - ret = ACK_ERROR_ARG; - } - else if (strcmp(command->mpdcommand, "password") == 0) - { - ret = command->handler(output, argc, argv, &errmsg, client_ctx); - client_ctx->authenticated = ret == 0; - } - else if (!client_ctx->authenticated) - { - errmsg = safe_asprintf("Not authenticated"); - ret = ACK_ERROR_PERMISSION; - } - else - ret = command->handler(output, argc, argv, &errmsg, client_ctx); - - /* - * If an error occurred, add the ACK line to the response buffer and exit the loop - */ - if (ret != 0) - { - DPRINTF(E_LOG, L_MPD, "Error executing command '%s': %s\n", argv[0], errmsg); - evbuffer_add_printf(output, "ACK [%d@%d] {%s} %s\n", ret, ncmd, argv[0], errmsg); - free(errmsg); - free(line); - break; - } - - /* - * If the command sequence started with command_list_ok_begin, add a list_ok line to the - * response buffer after each command output. - */ - if (listtype == COMMAND_LIST_OK) - { - evbuffer_add(output, "list_OK\n", 8); - } - /* - * If everything was successful add OK line to signal clients end of command message. - */ - else if (listtype == COMMAND_LIST_NONE && idle_cmd == 0 && close_cmd == 0) - { - evbuffer_add(output, "OK\n", 3); - } free(line); - ncmd++; - } - DPRINTF(E_SPAM, L_MPD, "Finished MPD command sequence: %d\n", ret); + switch (res) { + case CMD_RESULT_ERROR: + case CMD_RESULT_IDLE: + case CMD_RESULT_OK: + break; - /* - * If everything was successful and we are processing a command list, add OK line to signal - * clients end of message. - * If an error occurred the necessary ACK line should already be added to the response buffer. - */ - if (ret == 0 && close_cmd == 0 && listtype == COMMAND_LIST_END) - { - evbuffer_add(output, "OK\n", 3); - } + case CMD_RESULT_CLOSE: + client_ctx->is_closing = true; - if (close_cmd) - { - /* - * Freeing the bufferevent closes the connection, if it was - * opened with BEV_OPT_CLOSE_ON_FREE. - * Since bufferevent is reference-counted, it will happen as - * soon as possible, not necessarily immediately. - */ - bufferevent_free(bev); + if (client_ctx->cmd_list_buffer != NULL) + { + evbuffer_free(client_ctx->cmd_list_buffer); + client_ctx->cmd_list_buffer = NULL; + } + + /* + * Freeing the bufferevent closes the connection, if it was + * opened with BEV_OPT_CLOSE_ON_FREE. + * Since bufferevent is reference-counted, it will happen as + * soon as possible, not necessarily immediately. + */ + bufferevent_free(bev); + break; + } } } @@ -4511,9 +4792,9 @@ mpd_event_cb(struct bufferevent *bev, short events, void *ctx) } /* - * The input filter buffer callback checks if the data received from the client is a complete command sequence. - * A command sequence has end with '\n' and if it starts with "command_list_begin\n" or "command_list_ok_begin\n" - * the last line has to be "command_list_end\n". + * The input filter buffer callback. + * + * Pass complete lines. * * @param src evbuffer to read data from (contains the data received from the client) * @param dst evbuffer to write data to (this is the evbuffer for the read callback) @@ -4525,44 +4806,31 @@ mpd_event_cb(struct bufferevent *bev, short events, void *ctx) static enum bufferevent_filter_result mpd_input_filter(struct evbuffer *src, struct evbuffer *dst, ev_ssize_t lim, enum bufferevent_flush_mode state, void *ctx) { - struct evbuffer_ptr p; char *line; int ret; + // Filter functions must return BEV_OK + // if any data was successfully written to the destination buffer + int output_count = 0; while ((line = evbuffer_readln(src, NULL, EVBUFFER_EOL_ANY))) { ret = evbuffer_add_printf(dst, "%s\n", line); if (ret < 0) - { - DPRINTF(E_LOG, L_MPD, "Error adding line to buffer: '%s'\n", line); - free(line); - return BEV_ERROR; - } + { + DPRINTF(E_LOG, L_MPD, "Error adding line to buffer: '%s'\n", line); + free(line); + return BEV_ERROR; + } free(line); + output_count += ret; } - if (evbuffer_get_length(src) > 0) + if (output_count == 0) { DPRINTF(E_DBG, L_MPD, "Message incomplete, waiting for more data\n"); return BEV_NEED_MORE; } - p = evbuffer_search(dst, "command_list_begin", 18, NULL); - if (p.pos < 0) - { - p = evbuffer_search(dst, "command_list_ok_begin", 21, NULL); - } - - if (p.pos >= 0) - { - p = evbuffer_search(dst, "command_list_end", 16, NULL); - if (p.pos < 0) - { - DPRINTF(E_DBG, L_MPD, "Message incomplete (missing command_list_end), waiting for more data\n"); - return BEV_NEED_MORE; - } - } - return BEV_OK; } @@ -4617,6 +4885,9 @@ mpd_accept_conn_cb(struct evconnlistener *listener, */ evbuffer_add(bufferevent_get_output(bev), "OK MPD 0.20.0\n", 14); client_ctx->evbuffer = bufferevent_get_output(bev); + client_ctx->cmd_list_type = COMMAND_LIST_NONE; + client_ctx->is_idle = false; + client_ctx->is_closing = false; DPRINTF(E_INFO, L_MPD, "New mpd client connection accepted\n"); } @@ -4874,12 +5145,26 @@ mpd_init(void) const char *pl_dir; int ret; - port = cfg_getint(cfg_getsec(cfg, "mpd"), "port"); + cfg_t *mpd_section = cfg_getsec(cfg, "mpd"); + + port = cfg_getint(mpd_section, "port"); if (port <= 0) { DPRINTF(E_INFO, L_MPD, "MPD not enabled\n"); return 0; } + + long max_command_list_size = cfg_getint(mpd_section, "max_command_list_size"); + if (max_command_list_size <= 0 || max_command_list_size > INT_MAX) + { + DPRINTF(E_INFO, L_MPD, "Ignoring invalid config \"max_command_list_size\" (%ld). Will use the default %uKB instead.\n", + max_command_list_size, + (Config.MaxCommandListSize / 1024)); + } + else + { + Config.MaxCommandListSize = max_command_list_size * 1024; // from KB to bytes + } CHECK_NULL(L_MPD, evbase_mpd = event_base_new()); CHECK_NULL(L_MPD, cmdbase = commands_base_new(evbase_mpd, NULL)); From 4b8ecfe18df62523fdb06a1c0b10238e64f89b94 Mon Sep 17 00:00:00 2001 From: gd Date: Sun, 21 May 2023 15:45:36 +0300 Subject: [PATCH 05/65] [mpd] Fix: allow password command when not authenticated --- src/mpd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mpd.c b/src/mpd.c index 5538d2bd..dafea3bd 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -4545,7 +4545,7 @@ mpd_process_command(char *line, struct evbuffer *output, int cmd_num, struct mpd command->min_argc, argc); mpd_err_code = ACK_ERROR_ARG; } - else if (!client_ctx->authenticated) + else if (!client_ctx->authenticated && strcmp(cmd_name, "password") != 0) { errmsg = safe_asprintf("Not authenticated"); mpd_err_code = ACK_ERROR_PERMISSION; From 783f918c5e3946f425f3d18b180b588cf16f3e1a Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Fri, 7 Jul 2023 12:35:29 +0200 Subject: [PATCH 06/65] [mpd] Refactor commit 9962c743 and other stuff in mpd.c --- owntone.conf.in | 5 - src/conffile.c | 1 - src/db.c | 63 +- src/mpd.c | 1635 +++++++++++++++++++++-------------------------- 4 files changed, 761 insertions(+), 943 deletions(-) diff --git a/owntone.conf.in b/owntone.conf.in index 06e6b7ac..8f44e30a 100644 --- a/owntone.conf.in +++ b/owntone.conf.in @@ -441,11 +441,6 @@ mpd { # Whether to emit an output with plugin type "httpd" to tell clients # that a stream is available for local playback. # enable_httpd_plugin = false - - # The maximum size of a command list in KB. - # It is the sum of lengths of all the command lines between command list begin and end. - # Default is 2048 (2 MiB). -# max_command_list_size = KBYTES } # SQLite configuration (allows to modify the operation of the SQLite databases) diff --git a/src/conffile.c b/src/conffile.c index 31dbe6f4..da49f03d 100644 --- a/src/conffile.c +++ b/src/conffile.c @@ -239,7 +239,6 @@ static cfg_opt_t sec_mpd[] = CFG_INT("port", 6600, CFGF_NONE), CFG_INT("http_port", 0, CFGF_NONE), CFG_BOOL("enable_httpd_plugin", cfg_false, CFGF_NONE), - CFG_INT("max_command_list_size", 2048, CFGF_NONE), CFG_BOOL("clear_queue_on_stop_disable", cfg_false, CFGF_NODEFAULT | CFGF_DEPRECATED), CFG_BOOL("allow_modifying_stored_playlists", cfg_false, CFGF_NODEFAULT | CFGF_DEPRECATED), CFG_STR("default_playlist_directory", NULL, CFGF_NODEFAULT | CFGF_DEPRECATED), diff --git a/src/db.c b/src/db.c index 0c8c70b2..541e4762 100644 --- a/src/db.c +++ b/src/db.c @@ -6005,60 +6005,43 @@ db_queue_move_bypos(int pos_from, int pos_to) int db_queue_move_bypos_range(int range_begin, int range_end, int pos_to) { +#define Q_TMPL "UPDATE queue SET pos = CASE WHEN pos < %d THEN pos + %d ELSE pos - %d END, queue_version = %d WHERE pos >= %d AND pos < %d;" int queue_version; char *query; + int count; + int update_begin; + int update_end; int ret; - int changes = 0; + int cut_off; + int offset_up; + int offset_down; queue_version = queue_transaction_begin(); - int count = range_end - range_begin; - int update_begin = MIN(range_begin, pos_to); - int update_end = MAX(range_begin + count, pos_to + count); - int cut_off, offset_up, offset_down; + count = range_end - range_begin; + update_begin = MIN(range_begin, pos_to); + update_end = MAX(range_begin + count, pos_to + count); - if (range_begin < pos_to) { - cut_off = range_begin + count; - offset_up = pos_to - range_begin; - offset_down = count; - } else { + if (range_begin < pos_to) + { + cut_off = range_begin + count; + offset_up = pos_to - range_begin; + offset_down = count; + } + else + { cut_off = range_begin; offset_up = count; offset_down = range_begin - pos_to; - } + } - DPRINTF(E_DBG, L_DB, "db_queue_move_bypos_range: from = %d, to = %d," - " count = %d, cut_off = %d, offset_up = %d, offset_down = %d," - " begin = %d, end = %d\n", - range_begin, pos_to, count, cut_off, offset_up, offset_down, update_begin, update_end); + query = sqlite3_mprintf(Q_TMPL, cut_off, offset_up, offset_down, queue_version, update_begin, update_end); + ret = db_query_run(query, 1, 0); - query = "UPDATE queue SET pos =" - " CASE" - " WHEN pos < :cut_off THEN pos + :offset_up" - " ELSE pos - :offset_down" - " END," - " queue_version = :queue_version" - " WHERE" - " pos >= :update_begin AND pos < :update_end;"; - - sqlite3_stmt *stmt; - if (SQLITE_OK != (ret = sqlite3_prepare_v2(hdl, query, -1, &stmt, NULL))) goto end_transaction; - - if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 1, cut_off))) goto end_transaction; - if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 2, offset_up))) goto end_transaction; - if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 3, offset_down))) goto end_transaction; - if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 4, queue_version))) goto end_transaction; - if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 5, update_begin))) goto end_transaction; - if (SQLITE_OK != (ret = sqlite3_bind_int(stmt, 6, update_end))) goto end_transaction; - - changes = db_statement_run(stmt, 0); - - end_transaction: - DPRINTF(E_LOG, L_DB, "db_queue_move_bypos_range: changes = %d, res = %d: %s\n", - changes, ret, sqlite3_errstr(ret)); queue_transaction_end(ret, queue_version); - return ret == SQLITE_OK && changes != -1 ? 0 : -1; + return ret; +#undef Q_TMPL } /* diff --git a/src/mpd.c b/src/mpd.c index dafea3bd..d5f03f62 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -50,37 +51,6 @@ #include "player.h" #include "remote_pairing.h" - -enum mpd_type { - MPD_TYPE_INT, - MPD_TYPE_STRING, - MPD_TYPE_SPECIAL, -}; - - -#define MPD_ALL_IDLE_LISTENER_EVENTS (LISTENER_PLAYER | LISTENER_QUEUE | LISTENER_VOLUME | LISTENER_SPEAKER | LISTENER_OPTIONS | LISTENER_DATABASE | LISTENER_UPDATE | LISTENER_STORED_PLAYLIST | LISTENER_RATING) -#define MPD_RATING_FACTOR 10.0 -#define MPD_BINARY_SIZE 8192 /* MPD MAX_BINARY_SIZE */ -#define MPD_BINARY_SIZE_MIN 64 /* min size from MPD ClientCommands.cxx */ - -static pthread_t tid_mpd; - -static struct event_base *evbase_mpd; - -static struct commands_base *cmdbase; - -static struct evhttp *evhttpd; - -static struct evconnlistener *mpd_listener; -static int mpd_sockfd; - -static bool mpd_plugin_httpd; - -// Virtual path to the default playlist directory -static char *default_pl_dir; -static bool allow_modifying_stored_playlists; - - /** * from MPD source: * * @@ -92,58 +62,173 @@ static bool allow_modifying_stored_playlists; * * https://github.com/MusicPlayerDaemon/MPD/blob/master/src/command/AllCommands.cxx */ -#define COMMAND_ARGV_MAX 70 +#define MPD_COMMAND_ARGV_MAX 70 /** * config: * max_command_list_size KBYTES - * The maximum size a command list. Default is 2048 (2 MiB). * * https://github.com/MusicPlayerDaemon/MPD/blob/master/src/client/Config.cxx */ -#define CLIENT_MAX_COMMAND_LIST_DEFAULT (2048*1024) +#define MPD_MAX_COMMAND_LIST_SIZE (2048*1024) -static struct { - /** - * Max size in bytes allowed in command list. - * "max_command_list_size" - */ - uint32_t MaxCommandListSize; -} -Config = { - .MaxCommandListSize = CLIENT_MAX_COMMAND_LIST_DEFAULT -}; +#define MPD_ALL_IDLE_LISTENER_EVENTS (LISTENER_PLAYER | LISTENER_QUEUE | LISTENER_VOLUME | LISTENER_SPEAKER | LISTENER_OPTIONS | LISTENER_DATABASE | LISTENER_UPDATE | LISTENER_STORED_PLAYLIST | LISTENER_RATING) +#define MPD_RATING_FACTOR 10.0 +#define MPD_BINARY_SIZE 8192 /* MPD MAX_BINARY_SIZE */ +#define MPD_BINARY_SIZE_MIN 64 /* min size from MPD ClientCommands.cxx */ - -/* MPD error codes (taken from ack.h) */ -enum ack +// MPD error codes (taken from ack.h) +enum mpd_ack_error { - ACK_ERROR_NOT_LIST = 1, - ACK_ERROR_ARG = 2, - ACK_ERROR_PASSWORD = 3, - ACK_ERROR_PERMISSION = 4, - ACK_ERROR_UNKNOWN = 5, + ACK_ERROR_NONE = 0, + ACK_ERROR_NOT_LIST = 1, + ACK_ERROR_ARG = 2, + ACK_ERROR_PASSWORD = 3, + ACK_ERROR_PERMISSION = 4, + ACK_ERROR_UNKNOWN = 5, - ACK_ERROR_NO_EXIST = 50, - ACK_ERROR_PLAYLIST_MAX = 51, - ACK_ERROR_SYSTEM = 52, - ACK_ERROR_PLAYLIST_LOAD = 53, - ACK_ERROR_UPDATE_ALREADY = 54, - ACK_ERROR_PLAYER_SYNC = 55, - ACK_ERROR_EXIST = 56, + ACK_ERROR_NO_EXIST = 50, + ACK_ERROR_PLAYLIST_MAX = 51, + ACK_ERROR_SYSTEM = 52, + ACK_ERROR_PLAYLIST_LOAD = 53, + ACK_ERROR_UPDATE_ALREADY = 54, + ACK_ERROR_PLAYER_SYNC = 55, + ACK_ERROR_EXIST = 56, +}; + +enum mpd_type { + MPD_TYPE_INT, + MPD_TYPE_STRING, + MPD_TYPE_SPECIAL, }; -/** - * Flag for command list state - */ enum command_list_type { - COMMAND_LIST = 1, - COMMAND_LIST_OK = 2, - COMMAND_LIST_END = 3, - COMMAND_LIST_NONE = 4 + COMMAND_LIST_NONE = 0, + COMMAND_LIST_BEGIN, + COMMAND_LIST_OK_BEGIN, + COMMAND_LIST_END, + COMMAND_LIST_OK_END, }; +struct mpd_tagtype +{ + char *tag; + char *field; + char *sort_field; + char *group_field; + enum mpd_type type; + ssize_t mfi_offset; + + /* + * This allows omitting the "group" fields in the created group by clause to improve + * performance in the "list" command. For example listing albums and artists already + * groups by their persistent id, an additional group clause by artist/album will + * decrease performance of the select query and will in general not change the result + * (e. g. album persistent id is generated by artist and album and listing albums + * grouped by artist is therefor not necessary). + */ + bool group_in_listcommand; +}; + +struct mpd_client_ctx +{ + // True if the connection is already authenticated or does not need authentication + bool authenticated; + + // The events the client needs to be notified of + short events; + + // True if the client is waiting for idle events + bool is_idle; + + // The events the client is waiting for (set by the idle command) + short idle_events; + + // The current binary limit size + unsigned int binarylimit; + + // The output buffer for the client (used to send data to the client) + struct evbuffer *evbuffer; + + // Equals COMMAND_LIST_NONE unless command_list_begin or command_list_ok_begin + // received. + enum command_list_type cmd_list_type; + + // Current command list + // When cmd_list_type is either COMMAND_LIST_BEGIN or COMMAND_LIST_OK_BEGIN + // received commands are added to this buffer. When command_list_end is + // received, the commands saved in this buffer are processed. + struct evbuffer *cmd_list_buffer; + + // Set to true by handlers and command processing if we must cut the client + // connection. + bool must_disconnect; + + struct mpd_client_ctx *next; +}; + +struct mpd_command +{ + /* The command name */ + const char *mpdcommand; + + /* + * The function to execute the command + * + * @param evbuf the response event buffer + * @param argc number of arguments in argv + * @param argv argument array, first entry is the commandname + * @param errmsg error message set by this function if an error occured + * @return MPD ack error (ACK_ERROR_NONE on succes) + */ + enum mpd_ack_error (*handler)(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx); + int min_argc; +}; + +struct output +{ + unsigned short shortid; + uint64_t id; + char *name; + + unsigned selected; +}; + +struct output_get_param +{ + unsigned short curid; + unsigned short shortid; + struct output *output; +}; + +struct output_outputs_param +{ + unsigned short nextid; + struct evbuffer *buf; +}; + + +/* ---------------------------------- Globals ------------------------------- */ + +static pthread_t tid_mpd; +static struct event_base *evbase_mpd; +static struct commands_base *cmdbase; +static struct evhttp *evhttpd; +static struct evconnlistener *mpd_listener; +static int mpd_sockfd; +static bool mpd_plugin_httpd; + +// Virtual path to the default playlist directory +static char *default_pl_dir; +static bool allow_modifying_stored_playlists; + +// Forward +static struct mpd_command mpd_handlers[]; + +// List of all connected mpd clients +struct mpd_client_ctx *mpd_clients; + /** * This lists for ffmpeg suffixes and mime types are taken from the ffmpeg decoder plugin from mpd * (FfmpegDecoderPlugin.cxx, git revision 9fb351a139a56fc7b1ece549894f8fc31fa887cd). @@ -185,26 +270,6 @@ static const char * const ffmpeg_mime_types[] = { "application/flv", "applicatio NULL }; -struct mpd_tagtype -{ - char *tag; - char *field; - char *sort_field; - char *group_field; - enum mpd_type type; - ssize_t mfi_offset; - - /* - * This allows omitting the "group" fields in the created group by clause to improve - * performance in the "list" command. For example listing albums and artists already - * groups by their persistent id, an additional group clause by artist/album will - * decrease performance of the select query and will in general not change the result - * (e. g. album persistent id is generated by artist and album and listing albums - * grouped by artist is therefor not necessary). - */ - bool group_in_listcommand; -}; - static struct mpd_tagtype tagtypes[] = { /* tag | db field | db sort field | db group field | type | media_file offset | group_in_listcommand */ @@ -228,6 +293,9 @@ static struct mpd_tagtype tagtypes[] = }; + +/* -------------------------------- Helpers --------------------------------- */ + static struct mpd_tagtype * find_tagtype(const char *tag) { @@ -245,79 +313,33 @@ find_tagtype(const char *tag) return NULL; } -/* - * MPD client connection data - */ -struct mpd_client_ctx -{ - // True if the connection is already authenticated or does not need authentication - bool authenticated; - - // The events the client needs to be notified of - short events; - - // True if the client is waiting for idle events - bool is_idle; - - // The events the client is waiting for (set by the idle command) - short idle_events; - - // The current binary limit size - unsigned int binarylimit; - - // The output buffer for the client (used to send data to the client) - struct evbuffer *evbuffer; - - /** - * command list type flag: - * is set to: - * COMMAND_LIST_NONE by default and when receiving command_list_end - * COMMAND_LIST when receiving command_list_begin - * COMMAND_OK_LIST when receiving command_list_ok_begin - */ - enum command_list_type cmd_list_type; - - /** - * current command list: - *

- * When cmd_list_type is either COMMAND_LIST or COMMAND_OK_LIST - * received commands are added to this buffer. - *

- * When command_list_end is received, the commands save - * in this buffer are processed, and then the buffer is freed. - * - * @see mpd_command_list_add - */ - struct evbuffer *cmd_list_buffer; - - /** - * closing flag - * - * set to true in mpd_read_cb() when we want to close - * the client connection by freeing the evbuffer. - */ - bool is_closing; - - struct mpd_client_ctx *next; -}; - -// List of all connected mpd clients -struct mpd_client_ctx *mpd_clients; - static void -free_mpd_client_ctx(void *ctx) +client_ctx_free(struct mpd_client_ctx *client_ctx) { - struct mpd_client_ctx *client_ctx = ctx; - struct mpd_client_ctx *client; - struct mpd_client_ctx *prev; - if (!client_ctx) return; - if (client_ctx->cmd_list_buffer != NULL) - { - evbuffer_free(client_ctx->cmd_list_buffer); - } + evbuffer_free(client_ctx->cmd_list_buffer); + free(client_ctx); +} + +static struct mpd_client_ctx * +client_ctx_new(void) +{ + struct mpd_client_ctx *client_ctx; + + CHECK_NULL(L_MPD, client_ctx = calloc(1, sizeof(struct mpd_client_ctx))); + CHECK_NULL(L_MPD, client_ctx->cmd_list_buffer = evbuffer_new()); + + return client_ctx; +} + +static void +client_ctx_remove(void *arg) +{ + struct mpd_client_ctx *client_ctx = arg; + struct mpd_client_ctx *client; + struct mpd_client_ctx *prev; client = mpd_clients; prev = NULL; @@ -340,39 +362,28 @@ free_mpd_client_ctx(void *ctx) client = client->next; } - free(client_ctx); + client_ctx_free(client_ctx); } -struct output +static struct mpd_client_ctx * +client_ctx_add(void) { - unsigned short shortid; - uint64_t id; - char *name; + struct mpd_client_ctx *client_ctx = client_ctx_new(); - unsigned selected; -}; + client_ctx->next = mpd_clients; + mpd_clients = client_ctx; -struct output_get_param -{ - unsigned short curid; - unsigned short shortid; - struct output *output; -}; - -struct output_outputs_param -{ - unsigned short nextid; - struct evbuffer *buf; -}; + return client_ctx; +} static void free_output(struct output *output) { - if (output) - { - free(output->name); - free(output); - } + if (!output) + return; + + free(output->name); + free(output); } /* @@ -395,28 +406,6 @@ prepend_slash(const char *path) return result; } - -/* Thread: mpd */ -static void * -mpd(void *arg) -{ - int ret; - - ret = db_perthread_init(); - if (ret < 0) - { - DPRINTF(E_LOG, L_MPD, "Error: DB init failed\n"); - - pthread_exit(NULL); - } - - event_base_dispatch(evbase_mpd); - - db_perthread_deinit(); - - pthread_exit(NULL); -} - static void mpd_time(char *buffer, size_t bufferlen, time_t t) { @@ -429,55 +418,36 @@ mpd_time(char *buffer, size_t bufferlen, time_t t) } /* - * Parses a rage argument of the form START:END (the END item is not included in the range) + * Parses a range argument of the form START:END (the END item is not included in the range) * into its start and end position. * * @param range the range argument * @param start_pos set by this method to the start position - * @param end_pos set by this method to the end position + * @param end_pos set by this method to the end postion * @return 0 on success, -1 on failure - * - * @see https://github.com/MusicPlayerDaemon/MPD/blob/master/src/protocol/RangeArg.hxx - * - * For "window START:END" The end index can be omitted, which means the range is open-ended. */ static int mpd_pars_range_arg(const char *range, int *start_pos, int *end_pos) { int ret; - static char separator = ':'; - char* sep_pos = strchr(range, separator); - - if (sep_pos) + if (strchr(range, ':')) { - *sep_pos++ = '\0'; - // range start - if (safe_atoi32(range, start_pos) != 0) - { - DPRINTF(E_LOG, L_MPD, "Error parsing range argument '%s'\n", range); - return -1; - } - // range end - if (*sep_pos == 0) - { - DPRINTF(E_LOG, L_MPD, "Open ended range not supported: '%s'\n", range); - return -1; - } - else if (safe_atoi32(sep_pos, end_pos) != 0) - { - DPRINTF(E_LOG, L_MPD, "Error parsing range argument '%s'\n", range); - return -1; - } + ret = sscanf(range, "%d:%d", start_pos, end_pos); + if (ret < 0) + { + DPRINTF(E_LOG, L_MPD, "Error parsing range argument '%s' (return code = %d)\n", range, ret); + return -1; + } } else { ret = safe_atoi32(range, start_pos); if (ret < 0) - { - DPRINTF(E_LOG, L_MPD, "Error parsing integer argument '%s' (return code = %d)\n", range, ret); - return -1; - } + { + DPRINTF(E_LOG, L_MPD, "Error parsing integer argument '%s' (return code = %d)\n", range, ret); + return -1; + } *end_pos = (*start_pos) + 1; } @@ -887,10 +857,51 @@ parse_group_params(int argc, char **argv, bool group_in_listcommand, struct quer return 0; } -/* - * Command handler function for 'currentsong' - */ static int +notify_idle_client(struct mpd_client_ctx *client_ctx, short events) +{ + if (!client_ctx->is_idle) + { + client_ctx->events |= events; + return 1; + } + + if (!(client_ctx->idle_events & events)) + { + DPRINTF(E_DBG, L_MPD, "Client not listening for events: %d\n", events); + return 1; + } + + if (events & LISTENER_DATABASE) + evbuffer_add(client_ctx->evbuffer, "changed: database\n", 18); + if (events & LISTENER_UPDATE) + evbuffer_add(client_ctx->evbuffer, "changed: update\n", 16); + if (events & LISTENER_QUEUE) + evbuffer_add(client_ctx->evbuffer, "changed: playlist\n", 18); + if (events & LISTENER_PLAYER) + evbuffer_add(client_ctx->evbuffer, "changed: player\n", 16); + if (events & LISTENER_VOLUME) + evbuffer_add(client_ctx->evbuffer, "changed: mixer\n", 15); + if (events & LISTENER_SPEAKER) + evbuffer_add(client_ctx->evbuffer, "changed: output\n", 16); + if (events & LISTENER_OPTIONS) + evbuffer_add(client_ctx->evbuffer, "changed: options\n", 17); + if (events & LISTENER_STORED_PLAYLIST) + evbuffer_add(client_ctx->evbuffer, "changed: stored_playlist\n", 25); + if (events & LISTENER_RATING) + evbuffer_add(client_ctx->evbuffer, "changed: sticker\n", 17); + + client_ctx->is_idle = false; + client_ctx->idle_events = 0; + client_ctx->events = 0; + + return 0; +} + + +/* ----------------------------- Command handlers --------------------------- */ + +static enum mpd_ack_error mpd_command_currentsong(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { @@ -907,7 +918,7 @@ mpd_command_currentsong(struct evbuffer *evbuf, int argc, char **argv, char **er if (!queue_item) { - return 0; + return ACK_ERROR_NONE; } ret = mpd_add_db_queue_item(evbuf, queue_item); @@ -916,21 +927,18 @@ mpd_command_currentsong(struct evbuffer *evbuf, int argc, char **argv, char **er if (ret < 0) { - *errmsg = safe_asprintf("Error adding media info for file with id: %d", status.id); + *errmsg = safe_asprintf("Error setting media info for file with id: %d", status.id); return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } -static int -mpd_notify_idle_client(struct mpd_client_ctx *client_ctx, short events); - /* * Example input: * idle "database" "mixer" "options" "output" "player" "playlist" "sticker" "update" */ -static int +static enum mpd_ack_error mpd_command_idle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int i; @@ -970,11 +978,25 @@ mpd_command_idle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s // If events the client listens to occurred since the last idle call (or since the client connected, // if it is the first idle call), notify immediately. if (ctx->events & ctx->idle_events) - { - mpd_notify_idle_client(ctx, ctx->events); - } + notify_idle_client(ctx, ctx->events); - return 0; + return ACK_ERROR_NONE; +} + +static enum mpd_ack_error +mpd_command_noidle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +{ + /* + * The protocol specifies: "The idle command can be canceled by + * sending the command noidle (no other commands are allowed). MPD + * will then leave idle mode and print results immediately; might be + * empty at this time." + */ + if (ctx->events) + notify_idle_client(ctx, ctx->events); + + ctx->is_idle = false; + return ACK_ERROR_NONE; } /* @@ -999,7 +1021,7 @@ mpd_command_idle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s * nextsong: 1 * nextsongid: 2 */ -static int +static enum mpd_ack_error mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct player_status status; @@ -1096,13 +1118,13 @@ mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, } } - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'stats' */ -static int +static enum mpd_ack_error mpd_command_stats(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params qp; @@ -1143,7 +1165,7 @@ mpd_command_stats(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, db_update, 7); - return 0; + return ACK_ERROR_NONE; } /* @@ -1152,7 +1174,7 @@ mpd_command_stats(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * 0 = disable consume * 1 = enable consume */ -static int +static enum mpd_ack_error mpd_command_consume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int enable; @@ -1166,7 +1188,7 @@ mpd_command_consume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg } player_consume_set(enable); - return 0; + return ACK_ERROR_NONE; } /* @@ -1175,7 +1197,7 @@ mpd_command_consume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg * 0 = disable shuffle * 1 = enable shuffle */ -static int +static enum mpd_ack_error mpd_command_random(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int enable; @@ -1189,7 +1211,7 @@ mpd_command_random(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, } player_shuffle_set(enable); - return 0; + return ACK_ERROR_NONE; } /* @@ -1198,7 +1220,7 @@ mpd_command_random(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * 0 = repeat off * 1 = repeat all */ -static int +static enum mpd_ack_error mpd_command_repeat(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int enable; @@ -1216,14 +1238,14 @@ mpd_command_repeat(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, else player_repeat_set(REPEAT_ALL); - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'setvol' * Sets the volume, expects argument argv[1] to be an integer 0-100 */ -static int +static enum mpd_ack_error mpd_command_setvol(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int volume; @@ -1238,7 +1260,7 @@ mpd_command_setvol(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, player_volume_set(volume); - return 0; + return ACK_ERROR_NONE; } /* @@ -1258,7 +1280,7 @@ mpd_command_setvol(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * 1 = repeat song * Thus "oneshot" is accepted, but ignored under all circumstances. */ -static int +static enum mpd_ack_error mpd_command_single(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int enable; @@ -1284,7 +1306,7 @@ mpd_command_single(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, else player_repeat_set(REPEAT_SONG); - return 0; + return ACK_ERROR_NONE; } /* @@ -1292,11 +1314,11 @@ mpd_command_single(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * The server does not support replay gain, therefor this function returns always * "replay_gain_mode: off". */ -static int +static enum mpd_ack_error mpd_command_replay_gain_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { evbuffer_add(evbuf, "replay_gain_mode: off\n", 22); - return 0; + return ACK_ERROR_NONE; } /* @@ -1305,7 +1327,7 @@ mpd_command_replay_gain_status(struct evbuffer *evbuf, int argc, char **argv, ch * * According to the mpd protocoll specification this function is deprecated. */ -static int +static enum mpd_ack_error mpd_command_volume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct player_status status; @@ -1325,14 +1347,14 @@ mpd_command_volume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, player_volume_set(volume); - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'next' * Skips to the next song in the playqueue */ -static int +static enum mpd_ack_error mpd_command_next(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int ret; @@ -1352,7 +1374,7 @@ mpd_command_next(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* @@ -1361,7 +1383,7 @@ mpd_command_next(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s * 0 = play * 1 = pause */ -static int +static enum mpd_ack_error mpd_command_pause(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int pause; @@ -1370,15 +1392,18 @@ mpd_command_pause(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, player_get_status(&status); - pause = status.status == PLAY_PLAYING ? 1 : 0; if (argc > 1) { ret = safe_atoi32(argv[1], &pause); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } + { + *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); + return ACK_ERROR_ARG; + } + } + else + { + pause = status.status == PLAY_PLAYING ? 1 : 0; } // MPD ignores pause in stopped state @@ -1386,14 +1411,16 @@ mpd_command_pause(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, ret = player_playback_pause(); else if (pause == 0 && status.status == PLAY_PAUSED) ret = player_playback_start(); + else + ret = 0; if (ret < 0) { - *errmsg = safe_asprintf("Failed to pause playback"); + *errmsg = safe_asprintf("Failed to %s playback", (pause == 1) ? "pause" : "start"); return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* @@ -1401,7 +1428,7 @@ mpd_command_pause(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * Starts playback, the optional argument argv[1] represents the position in the playqueue * where to start playback. */ -static int +static enum mpd_ack_error mpd_command_play(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int songpos; @@ -1425,7 +1452,7 @@ mpd_command_play(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s if (status.status == PLAY_PLAYING && songpos < 0) { DPRINTF(E_DBG, L_MPD, "Ignoring play command with parameter '%s', player is already playing.\n", argv[1]); - return 0; + return ACK_ERROR_NONE; } if (status.status == PLAY_PLAYING) @@ -1455,7 +1482,7 @@ mpd_command_play(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* @@ -1463,7 +1490,7 @@ mpd_command_play(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s * Starts playback, the optional argument argv[1] represents the songid of the song * where to start playback. */ -static int +static enum mpd_ack_error mpd_command_playid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { uint32_t id; @@ -1512,14 +1539,14 @@ mpd_command_playid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'previous' * Skips to the previous song in the playqueue */ -static int +static enum mpd_ack_error mpd_command_previous(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int ret; @@ -1539,7 +1566,7 @@ mpd_command_previous(struct evbuffer *evbuf, int argc, char **argv, char **errms return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* @@ -1547,7 +1574,7 @@ mpd_command_previous(struct evbuffer *evbuf, int argc, char **argv, char **errms * Seeks to song at the given position in argv[1] to the position in seconds given in argument argv[2] * (fractions allowed). */ -static int +static enum mpd_ack_error mpd_command_seek(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { uint32_t songpos; @@ -1582,7 +1609,7 @@ mpd_command_seek(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* @@ -1590,7 +1617,7 @@ mpd_command_seek(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s * Seeks to song with id given in argv[1] to the position in seconds given in argument argv[2] * (fractions allowed). */ -static int +static enum mpd_ack_error mpd_command_seekid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct player_status status; @@ -1632,14 +1659,14 @@ mpd_command_seekid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'seekcur' * Seeks the current song to the position in seconds given in argument argv[1] (fractions allowed). */ -static int +static enum mpd_ack_error mpd_command_seekcur(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { float seek_target_sec; @@ -1665,14 +1692,14 @@ mpd_command_seekcur(struct evbuffer *evbuf, int argc, char **argv, char **errmsg return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'stop' * Stop playback. */ -static int +static enum mpd_ack_error mpd_command_stop(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int ret; @@ -1685,7 +1712,7 @@ mpd_command_stop(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* @@ -1738,7 +1765,7 @@ mpd_queue_add(char *path, bool exact_match, int position) * Adds the all songs under the given path to the end of the playqueue (directories add recursively). * Expects argument argv[1] to be a path to a single file or directory. */ -static int +static enum mpd_ack_error mpd_command_add(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct player_status status; @@ -1765,7 +1792,7 @@ mpd_command_add(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, st } } - return 0; + return ACK_ERROR_NONE; } /* @@ -1774,7 +1801,7 @@ mpd_command_add(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, st * Expects argument argv[1] to be a path to a single file. argv[2] is optional, if present * it must be an integer representing the position in the playqueue. */ -static int +static enum mpd_ack_error mpd_command_addid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct player_status status; @@ -1816,14 +1843,14 @@ mpd_command_addid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, "Id: %d\n", ret); // mpd_queue_add returns the item_id of the last inserted queue item - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'clear' * Stops playback and removes all songs from the playqueue */ -static int +static enum mpd_ack_error mpd_command_clear(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int ret; @@ -1836,7 +1863,7 @@ mpd_command_clear(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, db_queue_clear(0); - return 0; + return ACK_ERROR_NONE; } /* @@ -1845,7 +1872,7 @@ mpd_command_clear(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * an integer range {START:END} representing the position of the songs in the playlist, that * should be removed. */ -static int +static enum mpd_ack_error mpd_command_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int start_pos; @@ -1857,7 +1884,7 @@ mpd_command_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, if (argc < 2) { db_queue_clear(0); - return 0; + return ACK_ERROR_NONE; } // If argument argv[1] is present remove only the specified songs @@ -1877,14 +1904,13 @@ mpd_command_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } -/* - * Command handler function for 'deleteid' +/* Command handler function for 'deleteid' * Removes the song with given id from the playqueue. Expects argument argv[1] to be an integer (song id). */ -static int +static enum mpd_ack_error mpd_command_deleteid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { uint32_t songid; @@ -1904,16 +1930,18 @@ mpd_command_deleteid(struct evbuffer *evbuf, int argc, char **argv, char **errms return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } -//Moves the song at FROM or range of songs at START:END to TO in the playlist. -static int +// Moves the song at FROM or range of songs at START:END to TO in the playlist. +static enum mpd_ack_error mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int start_pos; int end_pos; + int count; uint32_t to_pos; + uint32_t queue_length; int ret; ret = mpd_pars_range_arg(argv[1], &start_pos, &end_pos); @@ -1923,8 +1951,7 @@ mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_ARG; } -// if (count > 1) -// DPRINTF(E_WARN, L_MPD, "Moving ranges is not supported, only the first item will be moved\n"); + count = end_pos - start_pos; ret = safe_atou32(argv[2], &to_pos); if (ret < 0) @@ -1933,10 +1960,8 @@ mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_ARG; } - uint32_t queue_length; db_queue_get_count(&queue_length); - int count = end_pos - start_pos; // valid move pos and range is: // 0 <= start < queue_len // start < end <= queue_len @@ -1945,8 +1970,7 @@ mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s && end_pos > start_pos && end_pos <= queue_length && to_pos >= 0 && to_pos <= queue_length - count)) { - *errmsg = safe_asprintf((to_pos > queue_length - count) - ? "Range too large for target position" : "Bad song index"); + *errmsg = safe_asprintf("Range too large for target position %d or bad song index (count %d, length %u)", to_pos, count, queue_length); return ACK_ERROR_ARG; } @@ -1957,10 +1981,10 @@ mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_moveid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { uint32_t songid; @@ -1988,7 +2012,7 @@ mpd_command_moveid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* @@ -1998,7 +2022,7 @@ mpd_command_moveid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * * The order of the songs is always the not shuffled order. */ -static int +static enum mpd_ack_error mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params query_params; @@ -2047,7 +2071,7 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err db_queue_enum_end(&query_params); free(query_params.filter); - return 0; + return ACK_ERROR_NONE; } @@ -2058,7 +2082,7 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err * * The order of the songs is always the not shuffled order. */ -static int +static enum mpd_ack_error mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params query_params; @@ -2110,10 +2134,10 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e db_queue_enum_end(&query_params); free(query_params.filter); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_playlistfind(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params query_params; @@ -2154,10 +2178,10 @@ mpd_command_playlistfind(struct evbuffer *evbuf, int argc, char **argv, char **e db_queue_enum_end(&query_params); free(query_params.filter); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_playlistsearch(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params query_params; @@ -2198,10 +2222,10 @@ mpd_command_playlistsearch(struct evbuffer *evbuf, int argc, char **argv, char * db_queue_enum_end(&query_params); free(query_params.filter); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error plchanges_build_queryparams(struct query_params *query_params, int argc, char **argv, char **errmsg) { uint32_t version; @@ -2238,23 +2262,24 @@ plchanges_build_queryparams(struct query_params *query_params, int argc, char ** else query_params->filter = db_mprintf("(queue_version > %d AND pos >= %d AND pos < %d)", version, start_pos, end_pos); - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'plchanges' * Lists all changed songs in the queue since the given playlist version in argv[1]. */ -static int +static enum mpd_ack_error mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params query_params; struct db_queue_item queue_item; int ret; + enum mpd_ack_error ack_error; - ret = plchanges_build_queryparams(&query_params, argc, argv, errmsg); - if (ret != 0) - return ret; + ack_error = plchanges_build_queryparams(&query_params, argc, argv, errmsg); + if (ack_error != ACK_ERROR_NONE) + return ack_error; ret = db_queue_enum_start(&query_params); if (ret < 0) @@ -2273,7 +2298,7 @@ mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errm db_queue_enum_end(&query_params); free_query_params(&query_params, 1); - return 0; + return ACK_ERROR_NONE; error: db_queue_enum_end(&query_params); @@ -2286,7 +2311,7 @@ mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errm * Command handler function for 'plchangesposid' * Lists all changed songs in the queue since the given playlist version in argv[1] without metadata. */ -static int +static enum mpd_ack_error mpd_command_plchangesposid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params query_params; @@ -2313,7 +2338,7 @@ mpd_command_plchangesposid(struct evbuffer *evbuf, int argc, char **argv, char * db_queue_enum_end(&query_params); free_query_params(&query_params, 1); - return 0; + return ACK_ERROR_NONE; error: db_queue_enum_end(&query_params); @@ -2326,7 +2351,7 @@ mpd_command_plchangesposid(struct evbuffer *evbuf, int argc, char **argv, char * * Command handler function for 'listplaylist' * Lists all songs in the playlist given by virtual-path in argv[1]. */ -static int +static enum mpd_ack_error mpd_command_listplaylist(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { char *path; @@ -2382,14 +2407,14 @@ mpd_command_listplaylist(struct evbuffer *evbuf, int argc, char **argv, char **e free_pli(pli, 0); - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'listplaylistinfo' * Lists all songs in the playlist given by virtual-path in argv[1] with metadata. */ -static int +static enum mpd_ack_error mpd_command_listplaylistinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { char *path; @@ -2447,14 +2472,14 @@ mpd_command_listplaylistinfo(struct evbuffer *evbuf, int argc, char **argv, char free_pli(pli, 0); - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'listplaylists' * Lists all playlists with their last modified date. */ -static int +static enum mpd_ack_error mpd_command_listplaylists(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params qp; @@ -2502,14 +2527,14 @@ mpd_command_listplaylists(struct evbuffer *evbuf, int argc, char **argv, char ** db_query_end(&qp); free(qp.filter); - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'load' * Adds the playlist given by virtual-path in argv[1] to the queue. */ -static int +static enum mpd_ack_error mpd_command_load(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { char *path; @@ -2551,10 +2576,10 @@ mpd_command_load(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_playlistadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { char *vp_playlist; @@ -2589,10 +2614,10 @@ mpd_command_playlistadd(struct evbuffer *evbuf, int argc, char **argv, char **er return ACK_ERROR_ARG; } - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_rm(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { char *virtual_path; @@ -2623,10 +2648,10 @@ mpd_command_rm(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, str return ACK_ERROR_ARG; } - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_save(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { char *virtual_path; @@ -2657,10 +2682,10 @@ mpd_command_save(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s return ACK_ERROR_ARG; } - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_count(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params qp; @@ -2695,10 +2720,10 @@ mpd_command_count(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, db_query_end(&qp); free(qp.filter); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params qp; @@ -2741,10 +2766,10 @@ mpd_command_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s db_query_end(&qp); free(qp.filter); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_findadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params qp; @@ -2775,7 +2800,7 @@ mpd_command_findadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* @@ -2783,7 +2808,6 @@ mpd_command_findadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg * While they should normally not be included in most ID3 tags, they sometimes * are, so we just change them to space. See #1613 for more details. */ - static void sanitize_value(char **strval) { @@ -2799,7 +2823,7 @@ sanitize_value(char **strval) } } -static int +static enum mpd_ack_error mpd_command_list(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct mpd_tagtype *tagtype; @@ -2825,7 +2849,7 @@ mpd_command_list(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s if (!tagtype || tagtype->type == MPD_TYPE_SPECIAL) //FIXME allow "file" tagtype { DPRINTF(E_WARN, L_MPD, "Unsupported type argument for command 'list': %s\n", argv[1]); - return 0; + return ACK_ERROR_NONE; } memset(&qp, 0, sizeof(struct query_params)); @@ -2893,10 +2917,10 @@ mpd_command_list(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s free(qp.group); free(group); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int listinfo, char **errmsg) { struct directory_info subdir; @@ -2954,9 +2978,9 @@ mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int lis ret = db_directory_enum_start(&dir_enum); if (ret < 0) { - DPRINTF(E_LOG, L_MPD, "Failed to start directory enum for parent_id %d\n", directory_id); + *errmsg = safe_asprintf("Failed to start directory enum for parent_id %d\n", directory_id); db_directory_enum_end(&dir_enum); - return -1; + return ACK_ERROR_UNKNOWN; } while ((ret = db_directory_enum_fetch(&dir_enum, &subdir)) == 0 && subdir.id > 0) { @@ -3016,10 +3040,10 @@ mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int lis db_query_end(&qp); free(qp.filter); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_listall(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int dir_id; @@ -3054,12 +3078,10 @@ mpd_command_listall(struct evbuffer *evbuf, int argc, char **argv, char **errmsg return ACK_ERROR_NO_EXIST; } - ret = mpd_add_directory(evbuf, dir_id, 1, 0, errmsg); - - return ret; + return mpd_add_directory(evbuf, dir_id, 1, 0, errmsg); } -static int +static enum mpd_ack_error mpd_command_listallinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int dir_id; @@ -3094,22 +3116,21 @@ mpd_command_listallinfo(struct evbuffer *evbuf, int argc, char **argv, char **er return ACK_ERROR_NO_EXIST; } - ret = mpd_add_directory(evbuf, dir_id, 1, 1, errmsg); - - return ret; + return mpd_add_directory(evbuf, dir_id, 1, 1, errmsg); } /* * Command handler function for 'lsinfo' * Lists the contents of the directory given in argv[1]. */ -static int +static enum mpd_ack_error mpd_command_lsinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int dir_id; char parent[PATH_MAX]; int print_playlists; int ret; + enum mpd_ack_error ack_error; if (argc < 2 || strlen(argv[1]) == 0 || (strncmp(argv[1], "/", 1) == 0 && strlen(argv[1]) == 1)) @@ -3151,15 +3172,15 @@ mpd_command_lsinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, return ACK_ERROR_NO_EXIST; } - ret = mpd_add_directory(evbuf, dir_id, 0, 1, errmsg); + ack_error = mpd_add_directory(evbuf, dir_id, 0, 1, errmsg); // If the root directory was passed as argument add the stored playlists to the response - if (ret == 0 && print_playlists) + if (ack_error == ACK_ERROR_NONE && print_playlists) { return mpd_command_listplaylists(evbuf, argc, argv, errmsg, ctx); } - return ret; + return ack_error; } /* @@ -3168,7 +3189,7 @@ mpd_command_lsinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * This command should list all files including files that are not part of the library. We do not support this * and only report files in the library. */ -static int +static enum mpd_ack_error mpd_command_listfiles(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { return mpd_command_lsinfo(evbuf, argc, argv, errmsg, ctx); @@ -3188,7 +3209,7 @@ mpd_command_listfiles(struct evbuffer *evbuf, int argc, char **argv, char **errm * * Example request: "search artist foo album bar" */ -static int +static enum mpd_ack_error mpd_command_search(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params qp; @@ -3231,10 +3252,10 @@ mpd_command_search(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, db_query_end(&qp); free(qp.filter); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_searchadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct query_params qp; @@ -3265,14 +3286,14 @@ mpd_command_searchadd(struct evbuffer *evbuf, int argc, char **argv, char **errm return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'update' * Initiates an init-rescan (scans for new files) */ -static int +static enum mpd_ack_error mpd_command_update(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { if (argc > 1 && strlen(argv[1]) > 0) @@ -3285,10 +3306,10 @@ mpd_command_update(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, evbuffer_add(evbuf, "updating_db: 1\n", 15); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_sticker_get(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) { struct media_file_info *mfi = NULL; @@ -3316,10 +3337,10 @@ mpd_sticker_get(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, co free_mfi(mfi, 0); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_sticker_set(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) { uint32_t rating; @@ -3355,10 +3376,10 @@ mpd_sticker_set(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, co library_item_attrib_save(id, LIBRARY_ATTRIB_RATING, rating); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_sticker_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) { int id; @@ -3378,10 +3399,10 @@ mpd_sticker_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, library_item_attrib_save(id, LIBRARY_ATTRIB_RATING, 0); - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_sticker_list(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) { struct media_file_info *mfi = NULL; @@ -3404,10 +3425,10 @@ mpd_sticker_list(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, c free_mfi(mfi, 0); /* |:todo:| real sticker implementation */ - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_sticker_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) { struct query_params qp; @@ -3462,8 +3483,7 @@ mpd_sticker_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, c if (!qp.filter) { *errmsg = safe_asprintf("Out of memory"); - ret = ACK_ERROR_UNKNOWN; - return ret; + return ACK_ERROR_UNKNOWN; } ret = db_query_start(&qp); @@ -3473,8 +3493,7 @@ mpd_sticker_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, c free(qp.filter); *errmsg = safe_asprintf("Could not start query"); - ret = ACK_ERROR_UNKNOWN; - return ret; + return ACK_ERROR_UNKNOWN; } while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) @@ -3499,12 +3518,12 @@ mpd_sticker_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, c db_query_end(&qp); free(qp.filter); - return 0; + return ACK_ERROR_NONE; } struct mpd_sticker_command { const char *cmd; - int (*handler)(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path); + enum mpd_ack_error (*handler)(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path); int need_args; }; @@ -3536,13 +3555,13 @@ static struct mpd_sticker_command mpd_sticker_handlers[] = * sticker set song "file:/srv/music/VA/The Electro Swing Revolution Vol 3 1 - Hop, Hop, Hop/13 Mr. Hotcut - You Are.mp3" rating "6" * OK */ -static int +static enum mpd_ack_error mpd_command_sticker(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct mpd_sticker_command *cmd_param = NULL; // Quell compiler warning about uninitialized use of cmd_param char *virtual_path = NULL; int i; - int ret; + enum mpd_ack_error ack_error; if (strcmp(argv[2], "song") != 0) { @@ -3569,11 +3588,11 @@ mpd_command_sticker(struct evbuffer *evbuf, int argc, char **argv, char **errmsg virtual_path = prepend_slash(argv[3]); - ret = cmd_param->handler(evbuf, argc, argv, errmsg, virtual_path); + ack_error = cmd_param->handler(evbuf, argc, argv, errmsg, virtual_path); free(virtual_path); - return ret; + return ack_error; } /* @@ -3597,7 +3616,14 @@ mpd_command_rescan(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, } */ -static int +static enum mpd_ack_error +mpd_command_close(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +{ + ctx->must_disconnect = true; + return ACK_ERROR_NONE; +} + +static enum mpd_ack_error mpd_command_password(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { char *required_password; @@ -3619,7 +3645,7 @@ mpd_command_password(struct evbuffer *evbuf, int argc, char **argv, char **errms supplied_password, unrequired ? " although no password is required" : ""); ctx->authenticated = true; - return 0; + return ACK_ERROR_NONE; } DPRINTF(E_LOG, L_MPD, @@ -3630,7 +3656,7 @@ mpd_command_password(struct evbuffer *evbuf, int argc, char **argv, char **errms return ACK_ERROR_PASSWORD; } -static int +static enum mpd_ack_error mpd_command_binarylimit(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { unsigned int size; @@ -3651,7 +3677,7 @@ mpd_command_binarylimit(struct evbuffer *evbuf, int argc, char **argv, char **er ctx->binarylimit = size; - return 0; + return ACK_ERROR_NONE; } /* @@ -3685,7 +3711,7 @@ output_get_cb(struct player_speaker_info *spk, void *arg) * Command handler function for 'disableoutput' * Expects argument argv[1] to be the id of the speaker to disable. */ -static int +static enum mpd_ack_error mpd_command_disableoutput(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct output_get_param param; @@ -3716,14 +3742,14 @@ mpd_command_disableoutput(struct evbuffer *evbuf, int argc, char **argv, char ** } } - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'enableoutput' * Expects argument argv[1] to be the id of the speaker to enable. */ -static int +static enum mpd_ack_error mpd_command_enableoutput(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct output_get_param param; @@ -3754,14 +3780,14 @@ mpd_command_enableoutput(struct evbuffer *evbuf, int argc, char **argv, char **e } } - return 0; + return ACK_ERROR_NONE; } /* * Command handler function for 'toggleoutput' * Expects argument argv[1] to be the id of the speaker to enable/disable. */ -static int +static enum mpd_ack_error mpd_command_toggleoutput(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct output_get_param param; @@ -3796,7 +3822,7 @@ mpd_command_toggleoutput(struct evbuffer *evbuf, int argc, char **argv, char **e } } - return 0; + return ACK_ERROR_NONE; } /* @@ -3848,7 +3874,7 @@ speaker_enum_cb(struct player_speaker_info *spk, void *arg) * Command handler function for 'output' * Returns a lists with the avaiable speakers. */ -static int +static enum mpd_ack_error mpd_command_outputs(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { struct output_outputs_param param; @@ -3876,10 +3902,10 @@ mpd_command_outputs(struct evbuffer *evbuf, int argc, char **argv, char **errmsg param.nextid++; } - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error outputvolume_set(uint32_t shortid, int volume, char **errmsg) { struct output_get_param param; @@ -3907,10 +3933,10 @@ outputvolume_set(uint32_t shortid, int volume, char **errmsg) return ACK_ERROR_UNKNOWN; } - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_outputvolume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { uint32_t shortid; @@ -3931,9 +3957,7 @@ mpd_command_outputvolume(struct evbuffer *evbuf, int argc, char **argv, char **e return ACK_ERROR_ARG; } - ret = outputvolume_set(shortid, volume, errmsg); - - return ret; + return outputvolume_set(shortid, volume, errmsg); } static void @@ -4036,7 +4060,7 @@ mpd_find_channel(const char *name) return NULL; } -static int +static enum mpd_ack_error mpd_command_channels(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int i; @@ -4048,10 +4072,10 @@ mpd_command_channels(struct evbuffer *evbuf, int argc, char **argv, char **errms mpd_channels[i].channel); } - return 0; + return ACK_ERROR_NONE; } -static int +static enum mpd_ack_error mpd_command_sendmessage(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { const char *channelname; @@ -4072,34 +4096,46 @@ mpd_command_sendmessage(struct evbuffer *evbuf, int argc, char **argv, char **er { // Just ignore the message, only log an error message DPRINTF(E_LOG, L_MPD, "Unsupported channel '%s'\n", channelname); - return 0; + return ACK_ERROR_NONE; } channel->handler(message); - return 0; + return ACK_ERROR_NONE; } /* * Dummy function to handle commands that are not supported and should * not raise an error. */ -static int +static enum mpd_ack_error mpd_command_ignore(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { //do nothing DPRINTF(E_DBG, L_MPD, "Ignore command %s\n", argv[0]); - return 0; + return ACK_ERROR_NONE; } -static int -mpd_command_commands(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx); +static enum mpd_ack_error +mpd_command_commands(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +{ + int i; + + for (i = 0; mpd_handlers[i].handler; i++) + { + evbuffer_add_printf(evbuf, + "command: %s\n", + mpd_handlers[i].mpdcommand); + } + + return ACK_ERROR_NONE; +} /* * Command handler function for 'tagtypes' * Returns a lists with supported tags in the form: * tagtype: Artist */ -static int +static enum mpd_ack_error mpd_command_tagtypes(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int i; @@ -4110,7 +4146,7 @@ mpd_command_tagtypes(struct evbuffer *evbuf, int argc, char **argv, char **errms evbuffer_add_printf(evbuf, "tagtype: %s\n", tagtypes[i].tag); } - return 0; + return ACK_ERROR_NONE; } /* @@ -4118,7 +4154,7 @@ mpd_command_tagtypes(struct evbuffer *evbuf, int argc, char **argv, char **errms * Returns a lists with supported tags in the form: * handler: protocol:// */ -static int +static enum mpd_ack_error mpd_command_urlhandlers(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { evbuffer_add_printf(evbuf, @@ -4141,7 +4177,7 @@ mpd_command_urlhandlers(struct evbuffer *evbuf, int argc, char **argv, char **er // "handler: alsa://\n" ); - return 0; + return ACK_ERROR_NONE; } /* @@ -4151,7 +4187,7 @@ mpd_command_urlhandlers(struct evbuffer *evbuf, int argc, char **argv, char **er * The server only uses libav/ffmepg for decoding and does not support decoder plugins, * therefor the function reports only ffmpeg as available. */ -static int +static enum mpd_ack_error mpd_command_decoders(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { int i; @@ -4168,26 +4204,39 @@ mpd_command_decoders(struct evbuffer *evbuf, int argc, char **argv, char **errms evbuffer_add_printf(evbuf, "mime_type: %s\n", ffmpeg_mime_types[i]); } - return 0; + return ACK_ERROR_NONE; } -struct mpd_command +static enum mpd_ack_error +mpd_command_command_list_begin(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) { - /* The command name */ - const char *mpdcommand; + ctx->cmd_list_type = COMMAND_LIST_BEGIN; + return ACK_ERROR_NONE; +} + +static enum mpd_ack_error +mpd_command_command_list_ok_begin(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +{ + ctx->cmd_list_type = COMMAND_LIST_OK_BEGIN; + return ACK_ERROR_NONE; +} + +static enum mpd_ack_error +mpd_command_command_list_end(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +{ + if (ctx->cmd_list_type == COMMAND_LIST_BEGIN) + ctx->cmd_list_type = COMMAND_LIST_END; + else if (ctx->cmd_list_type == COMMAND_LIST_OK_BEGIN) + ctx->cmd_list_type = COMMAND_LIST_OK_END; + else + { + *errmsg = safe_asprintf("Got with command list end without preceeding list start"); + return ACK_ERROR_ARG; + } + + return ACK_ERROR_NONE; +} - /* - * The function to execute the command - * - * @param evbuf the response event buffer - * @param argc number of arguments in argv - * @param argv argument array, first entry is the commandname - * @param errmsg error message set by this function if an error occured - * @return 0 if successful, one of ack values if an error occured - */ - int (*handler)(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx); - int min_argc; -}; static struct mpd_command mpd_handlers[] = { @@ -4197,6 +4246,7 @@ static struct mpd_command mpd_handlers[] = { "clearerror", mpd_command_ignore, -1 }, { "currentsong", mpd_command_currentsong, -1 }, { "idle", mpd_command_idle, -1 }, + { "noidle", mpd_command_noidle, -1 }, { "status", mpd_command_status, -1 }, { "stats", mpd_command_stats, -1 }, @@ -4287,7 +4337,7 @@ static struct mpd_command mpd_handlers[] = { "sticker", mpd_command_sticker, 4 }, // Connection settings - { "close", mpd_command_ignore, -1 }, + { "close", mpd_command_close, -1 }, // { "kill", mpd_command_kill, -1 }, { "password", mpd_command_password, -1 }, { "ping", mpd_command_ignore, -1 }, @@ -4300,13 +4350,8 @@ static struct mpd_command mpd_handlers[] = { "toggleoutput", mpd_command_toggleoutput, 2 }, { "outputs", mpd_command_outputs, -1 }, - // Reflection -// { "config", mpd_command_config, -1 }, - { "commands", mpd_command_commands, -1 }, - { "notcommands", mpd_command_ignore, -1 }, - { "tagtypes", mpd_command_tagtypes, -1 }, - { "urlhandlers", mpd_command_urlhandlers, -1 }, - { "decoders", mpd_command_decoders, -1 }, + // Custom command outputvolume (not supported by mpd) + { "outputvolume", mpd_command_outputvolume, 3 }, // Client to client { "subscribe", mpd_command_ignore, -1 }, @@ -4315,8 +4360,18 @@ static struct mpd_command mpd_handlers[] = { "readmessages", mpd_command_ignore, -1 }, { "sendmessage", mpd_command_sendmessage, -1 }, - // Custom commands (not supported by mpd) - { "outputvolume", mpd_command_outputvolume, 3 }, + // Reflection +// { "config", mpd_command_config, -1 }, + { "commands", mpd_command_commands, -1 }, + { "notcommands", mpd_command_ignore, -1 }, + { "tagtypes", mpd_command_tagtypes, -1 }, + { "urlhandlers", mpd_command_urlhandlers, -1 }, + { "decoders", mpd_command_decoders, -1 }, + + // Command lists + { "command_list_begin", mpd_command_command_list_begin, -1 }, + { "command_list_ok_begin", mpd_command_command_list_ok_begin, -1 }, + { "command_list_end", mpd_command_command_list_end, -1 }, // NULL command to terminate loop { NULL, NULL, -1 } @@ -4344,98 +4399,11 @@ mpd_find_command(const char *name) return NULL; } -static int -mpd_command_commands(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) -{ - int i; - - for (i = 0; mpd_handlers[i].handler; i++) - { - evbuffer_add_printf(evbuf, - "command: %s\n", - mpd_handlers[i].mpdcommand); - } - - return 0; -} - -static inline int -mpd_ack_response(struct evbuffer *output, int err_code, int cmd_num, char *cmd_name, char *errmsg) -{ - return evbuffer_add_printf(output, "ACK [%d@%d] {%s} %s\n", err_code, cmd_num, cmd_name, errmsg); -} - -static inline int -mpd_ok_response(struct evbuffer *output) -{ - return evbuffer_add_printf(output, "OK\n"); -} - -/** - * Add a command line, including null terminator, into the command list buffer. - * These command lines will be processed when command_list_end is received. - */ -static int -mpd_command_list_add(struct mpd_client_ctx *client_ctx, char* line) -{ - if (client_ctx->cmd_list_buffer == NULL) - { - client_ctx->cmd_list_buffer = evbuffer_new(); - } - - return evbuffer_add(client_ctx->cmd_list_buffer, line, strlen(line) + 1); -} - -/** - * The result returned by mpd_process_command() and mpd_process_line() - */ -typedef enum mpd_command_result { - /** - * command handled with success. - * the connection should stay open. - * no response was sent. - * the caller of mpd_process_command sends OK or list_OK. - */ - CMD_RESULT_OK = 0, - - /** - * command handled with error. - * ack response was send by the command handler. - * the connection should stay open. - */ - CMD_RESULT_ERROR = 1, - - /** - * the client entered idle state. - * no response should be sent to the client. - */ - CMD_RESULT_IDLE = 2, - - /** - * the client connection should be closed - */ - CMD_RESULT_CLOSE = 3, -} -MpdCommandResult; - -typedef enum mpd_parse_args_result { - ARGS_OK, - ARGS_EMPTY, - ARGS_TOO_MANY, - ARGS_ERROR -} -MpdParseArgsResult; - -/* - * Parses the argument string into an array of strings. - * Arguments are seperated by a whitespace character and may be wrapped in double quotes. - * - * @param args the arguments - * @param argc the number of arguments in the argument string - * @param argv the array containing the found arguments - */ -static MpdParseArgsResult -mpd_parse_args(char *args, int *argc, char **argv, int argv_size) +// Parses the argument string into an array of strings. Arguments are separated +// by a whitespace character and may be wrapped in double quotes. ack_error is +// set and errmsg allocated if there is an error. +static enum mpd_ack_error +mpd_parse_args(char **argv, int argv_size, int *argc, char *args, bool *must_disconnect, char **errmsg) { char *input = args; int arg_count = 0; @@ -4446,331 +4414,242 @@ mpd_parse_args(char *args, int *argc, char **argv, int argv_size) { // Ignore whitespace characters if (*input == ' ') - { - input++; - continue; - } + { + input++; + continue; + } // Check if the parameter is wrapped in double quotes if (*input == '"') - { - argv[arg_count] = mpd_pars_quoted(&input); - if (argv[arg_count] == NULL) - { - return ARGS_ERROR; - } - arg_count += 1; - } + { + argv[arg_count] = mpd_pars_quoted(&input); + if (!argv[arg_count]) + goto error; + } else - { - argv[arg_count++] = mpd_pars_unquoted(&input); - } + { + argv[arg_count] = mpd_pars_unquoted(&input); + } + + arg_count++; } DPRINTF(E_SPAM, L_MPD, "Parse args: args count = \"%d\"\n", arg_count); *argc = arg_count; if (arg_count == 0) - return ARGS_EMPTY; + { + *errmsg = safe_asprintf("No command given"); + *must_disconnect = true; // in this case MPD disconnects the client + return ACK_ERROR_ARG; + } if (*input != 0 && arg_count == argv_size) - return ARGS_TOO_MANY; + { + *errmsg = safe_asprintf("Too many arguments: %d allowed", argv_size); + return ACK_ERROR_ARG; // in this case MPD doesn't disconnect the client + } - return ARGS_OK; + return ACK_ERROR_NONE; + + error: + *errmsg = safe_asprintf("Error parsing arguments"); + *must_disconnect = true; // in this case MPD disconnects the client + return ACK_ERROR_UNKNOWN; } -/** - * Process one command line. - * @param line - * @param output - * @param cmd_num - * @param client_ctx - * @return - */ -static MpdCommandResult -mpd_process_command(char *line, struct evbuffer *output, int cmd_num, struct mpd_client_ctx *client_ctx) +static enum mpd_ack_error +mpd_list_add(struct mpd_client_ctx *client_ctx, const char *line) { - char *argv[COMMAND_ARGV_MAX]; - int argc = 0; + size_t sz = strlen(line) + 1; + int ret; + + if (evbuffer_get_length(client_ctx->cmd_list_buffer) + sz > MPD_MAX_COMMAND_LIST_SIZE) + { + DPRINTF(E_LOG, L_MPD, "Max command list size (%uKB) exceeded\n", (MPD_MAX_COMMAND_LIST_SIZE / 1024)); + client_ctx->must_disconnect = true; + return ACK_ERROR_NONE; + } + + ret = evbuffer_add(client_ctx->cmd_list_buffer, line, sz); + if (ret < 0) + { + DPRINTF(E_LOG, L_MPD, "Failed to add to command list\n"); + client_ctx->must_disconnect = true; + return ACK_ERROR_NONE; + } + + return ACK_ERROR_NONE; +} + +static enum mpd_ack_error +mpd_process_command_line(struct evbuffer *output, char *line, int cmd_num, struct mpd_client_ctx *client_ctx) +{ + enum mpd_ack_error ack_error; + bool got_noidle; + char *argv[MPD_COMMAND_ARGV_MAX] = { 0 }; // Zero init just to silence false positive from scan-build + int argc = 0; // Also to silence scan-build + char *cmd_name = NULL; + struct mpd_command *command; char *errmsg = NULL; - int mpd_err_code = 0; - char *cmd_name = "unknown"; - MpdCommandResult cmd_result = CMD_RESULT_OK; + + // We're in command list mode, just add command to buffer and return + if ((client_ctx->cmd_list_type == COMMAND_LIST_BEGIN || client_ctx->cmd_list_type == COMMAND_LIST_OK_BEGIN) && strcmp(line, "command_list_end") != 0) + { + return mpd_list_add(client_ctx, line); + } + + got_noidle = (strcmp(line, "noidle") == 0); + if (got_noidle && !client_ctx->is_idle) + { + return ACK_ERROR_NONE; // Just ignore, don't proceed to send an OK + } + else if (!got_noidle && client_ctx->is_idle) + { + errmsg = safe_asprintf("Only 'noidle' is allowed during idle"); + ack_error = ACK_ERROR_ARG; + client_ctx->must_disconnect = true; + goto error; + } // Split the read line into command name and arguments - MpdParseArgsResult args_result = mpd_parse_args(line, &argc, argv, COMMAND_ARGV_MAX); - - switch (args_result) + ack_error = mpd_parse_args(argv, MPD_COMMAND_ARGV_MAX, &argc, line, &client_ctx->must_disconnect, &errmsg); + if (ack_error != ACK_ERROR_NONE) { - case ARGS_EMPTY: - DPRINTF(E_LOG, L_MPD, "No command given\n"); - errmsg = safe_asprintf("No command given"); - mpd_err_code = ACK_ERROR_ARG; - // in this case MPD disconnects the client - cmd_result = CMD_RESULT_CLOSE; - break; - - case ARGS_TOO_MANY: - DPRINTF(E_LOG, L_MPD, "Number of arguments exceeds max of %d: %s\n", COMMAND_ARGV_MAX, line); - errmsg = safe_asprintf("Too many arguments: %d allowed", COMMAND_ARGV_MAX); - mpd_err_code = ACK_ERROR_ARG; - // in this case MPD doesn't disconnect the client - cmd_result = CMD_RESULT_ERROR; - break; - - case ARGS_ERROR: - // Error handling for argument parsing error - DPRINTF(E_LOG, L_MPD, "Error parsing arguments for MPD message: %s\n", line); - errmsg = safe_asprintf("Error parsing arguments"); - mpd_err_code = ACK_ERROR_UNKNOWN; - // in this case MPD disconnects the client - cmd_result = CMD_RESULT_CLOSE; - break; - - case ARGS_OK: - cmd_name = argv[0]; - /* - * Find the command handler and execute the command function - */ - struct mpd_command *command = mpd_find_command(cmd_name); - - if (command == NULL) - { - errmsg = safe_asprintf("unknown command \"%s\"", cmd_name); - mpd_err_code = ACK_ERROR_UNKNOWN; - } - else if (command->min_argc > argc) - { - errmsg = safe_asprintf("Missing argument(s) for command '%s', expected %d, given %d", argv[0], - command->min_argc, argc); - mpd_err_code = ACK_ERROR_ARG; - } - else if (!client_ctx->authenticated && strcmp(cmd_name, "password") != 0) - { - errmsg = safe_asprintf("Not authenticated"); - mpd_err_code = ACK_ERROR_PERMISSION; - } - else - { - mpd_err_code = command->handler(output, argc, argv, &errmsg, client_ctx); - } - break; + goto error; } - /* - * If an error occurred, add the ACK line to the response buffer - */ - if (mpd_err_code != 0) + CHECK_NULL(L_MPD, argv[0]); + + cmd_name = argv[0]; + if (strcmp(cmd_name, "password") != 0 && !client_ctx->authenticated) { - DPRINTF(E_LOG, L_MPD, "Error executing command '%s': %s\n", line, errmsg); - mpd_ack_response(output, mpd_err_code, cmd_num, cmd_name, errmsg); - if (cmd_result == CMD_RESULT_OK) - { - cmd_result = CMD_RESULT_ERROR; - } - } - else if (0 == strcmp(cmd_name, "idle")) - { - cmd_result = CMD_RESULT_IDLE; - } - else if (0 == strcmp(cmd_name, "close")) - { - cmd_result = CMD_RESULT_CLOSE; + errmsg = safe_asprintf("Not authenticated"); + ack_error = ACK_ERROR_PERMISSION; + goto error; } - if (errmsg != NULL) - free(errmsg); + command = mpd_find_command(cmd_name); + if (!command) + { + errmsg = safe_asprintf("Unknown command"); + ack_error = ACK_ERROR_UNKNOWN; + goto error; + } + else if (command->min_argc > argc) + { + errmsg = safe_asprintf("Missing argument(s), expected %d, given %d", command->min_argc, argc); + ack_error = ACK_ERROR_ARG; + goto error; + } - return cmd_result; + ack_error = command->handler(output, argc, argv, &errmsg, client_ctx); + if (ack_error != ACK_ERROR_NONE) + { + goto error; + } + + if (client_ctx->cmd_list_type == COMMAND_LIST_NONE && !client_ctx->is_idle) + evbuffer_add_printf(output, "OK\n"); + + return ack_error; + + error: + DPRINTF(E_LOG, L_MPD, "Error processing command '%s': %s\n", line, errmsg); + + if (cmd_name) + evbuffer_add_printf(output, "ACK [%d@%d] {%s} %s\n", ack_error, cmd_num, cmd_name, errmsg); + + free(errmsg); + + return ack_error; } -static MpdCommandResult -mpd_process_line(char *line, struct evbuffer *output, struct mpd_client_ctx *client_ctx) +// Process the commands that were added to client_ctx->cmd_list_buffer +// From MPD documentation (https://mpd.readthedocs.io/en/latest/protocol.html#command-lists): +// It does not execute any commands until the list has ended. The response is +// a concatenation of all individual responses. +// If a command fails, no more commands are executed and the appropriate ACK +// error is returned. If command_list_ok_begin is used, list_OK is returned +// for each successful command executed in the command list. +// On success for all commands, OK is returned. +static void +mpd_process_command_list(struct evbuffer *output, struct mpd_client_ctx *client_ctx) { - /* - * "noidle" is ignored unless the client is in idle state - */ - if (0 == strcmp(line, "noidle")) - { - if (client_ctx->is_idle) - { - // leave idle state and send OK - client_ctx->is_idle = false; - mpd_ok_response(output); - } + char *line; + enum mpd_ack_error ack_error = ACK_ERROR_NONE; + int cmd_num = 0; - return CMD_RESULT_OK; + while ((line = evbuffer_readln(client_ctx->cmd_list_buffer, NULL, EVBUFFER_EOL_NUL))) + { + ack_error = mpd_process_command_line(output, line, cmd_num, client_ctx); + cmd_num++; + + free(line); + + if (ack_error != ACK_ERROR_NONE) + break; + + if (client_ctx->cmd_list_type == COMMAND_LIST_OK_END) + evbuffer_add_printf(output, "list_OK\n"); } - /* - * in idle state the only allowed command is "noidle" - */ - if (client_ctx->is_idle) - { - // during idle state client must not send anything except "noidle" - DPRINTF(E_FATAL, L_MPD, "Only \"noidle\" is allowed during idle. received: %s\n", line); - return CMD_RESULT_CLOSE; - } + if (ack_error == ACK_ERROR_NONE) + evbuffer_add_printf(output, "OK\n"); - MpdCommandResult res = CMD_RESULT_OK; - - if (client_ctx->cmd_list_type == COMMAND_LIST_NONE) - { - // not in command list - - if (0 == strcmp(line, "command_list_begin")) - { - client_ctx->cmd_list_type = COMMAND_LIST; - return CMD_RESULT_OK; - } - - if (0 == strcmp(line, "command_list_ok_begin")) - { - client_ctx->cmd_list_type = COMMAND_LIST_OK; - return CMD_RESULT_OK; - } - - res = mpd_process_command(line, output, 0, client_ctx); - - DPRINTF(E_DBG, L_MPD, "Command \"%s\" returned: %d\n", line, res); - - if (res == CMD_RESULT_OK) - { - mpd_ok_response(output); - } - } - else - { - // in command list - if (0 == strcmp(line, "command_list_end")) - { - // end of command list: - // process the commands that were added to client_ctx->cmd_list_buffer - // From MPD documentation (https://mpd.readthedocs.io/en/latest/protocol.html#command-lists): - // It does not execute any commands until the list has ended. The response is - // a concatenation of all individual responses. - // On success for all commands, OK is returned. - // If a command fails, no more commands are executed and the appropriate ACK error is returned. - // If command_list_ok_begin is used, list_OK is returned - // for each successful command executed in the command list. - - DPRINTF(E_DBG, L_MPD, "process command list\n"); - - bool ok_mode = (client_ctx->cmd_list_type == COMMAND_LIST_OK); - struct evbuffer *commands_buffer = client_ctx->cmd_list_buffer; - - client_ctx->cmd_list_type = COMMAND_LIST_NONE; - client_ctx->cmd_list_buffer = NULL; - - int cmd_num = 0; - char *cmd_line; - - if (commands_buffer != NULL) - { - while ((cmd_line = evbuffer_readln(commands_buffer, NULL, EVBUFFER_EOL_NUL))) - { - res = mpd_process_command(cmd_line, output, cmd_num++, client_ctx); - - free(cmd_line); - - if (res != CMD_RESULT_OK) break; - - if (ok_mode) - evbuffer_add_printf(output, "list_OK\n"); - } - - evbuffer_free(commands_buffer); - } - - DPRINTF(E_DBG, L_MPD, "Command list returned: %d\n", res); - - if (res == CMD_RESULT_OK) - { - mpd_ok_response(output); - } - } - else - { - // in command list: - // save commands in the client context - if (-1 == mpd_command_list_add(client_ctx, line)) - { - DPRINTF(E_FATAL, L_MPD, "Failed to add to command list\n"); - res = CMD_RESULT_CLOSE; - } - else if (evbuffer_get_length(client_ctx->cmd_list_buffer) > Config.MaxCommandListSize) - { - DPRINTF(E_FATAL, L_MPD, "Max command list size (%uKB) exceeded\n", (Config.MaxCommandListSize / 1024)); - res = CMD_RESULT_CLOSE; - } - else - { - res = CMD_RESULT_OK; - } - } - } - return res; + // Back to single-command mode + evbuffer_drain(client_ctx->cmd_list_buffer, -1); + client_ctx->cmd_list_type = COMMAND_LIST_NONE; } +/* --------------------------- Server implementation ------------------------ */ + /* - * The read callback function is invoked if a complete command sequence was received from the client - * (see mpd_input_filter function). + * The read callback function is invoked if a complete command sequence was + * received from the client (see mpd_input_filter function). * * @param bev the buffer event * @param ctx used for authentication */ static void -mpd_read_cb(struct bufferevent *bev, void *ctx) +mpd_read_cb(struct bufferevent *bev, void *arg) { + struct mpd_client_ctx *client_ctx = arg; struct evbuffer *input; struct evbuffer *output; char *line; - struct mpd_client_ctx *client_ctx = (struct mpd_client_ctx *)ctx; - if (client_ctx->is_closing) - { - // after freeing the bev ignore any reads - return; - } - - /* Get the input evbuffer, contains the command sequence received from the client */ + // Contains the command sequence received from the client input = bufferevent_get_input(bev); - /* Get the output evbuffer, used to send the server response to the client */ + // Used to send the server response to the client output = bufferevent_get_output(bev); while ((line = evbuffer_readln(input, NULL, EVBUFFER_EOL_ANY))) { - DPRINTF(E_DBG, L_MPD, "MPD message: \"%s\"\n", line); + DPRINTF(E_DBG, L_MPD, "MPD message: '%s'\n", line); - enum mpd_command_result res = mpd_process_line(line, output, client_ctx); + mpd_process_command_line(output, line, 0, client_ctx); free(line); - switch (res) { - case CMD_RESULT_ERROR: - case CMD_RESULT_IDLE: - case CMD_RESULT_OK: - break; + if (client_ctx->cmd_list_type == COMMAND_LIST_END || client_ctx->cmd_list_type == COMMAND_LIST_OK_END) + mpd_process_command_list(output, client_ctx); - case CMD_RESULT_CLOSE: - client_ctx->is_closing = true; - - if (client_ctx->cmd_list_buffer != NULL) - { - evbuffer_free(client_ctx->cmd_list_buffer); - client_ctx->cmd_list_buffer = NULL; - } - - /* - * Freeing the bufferevent closes the connection, if it was - * opened with BEV_OPT_CLOSE_ON_FREE. - * Since bufferevent is reference-counted, it will happen as - * soon as possible, not necessarily immediately. - */ - bufferevent_free(bev); - break; - } + if (client_ctx->must_disconnect) + goto disconnect; } + + return; + + disconnect: + DPRINTF(E_DBG, L_MPD, "Disconnecting client\n"); + + // Freeing the bufferevent closes the connection, since it was opened with + // BEV_OPT_CLOSE_ON_FREE. Bufferevents are internally reference-counted, so if + // the bufferevent has pending deferred callbacks when you free it, it won’t + // be deleted until the callbacks are done. + bufferevent_setcb(bev, NULL, NULL, NULL, NULL); + bufferevent_free(bev); } /* @@ -4817,10 +4696,11 @@ mpd_input_filter(struct evbuffer *src, struct evbuffer *dst, ev_ssize_t lim, enu ret = evbuffer_add_printf(dst, "%s\n", line); if (ret < 0) { - DPRINTF(E_LOG, L_MPD, "Error adding line to buffer: '%s'\n", line); - free(line); - return BEV_ERROR; - } + DPRINTF(E_LOG, L_MPD, "Error adding line to buffer: '%s'\n", line); + free(line); + return BEV_ERROR; + } + free(line); output_count += ret; } @@ -4855,14 +4735,13 @@ mpd_accept_conn_cb(struct evconnlistener *listener, */ struct event_base *base = evconnlistener_get_base(listener); struct bufferevent *bev = bufferevent_socket_new(base, sock, BEV_OPT_CLOSE_ON_FREE); - struct mpd_client_ctx *client_ctx = calloc(1, sizeof(struct mpd_client_ctx)); + struct mpd_client_ctx *client_ctx = client_ctx_add(); - if (!client_ctx) - { - DPRINTF(E_LOG, L_MPD, "Out of memory for command context\n"); - bufferevent_free(bev); - return; - } + bev = bufferevent_filter_new(bev, mpd_input_filter, NULL, BEV_OPT_CLOSE_ON_FREE, client_ctx_remove, client_ctx); + bufferevent_setcb(bev, mpd_read_cb, NULL, mpd_event_cb, client_ctx); + bufferevent_enable(bev, EV_READ | EV_WRITE); + + client_ctx->evbuffer = bufferevent_get_output(bev); client_ctx->authenticated = !cfg_getstr(cfg_getsec(cfg, "library"), "password"); if (!client_ctx->authenticated) @@ -4872,22 +4751,11 @@ mpd_accept_conn_cb(struct evconnlistener *listener, client_ctx->binarylimit = MPD_BINARY_SIZE; - client_ctx->next = mpd_clients; - mpd_clients = client_ctx; - - bev = bufferevent_filter_new(bev, mpd_input_filter, NULL, BEV_OPT_CLOSE_ON_FREE, free_mpd_client_ctx, client_ctx); - bufferevent_setcb(bev, mpd_read_cb, NULL, mpd_event_cb, client_ctx); - bufferevent_enable(bev, EV_READ | EV_WRITE); - /* * According to the mpd protocol send "OK MPD \n" to the client, where version is the version * of the supported mpd protocol and not the server version. */ - evbuffer_add(bufferevent_get_output(bev), "OK MPD 0.20.0\n", 14); - client_ctx->evbuffer = bufferevent_get_output(bev); - client_ctx->cmd_list_type = COMMAND_LIST_NONE; - client_ctx->is_idle = false; - client_ctx->is_closing = false; + evbuffer_add(client_ctx->evbuffer, "OK MPD 0.22.4\n", 14); DPRINTF(E_INFO, L_MPD, "New mpd client connection accepted\n"); } @@ -4906,49 +4774,6 @@ mpd_accept_error_cb(struct evconnlistener *listener, void *ctx) DPRINTF(E_LOG, L_MPD, "Error occured %d (%s) on the listener.\n", err, evutil_socket_error_to_string(err)); } -static int -mpd_notify_idle_client(struct mpd_client_ctx *client_ctx, short events) -{ - if (!client_ctx->is_idle) - { - client_ctx->events |= events; - return 1; - } - - if (!(client_ctx->idle_events & events)) - { - DPRINTF(E_DBG, L_MPD, "Client not listening for events: %d\n", events); - return 1; - } - - if (events & LISTENER_DATABASE) - evbuffer_add(client_ctx->evbuffer, "changed: database\n", 18); - if (events & LISTENER_UPDATE) - evbuffer_add(client_ctx->evbuffer, "changed: update\n", 16); - if (events & LISTENER_QUEUE) - evbuffer_add(client_ctx->evbuffer, "changed: playlist\n", 18); - if (events & LISTENER_PLAYER) - evbuffer_add(client_ctx->evbuffer, "changed: player\n", 16); - if (events & LISTENER_VOLUME) - evbuffer_add(client_ctx->evbuffer, "changed: mixer\n", 15); - if (events & LISTENER_SPEAKER) - evbuffer_add(client_ctx->evbuffer, "changed: output\n", 16); - if (events & LISTENER_OPTIONS) - evbuffer_add(client_ctx->evbuffer, "changed: options\n", 17); - if (events & LISTENER_STORED_PLAYLIST) - evbuffer_add(client_ctx->evbuffer, "changed: stored_playlist\n", 25); - if (events & LISTENER_RATING) - evbuffer_add(client_ctx->evbuffer, "changed: sticker\n", 17); - - evbuffer_add(client_ctx->evbuffer, "OK\n", 3); - - client_ctx->is_idle = false; - client_ctx->idle_events = 0; - client_ctx->events = 0; - - return 0; -} - static enum command_state mpd_notify_idle(void *arg, int *retval) { @@ -4965,7 +4790,10 @@ mpd_notify_idle(void *arg, int *retval) { DPRINTF(E_DBG, L_MPD, "Notify client #%d\n", i); - mpd_notify_idle_client(client, event_mask); + notify_idle_client(client, event_mask); + + evbuffer_add_printf(client->evbuffer, "OK\n"); + client = client->next; i++; } @@ -5099,6 +4927,33 @@ artwork_cb(struct evhttp_request *req, void *arg) free(decoded_path); } + +/* -------------------------------- Event loop ------------------------------ */ + +/* Thread: mpd */ +static void * +mpd(void *arg) +{ + int ret; + + ret = db_perthread_init(); + if (ret < 0) + { + DPRINTF(E_LOG, L_MPD, "Error: DB init failed\n"); + + pthread_exit(NULL); + } + + event_base_dispatch(evbase_mpd); + + db_perthread_deinit(); + + pthread_exit(NULL); +} + + +/* -------------------------------- Init/deinit ----------------------------- */ + /* Thread: main */ static int mpd_httpd_init(void) @@ -5145,26 +5000,12 @@ mpd_init(void) const char *pl_dir; int ret; - cfg_t *mpd_section = cfg_getsec(cfg, "mpd"); - - port = cfg_getint(mpd_section, "port"); + port = cfg_getint(cfg_getsec(cfg, "mpd"), "port"); if (port <= 0) { DPRINTF(E_INFO, L_MPD, "MPD not enabled\n"); return 0; } - - long max_command_list_size = cfg_getint(mpd_section, "max_command_list_size"); - if (max_command_list_size <= 0 || max_command_list_size > INT_MAX) - { - DPRINTF(E_INFO, L_MPD, "Ignoring invalid config \"max_command_list_size\" (%ld). Will use the default %uKB instead.\n", - max_command_list_size, - (Config.MaxCommandListSize / 1024)); - } - else - { - Config.MaxCommandListSize = max_command_list_size * 1024; // from KB to bytes - } CHECK_NULL(L_MPD, evbase_mpd = event_base_new()); CHECK_NULL(L_MPD, cmdbase = commands_base_new(evbase_mpd, NULL)); @@ -5271,7 +5112,7 @@ mpd_deinit(void) while (mpd_clients) { - free_mpd_client_ctx(mpd_clients); + client_ctx_remove(mpd_clients); } mpd_httpd_deinit(); From 6b55ee289045e86eab45313356af807405230d0d Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Tue, 10 Sep 2024 22:39:23 +0200 Subject: [PATCH 07/65] [db] free_query_params should also free qp->group Plus honor qp->order in queue_enum_start() if set by caller --- src/db.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/db.c b/src/db.c index 541e4762..f8e8618d 100644 --- a/src/db.c +++ b/src/db.c @@ -844,6 +844,7 @@ free_query_params(struct query_params *qp, int content_only) free(qp->filter); free(qp->having); free(qp->order); + free(qp->group); if (!content_only) free(qp); @@ -5291,7 +5292,9 @@ queue_enum_start(struct query_params *qp) qp->stmt = NULL; - if (qp->sort) + if (qp->order) + orderby = qp->order; + else if (qp->sort) orderby = sort_clause[qp->sort]; else orderby = sort_clause[S_POS]; From 1e485f7d283f76d6047176d9c928556db7619b12 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Thu, 12 Sep 2024 16:58:52 +0200 Subject: [PATCH 08/65] [mpd] Make protocol version a #define --- src/mpd.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/mpd.c b/src/mpd.c index d5f03f62..1beb5a47 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -51,6 +51,10 @@ #include "player.h" #include "remote_pairing.h" +// According to the mpd protocol send "OK MPD \n" to the client, where +// version is the version of the supported mpd protocol and not the server version +#define MPD_PROTOCOL_VERSION_OK "OK MPD 0.22.4\n" + /** * from MPD source: * * @@ -4751,11 +4755,8 @@ mpd_accept_conn_cb(struct evconnlistener *listener, client_ctx->binarylimit = MPD_BINARY_SIZE; - /* - * According to the mpd protocol send "OK MPD \n" to the client, where version is the version - * of the supported mpd protocol and not the server version. - */ - evbuffer_add(client_ctx->evbuffer, "OK MPD 0.22.4\n", 14); + // No zero terminator (newline in the string is terminator) + evbuffer_add(client_ctx->evbuffer, MPD_PROTOCOL_VERSION_OK, strlen(MPD_PROTOCOL_VERSION_OK)); DPRINTF(E_INFO, L_MPD, "New mpd client connection accepted\n"); } From 94ce56d7b11d3bd0d8aaab6da9aa12626954f09a Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Sat, 31 Aug 2024 00:02:25 +0200 Subject: [PATCH 09/65] [mpd] Add Bison/Flex parser for complex mpd commands + misc Some of the misc: * Initialize query_params from the start of each function * Reduce code duplication by consolidating the handler's integer conversion * Go back to classic int return types for handlers * Change list grouping to respond like mpd * Sanitize all user string output --- src/Makefile.am | 4 +- src/mpd.c | 3071 +++++++++++++++----------------------- src/parsers/mpd_lexer.l | 124 ++ src/parsers/mpd_parser.y | 806 ++++++++++ 4 files changed, 2139 insertions(+), 1866 deletions(-) create mode 100644 src/parsers/mpd_lexer.l create mode 100644 src/parsers/mpd_parser.y diff --git a/src/Makefile.am b/src/Makefile.am index f0d4ccbf..0a277642 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -53,8 +53,8 @@ GPERF_FILES = \ GPERF_SRC = $(GPERF_FILES:.gperf=_hash.h) -LEXER_SRC = parsers/daap_lexer.l parsers/smartpl_lexer.l parsers/rsp_lexer.l -PARSER_SRC = parsers/daap_parser.y parsers/smartpl_parser.y parsers/rsp_parser.y +LEXER_SRC = parsers/daap_lexer.l parsers/smartpl_lexer.l parsers/rsp_lexer.l parsers/mpd_lexer.l +PARSER_SRC = parsers/daap_parser.y parsers/smartpl_parser.y parsers/rsp_parser.y parsers/mpd_parser.y # This flag is given to Bison and tells it to produce headers. Note that # automake recognizes this flag too, and has special logic around it, so don't diff --git a/src/mpd.c b/src/mpd.c index 1beb5a47..c5584d6b 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -16,6 +16,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* + * To test with raw command input use: + * echo "command" | nc -q0 localhost 6600 + * Or interactive with: + * socat - TCP:localhost:6600 + */ + #ifdef HAVE_CONFIG_H # include #endif @@ -33,6 +40,7 @@ #include #include #include +#include // isdigit #include #include @@ -50,6 +58,17 @@ #include "misc.h" #include "player.h" #include "remote_pairing.h" +#include "parsers/mpd_parser.h" + +// TODO +// optimize queries (map albumartist/album groupings to songalbumid/artistid in db.c) +// support for group in count, e.g. count group artist +// empty group value is a negation + +// Command handlers should use this for returning errors to make sure both +// ack_error and errmsg are correctly set +#define RETURN_ERROR(r, ...) \ + do { out->ack_error = (r); free(out->errmsg); out->errmsg = safe_asprintf(__VA_ARGS__); return -1; } while(0) // According to the mpd protocol send "OK MPD \n" to the client, where // version is the version of the supported mpd protocol and not the server version @@ -100,12 +119,6 @@ enum mpd_ack_error ACK_ERROR_EXIST = 56, }; -enum mpd_type { - MPD_TYPE_INT, - MPD_TYPE_STRING, - MPD_TYPE_SPECIAL, -}; - enum command_list_type { COMMAND_LIST_NONE = 0, @@ -115,26 +128,6 @@ enum command_list_type COMMAND_LIST_OK_END, }; -struct mpd_tagtype -{ - char *tag; - char *field; - char *sort_field; - char *group_field; - enum mpd_type type; - ssize_t mfi_offset; - - /* - * This allows omitting the "group" fields in the created group by clause to improve - * performance in the "list" command. For example listing albums and artists already - * groups by their persistent id, an additional group clause by artist/album will - * decrease performance of the select query and will in general not change the result - * (e. g. album persistent id is generated by artist and album and listing albums - * grouped by artist is therefor not necessary). - */ - bool group_in_listcommand; -}; - struct mpd_client_ctx { // True if the connection is already authenticated or does not need authentication @@ -172,22 +165,47 @@ struct mpd_client_ctx struct mpd_client_ctx *next; }; +#define MPD_WANTS_NUM_ARGV_MIN 1 +#define MPD_WANTS_NUM_ARGV_MAX 3 +enum command_wants_num +{ + MPD_WANTS_NUM_NONE = 0, + MPD_WANTS_NUM_ARG1_IVAL = (1 << (0 + MPD_WANTS_NUM_ARGV_MIN)), + MPD_WANTS_NUM_ARG2_IVAL = (1 << (1 + MPD_WANTS_NUM_ARGV_MIN)), + MPD_WANTS_NUM_ARG3_IVAL = (1 << (2 + MPD_WANTS_NUM_ARGV_MIN)), + MPD_WANTS_NUM_ARG1_UVAL = (1 << (0 + MPD_WANTS_NUM_ARGV_MIN + MPD_WANTS_NUM_ARGV_MAX)), + MPD_WANTS_NUM_ARG2_UVAL = (1 << (1 + MPD_WANTS_NUM_ARGV_MIN + MPD_WANTS_NUM_ARGV_MAX)), + MPD_WANTS_NUM_ARG3_UVAL = (1 << (2 + MPD_WANTS_NUM_ARGV_MIN + MPD_WANTS_NUM_ARGV_MAX)), +}; + +struct mpd_command_input +{ + // Raw argument line + const char *args_raw; + + // Argument line unescaped and split + char *args_split; + char *argv[MPD_COMMAND_ARGV_MAX]; + int argc; + + int has_num; + int32_t argv_i32val[MPD_COMMAND_ARGV_MAX]; + uint32_t argv_u32val[MPD_COMMAND_ARGV_MAX]; +}; + +struct mpd_command_output +{ + struct evbuffer *evbuf; + char *errmsg; + enum mpd_ack_error ack_error; +}; + struct mpd_command { - /* The command name */ - const char *mpdcommand; - - /* - * The function to execute the command - * - * @param evbuf the response event buffer - * @param argc number of arguments in argv - * @param argv argument array, first entry is the commandname - * @param errmsg error message set by this function if an error occured - * @return MPD ack error (ACK_ERROR_NONE on succes) - */ - enum mpd_ack_error (*handler)(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx); + const char *name; + int (*handler)(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx); int min_argc; + int wants_num; }; struct output @@ -274,47 +292,31 @@ static const char * const ffmpeg_mime_types[] = { "application/flv", "applicatio NULL }; -static struct mpd_tagtype tagtypes[] = - { - /* tag | db field | db sort field | db group field | type | media_file offset | group_in_listcommand */ - - // We treat the artist tag as album artist, this allows grouping over the artist-persistent-id index and increases performance - // { "Artist", "f.artist", "f.artist", "f.artist", MPD_TYPE_STRING, dbmfi_offsetof(artist), }, - { "Artist", "f.album_artist", "f.album_artist_sort, f.album_artist", "f.songartistid", MPD_TYPE_STRING, dbmfi_offsetof(album_artist), false, }, - { "ArtistSort", "f.album_artist_sort", "f.album_artist_sort, f.album_artist", "f.songartistid", MPD_TYPE_STRING, dbmfi_offsetof(album_artist_sort), false, }, - { "AlbumArtist", "f.album_artist", "f.album_artist_sort, f.album_artist", "f.songartistid", MPD_TYPE_STRING, dbmfi_offsetof(album_artist), false, }, - { "AlbumArtistSort", "f.album_artist_sort", "f.album_artist_sort, f.album_artist", "f.songartistid", MPD_TYPE_STRING, dbmfi_offsetof(album_artist_sort), false, }, - { "Album", "f.album", "f.album_sort, f.album", "f.songalbumid", MPD_TYPE_STRING, dbmfi_offsetof(album), false, }, - { "Title", "f.title", "f.title", "f.title", MPD_TYPE_STRING, dbmfi_offsetof(title), true, }, - { "Track", "f.track", "f.track", "f.track", MPD_TYPE_INT, dbmfi_offsetof(track), true, }, - { "Genre", "f.genre", "f.genre", "f.genre", MPD_TYPE_STRING, dbmfi_offsetof(genre), true, }, - { "Disc", "f.disc", "f.disc", "f.disc", MPD_TYPE_INT, dbmfi_offsetof(disc), true, }, - { "Date", "f.year", "f.year", "f.year", MPD_TYPE_INT, dbmfi_offsetof(year), true, }, - { "file", NULL, NULL, NULL, MPD_TYPE_SPECIAL, -1, true, }, - { "base", NULL, NULL, NULL, MPD_TYPE_SPECIAL, -1, true, }, - { "any", NULL, NULL, NULL, MPD_TYPE_SPECIAL, -1, true, }, - { "modified-since", NULL, NULL, NULL, MPD_TYPE_SPECIAL, -1, true, }, - - }; - /* -------------------------------- Helpers --------------------------------- */ -static struct mpd_tagtype * -find_tagtype(const char *tag) +/* + * Some MPD clients crash if the tag value includes the newline character. + * While they should normally not be included in most ID3 tags, they sometimes + * are, so we just change them to space. See #1613 for more details. + */ +static char * +sanitize(char *strval) { - int i; + char *ptr = strval; - if (!tag) - return 0; + if (!strval) + return ""; - for (i = 0; i < ARRAY_SIZE(tagtypes); i++) + while (*ptr != '\0') { - if (strcasecmp(tag, tagtypes[i].tag) == 0) - return &tagtypes[i]; + if (*ptr == '\n') + *ptr = ' '; + + ptr++; } - return NULL; + return strval; } static void @@ -422,16 +424,16 @@ mpd_time(char *buffer, size_t bufferlen, time_t t) } /* - * Parses a range argument of the form START:END (the END item is not included in the range) + * Splits a range argument of the form START:END (the END item is not included in the range) * into its start and end position. * - * @param range the range argument * @param start_pos set by this method to the start position * @param end_pos set by this method to the end postion + * @param range the range argument * @return 0 on success, -1 on failure */ static int -mpd_pars_range_arg(const char *range, int *start_pos, int *end_pos) +range_pos_from_arg(int *start_pos, int *end_pos, const char *range) { int ret; @@ -440,7 +442,7 @@ mpd_pars_range_arg(const char *range, int *start_pos, int *end_pos) ret = sscanf(range, "%d:%d", start_pos, end_pos); if (ret < 0) { - DPRINTF(E_LOG, L_MPD, "Error parsing range argument '%s' (return code = %d)\n", range, ret); + DPRINTF(E_LOG, L_MPD, "Error splitting range argument '%s' (return code = %d)\n", range, ret); return -1; } } @@ -449,7 +451,7 @@ mpd_pars_range_arg(const char *range, int *start_pos, int *end_pos) ret = safe_atoi32(range, start_pos); if (ret < 0) { - DPRINTF(E_LOG, L_MPD, "Error parsing integer argument '%s' (return code = %d)\n", range, ret); + DPRINTF(E_LOG, L_MPD, "Error spitting integer argument '%s' (return code = %d)\n", range, ret); return -1; } @@ -459,11 +461,51 @@ mpd_pars_range_arg(const char *range, int *start_pos, int *end_pos) return 0; } +/* + * Converts a TO arg, which is either an absolute position "X", or a position + * relative to currently playing song "+X"/"-X", into absolute queue pos. + * + * @param to_pos set by this method to absolute queue pos + * @param to_arg string with an integer (abs) or prefixed with +/- (rel) + * @return 0 on success, -1 on failure + */ +static int +to_pos_from_arg(int *to_pos, const char *to_arg) +{ + struct player_status status; + struct db_queue_item *queue_item; + int ret; + + *to_pos = -1; + + if (!to_arg) + return 0; // If no to_arg, assume end of queue (to_pos = -1) + + ret = safe_atoi32(to_arg, to_pos); // +12 will become 12, -12 becomes -12 + if (ret < 0) + return -1; + + if (to_arg[0] != '+' && to_arg[0] != '-') + return 0; + + ret = player_get_status(&status); + if (ret < 0) + return -1; + + queue_item = (status.status == PLAY_STOPPED) ? db_queue_fetch_bypos(0, status.shuffle) : db_queue_fetch_byitemid(status.item_id); + if (!queue_item) + return -1; + + *to_pos += queue_item->pos; + free_queue_item(queue_item, 0); + return 0; +} + /* * Returns the next unquoted string argument from the input string */ static char* -mpd_pars_unquoted(char **input) +mpd_next_unquoted(char **input) { char *arg; @@ -489,7 +531,7 @@ mpd_pars_unquoted(char **input) * with the quotes removed */ static char* -mpd_pars_quoted(char **input) +mpd_next_quoted(char **input) { char *arg; char *src; @@ -526,6 +568,52 @@ mpd_pars_quoted(char **input) return arg; } +// Splits the argument string into an array of strings. Arguments are separated +// by a whitespace character and may be wrapped in double quotes. +static int +mpd_split_args(char **argv, int argv_size, int *argc, char **split, const char *line) +{ + char *ptr; + int arg_count = 0; + + *split = safe_strdup(line); + ptr = *split; + + while (*ptr != 0 && arg_count < argv_size) + { + // Ignore whitespace characters + if (*ptr == ' ') + { + ptr++; + continue; + } + + // Check if the parameter is wrapped in double quotes + if (*ptr == '"') + argv[arg_count] = mpd_next_quoted(&ptr); + else + argv[arg_count] = mpd_next_unquoted(&ptr); + + if (!argv[arg_count]) + goto error; + + arg_count++; + } + + *argc = arg_count; + + // No args or too many args + if (arg_count == 0 || (*ptr != 0 && arg_count == argv_size)) + goto error; + + return 0; + + error: + free(*split); + *split = NULL; + return -1; +} + /* * Adds the information (path, id, tags, etc.) for the given song to the given buffer * with additional information for the position of this song in the player queue. @@ -582,15 +670,15 @@ mpd_add_db_queue_item(struct evbuffer *evbuf, struct db_queue_item *queue_item) (queue_item->virtual_path + 1), modified, (queue_item->song_length / 1000), - queue_item->artist, - queue_item->album_artist, - queue_item->artist_sort, - queue_item->album_artist_sort, - queue_item->album, - queue_item->title, + sanitize(queue_item->artist), + sanitize(queue_item->album_artist), + sanitize(queue_item->artist_sort), + sanitize(queue_item->album_artist_sort), + sanitize(queue_item->album), + sanitize(queue_item->title), queue_item->track, queue_item->year, - queue_item->genre, + sanitize(queue_item->genre), queue_item->disc, queue_item->pos, queue_item->id); @@ -665,204 +753,132 @@ mpd_add_db_media_file_info(struct evbuffer *evbuf, struct db_media_file_info *db modified, (songlength / 1000), ((float) songlength / 1000), - dbmfi->artist, - dbmfi->album_artist, - dbmfi->artist_sort, - dbmfi->album_artist_sort, - dbmfi->album, - dbmfi->title, + sanitize(dbmfi->artist), + sanitize(dbmfi->album_artist), + sanitize(dbmfi->artist_sort), + sanitize(dbmfi->album_artist_sort), + sanitize(dbmfi->album), + sanitize(dbmfi->title), dbmfi->track, dbmfi->year, - dbmfi->genre, + sanitize(dbmfi->genre), dbmfi->disc); return ret; } -static void -append_string(char **a, const char *b, const char *separator) +static bool +is_filter_end(const char *arg) { - char *temp; + return (strcasecmp(arg, "sort") == 0 || strcasecmp(arg, "group") == 0 || strcasecmp(arg, "window") == 0); +} - if (*a) - temp = db_mprintf("%s%s%s", *a, (separator ? separator : ""), b); - else - temp = db_mprintf("%s", b); +// The bison/flex parser only works with the filter format used after version +// 0.20 e.g. "(TAG == 'value') instead of TAG VALUE. +static int +args_reassemble(char *args, size_t args_size, int argc, char **argv) +{ + const char *op; + int filter_start; + int filter_end; + int i; - free(*a); - *a = temp; + // "list" has the filter as second arg, the rest have it as first + filter_start = (strcmp(argv[0], "list") == 0) ? 2 : 1; + op = strstr(argv[0], "search") ? " contains " : " == "; + + for (i = filter_start; i < argc && !is_filter_end(argv[i]); i++) + ; + + filter_end = i; + + snprintf(args, args_size, "%s", argv[0]); + + for (i = 1; i < filter_start; i++) + safe_snprintf_cat(args, args_size, " %s", argv[i]); + + for (i = filter_start; i < filter_end; i++) + { + if (*argv[i] == '(') + { + safe_snprintf_cat(args, args_size, " %s", argv[i]); + } + else if (i + 1 < filter_end) // Legacy filter format (0.20 and before), we will convert + { + safe_snprintf_cat(args, args_size, " %s%s%s\"%s\"%s", i == filter_start ? "((" : "AND (", argv[i], op, argv[i + 1], i + 2 == filter_end ? "))" : ")"); + i++; + } + else if (filter_end == filter_start + 1) // Special case: a legacy single token is allowed if listing albums for an artist + { + safe_snprintf_cat(args, args_size, " (AlbumArtist%s\"%s\")", op, argv[i]); + } + } + + for (i = filter_end; i < argc; i++) + safe_snprintf_cat(args, args_size, " %s", argv[i]); + + // Return an error if the buffer was filled and thus probably truncated + return (strlen(args) + 1 < args_size) ? 0 : -1; } /* - * Sets the filter (where clause) and the window (limit clause) in the given query_params - * based on the given arguments + * Invokes a lexer/parser to read a supported command * - * @param argc Number of arguments in argv - * @param argv Pointer to the first filter parameter - * @param exact_match If true, creates filter for exact matches (e.g. find command) otherwise matches substrings (e.g. search command) - * @param qp Query parameters + * @param qp Must be initialized by caller (zeroed or set to default values) + * @param pos Allocated string with TO position parameter, e.g. "+5" (or NULL) + * @param type Allocated string with TYPE parameter, e.g. "albums" (or NULL) + * @param in The command input */ static int -parse_filter_window_params(int argc, char **argv, bool exact_match, struct query_params *qp) +parse_command(struct query_params *qp, char **pos, char **tagtype, struct mpd_command_input *in) { - struct mpd_tagtype *tagtype; - char *c1; - int start_pos; - int end_pos; - int i; - uint32_t num; + struct mpd_result result; + char args_reassembled[8192]; int ret; - c1 = NULL; + if (pos) + *pos = NULL; + if (tagtype) + *tagtype = NULL; - for (i = 0; i < argc; i += 2) + if (in->argc < 2) + return 0; // Nothing to parse + + ret = args_reassemble(args_reassembled, sizeof(args_reassembled), in->argc, in->argv); + if (ret < 0) { - // End of filter key/value pairs reached, if keywords "window" or "group" found - if (0 == strcasecmp(argv[i], "window") || 0 == strcasecmp(argv[i], "group")) - break; - - // Process filter key/value pair - if ((i + 1) < argc) - { - tagtype = find_tagtype(argv[i]); - - if (!tagtype) - { - DPRINTF(E_WARN, L_MPD, "Parameter '%s' is not supported and will be ignored\n", argv[i]); - continue; - } - - if (tagtype->type == MPD_TYPE_STRING) - { - if (exact_match) - c1 = db_mprintf("(%s = '%q')", tagtype->field, argv[i + 1]); - else - c1 = db_mprintf("(%s LIKE '%%%q%%')", tagtype->field, argv[i + 1]); - } - else if (tagtype->type == MPD_TYPE_INT) - { - ret = safe_atou32(argv[i + 1], &num); - if (ret < 0) - DPRINTF(E_WARN, L_MPD, "%s parameter '%s' is not an integer and will be ignored\n", tagtype->tag, argv[i + 1]); - else - c1 = db_mprintf("(%s = %d)", tagtype->field, num); - } - else if (tagtype->type == MPD_TYPE_SPECIAL) - { - if (0 == strcasecmp(tagtype->tag, "any")) - { - c1 = db_mprintf("(f.artist LIKE '%%%q%%' OR f.album LIKE '%%%q%%' OR f.title LIKE '%%%q%%')", argv[i + 1], argv[i + 1], argv[i + 1]); - } - else if (0 == strcasecmp(tagtype->tag, "file")) - { - if (exact_match) - c1 = db_mprintf("(f.virtual_path = '/%q')", argv[i + 1]); - else - c1 = db_mprintf("(f.virtual_path LIKE '%%%q%%')", argv[i + 1]); - } - else if (0 == strcasecmp(tagtype->tag, "base")) - { - c1 = db_mprintf("(f.virtual_path LIKE '/%q%%')", argv[i + 1]); - } - else if (0 == strcasecmp(tagtype->tag, "modified-since")) - { - // according to the mpd protocol specification the value can be a unix timestamp or ISO 8601 - if (strchr(argv[i + 1], '-') == NULL) - c1 = db_mprintf("(f.time_modified > strftime('%%s', datetime('%q', 'unixepoch')))", argv[i + 1]); - else - c1 = db_mprintf("(f.time_modified > strftime('%%s', datetime('%q', 'utc')))", argv[i + 1]); - } - else - { - DPRINTF(E_WARN, L_MPD, "Unknown special parameter '%s' will be ignored\n", tagtype->tag); - } - } - } - else if (i == 0 && argc == 1) - { - // Special case: a single token is allowed if listing albums for an artist - c1 = db_mprintf("(f.album_artist = '%q')", argv[i]); - } - else - { - DPRINTF(E_WARN, L_MPD, "Missing value for parameter '%s', ignoring '%s'\n", argv[i], argv[i]); - } - - if (c1) - { - append_string(&qp->filter, c1, " AND "); - - free(c1); - c1 = NULL; - } + DPRINTF(E_LOG, L_MPD, "Could not prepare '%s' for parsing\n", in->args_raw); + return -1; } - if ((i + 1) < argc && 0 == strcasecmp(argv[i], "window")) + DPRINTF(E_DBG, L_MPD, "Parse mpd query input '%s'\n", args_reassembled); + + ret = mpd_lex_parse(&result, args_reassembled); + if (ret != 0) { - ret = mpd_pars_range_arg(argv[i + 1], &start_pos, &end_pos); - if (ret == 0) - { - qp->idx_type = I_SUB; - qp->limit = end_pos - start_pos; - qp->offset = start_pos; - } - else - { - DPRINTF(E_LOG, L_MPD, "Window argument doesn't convert to integer or range: '%s'\n", argv[i + 1]); - } + DPRINTF(E_LOG, L_MPD, "Could not parse '%s': %s\n", args_reassembled, result.errmsg); + return -1; } + qp->filter = safe_strdup(result.where); + qp->order = safe_strdup(result.order); + qp->group = safe_strdup(result.group); + + qp->limit = result.limit; + qp->offset = result.offset; + qp->idx_type = (qp->limit || qp->offset) ? I_SUB : I_NONE; + + if (pos) + *pos = safe_strdup(result.position); + + if (tagtype) + *tagtype = safe_strdup(result.tagtype); + return 0; } static int -parse_group_params(int argc, char **argv, bool group_in_listcommand, struct query_params *qp, struct mpd_tagtype ***group, int *groupsize) -{ - int first_group; - int i; - int j; - struct mpd_tagtype *tagtype; - - *groupsize = 0; - *group = NULL; - - // Iterate through arguments to the first "group" argument - for (first_group = 0; first_group < argc; first_group++) - { - if (0 == strcasecmp(argv[first_group], "group")) - break; - } - - // Early return if no group keyword in arguments (or group keyword not followed by field argument) - if ((first_group + 1) >= argc || (argc - first_group) % 2 != 0) - return 0; - - *groupsize = (argc - first_group) / 2; - - CHECK_NULL(L_MPD, *group = calloc(*groupsize, sizeof(struct mpd_tagtype *))); - - // Now process all group/field arguments - for (j = 0; j < (*groupsize); j++) - { - i = first_group + (j * 2); - - if ((i + 1) < argc && 0 == strcasecmp(argv[i], "group")) - { - tagtype = find_tagtype(argv[i + 1]); - if (tagtype && tagtype->type != MPD_TYPE_SPECIAL) - { - if (group_in_listcommand) - append_string(&qp->group, tagtype->group_field, ", "); - (*group)[j] = tagtype; - } - } - } - - return 0; -} - -static int -notify_idle_client(struct mpd_client_ctx *client_ctx, short events) +notify_idle_client(struct mpd_client_ctx *client_ctx, short events, bool add_ok) { if (!client_ctx->is_idle) { @@ -895,6 +911,9 @@ notify_idle_client(struct mpd_client_ctx *client_ctx, short events) if (events & LISTENER_RATING) evbuffer_add(client_ctx->evbuffer, "changed: sticker\n", 17); + if (add_ok) + evbuffer_add(client_ctx->evbuffer, "OK\n", 3); + client_ctx->is_idle = false; client_ctx->idle_events = 0; client_ctx->events = 0; @@ -905,10 +924,9 @@ notify_idle_client(struct mpd_client_ctx *client_ctx, short events) /* ----------------------------- Command handlers --------------------------- */ -static enum mpd_ack_error -mpd_command_currentsong(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_currentsong(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct player_status status; struct db_queue_item *queue_item; int ret; @@ -921,59 +939,55 @@ mpd_command_currentsong(struct evbuffer *evbuf, int argc, char **argv, char **er queue_item = db_queue_fetch_byitemid(status.item_id); if (!queue_item) - { - return ACK_ERROR_NONE; - } - - ret = mpd_add_db_queue_item(evbuf, queue_item); + return 0; + ret = mpd_add_db_queue_item(out->evbuf, queue_item); free_queue_item(queue_item, 0); - if (ret < 0) - { - *errmsg = safe_asprintf("Error setting media info for file with id: %d", status.id); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Error setting media info for file with id: %d", status.id); - return ACK_ERROR_NONE; + return 0; } /* * Example input: * idle "database" "mixer" "options" "output" "player" "playlist" "sticker" "update" */ -static enum mpd_ack_error -mpd_command_idle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_idle(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { + char *key; int i; ctx->idle_events = 0; ctx->is_idle = true; - if (argc > 1) + if (in->argc > 1) { - for (i = 1; i < argc; i++) + for (i = 1; i < in->argc; i++) { - if (0 == strcmp(argv[i], "database")) + key = in->argv[i]; + + if (0 == strcmp(key, "database")) ctx->idle_events |= LISTENER_DATABASE; - else if (0 == strcmp(argv[i], "update")) + else if (0 == strcmp(key, "update")) ctx->idle_events |= LISTENER_UPDATE; - else if (0 == strcmp(argv[i], "player")) + else if (0 == strcmp(key, "player")) ctx->idle_events |= LISTENER_PLAYER; - else if (0 == strcmp(argv[i], "playlist")) + else if (0 == strcmp(key, "playlist")) ctx->idle_events |= LISTENER_QUEUE; - else if (0 == strcmp(argv[i], "mixer")) + else if (0 == strcmp(key, "mixer")) ctx->idle_events |= LISTENER_VOLUME; - else if (0 == strcmp(argv[i], "output")) + else if (0 == strcmp(key, "output")) ctx->idle_events |= LISTENER_SPEAKER; - else if (0 == strcmp(argv[i], "options")) + else if (0 == strcmp(key, "options")) ctx->idle_events |= LISTENER_OPTIONS; - else if (0 == strcmp(argv[i], "stored_playlist")) + else if (0 == strcmp(key, "stored_playlist")) ctx->idle_events |= LISTENER_STORED_PLAYLIST; - else if (0 == strcmp(argv[i], "sticker")) + else if (0 == strcmp(key, "sticker")) ctx->idle_events |= LISTENER_RATING; else - DPRINTF(E_DBG, L_MPD, "Idle command for '%s' not supported\n", argv[i]); + DPRINTF(E_DBG, L_MPD, "Idle command for '%s' not supported\n", key); } } else @@ -982,13 +996,13 @@ mpd_command_idle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s // If events the client listens to occurred since the last idle call (or since the client connected, // if it is the first idle call), notify immediately. if (ctx->events & ctx->idle_events) - notify_idle_client(ctx, ctx->events); + notify_idle_client(ctx, ctx->events, false); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_noidle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_noidle(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { /* * The protocol specifies: "The idle command can be canceled by @@ -997,10 +1011,10 @@ mpd_command_noidle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * empty at this time." */ if (ctx->events) - notify_idle_client(ctx, ctx->events); + notify_idle_client(ctx, ctx->events, false); ctx->is_idle = false; - return ACK_ERROR_NONE; + return 0; } /* @@ -1025,8 +1039,8 @@ mpd_command_noidle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * nextsong: 1 * nextsongid: 2 */ -static enum mpd_ack_error -mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_status(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { struct player_status status; uint32_t queue_length = 0; @@ -1055,7 +1069,7 @@ mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, db_admin_getint(&queue_version, DB_ADMIN_QUEUE_VERSION); db_queue_get_count(&queue_length); - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "volume: %d\n" "repeat: %d\n" "random: %d\n" @@ -1081,7 +1095,7 @@ mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, if (queue_item) { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "song: %d\n" "songid: %d\n", queue_item->pos, @@ -1093,7 +1107,7 @@ mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, if (status.status != PLAY_STOPPED) { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "time: %d:%d\n" "elapsed: %#.3f\n" "bitrate: 128\n" @@ -1104,7 +1118,7 @@ mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, if (library_is_scanning()) { - evbuffer_add(evbuf, "updating_db: 1\n", 15); + evbuffer_add(out->evbuf, "updating_db: 1\n", 15); } if (itemid > 0) @@ -1112,7 +1126,7 @@ mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, queue_item = db_queue_fetch_next(itemid, status.shuffle); if (queue_item) { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "nextsong: %d\n" "nextsongid: %d\n", queue_item->pos, @@ -1122,38 +1136,32 @@ mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, } } - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'stats' */ -static enum mpd_ack_error -mpd_command_stats(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_stats(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params qp; + struct query_params qp = { .type = Q_COUNT_ITEMS }; struct filecount_info fci; double uptime; int64_t db_start = 0; int64_t db_update = 0; int ret; - memset(&qp, 0, sizeof(struct query_params)); - qp.type = Q_COUNT_ITEMS; - ret = db_filecount_get(&fci, &qp); if (ret < 0) - { - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); db_admin_getint64(&db_start, DB_ADMIN_START_TIME); uptime = difftime(time(NULL), (time_t) db_start); db_admin_getint64(&db_update, DB_ADMIN_DB_UPDATE); //TODO [mpd] Implement missing stats attributes (playtime) - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "artists: %d\n" "albums: %d\n" "songs: %d\n" @@ -1169,7 +1177,7 @@ mpd_command_stats(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, db_update, 7); - return ACK_ERROR_NONE; + return 0; } /* @@ -1178,21 +1186,11 @@ mpd_command_stats(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * 0 = disable consume * 1 = enable consume */ -static enum mpd_ack_error -mpd_command_consume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_consume(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - int enable; - int ret; - - ret = safe_atoi32(argv[1], &enable); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - - player_consume_set(enable); - return ACK_ERROR_NONE; + player_consume_set(in->argv_u32val[1]); + return 0; } /* @@ -1201,21 +1199,11 @@ mpd_command_consume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg * 0 = disable shuffle * 1 = enable shuffle */ -static enum mpd_ack_error -mpd_command_random(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_random(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - int enable; - int ret; - - ret = safe_atoi32(argv[1], &enable); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - - player_shuffle_set(enable); - return ACK_ERROR_NONE; + player_shuffle_set(in->argv_u32val[1]); + return 0; } /* @@ -1224,47 +1212,26 @@ mpd_command_random(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * 0 = repeat off * 1 = repeat all */ -static enum mpd_ack_error -mpd_command_repeat(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_repeat(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - int enable; - int ret; - - ret = safe_atoi32(argv[1], &enable); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - - if (enable == 0) + if (in->argv_u32val[1] == 0) player_repeat_set(REPEAT_OFF); else player_repeat_set(REPEAT_ALL); - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'setvol' * Sets the volume, expects argument argv[1] to be an integer 0-100 */ -static enum mpd_ack_error -mpd_command_setvol(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_setvol(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - int volume; - int ret; - - ret = safe_atoi32(argv[1], &volume); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - - player_volume_set(volume); - - return ACK_ERROR_NONE; + player_volume_set(in->argv_u32val[1]); + return 0; } /* @@ -1284,22 +1251,19 @@ mpd_command_setvol(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * 1 = repeat song * Thus "oneshot" is accepted, but ignored under all circumstances. */ -static enum mpd_ack_error -mpd_command_single(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_single(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - int enable; + bool has_enable = (in->has_num & MPD_WANTS_NUM_ARG1_UVAL); + uint32_t enable = in->argv_u32val[1]; struct player_status status; - int ret; - ret = safe_atoi32(argv[1], &enable); - if (ret < 0) - { - /* 0.21 protocol: accept "oneshot" mode */ - if (strcmp(argv[1], "oneshot") == 0) - return 0; - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } + // 0.21 protocol: accept "oneshot" mode + if (strcmp(in->argv[1], "oneshot") == 0) + return 0; + + if (!has_enable) + RETURN_ERROR(ACK_ERROR_ARG, "Command 'single' expects integer or 'oneshot' argument"); player_get_status(&status); @@ -1310,7 +1274,7 @@ mpd_command_single(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, else player_repeat_set(REPEAT_SONG); - return ACK_ERROR_NONE; + return 0; } /* @@ -1318,32 +1282,22 @@ mpd_command_single(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * The server does not support replay gain, therefor this function returns always * "replay_gain_mode: off". */ -static enum mpd_ack_error -mpd_command_replay_gain_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_replay_gain_status(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - evbuffer_add(evbuf, "replay_gain_mode: off\n", 22); - return ACK_ERROR_NONE; + evbuffer_add(out->evbuf, "replay_gain_mode: off\n", 22); + return 0; } /* * Command handler function for 'volume' * Changes the volume by the given amount, expects argument argv[1] to be an integer - * - * According to the mpd protocoll specification this function is deprecated. */ -static enum mpd_ack_error -mpd_command_volume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_volume(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { struct player_status status; - int volume; - int ret; - - ret = safe_atoi32(argv[1], &volume); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } + int32_t volume = in->argv_i32val[1]; player_get_status(&status); @@ -1351,34 +1305,27 @@ mpd_command_volume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, player_volume_set(volume); - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'next' * Skips to the next song in the playqueue */ -static enum mpd_ack_error -mpd_command_next(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_next(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int ret; ret = player_playback_next(); - if (ret < 0) - { - *errmsg = safe_asprintf("Failed to skip to next song"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to skip to next song"); ret = player_playback_start(); if (ret < 0) - { - *errmsg = safe_asprintf("Player returned an error for start after nextitem"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Player returned an error for start after nextitem"); - return ACK_ERROR_NONE; + return 0; } /* @@ -1387,28 +1334,19 @@ mpd_command_next(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s * 0 = play * 1 = pause */ -static enum mpd_ack_error -mpd_command_pause(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_pause(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - int pause; + uint32_t pause; struct player_status status; int ret; player_get_status(&status); - if (argc > 1) - { - ret = safe_atoi32(argv[1], &pause); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - } + if (in->has_num & MPD_WANTS_NUM_ARG1_UVAL) + pause = in->argv_u32val[1]; else - { - pause = status.status == PLAY_PLAYING ? 1 : 0; - } + pause = (status.status == PLAY_PLAYING) ? 1 : 0; // MPD ignores pause in stopped state if (pause == 1 && status.status == PLAY_PLAYING) @@ -1419,12 +1357,9 @@ mpd_command_pause(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, ret = 0; if (ret < 0) - { - *errmsg = safe_asprintf("Failed to %s playback", (pause == 1) ? "pause" : "start"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to %s playback", (pause == 1) ? "pause" : "start"); - return ACK_ERROR_NONE; + return 0; } /* @@ -1432,47 +1367,30 @@ mpd_command_pause(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * Starts playback, the optional argument argv[1] represents the position in the playqueue * where to start playback. */ -static enum mpd_ack_error -mpd_command_play(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_play(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - int songpos; + bool has_songpos = (in->has_num & MPD_WANTS_NUM_ARG1_UVAL); + uint32_t songpos = in->argv_u32val[1]; struct player_status status; struct db_queue_item *queue_item; int ret; - songpos = -1; - if (argc > 1) - { - ret = safe_atoi32(argv[1], &songpos); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - } - player_get_status(&status); - if (status.status == PLAY_PLAYING && songpos < 0) - { - DPRINTF(E_DBG, L_MPD, "Ignoring play command with parameter '%s', player is already playing.\n", argv[1]); - return ACK_ERROR_NONE; - } + if (status.status == PLAY_PLAYING && !has_songpos) + return 0; + // Stop playback, if player is already playing and a valid song position is + // given (it will be restarted for the given song position) if (status.status == PLAY_PLAYING) - { - // Stop playback, if player is already playing and a valid song position is given (it will be restarted for the given song position) - player_playback_stop(); - } + player_playback_stop(); - if (songpos > 0) + if (has_songpos) { queue_item = db_queue_fetch_bypos(songpos, 0); if (!queue_item) - { - *errmsg = safe_asprintf("Failed to start playback"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start playback, unknown song position"); ret = player_playback_start_byitem(queue_item); free_queue_item(queue_item, 0); @@ -1481,12 +1399,9 @@ mpd_command_play(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s ret = player_playback_start(); if (ret < 0) - { - *errmsg = safe_asprintf("Failed to start playback"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start playback (queue empty?)"); - return ACK_ERROR_NONE; + return 0; } /* @@ -1494,42 +1409,27 @@ mpd_command_play(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s * Starts playback, the optional argument argv[1] represents the songid of the song * where to start playback. */ -static enum mpd_ack_error -mpd_command_playid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_playid(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - uint32_t id; + bool has_id = (in->has_num & MPD_WANTS_NUM_ARG1_UVAL); + uint32_t id = in->argv_u32val[1]; struct player_status status; struct db_queue_item *queue_item; int ret; player_get_status(&status); - id = 0; - if (argc > 1) - { - //TODO [mpd] mpd allows passing "-1" as argument and simply ignores it, the server fails to convert "-1" to an unsigned int - ret = safe_atou32(argv[1], &id); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - } - + // Stop playback, if player is already playing and a valid item id is given + // (it will be restarted for the given song) if (status.status == PLAY_PLAYING) - { - // Stop playback, if player is already playing and a valid item id is given (it will be restarted for the given song) - player_playback_stop(); - } + player_playback_stop(); - if (id > 0) + if (has_id) { queue_item = db_queue_fetch_byitemid(id); if (!queue_item) - { - *errmsg = safe_asprintf("Failed to start playback"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start playback, unknown song id"); ret = player_playback_start_byitem(queue_item); free_queue_item(queue_item, 0); @@ -1538,82 +1438,57 @@ mpd_command_playid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, ret = player_playback_start(); if (ret < 0) - { - *errmsg = safe_asprintf("Failed to start playback"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start playback (queue empty?)"); - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'previous' * Skips to the previous song in the playqueue */ -static enum mpd_ack_error -mpd_command_previous(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_previous(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int ret; ret = player_playback_prev(); - if (ret < 0) - { - *errmsg = safe_asprintf("Failed to skip to previous song"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to skip to previous song"); ret = player_playback_start(); if (ret < 0) - { - *errmsg = safe_asprintf("Player returned an error for start after previtem"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Player returned an error for start after previtem"); - return ACK_ERROR_NONE; + return 0; } /* - * Command handler function for 'seekid' + * Command handler function for 'seek' * Seeks to song at the given position in argv[1] to the position in seconds given in argument argv[2] * (fractions allowed). */ -static enum mpd_ack_error -mpd_command_seek(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_seek(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - uint32_t songpos; float seek_target_sec; int seek_target_msec; int ret; - ret = safe_atou32(argv[1], &songpos); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - //TODO Allow seeking in songs not currently playing - seek_target_sec = strtof(argv[2], NULL); + seek_target_sec = strtof(in->argv[2], NULL); seek_target_msec = seek_target_sec * 1000; ret = player_playback_seek(seek_target_msec, PLAYER_SEEK_POSITION); - if (ret < 0) - { - *errmsg = safe_asprintf("Failed to seek current song to time %d msec", seek_target_msec); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to seek current song to time %d msec", seek_target_msec); ret = player_playback_start(); - if (ret < 0) - { - *errmsg = safe_asprintf("Player returned an error for start after seekcur"); - return ACK_ERROR_UNKNOWN; - } + if (ret < 0) + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start playback"); - return ACK_ERROR_NONE; + return 0; } /* @@ -1621,102 +1496,73 @@ mpd_command_seek(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s * Seeks to song with id given in argv[1] to the position in seconds given in argument argv[2] * (fractions allowed). */ -static enum mpd_ack_error -mpd_command_seekid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_seekid(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { struct player_status status; - uint32_t id; float seek_target_sec; int seek_target_msec; int ret; - ret = safe_atou32(argv[1], &id); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - //TODO Allow seeking in songs not currently playing player_get_status(&status); - if (status.item_id != id) - { - *errmsg = safe_asprintf("Given song is not the current playing one, seeking is not supported"); - return ACK_ERROR_UNKNOWN; - } + if (status.item_id != in->argv_u32val[1]) + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Given song is not the current playing one, seeking is not supported"); - seek_target_sec = strtof(argv[2], NULL); + seek_target_sec = strtof(in->argv[2], NULL); seek_target_msec = seek_target_sec * 1000; ret = player_playback_seek(seek_target_msec, PLAYER_SEEK_POSITION); - if (ret < 0) - { - *errmsg = safe_asprintf("Failed to seek current song to time %d msec", seek_target_msec); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to seek current song to time %d msec", seek_target_msec); ret = player_playback_start(); if (ret < 0) - { - *errmsg = safe_asprintf("Player returned an error for start after seekcur"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start playback"); - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'seekcur' * Seeks the current song to the position in seconds given in argument argv[1] (fractions allowed). */ -static enum mpd_ack_error -mpd_command_seekcur(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_seekcur(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { float seek_target_sec; int seek_target_msec; int ret; - seek_target_sec = strtof(argv[1], NULL); + seek_target_sec = strtof(in->argv[1], NULL); seek_target_msec = seek_target_sec * 1000; // TODO If prefixed by '+' or '-', then the time is relative to the current playing position. ret = player_playback_seek(seek_target_msec, PLAYER_SEEK_POSITION); - if (ret < 0) - { - *errmsg = safe_asprintf("Failed to seek current song to time %d msec", seek_target_msec); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to seek current song to time %d msec", seek_target_msec); ret = player_playback_start(); if (ret < 0) - { - *errmsg = safe_asprintf("Player returned an error for start after seekcur"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start playback"); - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'stop' * Stop playback. */ -static enum mpd_ack_error -mpd_command_stop(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_stop(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int ret; ret = player_playback_stop(); - if (ret != 0) - { - *errmsg = safe_asprintf("Failed to stop playback"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to stop playback"); - return ACK_ERROR_NONE; + return 0; } /* @@ -1729,34 +1575,23 @@ mpd_command_stop(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s static int mpd_queue_add(char *path, bool exact_match, int position) { - struct query_params qp; + struct query_params qp = { .type = Q_ITEMS, .idx_type = I_NONE, .sort = S_ARTIST }; struct player_status status; int new_item_id; int ret; new_item_id = 0; - memset(&qp, 0, sizeof(struct query_params)); - - qp.type = Q_ITEMS; - qp.idx_type = I_NONE; - qp.sort = S_ARTIST; if (exact_match) - qp.filter = db_mprintf("f.disabled = 0 AND f.virtual_path LIKE '/%q'", path); + CHECK_NULL(L_MPD, qp.filter = db_mprintf("f.disabled = 0 AND f.virtual_path LIKE '/%q'", path)); else - qp.filter = db_mprintf("f.disabled = 0 AND f.virtual_path LIKE '/%q%%'", path); - - if (!qp.filter) - { - DPRINTF(E_DBG, L_PLAYER, "Out of memory\n"); - return -1; - } + CHECK_NULL(L_MPD, qp.filter = db_mprintf("f.disabled = 0 AND f.virtual_path LIKE '/%q%%'", path)); player_get_status(&status); ret = db_queue_add_by_query(&qp, status.shuffle, status.item_id, position, NULL, &new_item_id); - free(qp.filter); + free_query_params(&qp, 1); if (ret == 0) return new_item_id; @@ -1769,93 +1604,77 @@ mpd_queue_add(char *path, bool exact_match, int position) * Adds the all songs under the given path to the end of the playqueue (directories add recursively). * Expects argument argv[1] to be a path to a single file or directory. */ -static enum mpd_ack_error -mpd_command_add(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_add(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { struct player_status status; int ret; - ret = mpd_queue_add(argv[1], false, -1); - + ret = mpd_queue_add(in->argv[1], false, -1); if (ret < 0) - { - *errmsg = safe_asprintf("Failed to add song '%s' to playlist", argv[1]); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to add song '%s' to playlist", in->argv[1]); if (ret == 0) { player_get_status(&status); // Given path is not in the library, check if it is possible to add as a non-library queue item - ret = library_queue_item_add(argv[1], -1, status.shuffle, status.item_id, NULL, NULL); + ret = library_queue_item_add(in->argv[1], -1, status.shuffle, status.item_id, NULL, NULL); if (ret != LIBRARY_OK) - { - *errmsg = safe_asprintf("Failed to add song '%s' to playlist (unkown path)", argv[1]); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to add song '%s' to playlist (unknown path)", in->argv[1]); } - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'addid' * Adds the song under the given path to the end or to the given position of the playqueue. * Expects argument argv[1] to be a path to a single file. argv[2] is optional, if present - * it must be an integer representing the position in the playqueue. + * as int is the absolute new position, if present as "+x" og "-x" it is relative. */ -static enum mpd_ack_error -mpd_command_addid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_addid(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct player_status status; int to_pos = -1; + struct player_status status; + char *path = in->argv[1]; int ret; - if (argc > 2) + if (in->argc > 2) { - ret = safe_atoi32(argv[2], &to_pos); + ret = to_pos_from_arg(&to_pos, in->argv[2]); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[2]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Invalid TO argument: '%s'", in->argv[2]); } - ret = mpd_queue_add(argv[1], true, to_pos); - + ret = mpd_queue_add(path, true, to_pos); if (ret == 0) { player_get_status(&status); // Given path is not in the library, directly add it as a new queue item - ret = library_queue_item_add(argv[1], to_pos, status.shuffle, status.item_id, NULL, NULL); + ret = library_queue_item_add(path, to_pos, status.shuffle, status.item_id, NULL, NULL); if (ret != LIBRARY_OK) - { - *errmsg = safe_asprintf("Failed to add song '%s' to playlist (unkown path)", argv[1]); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to add song '%s' to playlist (unknown path)", path); } if (ret < 0) - { - *errmsg = safe_asprintf("Failed to add song '%s' to playlist", argv[1]); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to add song '%s' to playlist", path); - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "Id: %d\n", ret); // mpd_queue_add returns the item_id of the last inserted queue item - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'clear' * Stops playback and removes all songs from the playqueue */ -static enum mpd_ack_error -mpd_command_clear(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_clear(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int ret; @@ -1867,7 +1686,7 @@ mpd_command_clear(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, db_queue_clear(0); - return ACK_ERROR_NONE; + return 0; } /* @@ -1876,8 +1695,8 @@ mpd_command_clear(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * an integer range {START:END} representing the position of the songs in the playlist, that * should be removed. */ -static enum mpd_ack_error -mpd_command_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_delete(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int start_pos; int end_pos; @@ -1885,84 +1704,62 @@ mpd_command_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, int ret; // If argv[1] is omitted clear the whole queue - if (argc < 2) + if (in->argc < 2) { db_queue_clear(0); - return ACK_ERROR_NONE; + return 0; } // If argument argv[1] is present remove only the specified songs - ret = mpd_pars_range_arg(argv[1], &start_pos, &end_pos); + ret = range_pos_from_arg(&start_pos, &end_pos, in->argv[1]); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer or range: '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Argument doesn't convert to integer or range: '%s'", in->argv[1]); count = end_pos - start_pos; ret = db_queue_delete_bypos(start_pos, count); if (ret < 0) - { - *errmsg = safe_asprintf("Failed to remove %d songs starting at position %d", count, start_pos); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to remove %d songs starting at position %d", count, start_pos); - return ACK_ERROR_NONE; + return 0; } /* Command handler function for 'deleteid' * Removes the song with given id from the playqueue. Expects argument argv[1] to be an integer (song id). */ -static enum mpd_ack_error -mpd_command_deleteid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_deleteid(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - uint32_t songid; + uint32_t songid = in->argv_u32val[1]; int ret; - ret = safe_atou32(argv[1], &songid); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - ret = db_queue_delete_byitemid(songid); if (ret < 0) - { - *errmsg = safe_asprintf("Failed to remove song with id '%s'", argv[1]); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to remove song with id '%s'", in->argv[1]); - return ACK_ERROR_NONE; + return 0; } // Moves the song at FROM or range of songs at START:END to TO in the playlist. -static enum mpd_ack_error -mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_move(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int start_pos; int end_pos; int count; - uint32_t to_pos; + int to_pos; uint32_t queue_length; int ret; - ret = mpd_pars_range_arg(argv[1], &start_pos, &end_pos); + ret = range_pos_from_arg(&start_pos, &end_pos, in->argv[1]); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer or range: '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Argument doesn't convert to integer or range: '%s'", in->argv[1]); count = end_pos - start_pos; - ret = safe_atou32(argv[2], &to_pos); + ret = to_pos_from_arg(&to_pos, in->argv[2]); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[2]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Invalid argument: '%s'", in->argv[2]); db_queue_get_count(&queue_length); @@ -1973,50 +1770,31 @@ mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s if (!(start_pos >= 0 && start_pos < queue_length && end_pos > start_pos && end_pos <= queue_length && to_pos >= 0 && to_pos <= queue_length - count)) - { - *errmsg = safe_asprintf("Range too large for target position %d or bad song index (count %d, length %u)", to_pos, count, queue_length); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Range too large for target position %d or bad song index (count %d, length %u)", to_pos, count, queue_length); ret = db_queue_move_bypos_range(start_pos, end_pos, to_pos); if (ret < 0) - { - *errmsg = safe_asprintf("Failed to move song at position %d to %d", start_pos, to_pos); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to move song at position %d to %d", start_pos, to_pos); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_moveid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_moveid(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - uint32_t songid; - uint32_t to_pos; + uint32_t songid = in->argv_u32val[1]; + int to_pos; int ret; - ret = safe_atou32(argv[1], &songid); + ret = to_pos_from_arg(&to_pos, in->argv[2]); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - - ret = safe_atou32(argv[2], &to_pos); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[2]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Invalid TO argument: '%s'", in->argv[2]); ret = db_queue_move_byitemid(songid, to_pos, 0); if (ret < 0) - { - *errmsg = safe_asprintf("Failed to move song with id '%s' to index '%s'", argv[1], argv[2]); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to move song with id '%u' to index '%u'", songid, to_pos); - return ACK_ERROR_NONE; + return 0; } /* @@ -2026,59 +1804,42 @@ mpd_command_moveid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * * The order of the songs is always the not shuffled order. */ -static enum mpd_ack_error -mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_playlistid(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params query_params; + bool has_songid = (in->has_num & MPD_WANTS_NUM_ARG1_UVAL); + uint32_t songid = in->argv_u32val[1]; + struct query_params qp = { 0 }; struct db_queue_item queue_item; - uint32_t songid; int ret; - songid = 0; + if (has_songid) + qp.filter = db_mprintf("id = %d", songid); - if (argc > 1) - { - ret = safe_atou32(argv[1], &songid); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - } - - memset(&query_params, 0, sizeof(struct query_params)); - - if (songid > 0) - query_params.filter = db_mprintf("id = %d", songid); - - ret = db_queue_enum_start(&query_params); + ret = db_queue_enum_start(&qp); if (ret < 0) { - free(query_params.filter); - *errmsg = safe_asprintf("Failed to start queue enum for command playlistid: '%s'", argv[1]); - return ACK_ERROR_ARG; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_ARG, "Failed to start queue enum for command playlistid"); } - while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0) + while ((ret = db_queue_enum_fetch(&qp, &queue_item)) == 0 && queue_item.id > 0) { - ret = mpd_add_db_queue_item(evbuf, &queue_item); + ret = mpd_add_db_queue_item(out->evbuf, &queue_item); if (ret < 0) { - *errmsg = safe_asprintf("Error adding media info for file with id: %d", queue_item.file_id); - - db_queue_enum_end(&query_params); - free(query_params.filter); - return ACK_ERROR_UNKNOWN; + db_queue_enum_end(&qp); + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Error adding media info for file"); } } - db_queue_enum_end(&query_params); - free(query_params.filter); + db_queue_enum_end(&qp); + free_query_params(&qp, 1); - return ACK_ERROR_NONE; + return 0; } - /* * Command handler function for 'playlistinfo' * Displays a list of all songs in the queue, or if the optional argument is given, displays information @@ -2086,10 +1847,10 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err * * The order of the songs is always the not shuffled order. */ -static enum mpd_ack_error -mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_playlistinfo(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params query_params; + struct query_params qp = { 0 }; struct db_queue_item queue_item; int start_pos; int end_pos; @@ -2097,375 +1858,320 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e start_pos = 0; end_pos = 0; - memset(&query_params, 0, sizeof(struct query_params)); - if (argc > 1) + if (in->argc > 1) { - ret = mpd_pars_range_arg(argv[1], &start_pos, &end_pos); + ret = range_pos_from_arg(&start_pos, &end_pos, in->argv[1]); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer or range: '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Argument doesn't convert to integer or range: '%s'", in->argv[1]); if (start_pos < 0) - DPRINTF(E_DBG, L_MPD, "Command 'playlistinfo' called with pos < 0 (arg = '%s'), ignore arguments and return whole queue\n", argv[1]); + DPRINTF(E_DBG, L_MPD, "Command 'playlistinfo' called with pos < 0 (arg = '%s'), ignore arguments and return whole queue\n", in->argv[1]); else - query_params.filter = db_mprintf("pos >= %d AND pos < %d", start_pos, end_pos); + qp.filter = db_mprintf("pos >= %d AND pos < %d", start_pos, end_pos); } - ret = db_queue_enum_start(&query_params); + ret = db_queue_enum_start(&qp); if (ret < 0) - { - free(query_params.filter); - *errmsg = safe_asprintf("Failed to start queue enum for command playlistinfo: '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Failed to start queue enum for command playlistinfo: '%s'", in->argv[1]); - while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0) + while ((ret = db_queue_enum_fetch(&qp, &queue_item)) == 0 && queue_item.id > 0) { - ret = mpd_add_db_queue_item(evbuf, &queue_item); + ret = mpd_add_db_queue_item(out->evbuf, &queue_item); if (ret < 0) { - *errmsg = safe_asprintf("Error adding media info for file with id: %d", queue_item.file_id); - - db_queue_enum_end(&query_params); - free(query_params.filter); - return ACK_ERROR_UNKNOWN; + db_queue_enum_end(&qp); + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Error adding media info"); } } - db_queue_enum_end(&query_params); - free(query_params.filter); + db_queue_enum_end(&qp); + free_query_params(&qp, 1); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_playlistfind(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +/* + * playlistfind {FILTER} [sort {TYPE}] [window {START:END}] + * Searches for songs that match in the queue + * TODO add support for window (currently not supported by db_queue_enum_x) + */ +static int +mpd_command_playlistfind(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params query_params; + struct query_params qp = { 0 }; struct db_queue_item queue_item; int ret; - memset(&query_params, 0, sizeof(struct query_params)); + ret = parse_command(&qp, NULL, NULL, in); + if (ret < 0) + RETURN_ERROR(ACK_ERROR_ARG, "Unknown argument(s) for command 'playlistfind'"); - if (argc < 3 || ((argc - 1) % 2) != 0) - { - *errmsg = safe_asprintf("Missing argument(s) for command 'playlistfind'"); - return ACK_ERROR_ARG; - } - - parse_filter_window_params(argc - 1, argv + 1, true, &query_params); - - ret = db_queue_enum_start(&query_params); + ret = db_queue_enum_start(&qp); if (ret < 0) { - free(query_params.filter); - *errmsg = safe_asprintf("Failed to start queue enum for command playlistinfo: '%s'", argv[1]); - return ACK_ERROR_ARG; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_ARG, "Failed to start queue enum for command playlistinfo: '%s'", in->argv[1]); } - while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0) + while ((ret = db_queue_enum_fetch(&qp, &queue_item)) == 0 && queue_item.id > 0) { - ret = mpd_add_db_queue_item(evbuf, &queue_item); + ret = mpd_add_db_queue_item(out->evbuf, &queue_item); if (ret < 0) { - *errmsg = safe_asprintf("Error adding media info for file with id: %d", queue_item.file_id); - - db_queue_enum_end(&query_params); - free(query_params.filter); - return ACK_ERROR_UNKNOWN; + db_queue_enum_end(&qp); + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Error adding media info"); } } - db_queue_enum_end(&query_params); - free(query_params.filter); + db_queue_enum_end(&qp); + free_query_params(&qp, 1); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_playlistsearch(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +/* + * playlistsearch {FILTER} [sort {TYPE}] [window {START:END}] + */ +static int +mpd_command_playlistsearch(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params query_params; + struct query_params qp = { 0 }; struct db_queue_item queue_item; int ret; - memset(&query_params, 0, sizeof(struct query_params)); + ret = parse_command(&qp, NULL, NULL, in); + if (ret < 0) + RETURN_ERROR(ACK_ERROR_ARG, "Unknown argument(s) for command 'playlistsearch'"); - if (argc < 3 || ((argc - 1) % 2) != 0) - { - *errmsg = safe_asprintf("Missing argument(s) for command 'playlistfind'"); - return ACK_ERROR_ARG; - } - - parse_filter_window_params(argc - 1, argv + 1, false, &query_params); - - ret = db_queue_enum_start(&query_params); + ret = db_queue_enum_start(&qp); if (ret < 0) { - free(query_params.filter); - *errmsg = safe_asprintf("Failed to start queue enum for command playlistinfo: '%s'", argv[1]); - return ACK_ERROR_ARG; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_ARG, "Failed to start queue enum for command playlistinfo: '%s'", in->argv[1]); } - while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0) + while ((ret = db_queue_enum_fetch(&qp, &queue_item)) == 0 && queue_item.id > 0) { - ret = mpd_add_db_queue_item(evbuf, &queue_item); + ret = mpd_add_db_queue_item(out->evbuf, &queue_item); if (ret < 0) { - *errmsg = safe_asprintf("Error adding media info for file with id: %d", queue_item.file_id); - - db_queue_enum_end(&query_params); - free(query_params.filter); - return ACK_ERROR_UNKNOWN; + db_queue_enum_end(&qp); + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Error adding media info"); } } - db_queue_enum_end(&query_params); - free(query_params.filter); + db_queue_enum_end(&qp); + free_query_params(&qp, 1); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -plchanges_build_queryparams(struct query_params *query_params, int argc, char **argv, char **errmsg) +static int +plchanges_build_queryparams(struct query_params *qp, uint32_t version, const char *range) { - uint32_t version; int start_pos; int end_pos; int ret; - memset(query_params, 0, sizeof(struct query_params)); - - ret = safe_atou32(argv[1], &version); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } + memset(qp, 0, sizeof(struct query_params)); start_pos = 0; end_pos = 0; - if (argc > 2) + if (range) { - ret = mpd_pars_range_arg(argv[2], &start_pos, &end_pos); + ret = range_pos_from_arg(&start_pos, &end_pos, range); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer or range: '%s'", argv[2]); - return ACK_ERROR_ARG; - } + return -1; if (start_pos < 0) - DPRINTF(E_DBG, L_MPD, "Command 'playlistinfo' called with pos < 0 (arg = '%s'), ignore arguments and return whole queue\n", argv[1]); + DPRINTF(E_DBG, L_MPD, "Invalid range '%s', will return entire queue\n", range); } if (start_pos < 0 || end_pos <= 0) - query_params->filter = db_mprintf("(queue_version > %d)", version); + qp->filter = db_mprintf("(queue_version > %d)", version); else - query_params->filter = db_mprintf("(queue_version > %d AND pos >= %d AND pos < %d)", version, start_pos, end_pos); + qp->filter = db_mprintf("(queue_version > %d AND pos >= %d AND pos < %d)", version, start_pos, end_pos); - return ACK_ERROR_NONE; + return 0; } /* - * Command handler function for 'plchanges' + * plchanges {VERSION} [START:END] * Lists all changed songs in the queue since the given playlist version in argv[1]. */ -static enum mpd_ack_error -mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_plchanges(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params query_params; + uint32_t version = in->argv_u32val[1]; + const char *range = (in->argc > 2) ? in->argv[2] : NULL; + struct query_params qp; struct db_queue_item queue_item; int ret; - enum mpd_ack_error ack_error; - ack_error = plchanges_build_queryparams(&query_params, argc, argv, errmsg); - if (ack_error != ACK_ERROR_NONE) - return ack_error; - - ret = db_queue_enum_start(&query_params); + ret = plchanges_build_queryparams(&qp, version, range); if (ret < 0) - goto error; + RETURN_ERROR(ACK_ERROR_ARG, "Invalid range '%s' provided to plchanges", range); - while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0) + ret = db_queue_enum_start(&qp); + if (ret < 0) { - ret = mpd_add_db_queue_item(evbuf, &queue_item); + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start queue enum for command plchangesposid"); + } + + while ((ret = db_queue_enum_fetch(&qp, &queue_item)) == 0 && queue_item.id > 0) + { + ret = mpd_add_db_queue_item(out->evbuf, &queue_item); if (ret < 0) { - DPRINTF(E_LOG, L_MPD, "Error adding media info for file with id: %d", queue_item.file_id); - goto error; + db_queue_enum_end(&qp); + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Error adding media info"); } } - db_queue_enum_end(&query_params); - free_query_params(&query_params, 1); + db_queue_enum_end(&qp); + free_query_params(&qp, 1); - return ACK_ERROR_NONE; - - error: - db_queue_enum_end(&query_params); - free_query_params(&query_params, 1); - *errmsg = safe_asprintf("Failed to start queue enum for command plchanges"); - return ACK_ERROR_UNKNOWN; + return 0; } /* - * Command handler function for 'plchangesposid' - * Lists all changed songs in the queue since the given playlist version in argv[1] without metadata. + * plchangesposid {VERSION} [START:END] + * Lists all changed songs in the queue since the given playlist version in + * argv[1] without metadata. */ -static enum mpd_ack_error -mpd_command_plchangesposid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_plchangesposid(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params query_params; + uint32_t version = in->argv_u32val[1]; + const char *range = (in->argc > 2) ? in->argv[2] : NULL; + struct query_params qp; struct db_queue_item queue_item; int ret; - ret = plchanges_build_queryparams(&query_params, argc, argv, errmsg); - if (ret != 0) - return ret; - - ret = db_queue_enum_start(&query_params); + ret = plchanges_build_queryparams(&qp, version, range); if (ret < 0) - goto error; + RETURN_ERROR(ACK_ERROR_ARG, "Invalid range '%s' provided to plchangesposid", range); - while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0) + ret = db_queue_enum_start(&qp); + if (ret < 0) { - evbuffer_add_printf(evbuf, + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start queue enum for command plchangesposid"); + } + + while ((ret = db_queue_enum_fetch(&qp, &queue_item)) == 0 && queue_item.id > 0) + { + evbuffer_add_printf(out->evbuf, "cpos: %d\n" "Id: %d\n", queue_item.pos, queue_item.id); } - db_queue_enum_end(&query_params); - free_query_params(&query_params, 1); + db_queue_enum_end(&qp); + free_query_params(&qp, 1); - return ACK_ERROR_NONE; - - error: - db_queue_enum_end(&query_params); - free_query_params(&query_params, 1); - *errmsg = safe_asprintf("Failed to start queue enum for command plchangesposid"); - return ACK_ERROR_UNKNOWN; + return 0; } /* * Command handler function for 'listplaylist' * Lists all songs in the playlist given by virtual-path in argv[1]. */ -static enum mpd_ack_error -mpd_command_listplaylist(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_listplaylist(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { char *path; struct playlist_info *pli; - struct query_params qp; + struct query_params qp = { .type = Q_PLITEMS, .idx_type = I_NONE }; struct db_media_file_info dbmfi; int ret; - if (!default_pl_dir || strstr(argv[1], ":/")) + if (!default_pl_dir || strstr(in->argv[1], ":/")) { // Argument is a virtual path, make sure it starts with a '/' - path = prepend_slash(argv[1]); + path = prepend_slash(in->argv[1]); } else { // Argument is a playlist name, prepend default playlist directory - path = safe_asprintf("%s/%s", default_pl_dir, argv[1]); + path = safe_asprintf("%s/%s", default_pl_dir, in->argv[1]); } pli = db_pl_fetch_byvirtualpath(path); free(path); if (!pli) - { - *errmsg = safe_asprintf("Playlist not found for path '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Playlist not found for path '%s'", in->argv[1]); - memset(&qp, 0, sizeof(struct query_params)); - - qp.type = Q_PLITEMS; - qp.idx_type = I_NONE; qp.id = pli->id; ret = db_query_start(&qp); if (ret < 0) { - db_query_end(&qp); - free_pli(pli, 0); - - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); } while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "file: %s\n", (dbmfi.virtual_path + 1)); } db_query_end(&qp); - free_pli(pli, 0); - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'listplaylistinfo' * Lists all songs in the playlist given by virtual-path in argv[1] with metadata. */ -static enum mpd_ack_error -mpd_command_listplaylistinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_listplaylistinfo(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { char *path; struct playlist_info *pli; - struct query_params qp; + struct query_params qp = { .type = Q_PLITEMS, .idx_type = I_NONE }; struct db_media_file_info dbmfi; int ret; - if (!default_pl_dir || strstr(argv[1], ":/")) + if (!default_pl_dir || strstr(in->argv[1], ":/")) { // Argument is a virtual path, make sure it starts with a '/' - path = prepend_slash(argv[1]); + path = prepend_slash(in->argv[1]); } else { // Argument is a playlist name, prepend default playlist directory - path = safe_asprintf("%s/%s", default_pl_dir, argv[1]); + path = safe_asprintf("%s/%s", default_pl_dir, in->argv[1]); } pli = db_pl_fetch_byvirtualpath(path); free(path); if (!pli) - { - *errmsg = safe_asprintf("Playlist not found for path '%s'", argv[1]); - return ACK_ERROR_NO_EXIST; - } + RETURN_ERROR(ACK_ERROR_NO_EXIST, "Playlist not found for path '%s'", in->argv[1]); - memset(&qp, 0, sizeof(struct query_params)); - - qp.type = Q_PLITEMS; - qp.idx_type = I_NONE; qp.id = pli->id; ret = db_query_start(&qp); if (ret < 0) { - db_query_end(&qp); - free_pli(pli, 0); - - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); } while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) { - ret = mpd_add_db_media_file_info(evbuf, &dbmfi); + ret = mpd_add_db_media_file_info(out->evbuf, &dbmfi); if (ret < 0) { DPRINTF(E_LOG, L_MPD, "Error adding song to the evbuffer, song id: %s\n", dbmfi.id); @@ -2473,55 +2179,45 @@ mpd_command_listplaylistinfo(struct evbuffer *evbuf, int argc, char **argv, char } db_query_end(&qp); - free_pli(pli, 0); - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'listplaylists' * Lists all playlists with their last modified date. */ -static enum mpd_ack_error -mpd_command_listplaylists(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_listplaylists(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params qp; + struct query_params qp = { .type = Q_PL, .idx_type = I_NONE, .sort = S_PLAYLIST }; struct db_playlist_info dbpli; char modified[32]; uint32_t time_modified; int ret; - memset(&qp, 0, sizeof(struct query_params)); - - qp.type = Q_PL; - qp.sort = S_PLAYLIST; - qp.idx_type = I_NONE; qp.filter = db_mprintf("(f.type = %d OR f.type = %d)", PL_PLAIN, PL_SMART); ret = db_query_start(&qp); if (ret < 0) { - db_query_end(&qp); - free(qp.filter); - - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); } while (((ret = db_query_fetch_pl(&dbpli, &qp)) == 0) && (dbpli.id)) { if (safe_atou32(dbpli.db_timestamp, &time_modified) != 0) { - *errmsg = safe_asprintf("Error converting time modified to uint32_t: %s\n", dbpli.db_timestamp); db_query_end(&qp); - free(qp.filter); - return ACK_ERROR_UNKNOWN; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Error converting time modified to uint32_t"); } mpd_time(modified, sizeof(modified), time_modified); - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "playlist: %s\n" "Last-Modified: %s\n", (dbpli.virtual_path + 1), @@ -2529,17 +2225,17 @@ mpd_command_listplaylists(struct evbuffer *evbuf, int argc, char **argv, char ** } db_query_end(&qp); - free(qp.filter); + free_query_params(&qp, 1); - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'load' * Adds the playlist given by virtual-path in argv[1] to the queue. */ -static enum mpd_ack_error -mpd_command_load(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_load(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { char *path; struct playlist_info *pli; @@ -2547,24 +2243,21 @@ mpd_command_load(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s struct query_params qp = { .type = Q_PLITEMS }; int ret; - if (!default_pl_dir || strstr(argv[1], ":/")) + if (!default_pl_dir || strstr(in->argv[1], ":/")) { // Argument is a virtual path, make sure it starts with a '/' - path = prepend_slash(argv[1]); + path = prepend_slash(in->argv[1]); } else { // Argument is a playlist name, prepend default playlist directory - path = safe_asprintf("%s/%s", default_pl_dir, argv[1]); + path = safe_asprintf("%s/%s", default_pl_dir, in->argv[1]); } pli = db_pl_fetch_byvirtualpath(path); free(path); if (!pli) - { - *errmsg = safe_asprintf("Playlist not found for path '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Playlist not found for path '%s'", in->argv[1]); //TODO If a second parameter is given only add the specified range of songs to the playqueue @@ -2575,192 +2268,172 @@ mpd_command_load(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s ret = db_queue_add_by_query(&qp, status.shuffle, status.item_id, -1, NULL, NULL); if (ret < 0) - { - *errmsg = safe_asprintf("Failed to add song '%s' to playlist", argv[1]); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to add song '%s' to playlist", in->argv[1]); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_playlistadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_playlistadd(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { char *vp_playlist; char *vp_item; int ret; if (!allow_modifying_stored_playlists) - { - *errmsg = safe_asprintf("Modifying stored playlists is not enabled"); - return ACK_ERROR_PERMISSION; - } + RETURN_ERROR(ACK_ERROR_PERMISSION, "Modifying stored playlists is not enabled"); - if (!default_pl_dir || strstr(argv[1], ":/")) + if (!default_pl_dir || strstr(in->argv[1], ":/")) { // Argument is a virtual path, make sure it starts with a '/' - vp_playlist = prepend_slash(argv[1]); + vp_playlist = prepend_slash(in->argv[1]); } else { // Argument is a playlist name, prepend default playlist directory - vp_playlist = safe_asprintf("%s/%s", default_pl_dir, argv[1]); + vp_playlist = safe_asprintf("%s/%s", default_pl_dir, in->argv[1]); } - vp_item = prepend_slash(argv[2]); + vp_item = prepend_slash(in->argv[2]); ret = library_playlist_item_add(vp_playlist, vp_item); free(vp_playlist); free(vp_item); if (ret < 0) - { - *errmsg = safe_asprintf("Error adding item to file '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Error adding item to file '%s'", in->argv[1]); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_rm(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_rm(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { char *virtual_path; int ret; if (!allow_modifying_stored_playlists) - { - *errmsg = safe_asprintf("Modifying stored playlists is not enabled"); - return ACK_ERROR_PERMISSION; - } + RETURN_ERROR(ACK_ERROR_PERMISSION, "Modifying stored playlists is not enabled"); - if (!default_pl_dir || strstr(argv[1], ":/")) + if (!default_pl_dir || strstr(in->argv[1], ":/")) { // Argument is a virtual path, make sure it starts with a '/' - virtual_path = prepend_slash(argv[1]); + virtual_path = prepend_slash(in->argv[1]); } else { // Argument is a playlist name, prepend default playlist directory - virtual_path = safe_asprintf("%s/%s", default_pl_dir, argv[1]); + virtual_path = safe_asprintf("%s/%s", default_pl_dir, in->argv[1]); } ret = library_playlist_remove(virtual_path); free(virtual_path); if (ret < 0) - { - *errmsg = safe_asprintf("Error removing playlist '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Error removing playlist '%s'", in->argv[1]); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_save(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_save(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { char *virtual_path; int ret; if (!allow_modifying_stored_playlists) - { - *errmsg = safe_asprintf("Modifying stored playlists is not enabled"); - return ACK_ERROR_PERMISSION; - } + RETURN_ERROR(ACK_ERROR_PERMISSION, "Modifying stored playlists is not enabled"); - if (!default_pl_dir || strstr(argv[1], ":/")) + if (!default_pl_dir || strstr(in->argv[1], ":/")) { // Argument is a virtual path, make sure it starts with a '/' - virtual_path = prepend_slash(argv[1]); + virtual_path = prepend_slash(in->argv[1]); } else { // Argument is a playlist name, prepend default playlist directory - virtual_path = safe_asprintf("%s/%s", default_pl_dir, argv[1]); + virtual_path = safe_asprintf("%s/%s", default_pl_dir, in->argv[1]); } ret = library_queue_save(virtual_path); free(virtual_path); if (ret < 0) - { - *errmsg = safe_asprintf("Error saving queue to file '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Error saving queue to file '%s'", in->argv[1]); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_count(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +/* + * count [FILTER] [group {GROUPTYPE}] + * + * TODO Support for groups (the db interface doesn't have method for this). Note + * that mpd only supports one group. Mpd has filter as optional. Without filter, + * but with group, mpd returns: + * + * Album: Welcome + * songs: 1 + * playtime: 249 + */ +static int +mpd_command_count(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params qp; + struct query_params qp = { .type = Q_COUNT_ITEMS }; struct filecount_info fci; int ret; - if (argc < 3 || ((argc - 1) % 2) != 0) - { - *errmsg = safe_asprintf("Missing argument(s) for command 'find'"); - return ACK_ERROR_ARG; - } - - memset(&qp, 0, sizeof(struct query_params)); - qp.type = Q_COUNT_ITEMS; - parse_filter_window_params(argc - 1, argv + 1, true, &qp); + ret = parse_command(&qp, NULL, NULL, in); + if (ret < 0) + RETURN_ERROR(ACK_ERROR_ARG, "Unknown argument(s) for command 'count'"); ret = db_filecount_get(&fci, &qp); if (ret < 0) { - free(qp.filter); - - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); } - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "songs: %d\n" "playtime: %" PRIu64 "\n", fci.count, (fci.length / 1000)); db_query_end(&qp); - free(qp.filter); - - return ACK_ERROR_NONE; + free_query_params(&qp, 1); + return 0; } -static enum mpd_ack_error -mpd_command_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +/* + * find "albumartist" "Blue Foundation" "album" "Life Of A Ghost" "date" "2007" "window" "0:1" + * search "(modified-since '2024-06-04T22:49:41Z')" + * find "((Album == 'No Sign Of Bad') AND (AlbumArtist == 'Led Zeppelin'))" window 0:1 + * find "(Artist == \"foo\\'bar\\\"\")" + * + * TODO not sure if we support this correctly: "An empty value string means: + * match only if the given tag type does not exist at all; this implies that + * negation with an empty value checks for the existence of the given tag type." + * MaximumMPD (search function): + * count "((Artist == \"Blue Foundation\") AND (album == \"\"))" + */ +static int +mpd_command_find(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct query_params qp; + struct query_params qp = { .type = Q_ITEMS, .idx_type = I_NONE, .sort = S_ARTIST }; struct db_media_file_info dbmfi; int ret; - if (argc < 3 || ((argc - 1) % 2) != 0) - { - *errmsg = safe_asprintf("Missing argument(s) for command 'find'"); - return ACK_ERROR_ARG; - } - - memset(&qp, 0, sizeof(struct query_params)); - - qp.type = Q_ITEMS; - qp.sort = S_NAME; - qp.idx_type = I_NONE; - - parse_filter_window_params(argc - 1, argv + 1, true, &qp); + ret = parse_command(&qp, NULL, NULL, in); + if (ret < 0) + RETURN_ERROR(ACK_ERROR_ARG, "Unknown argument(s) in '%s'", in->args_raw); ret = db_query_start(&qp); if (ret < 0) { - db_query_end(&qp); - free(qp.filter); - - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); } while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) { - ret = mpd_add_db_media_file_info(evbuf, &dbmfi); + ret = mpd_add_db_media_file_info(out->evbuf, &dbmfi); if (ret < 0) { DPRINTF(E_LOG, L_MPD, "Error adding song to the evbuffer, song id: %s\n", dbmfi.id); @@ -2768,167 +2441,133 @@ mpd_command_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, s } db_query_end(&qp); - free(qp.filter); - - return ACK_ERROR_NONE; -} - -static enum mpd_ack_error -mpd_command_findadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) -{ - struct query_params qp; - struct player_status status; - int ret; - - if (argc < 3 || ((argc - 1) % 2) != 0) - { - *errmsg = safe_asprintf("Missing argument(s) for command 'findadd'"); - return ACK_ERROR_ARG; - } - - memset(&qp, 0, sizeof(struct query_params)); - - qp.type = Q_ITEMS; - qp.sort = S_ARTIST; - qp.idx_type = I_NONE; - - parse_filter_window_params(argc - 1, argv + 1, true, &qp); - - player_get_status(&status); - - ret = db_queue_add_by_query(&qp, status.shuffle, status.item_id, -1, NULL, NULL); - free(qp.filter); - if (ret < 0) - { - *errmsg = safe_asprintf("Failed to add songs to playlist"); - return ACK_ERROR_UNKNOWN; - } - - return ACK_ERROR_NONE; + free_query_params(&qp, 1); + return 0; } /* - * Some MPD clients crash if the tag value includes the newline character. - * While they should normally not be included in most ID3 tags, they sometimes - * are, so we just change them to space. See #1613 for more details. + * findadd "albumartist" "Blue Foundation" "album" "Life Of A Ghost" "date" "2007" "window" "3:4" position 0 */ -static void -sanitize_value(char **strval) +static int +mpd_command_findadd(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - char *ptr = *strval; - - while(*ptr != '\0') - { - if(*ptr == '\n') - { - *ptr = ' '; - } - ptr++; - } -} - -static enum mpd_ack_error -mpd_command_list(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) -{ - struct mpd_tagtype *tagtype; - struct query_params qp; - struct mpd_tagtype **group; - int groupsize; - struct db_media_file_info dbmfi; - char **strval; - int i; + struct query_params qp = { .type = Q_ITEMS, .idx_type = I_NONE, .sort = S_ARTIST }; + char *pos = NULL; + int to_pos; int ret; - if (argc < 2 || ((argc % 2) != 0)) + ret = parse_command(&qp, &pos, NULL, in); + if (ret < 0) + goto error; + + ret = to_pos_from_arg(&to_pos, pos); + if (ret < 0) + goto error; + + ret = db_queue_add_by_query(&qp, 0, 0, to_pos, NULL, NULL); + if (ret < 0) + goto error; + + free_query_params(&qp, 1); + free(pos); + return 0; + + error: + free_query_params(&qp, 1); + free(pos); + RETURN_ERROR(ACK_ERROR_ARG, "Invalid arguments"); +} + +static void +groups_from_dbcols(struct mpd_tag_map *groups[], size_t sz, const char *dbcols) +{ + char *copy = strdup(dbcols); + char *saveptr; + char *col; + int i; + + for (col = strtok_r(copy, ",", &saveptr), i = 0; col && i < sz - 1; col = strtok_r(NULL, ",", &saveptr), i++) { - if (argc != 3 || (0 != strcasecmp(argv[1], "album"))) - { - *errmsg = safe_asprintf("Missing argument(s) for command 'list'"); - return ACK_ERROR_ARG; - } + trim(col); + groups[i] = mpd_parser_tag_from_dbcol(col); } - tagtype = find_tagtype(argv[1]); + groups[i] = NULL; + free(copy); +} - if (!tagtype || tagtype->type == MPD_TYPE_SPECIAL) //FIXME allow "file" tagtype +/* + * list {TYPE} {FILTER} [group {GROUPTYPE} [group {GROUPTYPE} [...]]] + * + * Examples + * Rygelian: list Album group Date group AlbumArtistSort group AlbumArtist + * Plattenalbum: list "albumsort" "albumartist" "Bob Dylan" "group" "date" "group" "album" + * list Album "(Artist starts_with \"K\")" group AlbumArtist + * + * TODO Note that the below repeats group tags like so: + * AlbumArtist: Kasabian + * Album: Empire + * AlbumArtist: Kasabian + * Album: West Ryder Pauper Lunatic Asylum + * mpd doesn't repeat them: + * AlbumArtist: Kasabian + * Album: Empire + * Album: West Ryder Pauper Lunatic Asylum + */ +static int +mpd_command_list(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) +{ + struct query_params qp = { .type = Q_ITEMS, .sort = S_ARTIST }; + struct db_media_file_info dbmfi; + struct mpd_tag_map *groups[16]; + char **strval; + int ret; + int i; + + ret = parse_command(&qp, NULL, NULL, in); + if (ret < 0) + RETURN_ERROR(ACK_ERROR_ARG, "Unknown argument(s) in: '%s'", in->args_raw); + + // qp.group should at least include the tag type field + if (!qp.group) { - DPRINTF(E_WARN, L_MPD, "Unsupported type argument for command 'list': %s\n", argv[1]); - return ACK_ERROR_NONE; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Bug! Unknown or unsupported tag type/groups: '%s'", in->args_raw); } - memset(&qp, 0, sizeof(struct query_params)); - qp.type = Q_ITEMS; - qp.idx_type = I_NONE; - qp.order = tagtype->sort_field; - qp.group = strdup(tagtype->group_field); - - if (argc > 2) - { - parse_filter_window_params(argc - 2, argv + 2, true, &qp); - } - - group = NULL; - groupsize = 0; - parse_group_params(argc - 2, argv + 2, tagtype->group_in_listcommand, &qp, &group, &groupsize); + groups_from_dbcols(groups, ARRAY_SIZE(groups), qp.group); ret = db_query_start(&qp); if (ret < 0) { - db_query_end(&qp); - free(qp.filter); - free(qp.group); - free(group); - - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); } while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) { - strval = (char **) ((char *)&dbmfi + tagtype->mfi_offset); - - if (!(*strval) || (**strval == '\0')) - continue; - - sanitize_value(strval); - evbuffer_add_printf(evbuf, - "%s: %s\n", - tagtype->tag, - *strval); - - if (group && groupsize > 0) + for (i = 0; i < ARRAY_SIZE(groups) && groups[i]; i++) { - for (i = 0; i < groupsize; i++) - { - if (!group[i]) - continue; + strval = (char **) ((char *)&dbmfi + groups[i]->dbmfi_offset); - strval = (char **) ((char *)&dbmfi + group[i]->mfi_offset); + if (!(*strval) || (**strval == '\0')) + continue; - if (!(*strval) || (**strval == '\0')) - continue; - - evbuffer_add_printf(evbuf, - "%s: %s\n", - group[i]->tag, - *strval); - } + evbuffer_add_printf(out->evbuf, "%s: %s\n", groups[i]->name, sanitize(*strval)); } } db_query_end(&qp); - free(qp.filter); - free(qp.group); - free(group); + free_query_params(&qp, 1); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int listinfo, char **errmsg) +static int +mpd_add_directory(struct mpd_command_output *out, int directory_id, int listall, int listinfo) { struct directory_info subdir; - struct query_params qp; + struct query_params qp = { .type = Q_PL, .idx_type = I_NONE, .sort = S_PLAYLIST }; struct directory_enum dir_enum; struct db_playlist_info dbpli; char modified[32]; @@ -2937,18 +2576,12 @@ mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int lis int ret; // Load playlists for dir-id - memset(&qp, 0, sizeof(struct query_params)); - qp.type = Q_PL; - qp.sort = S_PLAYLIST; - qp.idx_type = I_NONE; qp.filter = db_mprintf("(f.directory_id = %d AND (f.type = %d OR f.type = %d))", directory_id, PL_PLAIN, PL_SMART); ret = db_query_start(&qp); if (ret < 0) { - db_query_end(&qp); - free(qp.filter); - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); } while (((ret = db_query_fetch_pl(&dbpli, &qp)) == 0) && (dbpli.id)) { @@ -2960,7 +2593,7 @@ mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int lis if (listinfo) { mpd_time(modified, sizeof(modified), time_modified); - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "playlist: %s\n" "Last-Modified: %s\n", (dbpli.virtual_path + 1), @@ -2968,29 +2601,26 @@ mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int lis } else { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "playlist: %s\n", (dbpli.virtual_path + 1)); } } db_query_end(&qp); - free(qp.filter); + free_query_params(&qp, 1); // Load sub directories for dir-id memset(&dir_enum, 0, sizeof(struct directory_enum)); dir_enum.parent_id = directory_id; ret = db_directory_enum_start(&dir_enum); if (ret < 0) - { - *errmsg = safe_asprintf("Failed to start directory enum for parent_id %d\n", directory_id); - db_directory_enum_end(&dir_enum); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Failed to start directory enum"); + while ((ret = db_directory_enum_fetch(&dir_enum, &subdir)) == 0 && subdir.id > 0) { if (listinfo) { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "directory: %s\n" "Last-Modified: %s\n", (subdir.virtual_path + 1), @@ -2998,14 +2628,14 @@ mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int lis } else { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "directory: %s\n", (subdir.virtual_path + 1)); } if (listall) { - mpd_add_directory(evbuf, subdir.id, listall, listinfo, errmsg); + mpd_add_directory(out, subdir.id, listall, listinfo); } } db_directory_enum_end(&dir_enum); @@ -3019,16 +2649,14 @@ mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int lis ret = db_query_start(&qp); if (ret < 0) { - db_query_end(&qp); - free(qp.filter); - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); } while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) { if (listinfo) { - ret = mpd_add_db_media_file_info(evbuf, &dbmfi); + ret = mpd_add_db_media_file_info(out->evbuf, &dbmfi); if (ret < 0) { DPRINTF(E_LOG, L_MPD, "Error adding song to the evbuffer, song id: %s\n", dbmfi.id); @@ -3036,125 +2664,109 @@ mpd_add_directory(struct evbuffer *evbuf, int directory_id, int listall, int lis } else { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "file: %s\n", (dbmfi.virtual_path + 1)); } } db_query_end(&qp); - free(qp.filter); + free_query_params(&qp, 1); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_listall(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_listall(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int dir_id; char parent[PATH_MAX]; int ret; - if (argc < 2 || strlen(argv[1]) == 0 - || (strncmp(argv[1], "/", 1) == 0 && strlen(argv[1]) == 1)) + if (in->argc < 2 || strlen(in->argv[1]) == 0 + || (strncmp(in->argv[1], "/", 1) == 0 && strlen(in->argv[1]) == 1)) { ret = snprintf(parent, sizeof(parent), "/"); } - else if (strncmp(argv[1], "/", 1) == 0) + else if (strncmp(in->argv[1], "/", 1) == 0) { - ret = snprintf(parent, sizeof(parent), "%s/", argv[1]); + ret = snprintf(parent, sizeof(parent), "%s/", in->argv[1]); } else { - ret = snprintf(parent, sizeof(parent), "/%s", argv[1]); + ret = snprintf(parent, sizeof(parent), "/%s", in->argv[1]); } if ((ret < 0) || (ret >= sizeof(parent))) - { - *errmsg = safe_asprintf("Parent path exceeds PATH_MAX"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Parent path exceeds PATH_MAX"); // Load dir-id from db for parent-path dir_id = db_directory_id_byvirtualpath(parent); if (dir_id == 0) - { - *errmsg = safe_asprintf("Directory info not found for virtual-path '%s'", parent); - return ACK_ERROR_NO_EXIST; - } + RETURN_ERROR(ACK_ERROR_NO_EXIST, "Directory info not found for virtual-path '%s'", parent); - return mpd_add_directory(evbuf, dir_id, 1, 0, errmsg); + return mpd_add_directory(out, dir_id, 1, 0); } -static enum mpd_ack_error -mpd_command_listallinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_listallinfo(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int dir_id; char parent[PATH_MAX]; int ret; - if (argc < 2 || strlen(argv[1]) == 0 - || (strncmp(argv[1], "/", 1) == 0 && strlen(argv[1]) == 1)) + if (in->argc < 2 || strlen(in->argv[1]) == 0 + || (strncmp(in->argv[1], "/", 1) == 0 && strlen(in->argv[1]) == 1)) { ret = snprintf(parent, sizeof(parent), "/"); } - else if (strncmp(argv[1], "/", 1) == 0) + else if (strncmp(in->argv[1], "/", 1) == 0) { - ret = snprintf(parent, sizeof(parent), "%s/", argv[1]); + ret = snprintf(parent, sizeof(parent), "%s/", in->argv[1]); } else { - ret = snprintf(parent, sizeof(parent), "/%s", argv[1]); + ret = snprintf(parent, sizeof(parent), "/%s", in->argv[1]); } if ((ret < 0) || (ret >= sizeof(parent))) - { - *errmsg = safe_asprintf("Parent path exceeds PATH_MAX"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Parent path exceeds PATH_MAX"); // Load dir-id from db for parent-path dir_id = db_directory_id_byvirtualpath(parent); if (dir_id == 0) - { - *errmsg = safe_asprintf("Directory info not found for virtual-path '%s'", parent); - return ACK_ERROR_NO_EXIST; - } + RETURN_ERROR(ACK_ERROR_NO_EXIST, "Directory info not found for virtual-path '%s'", parent); - return mpd_add_directory(evbuf, dir_id, 1, 1, errmsg); + return mpd_add_directory(out, dir_id, 1, 1); } /* * Command handler function for 'lsinfo' * Lists the contents of the directory given in argv[1]. */ -static enum mpd_ack_error -mpd_command_lsinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_lsinfo(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int dir_id; char parent[PATH_MAX]; int print_playlists; int ret; - enum mpd_ack_error ack_error; - if (argc < 2 || strlen(argv[1]) == 0 - || (strncmp(argv[1], "/", 1) == 0 && strlen(argv[1]) == 1)) + if (in->argc < 2 || strlen(in->argv[1]) == 0 + || (strncmp(in->argv[1], "/", 1) == 0 && strlen(in->argv[1]) == 1)) { ret = snprintf(parent, sizeof(parent), "/"); } - else if (strncmp(argv[1], "/", 1) == 0) + else if (strncmp(in->argv[1], "/", 1) == 0) { - ret = snprintf(parent, sizeof(parent), "%s/", argv[1]); + ret = snprintf(parent, sizeof(parent), "%s/", in->argv[1]); } else { - ret = snprintf(parent, sizeof(parent), "/%s", argv[1]); + ret = snprintf(parent, sizeof(parent), "/%s", in->argv[1]); } if ((ret < 0) || (ret >= sizeof(parent))) - { - *errmsg = safe_asprintf("Parent path exceeds PATH_MAX"); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Parent path exceeds PATH_MAX"); print_playlists = 0; if ((strncmp(parent, "/", 1) == 0 && strlen(parent) == 1)) @@ -3171,20 +2783,17 @@ mpd_command_lsinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, // Load dir-id from db for parent-path dir_id = db_directory_id_byvirtualpath(parent); if (dir_id == 0) - { - *errmsg = safe_asprintf("Directory info not found for virtual-path '%s'", parent); - return ACK_ERROR_NO_EXIST; - } + RETURN_ERROR(ACK_ERROR_NO_EXIST, "Directory info not found for virtual-path '%s'", parent); - ack_error = mpd_add_directory(evbuf, dir_id, 0, 1, errmsg); + ret = mpd_add_directory(out, dir_id, 0, 1); // If the root directory was passed as argument add the stored playlists to the response - if (ack_error == ACK_ERROR_NONE && print_playlists) + if (ret == 0 && print_playlists) { - return mpd_command_listplaylists(evbuf, argc, argv, errmsg, ctx); + return mpd_command_listplaylists(out, in, ctx); } - return ack_error; + return ret; } /* @@ -3193,282 +2802,159 @@ mpd_command_lsinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, * This command should list all files including files that are not part of the library. We do not support this * and only report files in the library. */ -static enum mpd_ack_error -mpd_command_listfiles(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_listfiles(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - return mpd_command_lsinfo(evbuf, argc, argv, errmsg, ctx); -} - -/* - * Command handler function for 'search' - * Lists any song that matches the given list of arguments. Arguments are pairs of TYPE and WHAT, where - * TYPE is the tag that contains WHAT (case insensitiv). - * - * TYPE can also be one of the special parameter: - * - any: checks all tags - * - file: checks the virtual_path - * - base: restricts result to the given directory - * - modified-since (not supported) - * - window: limits result to the given range of "START:END" - * - * Example request: "search artist foo album bar" - */ -static enum mpd_ack_error -mpd_command_search(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) -{ - struct query_params qp; - struct db_media_file_info dbmfi; - int ret; - - if (argc < 3 || ((argc - 1) % 2) != 0) - { - *errmsg = safe_asprintf("Missing argument(s) for command 'search'"); - return ACK_ERROR_ARG; - } - - memset(&qp, 0, sizeof(struct query_params)); - - qp.type = Q_ITEMS; - qp.sort = S_NAME; - qp.idx_type = I_NONE; - - parse_filter_window_params(argc - 1, argv + 1, false, &qp); - - ret = db_query_start(&qp); - if (ret < 0) - { - db_query_end(&qp); - free(qp.filter); - - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; - } - - while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) - { - ret = mpd_add_db_media_file_info(evbuf, &dbmfi); - if (ret < 0) - { - DPRINTF(E_LOG, L_MPD, "Error adding song to the evbuffer, song id: %s\n", dbmfi.id); - } - } - - db_query_end(&qp); - free(qp.filter); - - return ACK_ERROR_NONE; -} - -static enum mpd_ack_error -mpd_command_searchadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) -{ - struct query_params qp; - struct player_status status; - int ret; - - if (argc < 3 || ((argc - 1) % 2) != 0) - { - *errmsg = safe_asprintf("Missing argument(s) for command 'search'"); - return ACK_ERROR_ARG; - } - - memset(&qp, 0, sizeof(struct query_params)); - - qp.type = Q_ITEMS; - qp.sort = S_ARTIST; - qp.idx_type = I_NONE; - - parse_filter_window_params(argc - 1, argv + 1, false, &qp); - - player_get_status(&status); - - ret = db_queue_add_by_query(&qp, status.shuffle, status.item_id, -1, NULL, NULL); - free(qp.filter); - if (ret < 0) - { - *errmsg = safe_asprintf("Failed to add songs to playlist"); - return ACK_ERROR_UNKNOWN; - } - - return ACK_ERROR_NONE; + return mpd_command_lsinfo(out, in, ctx); } /* * Command handler function for 'update' * Initiates an init-rescan (scans for new files) */ -static enum mpd_ack_error -mpd_command_update(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_update(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - if (argc > 1 && strlen(argv[1]) > 0) - { - *errmsg = safe_asprintf("Update for specific uri not supported for command 'update'"); - return ACK_ERROR_ARG; - } + if (in->argc > 1 && strlen(in->argv[1]) > 0) + RETURN_ERROR(ACK_ERROR_ARG, "Update for specific uri not supported for command 'update'"); library_rescan(0); - evbuffer_add(evbuf, "updating_db: 1\n", 15); + evbuffer_add(out->evbuf, "updating_db: 1\n", 15); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_sticker_get(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) +/* + * sticker get song "/file:/path/to/song.wav" rating + */ +static int +mpd_sticker_get(struct mpd_command_output *out, struct mpd_command_input *in, const char *virtual_path) { - struct media_file_info *mfi = NULL; + struct media_file_info *mfi; uint32_t rating; - if (strcmp(argv[4], "rating") != 0) - { - *errmsg = safe_asprintf("no such sticker"); - return ACK_ERROR_NO_EXIST; - } + if (strcmp(in->argv[4], "rating") != 0) + RETURN_ERROR(ACK_ERROR_NO_EXIST, "No such sticker"); mfi = db_file_fetch_byvirtualpath(virtual_path); if (!mfi) - { - DPRINTF(E_LOG, L_MPD, "Virtual path not found: %s\n", virtual_path); - *errmsg = safe_asprintf("unknown sticker domain"); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Unknown sticker domain"); if (mfi->rating > 0) { rating = mfi->rating / MPD_RATING_FACTOR; - evbuffer_add_printf(evbuf, "sticker: rating=%d\n", rating); + evbuffer_add_printf(out->evbuf, "sticker: rating=%d\n", rating); } free_mfi(mfi, 0); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_sticker_set(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) +/* + * sticker set song "/file:/path/to/song.wav" rating 10 + */ +static int +mpd_sticker_set(struct mpd_command_output *out, struct mpd_command_input *in, const char *virtual_path) { uint32_t rating; int id; int ret; - if (strcmp(argv[4], "rating") != 0) - { - *errmsg = safe_asprintf("no such sticker"); - return ACK_ERROR_NO_EXIST; - } + if (strcmp(in->argv[4], "rating") != 0) + RETURN_ERROR(ACK_ERROR_NO_EXIST, "No such sticker"); - ret = safe_atou32(argv[5], &rating); + ret = safe_atou32(in->argv[5], &rating); if (ret < 0) - { - *errmsg = safe_asprintf("rating '%s' doesn't convert to integer", argv[5]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Rating '%s' doesn't convert to integer", in->argv[5]); rating *= MPD_RATING_FACTOR; if (rating > DB_FILES_RATING_MAX) - { - *errmsg = safe_asprintf("rating '%s' is greater than maximum value allowed", argv[5]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Rating '%s' is greater than maximum value allowed", in->argv[5]); id = db_file_id_byvirtualpath(virtual_path); if (id <= 0) - { - *errmsg = safe_asprintf("Invalid path '%s'", virtual_path); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Invalid path '%s'", virtual_path); library_item_attrib_save(id, LIBRARY_ATTRIB_RATING, rating); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_sticker_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) +static int +mpd_sticker_delete(struct mpd_command_output *out, struct mpd_command_input *in, const char *virtual_path) { int id; - if (strcmp(argv[4], "rating") != 0) - { - *errmsg = safe_asprintf("no such sticker"); - return ACK_ERROR_NO_EXIST; - } + if (strcmp(in->argv[4], "rating") != 0) + RETURN_ERROR(ACK_ERROR_NO_EXIST, "No such sticker"); id = db_file_id_byvirtualpath(virtual_path); if (id <= 0) - { - *errmsg = safe_asprintf("Invalid path '%s'", virtual_path); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Invalid path '%s'", virtual_path); library_item_attrib_save(id, LIBRARY_ATTRIB_RATING, 0); - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_sticker_list(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) +/* + * sticker list song "/file:/path/to/song.wav" + */ +static int +mpd_sticker_list(struct mpd_command_output *out, struct mpd_command_input *in, const char *virtual_path) { - struct media_file_info *mfi = NULL; + struct media_file_info *mfi; uint32_t rating; mfi = db_file_fetch_byvirtualpath(virtual_path); if (!mfi) - { - DPRINTF(E_LOG, L_MPD, "Virtual path not found: %s\n", virtual_path); - *errmsg = safe_asprintf("unknown sticker domain"); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Unknown sticker domain"); if (mfi->rating > 0) { rating = mfi->rating / MPD_RATING_FACTOR; - evbuffer_add_printf(evbuf, "sticker: rating=%d\n", rating); + evbuffer_add_printf(out->evbuf, "sticker: rating=%d\n", rating); } free_mfi(mfi, 0); /* |:todo:| real sticker implementation */ - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_sticker_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path) +/* + * sticker find {TYPE} {URI} {NAME} [sort {SORTTYPE}] [window {START:END}] + * sticker find {TYPE} {URI} {NAME} = {VALUE} [sort {SORTTYPE}] [window {START:END}] + * + * Example: + * sticker find song "/file:/path" rating = 10 + */ +static int +mpd_sticker_find(struct mpd_command_output *out, struct mpd_command_input *in, const char *virtual_path) { - struct query_params qp; + struct query_params qp = { .type = Q_ITEMS, .idx_type = I_NONE, .sort = S_VPATH }; struct db_media_file_info dbmfi; uint32_t rating = 0; uint32_t rating_arg = 0; const char *operator; int ret = 0; - if (strcmp(argv[4], "rating") != 0) - { - *errmsg = safe_asprintf("no such sticker"); - return ACK_ERROR_NO_EXIST; - } + if (strcmp(in->argv[4], "rating") != 0) + RETURN_ERROR(ACK_ERROR_NO_EXIST, "No such sticker"); - if (argc == 6) + if (in->argc > 6) { - *errmsg = safe_asprintf("not enough arguments for 'sticker find'"); - return ACK_ERROR_ARG; - } + if (strcmp(in->argv[5], "=") != 0 && strcmp(in->argv[5], ">") != 0 && strcmp(in->argv[5], "<") != 0) + RETURN_ERROR(ACK_ERROR_ARG, "Invalid operator '%s' given to 'sticker find'", in->argv[5]); - if (argc > 6) - { - if (strcmp(argv[5], "=") != 0 && strcmp(argv[5], ">") != 0 && strcmp(argv[5], "<") != 0) - { - *errmsg = safe_asprintf("invalid operator '%s' given to 'sticker find'", argv[5]); - return ACK_ERROR_ARG; - } - operator = argv[5]; + operator = in->argv[5]; - ret = safe_atou32(argv[6], &rating_arg); + ret = safe_atou32(in->argv[6], &rating_arg); if (ret < 0) - { - *errmsg = safe_asprintf("rating '%s' doesn't convert to integer", argv[6]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Rating '%s' doesn't convert to integer", in->argv[6]); + rating_arg *= MPD_RATING_FACTOR; } else @@ -3477,27 +2963,13 @@ mpd_sticker_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, c rating_arg = 0; } - memset(&qp, 0, sizeof(struct query_params)); - - qp.type = Q_ITEMS; - qp.sort = S_VPATH; - qp.idx_type = I_NONE; - qp.filter = db_mprintf("(f.virtual_path LIKE '%s%%' AND f.rating > 0 AND f.rating %s %d)", virtual_path, operator, rating_arg); - if (!qp.filter) - { - *errmsg = safe_asprintf("Out of memory"); - return ACK_ERROR_UNKNOWN; - } ret = db_query_start(&qp); if (ret < 0) { - db_query_end(&qp); - free(qp.filter); - - *errmsg = safe_asprintf("Could not start query"); - return ACK_ERROR_UNKNOWN; + free_query_params(&qp, 1); + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not start query"); } while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) @@ -3511,7 +2983,7 @@ mpd_sticker_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, c } rating /= MPD_RATING_FACTOR; - ret = evbuffer_add_printf(evbuf, + ret = evbuffer_add_printf(out->evbuf, "file: %s\n" "sticker: rating=%d\n", (dbmfi.virtual_path + 1), @@ -3521,13 +2993,13 @@ mpd_sticker_find(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, c } db_query_end(&qp); - free(qp.filter); - return ACK_ERROR_NONE; + free_query_params(&qp, 1); + return 0; } struct mpd_sticker_command { const char *cmd; - enum mpd_ack_error (*handler)(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, const char *virtual_path); + int (*handler)(struct mpd_command_output *out, struct mpd_command_input *in, const char *virtual_path); int need_args; }; @@ -3538,7 +3010,7 @@ static struct mpd_sticker_command mpd_sticker_handlers[] = { "set", mpd_sticker_set, 6 }, { "delete", mpd_sticker_delete, 5 }, { "list", mpd_sticker_list, 4 }, - { "find", mpd_sticker_find, 5 }, + { "find", mpd_sticker_find, 6 }, { NULL, NULL, 0 }, }; @@ -3559,129 +3031,72 @@ static struct mpd_sticker_command mpd_sticker_handlers[] = * sticker set song "file:/srv/music/VA/The Electro Swing Revolution Vol 3 1 - Hop, Hop, Hop/13 Mr. Hotcut - You Are.mp3" rating "6" * OK */ -static enum mpd_ack_error -mpd_command_sticker(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_sticker(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { struct mpd_sticker_command *cmd_param = NULL; // Quell compiler warning about uninitialized use of cmd_param - char *virtual_path = NULL; + char *virtual_path; + int ret; int i; - enum mpd_ack_error ack_error; - if (strcmp(argv[2], "song") != 0) - { - *errmsg = safe_asprintf("unknown sticker domain"); - return ACK_ERROR_ARG; - } + if (strcmp(in->argv[2], "song") != 0) + RETURN_ERROR(ACK_ERROR_ARG, "Unknown sticker domain"); for (i = 0; i < (sizeof(mpd_sticker_handlers) / sizeof(struct mpd_sticker_command)); ++i) { cmd_param = &mpd_sticker_handlers[i]; - if (cmd_param->cmd && strcmp(argv[1], cmd_param->cmd) == 0) + if (cmd_param->cmd && strcmp(in->argv[1], cmd_param->cmd) == 0) break; } + if (!cmd_param->cmd) - { - *errmsg = safe_asprintf("bad request"); - return ACK_ERROR_ARG; - } - if (argc < cmd_param->need_args) - { - *errmsg = safe_asprintf("not enough arguments"); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Bad request"); - virtual_path = prepend_slash(argv[3]); + if (in->argc < cmd_param->need_args) + RETURN_ERROR(ACK_ERROR_ARG, "Not enough arguments"); - ack_error = cmd_param->handler(evbuf, argc, argv, errmsg, virtual_path); + virtual_path = prepend_slash(in->argv[3]); + + ret = cmd_param->handler(out, in, virtual_path); free(virtual_path); - - return ack_error; + return ret; } -/* static int -mpd_command_rescan(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) -{ - int ret; - - if (argc > 1) - { - DPRINTF(E_LOG, L_MPD, "Rescan for specific uri not supported for command 'rescan'\n"); - *errmsg = safe_asprintf("Rescan for specific uri not supported for command 'rescan'"); - return ACK_ERROR_ARG; - } - - filescanner_trigger_fullrescan(); - - evbuffer_add(evbuf, "updating_db: 1\n", 15); - - return 0; -} -*/ - -static enum mpd_ack_error -mpd_command_close(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +mpd_command_close(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { ctx->must_disconnect = true; - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_password(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_password(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - char *required_password; - char *supplied_password = ""; - int unrequired; - - if (argc > 1) - { - supplied_password = argv[1]; - } + const char *required_password; + const char *supplied_password = (in->argc > 1) ? in->argv[1] : ""; + bool password_is_required; required_password = cfg_getstr(cfg_getsec(cfg, "library"), "password"); - unrequired = !required_password || required_password[0] == '\0'; + password_is_required = required_password && required_password[0] != '\0'; + if (password_is_required && strcmp(supplied_password, required_password) != 0) + RETURN_ERROR(ACK_ERROR_PASSWORD, "Wrong password. Authentication failed."); - if (unrequired || strcmp(supplied_password, required_password) == 0) - { - DPRINTF(E_DBG, L_MPD, - "Authentication succeeded with supplied password: %s%s\n", - supplied_password, - unrequired ? " although no password is required" : ""); - ctx->authenticated = true; - return ACK_ERROR_NONE; - } - - DPRINTF(E_LOG, L_MPD, - "Authentication failed with supplied password: %s" - " for required password: %s\n", - supplied_password, required_password); - *errmsg = safe_asprintf("Wrong password. Authentication failed."); - return ACK_ERROR_PASSWORD; + ctx->authenticated = true; + return 0; } -static enum mpd_ack_error -mpd_command_binarylimit(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_binarylimit(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - unsigned int size; - - if (safe_atou32(argv[1], &size) < 0) - { - DPRINTF(E_DBG, L_MPD, - "Argument %s to binarylimit is not a number\n", - argv[1]); - return ACK_ERROR_ARG; - } + uint32_t size = in->argv_u32val[1]; if (size < MPD_BINARY_SIZE_MIN) - { - *errmsg = safe_asprintf("Value too small"); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Value too small"); ctx->binarylimit = size; - return ACK_ERROR_NONE; + return 0; } /* @@ -3715,23 +3130,13 @@ output_get_cb(struct player_speaker_info *spk, void *arg) * Command handler function for 'disableoutput' * Expects argument argv[1] to be the id of the speaker to disable. */ -static enum mpd_ack_error -mpd_command_disableoutput(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_disableoutput(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct output_get_param param; - uint32_t num; + uint32_t num = in->argv_u32val[1]; + struct output_get_param param = { .shortid = num }; int ret; - ret = safe_atou32(argv[1], &num); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - - memset(¶m, 0, sizeof(struct output_get_param)); - param.shortid = num; - player_speaker_enumerate(output_get_cb, ¶m); if (param.output && param.output->selected) @@ -3740,36 +3145,23 @@ mpd_command_disableoutput(struct evbuffer *evbuf, int argc, char **argv, char ** free_output(param.output); if (ret < 0) - { - *errmsg = safe_asprintf("Speakers deactivation failed: %d", num); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Speakers deactivation failed: %d", num); } - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'enableoutput' * Expects argument argv[1] to be the id of the speaker to enable. */ -static enum mpd_ack_error -mpd_command_enableoutput(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_enableoutput(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct output_get_param param; - uint32_t num; + uint32_t num = in->argv_u32val[1]; + struct output_get_param param = { .shortid = num }; int ret; - ret = safe_atou32(argv[1], &num); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - - memset(¶m, 0, sizeof(struct output_get_param)); - param.shortid = num; - player_speaker_enumerate(output_get_cb, ¶m); if (param.output && !param.output->selected) @@ -3778,36 +3170,23 @@ mpd_command_enableoutput(struct evbuffer *evbuf, int argc, char **argv, char **e free_output(param.output); if (ret < 0) - { - *errmsg = safe_asprintf("Speakers deactivation failed: %d", num); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Speakers deactivation failed: %d", num); } - return ACK_ERROR_NONE; + return 0; } /* * Command handler function for 'toggleoutput' * Expects argument argv[1] to be the id of the speaker to enable/disable. */ -static enum mpd_ack_error -mpd_command_toggleoutput(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_toggleoutput(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct output_get_param param; - uint32_t num; + uint32_t num = in->argv_u32val[1]; + struct output_get_param param = { .shortid = num }; int ret; - ret = safe_atou32(argv[1], &num); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } - - memset(¶m, 0, sizeof(struct output_get_param)); - param.shortid = num; - player_speaker_enumerate(output_get_cb, ¶m); if (param.output) @@ -3820,13 +3199,10 @@ mpd_command_toggleoutput(struct evbuffer *evbuf, int argc, char **argv, char **e free_output(param.output); if (ret < 0) - { - *errmsg = safe_asprintf("Toggle speaker failed: %d", num); - return ACK_ERROR_UNKNOWN; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Toggle speaker failed: %d", num); } - return ACK_ERROR_NONE; + return 0; } /* @@ -3878,18 +3254,17 @@ speaker_enum_cb(struct player_speaker_info *spk, void *arg) * Command handler function for 'output' * Returns a lists with the avaiable speakers. */ -static enum mpd_ack_error -mpd_command_outputs(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_outputs(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct output_outputs_param param; + struct output_outputs_param param = { 0 }; /* Reference: * https://mpd.readthedocs.io/en/latest/protocol.html#audio-output-devices * the ID returned by mpd may change between excutions, so what we do * is simply enumerate the speakers, and for get/set commands we count * ID times to the output referenced. */ - memset(¶m, 0, sizeof(param)); - param.buf = evbuf; + param.buf = out->evbuf; player_speaker_enumerate(speaker_enum_cb, ¶m); @@ -3897,7 +3272,7 @@ mpd_command_outputs(struct evbuffer *evbuf, int argc, char **argv, char **errmsg * element when configured to do so */ if (mpd_plugin_httpd) { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "outputid: %u\n" "outputname: MP3 stream\n" "plugin: httpd\n" @@ -3906,62 +3281,38 @@ mpd_command_outputs(struct evbuffer *evbuf, int argc, char **argv, char **errmsg param.nextid++; } - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -outputvolume_set(uint32_t shortid, int volume, char **errmsg) +static int +outputvolume_set(uint32_t shortid, int volume) { - struct output_get_param param; + struct output_get_param param = { .shortid = shortid }; int ret; - memset(¶m, 0, sizeof(struct output_get_param)); - param.shortid = shortid; - player_speaker_enumerate(output_get_cb, ¶m); - if (param.output) - { - ret = player_volume_setabs_speaker(param.output->id, volume); - free_output(param.output); + if (!param.output) + return -1; - if (ret < 0) - { - *errmsg = safe_asprintf("Setting volume to %d for speaker with short-id %d failed", volume, shortid); - return ACK_ERROR_UNKNOWN; - } - } - else - { - *errmsg = safe_asprintf("No speaker found for short id: %d", shortid); - return ACK_ERROR_UNKNOWN; - } + ret = player_volume_setabs_speaker(param.output->id, volume); - return ACK_ERROR_NONE; + free_output(param.output); + return ret; } -static enum mpd_ack_error -mpd_command_outputvolume(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_outputvolume(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - uint32_t shortid; - int volume; + uint32_t shortid = in->argv_u32val[1]; + int32_t volume = in->argv_i32val[2]; int ret; - ret = safe_atou32(argv[1], &shortid); + ret = outputvolume_set(shortid, volume); if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[1]); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Could not set volume for speaker with id: %d", shortid); - ret = safe_atoi32(argv[2], &volume); - if (ret < 0) - { - *errmsg = safe_asprintf("Argument doesn't convert to integer: '%s'", argv[2]); - return ACK_ERROR_ARG; - } - - return outputvolume_set(shortid, volume, errmsg); + return 0; } static void @@ -3971,7 +3322,6 @@ channel_outputvolume(const char *message) int volume; char *tmp; char *ptr; - char *errmsg = NULL; int ret; tmp = strdup(message); @@ -4001,9 +3351,9 @@ channel_outputvolume(const char *message) return; } - outputvolume_set(shortid, volume, &errmsg); - if (errmsg) - DPRINTF(E_LOG, L_MPD, "Failed to set output volume from message: '%s' (error='%s')\n", message, errmsg); + ret = outputvolume_set(shortid, volume); + if (ret < 0) + DPRINTF(E_LOG, L_MPD, "Failed to set output volume from message: '%s'\n", message); free(tmp); } @@ -4064,74 +3414,77 @@ mpd_find_channel(const char *name) return NULL; } -static enum mpd_ack_error -mpd_command_channels(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_channels(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int i; for (i = 0; mpd_channels[i].handler; i++) { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "channel: %s\n", mpd_channels[i].channel); } - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_sendmessage(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_sendmessage(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { const char *channelname; const char *message; struct mpd_channel *channel; - if (argc < 3) - { - *errmsg = safe_asprintf("Missing argument for command 'sendmessage'"); - return ACK_ERROR_ARG; - } - - channelname = argv[1]; - message = argv[2]; + channelname = in->argv[1]; + message = in->argv[2]; channel = mpd_find_channel(channelname); if (!channel) { // Just ignore the message, only log an error message DPRINTF(E_LOG, L_MPD, "Unsupported channel '%s'\n", channelname); - return ACK_ERROR_NONE; + return 0; } channel->handler(message); - return ACK_ERROR_NONE; + return 0; } /* * Dummy function to handle commands that are not supported and should * not raise an error. */ -static enum mpd_ack_error -mpd_command_ignore(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_ignore(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { //do nothing - DPRINTF(E_DBG, L_MPD, "Ignore command %s\n", argv[0]); - return ACK_ERROR_NONE; + DPRINTF(E_DBG, L_MPD, "Ignore command %s\n", in->argv[0]); + return 0; } -static enum mpd_ack_error -mpd_command_commands(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_commands(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int i; for (i = 0; mpd_handlers[i].handler; i++) { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "command: %s\n", - mpd_handlers[i].mpdcommand); + mpd_handlers[i].name); } - return ACK_ERROR_NONE; + return 0; +} + +static void +tagtypes_enum(struct mpd_tag_map *tag, void *arg) +{ + struct evbuffer *evbuf = arg; + + if (tag->type != MPD_TYPE_SPECIAL) + evbuffer_add_printf(evbuf, "tagtype: %s\n", tag->name); } /* @@ -4139,18 +3492,11 @@ mpd_command_commands(struct evbuffer *evbuf, int argc, char **argv, char **errms * Returns a lists with supported tags in the form: * tagtype: Artist */ -static enum mpd_ack_error -mpd_command_tagtypes(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_tagtypes(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - int i; - - for (i = 0; i < ARRAY_SIZE(tagtypes); i++) - { - if (tagtypes[i].type != MPD_TYPE_SPECIAL) - evbuffer_add_printf(evbuf, "tagtype: %s\n", tagtypes[i].tag); - } - - return ACK_ERROR_NONE; + mpd_parser_enum_tagtypes(tagtypes_enum, out->evbuf); + return 0; } /* @@ -4158,10 +3504,10 @@ mpd_command_tagtypes(struct evbuffer *evbuf, int argc, char **argv, char **errms * Returns a lists with supported tags in the form: * handler: protocol:// */ -static enum mpd_ack_error -mpd_command_urlhandlers(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_urlhandlers(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - evbuffer_add_printf(evbuf, + evbuffer_add_printf(out->evbuf, "handler: http://\n" // handlers supported by MPD 0.19.12 // "handler: https://\n" @@ -4181,7 +3527,7 @@ mpd_command_urlhandlers(struct evbuffer *evbuf, int argc, char **argv, char **er // "handler: alsa://\n" ); - return ACK_ERROR_NONE; + return 0; } /* @@ -4191,60 +3537,56 @@ mpd_command_urlhandlers(struct evbuffer *evbuf, int argc, char **argv, char **er * The server only uses libav/ffmepg for decoding and does not support decoder plugins, * therefor the function reports only ffmpeg as available. */ -static enum mpd_ack_error -mpd_command_decoders(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_decoders(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { int i; - evbuffer_add_printf(evbuf, "plugin: ffmpeg\n"); + evbuffer_add_printf(out->evbuf, "plugin: ffmpeg\n"); for (i = 0; ffmpeg_suffixes[i]; i++) { - evbuffer_add_printf(evbuf, "suffix: %s\n", ffmpeg_suffixes[i]); + evbuffer_add_printf(out->evbuf, "suffix: %s\n", ffmpeg_suffixes[i]); } for (i = 0; ffmpeg_mime_types[i]; i++) { - evbuffer_add_printf(evbuf, "mime_type: %s\n", ffmpeg_mime_types[i]); + evbuffer_add_printf(out->evbuf, "mime_type: %s\n", ffmpeg_mime_types[i]); } - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_command_list_begin(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_command_list_begin(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { ctx->cmd_list_type = COMMAND_LIST_BEGIN; - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_command_list_ok_begin(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_command_list_ok_begin(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { ctx->cmd_list_type = COMMAND_LIST_OK_BEGIN; - return ACK_ERROR_NONE; + return 0; } -static enum mpd_ack_error -mpd_command_command_list_end(struct evbuffer *evbuf, int argc, char **argv, char **errmsg, struct mpd_client_ctx *ctx) +static int +mpd_command_command_list_end(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { if (ctx->cmd_list_type == COMMAND_LIST_BEGIN) ctx->cmd_list_type = COMMAND_LIST_END; else if (ctx->cmd_list_type == COMMAND_LIST_OK_BEGIN) ctx->cmd_list_type = COMMAND_LIST_OK_END; else - { - *errmsg = safe_asprintf("Got with command list end without preceeding list start"); - return ACK_ERROR_ARG; - } + RETURN_ERROR(ACK_ERROR_ARG, "Got with command list end without preceeding list start"); - return ACK_ERROR_NONE; + return 0; } - static struct mpd_command mpd_handlers[] = { - /* commandname | handler function | minimum argument count*/ + /* commandname | handler function | min arg count | handler requires int args */ // Commands for querying status { "clearerror", mpd_command_ignore, -1 }, @@ -4255,26 +3597,26 @@ static struct mpd_command mpd_handlers[] = { "stats", mpd_command_stats, -1 }, // Playback options - { "consume", mpd_command_consume, 2 }, + { "consume", mpd_command_consume, 2, MPD_WANTS_NUM_ARG1_UVAL }, { "crossfade", mpd_command_ignore, -1 }, { "mixrampdb", mpd_command_ignore, -1 }, { "mixrampdelay", mpd_command_ignore, -1 }, - { "random", mpd_command_random, 2 }, - { "repeat", mpd_command_repeat, 2 }, - { "setvol", mpd_command_setvol, 2 }, + { "random", mpd_command_random, 2, MPD_WANTS_NUM_ARG1_UVAL }, + { "repeat", mpd_command_repeat, 2, MPD_WANTS_NUM_ARG1_UVAL }, + { "setvol", mpd_command_setvol, 2, MPD_WANTS_NUM_ARG1_UVAL }, { "single", mpd_command_single, 2 }, { "replay_gain_mode", mpd_command_ignore, -1 }, { "replay_gain_status", mpd_command_replay_gain_status, -1 }, - { "volume", mpd_command_volume, 2 }, + { "volume", mpd_command_volume, 2, MPD_WANTS_NUM_ARG1_IVAL }, // Controlling playback { "next", mpd_command_next, -1 }, - { "pause", mpd_command_pause, -1 }, - { "play", mpd_command_play, -1 }, - { "playid", mpd_command_playid, -1 }, + { "pause", mpd_command_pause, 1, MPD_WANTS_NUM_ARG1_UVAL }, + { "play", mpd_command_play, 1, MPD_WANTS_NUM_ARG1_UVAL }, + { "playid", mpd_command_playid, 1, MPD_WANTS_NUM_ARG1_UVAL }, { "previous", mpd_command_previous, -1 }, - { "seek", mpd_command_seek, 3 }, - { "seekid", mpd_command_seekid, 3 }, + { "seek", mpd_command_seek, 3, MPD_WANTS_NUM_ARG1_UVAL }, + { "seekid", mpd_command_seekid, 3, MPD_WANTS_NUM_ARG1_UVAL }, { "seekcur", mpd_command_seekcur, 2 }, { "stop", mpd_command_stop, -1 }, @@ -4283,16 +3625,16 @@ static struct mpd_command mpd_handlers[] = { "addid", mpd_command_addid, 2 }, { "clear", mpd_command_clear, -1 }, { "delete", mpd_command_delete, -1 }, - { "deleteid", mpd_command_deleteid, 2 }, + { "deleteid", mpd_command_deleteid, 2, MPD_WANTS_NUM_ARG1_UVAL }, { "move", mpd_command_move, 3 }, - { "moveid", mpd_command_moveid, 3 }, + { "moveid", mpd_command_moveid, 3, MPD_WANTS_NUM_ARG1_UVAL }, { "playlist", mpd_command_playlistinfo, -1 }, // According to the mpd protocol the use of "playlist" is deprecated - { "playlistfind", mpd_command_playlistfind, -1 }, - { "playlistid", mpd_command_playlistid, -1 }, + { "playlistfind", mpd_command_playlistfind, 2 }, + { "playlistid", mpd_command_playlistid, 1, MPD_WANTS_NUM_ARG1_UVAL }, { "playlistinfo", mpd_command_playlistinfo, -1 }, - { "playlistsearch", mpd_command_playlistsearch, -1 }, - { "plchanges", mpd_command_plchanges, 2 }, - { "plchangesposid", mpd_command_plchangesposid, 2 }, + { "playlistsearch", mpd_command_playlistsearch, 2 }, + { "plchanges", mpd_command_plchanges, 2, MPD_WANTS_NUM_ARG1_UVAL }, + { "plchangesposid", mpd_command_plchangesposid, 2, MPD_WANTS_NUM_ARG1_UVAL }, // { "prio", mpd_command_prio, -1 }, // { "prioid", mpd_command_prioid, -1 }, // { "rangeid", mpd_command_rangeid, -1 }, @@ -4317,16 +3659,16 @@ static struct mpd_command mpd_handlers[] = // The music database { "count", mpd_command_count, -1 }, - { "find", mpd_command_find, -1 }, - { "findadd", mpd_command_findadd, -1 }, - { "list", mpd_command_list, -1 }, + { "find", mpd_command_find, 2 }, + { "findadd", mpd_command_findadd, 2 }, + { "search", mpd_command_find, 2 }, + { "searchadd", mpd_command_findadd, 2 }, + { "list", mpd_command_list, 2 }, { "listall", mpd_command_listall, -1 }, { "listallinfo", mpd_command_listallinfo, -1 }, { "listfiles", mpd_command_listfiles, -1 }, { "lsinfo", mpd_command_lsinfo, -1 }, // { "readcomments", mpd_command_readcomments, -1 }, - { "search", mpd_command_search, -1 }, - { "searchadd", mpd_command_searchadd, -1 }, // { "searchaddpl", mpd_command_searchaddpl, -1 }, { "update", mpd_command_update, -1 }, // { "rescan", mpd_command_rescan, -1 }, @@ -4345,24 +3687,23 @@ static struct mpd_command mpd_handlers[] = // { "kill", mpd_command_kill, -1 }, { "password", mpd_command_password, -1 }, { "ping", mpd_command_ignore, -1 }, - { "binarylimit", mpd_command_binarylimit, 2 }, - /* missing: tagtypes */ + { "binarylimit", mpd_command_binarylimit, 2, MPD_WANTS_NUM_ARG1_UVAL }, // Audio output devices - { "disableoutput", mpd_command_disableoutput, 2 }, - { "enableoutput", mpd_command_enableoutput, 2 }, - { "toggleoutput", mpd_command_toggleoutput, 2 }, + { "disableoutput", mpd_command_disableoutput, 2, MPD_WANTS_NUM_ARG1_UVAL }, + { "enableoutput", mpd_command_enableoutput, 2, MPD_WANTS_NUM_ARG1_UVAL }, + { "toggleoutput", mpd_command_toggleoutput, 2, MPD_WANTS_NUM_ARG1_UVAL }, { "outputs", mpd_command_outputs, -1 }, // Custom command outputvolume (not supported by mpd) - { "outputvolume", mpd_command_outputvolume, 3 }, + { "outputvolume", mpd_command_outputvolume, 3, MPD_WANTS_NUM_ARG1_UVAL | MPD_WANTS_NUM_ARG2_IVAL }, // Client to client { "subscribe", mpd_command_ignore, -1 }, { "unsubscribe", mpd_command_ignore, -1 }, { "channels", mpd_command_channels, -1 }, { "readmessages", mpd_command_ignore, -1 }, - { "sendmessage", mpd_command_sendmessage, -1 }, + { "sendmessage", mpd_command_sendmessage, 3 }, // Reflection // { "config", mpd_command_config, -1 }, @@ -4394,7 +3735,7 @@ mpd_find_command(const char *name) for (i = 0; mpd_handlers[i].handler; i++) { - if (0 == strcmp(name, mpd_handlers[i].mpdcommand)) + if (0 == strcmp(name, mpd_handlers[i].name)) { return &mpd_handlers[i]; } @@ -4403,170 +3744,173 @@ mpd_find_command(const char *name) return NULL; } -// Parses the argument string into an array of strings. Arguments are separated -// by a whitespace character and may be wrapped in double quotes. ack_error is -// set and errmsg allocated if there is an error. -static enum mpd_ack_error -mpd_parse_args(char **argv, int argv_size, int *argc, char *args, bool *must_disconnect, char **errmsg) +static void +mpd_command_input_free(struct mpd_command_input *input) { - char *input = args; - int arg_count = 0; + if (!input) + return; - DPRINTF(E_SPAM, L_MPD, "Parse args: args = \"%s\"\n", input); + free(input->args_split); + free(input); +} - while (*input != 0 && arg_count < argv_size) +static int +mpd_command_input_create(struct mpd_command_input **out, const char *line) +{ + struct mpd_command_input *in; + int ret; + int i; + + CHECK_NULL(L_MPD, in = calloc(1, sizeof(struct mpd_command_input))); + + in->args_raw = line; + + ret = mpd_split_args(in->argv, sizeof(in->argv), &in->argc, &in->args_split, line); + if (ret < 0) + goto error; + + // Many of the handlers need numeric input. If you change this, then also + // review command_has_num(). + for (i = MPD_WANTS_NUM_ARGV_MIN; i < in->argc && i <= MPD_WANTS_NUM_ARGV_MAX; i++) { - // Ignore whitespace characters - if (*input == ' ') - { - input++; - continue; - } - - // Check if the parameter is wrapped in double quotes - if (*input == '"') - { - argv[arg_count] = mpd_pars_quoted(&input); - if (!argv[arg_count]) - goto error; - } - else - { - argv[arg_count] = mpd_pars_unquoted(&input); - } - - arg_count++; + if (!isdigit(in->argv[i][0]) && in->argv[i][0] != '-') + continue; // Save some cycles if clearly not a number + if (safe_atoi32(in->argv[i], &in->argv_i32val[i]) == 0) + in->has_num |= 1 << i; + if (safe_atou32(in->argv[i], &in->argv_u32val[i]) == 0) + in->has_num |= 1 << (i + MPD_WANTS_NUM_ARGV_MAX); } - - DPRINTF(E_SPAM, L_MPD, "Parse args: args count = \"%d\"\n", arg_count); - *argc = arg_count; - - if (arg_count == 0) - { - *errmsg = safe_asprintf("No command given"); - *must_disconnect = true; // in this case MPD disconnects the client - return ACK_ERROR_ARG; - } - - if (*input != 0 && arg_count == argv_size) - { - *errmsg = safe_asprintf("Too many arguments: %d allowed", argv_size); - return ACK_ERROR_ARG; // in this case MPD doesn't disconnect the client - } - - return ACK_ERROR_NONE; + + *out = in; + return 0; error: - *errmsg = safe_asprintf("Error parsing arguments"); - *must_disconnect = true; // in this case MPD disconnects the client - return ACK_ERROR_UNKNOWN; + mpd_command_input_free(in); + return -1; } -static enum mpd_ack_error -mpd_list_add(struct mpd_client_ctx *client_ctx, const char *line) +// Check if input has the numeric arguments required for the command, taking +// into account that some commands have optional numeric args (purpose of mask) +static bool +command_has_num(int wants_num, int has_num, int argc) { - size_t sz = strlen(line) + 1; - int ret; + int ival_mask = (1 << argc) - 1; // If argc == 2 becomes ...00000011 + int uval_mask = (ival_mask << MPD_WANTS_NUM_ARGV_MAX); // If ..MAX == 3 becomes 00011000 + int mask = (ival_mask | uval_mask); // becomes 00011011 - if (evbuffer_get_length(client_ctx->cmd_list_buffer) + sz > MPD_MAX_COMMAND_LIST_SIZE) - { - DPRINTF(E_LOG, L_MPD, "Max command list size (%uKB) exceeded\n", (MPD_MAX_COMMAND_LIST_SIZE / 1024)); - client_ctx->must_disconnect = true; - return ACK_ERROR_NONE; - } - - ret = evbuffer_add(client_ctx->cmd_list_buffer, line, sz); - if (ret < 0) - { - DPRINTF(E_LOG, L_MPD, "Failed to add to command list\n"); - client_ctx->must_disconnect = true; - return ACK_ERROR_NONE; - } - - return ACK_ERROR_NONE; + return (wants_num & mask) == (has_num & wants_num & mask); } -static enum mpd_ack_error -mpd_process_command_line(struct evbuffer *output, char *line, int cmd_num, struct mpd_client_ctx *client_ctx) +static bool +mpd_must_process_command_now(const char *line, struct mpd_client_ctx *client_ctx) { - enum mpd_ack_error ack_error; - bool got_noidle; - char *argv[MPD_COMMAND_ARGV_MAX] = { 0 }; // Zero init just to silence false positive from scan-build - int argc = 0; // Also to silence scan-build - char *cmd_name = NULL; - struct mpd_command *command; - char *errmsg = NULL; + size_t line_len = strlen(line); // We're in command list mode, just add command to buffer and return if ((client_ctx->cmd_list_type == COMMAND_LIST_BEGIN || client_ctx->cmd_list_type == COMMAND_LIST_OK_BEGIN) && strcmp(line, "command_list_end") != 0) { - return mpd_list_add(client_ctx, line); + if (evbuffer_get_length(client_ctx->cmd_list_buffer) + line_len + 1 > MPD_MAX_COMMAND_LIST_SIZE) + { + DPRINTF(E_LOG, L_MPD, "Max command list size (%uKB) exceeded\n", (MPD_MAX_COMMAND_LIST_SIZE / 1024)); + client_ctx->must_disconnect = true; + return false; + } + + evbuffer_add(client_ctx->cmd_list_buffer, line, line_len + 1); + return false; } - got_noidle = (strcmp(line, "noidle") == 0); - if (got_noidle && !client_ctx->is_idle) + if (strcmp(line, "noidle") == 0 && !client_ctx->is_idle) { - return ACK_ERROR_NONE; // Just ignore, don't proceed to send an OK + return false; // Just ignore, don't proceed to send an OK } - else if (!got_noidle && client_ctx->is_idle) + + return true; +} + +static enum mpd_ack_error +mpd_process_command_line(struct evbuffer *evbuf, const char *line, int cmd_num, struct mpd_client_ctx *client_ctx) +{ + struct mpd_command_input *in = NULL; + struct mpd_command_output out = { .evbuf = evbuf, .ack_error = ACK_ERROR_NONE }; + struct mpd_command *command; + const char *cmd_name = NULL; + int ret; + + if (!mpd_must_process_command_now(line, client_ctx)) + { + return ACK_ERROR_NONE; + } + + ret = mpd_command_input_create(&in, line); + if (ret < 0) + { + client_ctx->must_disconnect = true; // This is what MPD does + out.errmsg = safe_asprintf("Could not read command: '%s'", line); + out.ack_error = ACK_ERROR_ARG; + goto error; + } + + cmd_name = in->argv[0]; + + if (strcmp(cmd_name, "noidle") != 0 && client_ctx->is_idle) { - errmsg = safe_asprintf("Only 'noidle' is allowed during idle"); - ack_error = ACK_ERROR_ARG; client_ctx->must_disconnect = true; + out.errmsg = safe_asprintf("Only 'noidle' is allowed during idle"); + out.ack_error = ACK_ERROR_ARG; goto error; } - // Split the read line into command name and arguments - ack_error = mpd_parse_args(argv, MPD_COMMAND_ARGV_MAX, &argc, line, &client_ctx->must_disconnect, &errmsg); - if (ack_error != ACK_ERROR_NONE) - { - goto error; - } - - CHECK_NULL(L_MPD, argv[0]); - - cmd_name = argv[0]; if (strcmp(cmd_name, "password") != 0 && !client_ctx->authenticated) { - errmsg = safe_asprintf("Not authenticated"); - ack_error = ACK_ERROR_PERMISSION; + out.errmsg = safe_asprintf("Not authenticated"); + out.ack_error = ACK_ERROR_PERMISSION; goto error; } command = mpd_find_command(cmd_name); if (!command) { - errmsg = safe_asprintf("Unknown command"); - ack_error = ACK_ERROR_UNKNOWN; + out.errmsg = safe_asprintf("Unknown command"); + out.ack_error = ACK_ERROR_UNKNOWN; goto error; } - else if (command->min_argc > argc) + else if (command->min_argc > in->argc) { - errmsg = safe_asprintf("Missing argument(s), expected %d, given %d", command->min_argc, argc); - ack_error = ACK_ERROR_ARG; + out.errmsg = safe_asprintf("Missing argument(s), expected %d, given %d", command->min_argc - 1, in->argc - 1); + out.ack_error = ACK_ERROR_ARG; + goto error; + } + else if (!command_has_num(command->wants_num, in->has_num, in->argc)) + { + out.errmsg = safe_asprintf("Missing or invalid numeric values in command: '%s'", line); + out.ack_error = ACK_ERROR_ARG; goto error; } - ack_error = command->handler(output, argc, argv, &errmsg, client_ctx); - if (ack_error != ACK_ERROR_NONE) + ret = command->handler(&out, in, client_ctx); + if (ret < 0) { goto error; } if (client_ctx->cmd_list_type == COMMAND_LIST_NONE && !client_ctx->is_idle) - evbuffer_add_printf(output, "OK\n"); + evbuffer_add_printf(out.evbuf, "OK\n"); - return ack_error; + mpd_command_input_free(in); + + return out.ack_error; error: - DPRINTF(E_LOG, L_MPD, "Error processing command '%s': %s\n", line, errmsg); + DPRINTF(E_LOG, L_MPD, "Error processing command '%s': %s\n", line, out.errmsg); if (cmd_name) - evbuffer_add_printf(output, "ACK [%d@%d] {%s} %s\n", ack_error, cmd_num, cmd_name, errmsg); + evbuffer_add_printf(out.evbuf, "ACK [%d@%d] {%s} %s\n", out.ack_error, cmd_num, cmd_name, out.errmsg); - free(errmsg); + mpd_command_input_free(in); + free(out.errmsg); - return ack_error; + return out.ack_error; } // Process the commands that were added to client_ctx->cmd_list_buffer @@ -4578,7 +3922,7 @@ mpd_process_command_line(struct evbuffer *output, char *line, int cmd_num, struc // for each successful command executed in the command list. // On success for all commands, OK is returned. static void -mpd_process_command_list(struct evbuffer *output, struct mpd_client_ctx *client_ctx) +mpd_process_command_list(struct evbuffer *evbuf, struct mpd_client_ctx *client_ctx) { char *line; enum mpd_ack_error ack_error = ACK_ERROR_NONE; @@ -4586,7 +3930,8 @@ mpd_process_command_list(struct evbuffer *output, struct mpd_client_ctx *client_ while ((line = evbuffer_readln(client_ctx->cmd_list_buffer, NULL, EVBUFFER_EOL_NUL))) { - ack_error = mpd_process_command_line(output, line, cmd_num, client_ctx); + ack_error = mpd_process_command_line(evbuf, line, cmd_num, client_ctx); + cmd_num++; free(line); @@ -4595,11 +3940,11 @@ mpd_process_command_list(struct evbuffer *output, struct mpd_client_ctx *client_ break; if (client_ctx->cmd_list_type == COMMAND_LIST_OK_END) - evbuffer_add_printf(output, "list_OK\n"); + evbuffer_add_printf(evbuf, "list_OK\n"); } if (ack_error == ACK_ERROR_NONE) - evbuffer_add_printf(output, "OK\n"); + evbuffer_add_printf(evbuf, "OK\n"); // Back to single-command mode evbuffer_drain(client_ctx->cmd_list_buffer, -1); @@ -4791,9 +4136,7 @@ mpd_notify_idle(void *arg, int *retval) { DPRINTF(E_DBG, L_MPD, "Notify client #%d\n", i); - notify_idle_client(client, event_mask); - - evbuffer_add_printf(client->evbuffer, "OK\n"); + notify_idle_client(client, event_mask, true); client = client->next; i++; diff --git a/src/parsers/mpd_lexer.l b/src/parsers/mpd_lexer.l new file mode 100644 index 00000000..d6e60ebc --- /dev/null +++ b/src/parsers/mpd_lexer.l @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2021-2022 Espen Jürgensen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* =========================== BOILERPLATE SECTION ===========================*/ + +/* This is to avoid compiler warnings about unused functions. More options are + noyyalloc noyyrealloc noyyfree. */ +%option noyywrap nounput noinput + +/* Thread safe scanner */ +%option reentrant + +/* To avoid symbol name conflicts with multiple lexers */ +%option prefix="mpd_" + +/* Automake's ylwrap expexts the output to have this name */ +%option outfile="lex.yy.c" + +/* Makes a Bison-compatible yylex */ +%option bison-bridge + +%{ +#include +#include +#include +#include +#include "mpd_parser.h" + +/* Unknown why this is required despite using prefix */ +#define YYSTYPE MPD_STYPE +%} + + +/* ========================= NON-BOILERPLATE SECTION =========================*/ + +%option case-insensitive + +singlequoted '(\\.|[^'\\])*' +doublequoted \"(\\.|[^"\\])*\" +yyyymmdd [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] + +%% + +[\n\r\t ]+ /* Ignore whitespace */ + +^playlistfind { return MPD_T_CMDPLAYLISTFIND; } +^playlistsearch { return MPD_T_CMDPLAYLISTSEARCH; } +^count { return MPD_T_CMDCOUNT; } +^find { return MPD_T_CMDFIND; } +^findadd { return MPD_T_CMDFINDADD; } +^list { return MPD_T_CMDLIST; } +^search { return MPD_T_CMDSEARCH; } +^searchadd { return MPD_T_CMDSEARCHADD; } +^searchcount { return MPD_T_CMDSEARCHCOUNT; } + +sort { return MPD_T_SORT; } +window { return MPD_T_WINDOW; } +position { return MPD_T_POSITION; } +group { return MPD_T_GROUP; } + +artist { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +artistsort { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +albumartist { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +albumartistsort { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +album { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +albumsort { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +title { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +titlesort { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +composer { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +composersort { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +genre { yylval->str = strdup(yytext); return MPD_T_STRTAG; } +file { yylval->str = strdup(yytext); return MPD_T_STRTAG; } + +base { yylval->str = strdup(yytext); return MPD_T_BASETAG; } + +track { yylval->str = strdup(yytext); return MPD_T_INTTAG; } +disc { yylval->str = strdup(yytext); return MPD_T_INTTAG; } +date { yylval->str = strdup(yytext); return MPD_T_INTTAG; } + +modified-since { yylval->str = strdup(yytext); return MPD_T_SINCETAG; } +added-since { yylval->str = strdup(yytext); return MPD_T_SINCETAG; } + +contains { return (yylval->ival = MPD_T_CONTAINS); } +starts_with { return (yylval->ival = MPD_T_STARTSWITH); } +ends_with { return (yylval->ival = MPD_T_ENDSWITH); } +== { return (yylval->ival = MPD_T_EQUAL); } +!= { return (yylval->ival = MPD_T_NOTEQUAL); } +\<= { return (yylval->ival = MPD_T_LESSEQUAL); } +\< { return (yylval->ival = MPD_T_LESS); } +\>= { return (yylval->ival = MPD_T_GREATEREQUAL); } +\> { return (yylval->ival = MPD_T_GREATER); } + +audioformat { return MPD_T_AUDIOFORMATTAG; } +any { return MPD_T_ANYTAG; } + +or { return MPD_T_OR; } +and { return MPD_T_AND; } +not { return MPD_T_NOT; } +! { return MPD_T_NOT; } + +{singlequoted} { yylval->str = mpd_parser_quoted(yytext); return MPD_T_STRING; } +{doublequoted} { yylval->str = mpd_parser_quoted(yytext); return MPD_T_STRING; } + +[0-9]+ { yylval->ival=atoi(yytext); return MPD_T_NUM; } + +. { return yytext[0]; } + +%% + diff --git a/src/parsers/mpd_parser.y b/src/parsers/mpd_parser.y new file mode 100644 index 00000000..74f8e8ee --- /dev/null +++ b/src/parsers/mpd_parser.y @@ -0,0 +1,806 @@ +/* + * Copyright (C) 2021-2022 Espen Jürgensen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* =========================== BOILERPLATE SECTION ===========================*/ + +/* No global variables and yylex has scanner as argument */ +%define api.pure true + +/* Change prefix of symbols from yy to avoid clashes with any other parsers we + may want to link */ +%define api.prefix {mpd_} + +/* Gives better errors than "syntax error" */ +%define parse.error verbose + +/* Enables debug mode */ +%define parse.trace + +/* Adds output parameter to the parser */ +%parse-param {struct mpd_result *result} + +/* Adds "scanner" as argument to the parses calls to yylex, which is required + when the lexer is in reentrant mode. The type is void because caller caller + shouldn't need to know about yyscan_t */ +%param {void *scanner} + +%code provides { +/* Convenience functions for caller to use instead of interfacing with lexer and + parser directly */ +int mpd_lex_cb(char *input, void (*cb)(int, const char *)); +int mpd_lex_parse(struct mpd_result *result, const char *input); +} + +/* Implementation of the convenience function and the parsing error function + required by Bison */ +%code { + #include "mpd_lexer.h" + + int mpd_lex_cb(char *input, void (*cb)(int, const char *)) + { + int ret; + yyscan_t scanner; + YY_BUFFER_STATE buf; + YYSTYPE val; + + if ((ret = mpd_lex_init(&scanner)) != 0) + return ret; + + buf = mpd__scan_string(input, scanner); + + while ((ret = mpd_lex(&val, scanner)) > 0) + cb(ret, mpd_get_text(scanner)); + + mpd__delete_buffer(buf, scanner); + mpd_lex_destroy(scanner); + return 0; + } + + int mpd_lex_parse(struct mpd_result *result, const char *input) + { + YY_BUFFER_STATE buffer; + yyscan_t scanner; + int retval = -1; + int ret; + + result->errmsg[0] = '\0'; // For safety + + ret = mpd_lex_init(&scanner); + if (ret != 0) + goto error_init; + + buffer = mpd__scan_string(input, scanner); + if (!buffer) + goto error_buffer; + + ret = mpd_parse(result, scanner); + if (ret != 0) + goto error_parse; + + retval = 0; + + error_parse: + mpd__delete_buffer(buffer, scanner); + error_buffer: + mpd_lex_destroy(scanner); + error_init: + return retval; + } + + void mpd_error(struct mpd_result *result, yyscan_t scanner, const char *msg) + { + snprintf(result->errmsg, sizeof(result->errmsg), "%s", msg); + } + +} + +/* ============ ABSTRACT SYNTAX TREE (AST) BOILERPLATE SECTION ===============*/ + +%code { + struct ast + { + int type; + struct ast *l; + struct ast *r; + void *data; + int ival; + }; + + __attribute__((unused)) static struct ast * ast_new(int type, struct ast *l, struct ast *r) + { + struct ast *a = calloc(1, sizeof(struct ast)); + + a->type = type; + a->l = l; + a->r = r; + return a; + } + + /* Note *data is expected to be freeable with regular free() */ + __attribute__((unused)) static struct ast * ast_data(int type, void *data) + { + struct ast *a = calloc(1, sizeof(struct ast)); + + a->type = type; + a->data = data; + return a; + } + + __attribute__((unused)) static struct ast * ast_int(int type, int ival) + { + struct ast *a = calloc(1, sizeof(struct ast)); + + a->type = type; + a->ival = ival; + return a; + } + + __attribute__((unused)) static void ast_free(struct ast *a) + { + if (!a) + return; + + ast_free(a->l); + ast_free(a->r); + free(a->data); + free(a); + } +} + +%destructor { free($$); } +%destructor { ast_free($$); } + + +/* ========================= NON-BOILERPLATE SECTION =========================*/ + +/* Includes required by the parser rules */ +%code top { +#ifndef _GNU_SOURCE +#define _GNU_SOURCE // For asprintf +#endif +#include +#include +#include +#include // For vsnprintf +#include +#include +#include + +#define INVERT_MASK 0x80000000 +} + +/* Dependencies, mocked or real */ +%code top { +#ifndef DEBUG_PARSER_MOCK +#include "db.h" +#include "misc.h" +#else +#include "owntonefunctions.h" +#endif +} + +/* Definition of struct that will hold the parsing result + * Some users have sizeable smart playlists, e.g. listing many artist names, + * which translate to sizeable sql queries. + */ +%code requires { +struct mpd_result_part { + char str[8192]; + int offset; +}; + +struct mpd_result { + struct mpd_result_part where_part; + struct mpd_result_part order_part; + struct mpd_result_part group_part; + char tagtype_buf[64]; + char position_buf[64]; + + // Pointers to the strings in mpd_result_part + const char *where; + const char *order; + const char *group; + + const char *tagtype; + const char *position; + + // Set to 0 if not found + int offset; + int limit; + + int err; + char errmsg[128]; +}; + +enum mpd_type { + MPD_TYPE_INT, + MPD_TYPE_STRING, + MPD_TYPE_SPECIAL, +}; + +struct mpd_tag_map { + const char *name; + const char *dbcol; + enum mpd_type type; + int dbmfi_offset; +}; + +char *mpd_parser_quoted(const char *str); +struct mpd_tag_map *mpd_parser_tag_from_dbcol(const char *dbcol); +void mpd_parser_enum_tagtypes(void (*func)(struct mpd_tag_map *, void *), void *arg); +} + +%code { +enum sql_append_type { + SQL_APPEND_OPERATOR, + SQL_APPEND_OPERATOR_STR, + SQL_APPEND_OPERATOR_LIKE, + SQL_APPEND_FIELD, + SQL_APPEND_STR, + SQL_APPEND_INT, + SQL_APPEND_TIME, + SQL_APPEND_ORDER, + SQL_APPEND_PARENS, +}; + +static struct mpd_tag_map mpd_tag_map[] = +{ + { "Artist", "f.artist", MPD_TYPE_STRING, dbmfi_offsetof(artist), }, + { "ArtistSort", "f.artist_sort", MPD_TYPE_STRING, dbmfi_offsetof(artist_sort), }, + { "AlbumArtist", "f.album_artist", MPD_TYPE_STRING, dbmfi_offsetof(album_artist), }, + { "AlbumArtistSort", "f.album_artist_sort", MPD_TYPE_STRING, dbmfi_offsetof(album_artist_sort), }, + { "Album", "f.album", MPD_TYPE_STRING, dbmfi_offsetof(album), }, + { "AlbumSort", "f.album_sort", MPD_TYPE_STRING, dbmfi_offsetof(album_sort), }, + { "Title", "f.title", MPD_TYPE_STRING, dbmfi_offsetof(title), }, + { "TitleSort", "f.title_sort", MPD_TYPE_STRING, dbmfi_offsetof(title_sort), }, + { "Genre", "f.genre", MPD_TYPE_STRING, dbmfi_offsetof(genre), }, + { "Composer", "f.composer", MPD_TYPE_STRING, dbmfi_offsetof(composer), }, + { "ComposerSort", "f.composer_sort", MPD_TYPE_STRING, dbmfi_offsetof(composer_sort), }, + { "file", "f.virtual_path", MPD_TYPE_SPECIAL, dbmfi_offsetof(virtual_path), }, + + { "base", "f.virtual_path", MPD_TYPE_SPECIAL, dbmfi_offsetof(virtual_path), }, + + { "Track", "f.track", MPD_TYPE_INT, dbmfi_offsetof(track), }, + { "Disc", "f.disc", MPD_TYPE_INT, dbmfi_offsetof(disc), }, + { "Date", "f.year", MPD_TYPE_INT, dbmfi_offsetof(year), }, + + { "modified-since", "f.time_modified", MPD_TYPE_SPECIAL, dbmfi_offsetof(time_modified), }, + { "added-since", "f.time_added", MPD_TYPE_SPECIAL, dbmfi_offsetof(time_added), }, + + // AudioFormat tag + { "samplerate", "f.samplerate", MPD_TYPE_INT, dbmfi_offsetof(samplerate), }, + { "bits_per_sample", "f.bits_per_sample", MPD_TYPE_INT, dbmfi_offsetof(bits_per_sample), }, + { "channels", "f.channels", MPD_TYPE_INT, dbmfi_offsetof(channels), }, + + { NULL }, +}; + +static const char * +tag_to_dbcol(const char *tag) +{ + struct mpd_tag_map *mapptr; + + for (mapptr = mpd_tag_map; mapptr->name; mapptr++) + { + if (strcasecmp(tag, mapptr->name) == 0) + return mapptr->dbcol; + } + + return "error"; // Should never happen, means tag_to_db_map is out of sync with lexer +} + +struct mpd_tag_map * +mpd_parser_tag_from_dbcol(const char *dbcol) +{ + struct mpd_tag_map *mapptr; + + if (!dbcol) + return NULL; + + for (mapptr = mpd_tag_map; mapptr->name; mapptr++) + { + if (strcasecmp(dbcol, mapptr->dbcol) == 0) + return mapptr; + } + + return NULL; +} + +void +mpd_parser_enum_tagtypes(void (*func)(struct mpd_tag_map *, void *), void *arg) +{ + struct mpd_tag_map *mapptr; + + for (mapptr = mpd_tag_map; mapptr->name; mapptr++) + { + func(mapptr, arg); + } +} + +// Remove any backslash that was used to escape single or double quotes +char * +mpd_parser_quoted(const char *str) +{ + char *out = strdup(str + 1); // Copy from after the first quote + size_t len = strlen(out); + const char *src; + char *dst; + + out[len - 1] = '\0'; // Remove terminating quote + + // Remove escaping backslashes + for (src = dst = out; *src != '\0'; src++, dst++) + { + if (*src == '\\') + src++; + if (*src == '\0') + break; + + *dst = *src; + } + + *dst = '\0'; + + return out; +} + +static void sql_from_ast(struct mpd_result *, struct mpd_result_part *, struct ast *); + +// Escapes any '%' or '_' that might be in the string +static void sql_like_escape(char **value, char *escape_char) +{ + char *s = *value; + size_t len = strlen(s); + char *new; + + *escape_char = 0; + + // Fast path, nothing to escape + if (!strpbrk(s, "_%")) + return; + + len = 2 * len; // Enough for every char to be escaped + new = realloc(s, len); + safe_snreplace(new, len, "%", "\\%"); + safe_snreplace(new, len, "_", "\\_"); + *escape_char = '\\'; + *value = new; +} + +static void sql_str_escape(char **value) +{ + char *old = *value; + *value = db_escape_string(old); + free(old); +} + +static void sql_append(struct mpd_result *result, struct mpd_result_part *part, const char *fmt, ...) +{ + va_list ap; + int remaining = sizeof(part->str) - part->offset; + int ret; + + if (remaining <= 0) + goto nospace; + + va_start(ap, fmt); + ret = vsnprintf(part->str + part->offset, remaining, fmt, ap); + va_end(ap); + if (ret < 0 || ret >= remaining) + goto nospace; + + part->offset += ret; + return; + + nospace: + snprintf(result->errmsg, sizeof(result->errmsg), "Parser output buffer too small (%zu bytes)", sizeof(part->str)); + result->err = -2; +} + +static void sql_append_recursive(struct mpd_result *result, struct mpd_result_part *part, struct ast *a, const char *op, const char *op_not, bool is_not, enum sql_append_type append_type) +{ + char escape_char; + + switch (append_type) + { + case SQL_APPEND_OPERATOR: + sql_from_ast(result, part, a->l); + sql_append(result, part, " %s ", is_not ? op_not : op); + sql_from_ast(result, part, a->r); + break; + case SQL_APPEND_OPERATOR_STR: + sql_from_ast(result, part, a->l); + sql_append(result, part, " %s '", is_not ? op_not : op); + sql_from_ast(result, part, a->r); + sql_append(result, part, "'"); + break; + case SQL_APPEND_OPERATOR_LIKE: + sql_from_ast(result, part, a->l); + sql_append(result, part, " %s '%s", is_not ? op_not : op, a->type == MPD_T_STARTSWITH ? "" : "%"); + sql_like_escape((char **)(&a->r->data), &escape_char); + sql_from_ast(result, part, a->r); + sql_append(result, part, "%s'", a->type == MPD_T_ENDSWITH ? "" : "%"); + if (escape_char) + sql_append(result, part, " ESCAPE '%c'", escape_char); + break; + case SQL_APPEND_FIELD: + assert(a->l == NULL); + assert(a->r == NULL); + sql_append(result, part, "%s", tag_to_dbcol((char *)a->data)); + break; + case SQL_APPEND_STR: + assert(a->l == NULL); + assert(a->r == NULL); + sql_str_escape((char **)&a->data); + sql_append(result, part, "%s", (char *)a->data); + break; + case SQL_APPEND_INT: + assert(a->l == NULL); + assert(a->r == NULL); + sql_append(result, part, "%d", a->ival); + break; + case SQL_APPEND_TIME: + assert(a->l == NULL); + assert(a->r == NULL); + sql_str_escape((char **)&a->data); + // MPD docs say the value can be a unix timestamp or ISO 8601 + sql_append(result, part, "strftime('%%s', datetime('%s', '%s'))", (char *)a->data, strchr((char *)a->data, '-') ? "utc" : "unixepoch"); + break; + case SQL_APPEND_ORDER: + assert(a->l == NULL); + assert(a->r == NULL); + if (a->data) + sql_append(result, part, "%s ", tag_to_dbcol((char *)a->data)); + sql_append(result, part, "%s", is_not ? op_not : op); + break; + case SQL_APPEND_PARENS: + assert(a->r == NULL); + if (is_not ? op_not : op) + sql_append(result, part, "%s ", is_not ? op_not : op); + sql_append(result, part, "("); + sql_from_ast(result, part, a->l); + sql_append(result, part, ")"); + break; + } +} + +/* Creates the parsing result from the AST. Errors are set via result->err. */ +static void sql_from_ast(struct mpd_result *result, struct mpd_result_part *part, struct ast *a) { + if (!a || result->err < 0) + return; + + bool is_not = (a->type & INVERT_MASK); + a->type &= ~INVERT_MASK; + + switch (a->type) + { + case MPD_T_LESS: + sql_append_recursive(result, part, a, "<", ">=", is_not, SQL_APPEND_OPERATOR); break; + case MPD_T_LESSEQUAL: + sql_append_recursive(result, part, a, "<=", ">", is_not, SQL_APPEND_OPERATOR); break; + case MPD_T_GREATER: + sql_append_recursive(result, part, a, ">", ">=", is_not, SQL_APPEND_OPERATOR); break; + case MPD_T_GREATEREQUAL: + sql_append_recursive(result, part, a, ">=", "<", is_not, SQL_APPEND_OPERATOR); break; + case MPD_T_EQUAL: + sql_append_recursive(result, part, a, "=", "!=", is_not, SQL_APPEND_OPERATOR_STR); break; + case MPD_T_NOTEQUAL: + sql_append_recursive(result, part, a, "!=", "=", is_not, SQL_APPEND_OPERATOR_STR); break; + case MPD_T_CONTAINS: + case MPD_T_STARTSWITH: + case MPD_T_ENDSWITH: + sql_append_recursive(result, part, a, "LIKE", "NOT LIKE", is_not, SQL_APPEND_OPERATOR_LIKE); break; + case MPD_T_AND: + sql_append_recursive(result, part, a, "AND", "AND NOT", is_not, SQL_APPEND_OPERATOR); break; + case MPD_T_OR: + sql_append_recursive(result, part, a, "OR", "OR NOT", is_not, SQL_APPEND_OPERATOR); break; + case MPD_T_STRING: + sql_append_recursive(result, part, a, NULL, NULL, 0, SQL_APPEND_STR); break; + case MPD_T_STRTAG: + case MPD_T_INTTAG: + sql_append_recursive(result, part, a, NULL, NULL, 0, SQL_APPEND_FIELD); break; + case MPD_T_NUM: + sql_append_recursive(result, part, a, NULL, NULL, 0, SQL_APPEND_INT); break; + case MPD_T_TIME: + sql_append_recursive(result, part, a, NULL, NULL, 0, SQL_APPEND_TIME); break; + case MPD_T_SORT: + sql_append_recursive(result, part, a, "ASC", "DESC", is_not, SQL_APPEND_ORDER); break; + case MPD_T_GROUP: + sql_append_recursive(result, part, a, ",", ",", is_not, SQL_APPEND_OPERATOR); break; + case MPD_T_PARENS: + sql_append_recursive(result, part, a, NULL, "NOT", is_not, SQL_APPEND_PARENS); break; + default: + snprintf(result->errmsg, sizeof(result->errmsg), "Parser produced unrecognized AST type %d", a->type); + result->err = -1; + } +} + +static int result_set(struct mpd_result *result, char *tagtype, struct ast *filter, struct ast *sort, struct ast *window, char *position, struct ast *group) +{ + memset(result, 0, sizeof(struct mpd_result)); + + if (tagtype) + { + snprintf(result->tagtype_buf, sizeof(result->tagtype_buf), "%s", tag_to_dbcol(tagtype)); + result->tagtype = result->tagtype_buf; + } + + sql_from_ast(result, &result->where_part, filter); + if (result->where_part.offset) + result->where = result->where_part.str; + + sql_from_ast(result, &result->order_part, sort); + if (result->order_part.offset) + result->order = result->order_part.str; + + sql_from_ast(result, &result->group_part, group); + if (tagtype) + sql_append(result, &result->group_part, result->group_part.offset ? " , %s" : "%s", tag_to_dbcol(tagtype)); + if (result->group_part.offset) + result->group = result->group_part.str; + + if (position) + { + snprintf(result->position_buf, sizeof(result->position_buf), "%s", position); + result->position = result->position_buf; + } + + if (window && window->l->ival <= window->r->ival) + { + result->offset = window->l->ival; + result->limit = window->r->ival - window->l->ival + 1; + } + + free(tagtype); + free(position); + ast_free(filter); + ast_free(sort); + ast_free(group); + ast_free(window); + + return result->err; +} + +static struct ast * ast_new_strnode(int type, const char *tag, const char *value) +{ + return ast_new(type, ast_data(MPD_T_STRTAG, strdup(tag)), ast_data(MPD_T_STRING, strdup(value))); +} + +/* This creates an OR ast tree with each tag in the tags array */ +static struct ast * ast_new_any(int type, const char *value) +{ + const char *tags[] = { "albumartist", "artist", "album", "title", NULL, }; + const char **tagptr = tags; + struct ast *a; + int op = (type == MPD_T_NOTEQUAL) ? MPD_T_AND : MPD_T_OR; + + a = ast_new_strnode(type, *tagptr, value); + for (tagptr++; *tagptr; tagptr++) + a = ast_new(op, a, ast_new_strnode(type, *tagptr, value)); + + // In case the expression will be negated, e.g. !(any contains 'cat'), we must + // group the result + return ast_new(MPD_T_PARENS, a, NULL); +} + +static struct ast * ast_new_audioformat(int type, const char *value) +{ + const char *tags[] = { "samplerate", "bits_per_sample", "channels", NULL, }; + const char **tagptr = tags; + char *value_copy = strdup(value); + char *saveptr; + char *token; + struct ast *a; + + token = strtok_r(value_copy, ":", &saveptr); + + a = ast_new_strnode(type, "samplerate", value_copy); + if (!token) + goto end; // If there was no ':' we assume we just have a samplerate + + for (tagptr++, token = strtok_r(NULL, ":", &saveptr); *tagptr && token; tagptr++, token = strtok_r(NULL, ":", &saveptr)) + a = ast_new(MPD_T_AND, a, ast_new_strnode(type, *tagptr, token)); + + end: + free(value_copy); + + // In case the expression will be negated we group the result + return ast_new(MPD_T_PARENS, a, NULL); +} +} + +%union { + unsigned int ival; + char *str; + struct ast *ast; +} + +/* mpd commands */ +%token MPD_T_CMDSEARCH +%token MPD_T_CMDSEARCHADD +%token MPD_T_CMDFIND +%token MPD_T_CMDFINDADD +%token MPD_T_CMDCOUNT +%token MPD_T_CMDSEARCHCOUNT +%token MPD_T_CMDPLAYLISTFIND +%token MPD_T_CMDPLAYLISTSEARCH +%token MPD_T_CMDLIST + +%token MPD_T_SORT +%token MPD_T_WINDOW +%token MPD_T_POSITION +%token MPD_T_GROUP + +/* A string that was quoted. Quotes were stripped by lexer. */ +%token MPD_T_STRING + +/* Numbers (integers) */ +%token MPD_T_NUM + +/* Since time is a quoted string the lexer will just use a MPD_T_STRING token. + The parser will recognize it as time based on the keyword and use MPD_T_TIME + for the AST tree. */ +%token MPD_T_TIME + +/* The semantic value holds the actual name of the field */ +%token MPD_T_STRTAG +%token MPD_T_INTTAG +%token MPD_T_SINCETAG +%token MPD_T_BASETAG + +%token MPD_T_ANYTAG +%token MPD_T_AUDIOFORMATTAG +%token MPD_T_PARENS +%token MPD_T_OR +%token MPD_T_AND +%token MPD_T_NOT + +/* The below are only ival so we can set intbool, datebool and strbool via the + default rule for semantic values, i.e. $$ = $1. The semantic value (ival) is + set to the token value by the lexer. */ +%token MPD_T_CONTAINS +%token MPD_T_STARTSWITH +%token MPD_T_ENDSWITH +%token MPD_T_EQUAL +%token MPD_T_NOTEQUAL +%token MPD_T_LESS +%token MPD_T_LESSEQUAL +%token MPD_T_GREATER +%token MPD_T_GREATEREQUAL + +%left MPD_T_OR +%left MPD_T_AND +%left MPD_T_NOT + +%type tagtype +%type filter +%type sort +%type window +%type position +%type group +%type groups +%type predicate +%type strbool +%type intbool + +%% + +/* + * Version 0.24: + * Type cmd_fsw (filter sort window): + * playlistfind {FILTER} [sort {TYPE}] [window {START:END}] + * playlistsearch {FILTER} [sort {TYPE}] [window {START:END}] + * find {FILTER} [sort {TYPE}] [window {START:END}] + * search {FILTER} [sort {TYPE}] [window {START:END}] + * Type fswp (filter sort window position): + * findadd {FILTER} [sort {TYPE}] [window {START:END}] [position POS] + * searchadd {FILTER} [sort {TYPE}] [window {START:END}] [position POS] + * Type fg (filter group): + * count {FILTER} [group {GROUPTYPE} group {GROUPTYPE} ...] + * searchcount {FILTER} [group {GROUPTYPE} group {GROUPTYPE} ...] + * Type tfg (type filter group): + * list {TYPE} {FILTER} [group {GROUPTYPE} group {GROUPTYPE} ...] + * Not implemented: + * searchaddpl {NAME} {FILTER} [sort {TYPE}] [window {START:END}] [position POS] + * searchplaylist {NAME} {FILTER} [{START:END}] + * case sensitivity for find + */ + +command: cmd_fsw filter sort window { if (result_set(result, NULL, $2, $3, $4, NULL, NULL) < 0) YYABORT; } +| cmd_fswp filter sort window position { if (result_set(result, NULL, $2, $3, $4, $5, NULL) < 0) YYABORT; } +| cmd_fg filter groups { if (result_set(result, NULL, $2, NULL, NULL, NULL, $3) < 0) YYABORT; } +| cmd_fg groups { if (result_set(result, NULL, NULL, NULL, NULL, NULL, $2) < 0) YYABORT; } +| cmd_tfg tagtype filter groups { if (result_set(result, $2, $3, NULL, NULL, NULL, $4) < 0) YYABORT; } +| cmd_tfg tagtype groups { if (result_set(result, $2, NULL, NULL, NULL, NULL, $3) < 0) YYABORT; } +; + +tagtype: MPD_T_STRTAG { if (asprintf(&($$), "%s", $1) < 0) YYABORT; } +; + +filter: filter MPD_T_AND filter { $$ = ast_new(MPD_T_AND, $1, $3); } +| filter MPD_T_OR filter { $$ = ast_new(MPD_T_OR, $1, $3); } +| '(' filter ')' { $$ = ast_new(MPD_T_PARENS, $2, NULL); } +| MPD_T_NOT filter { struct ast *a = $2; a->type |= INVERT_MASK; $$ = $2; } +| predicate +; + +sort: MPD_T_SORT MPD_T_STRTAG { $$ = ast_data(MPD_T_SORT, $2); } +| MPD_T_SORT '-' MPD_T_STRTAG { $$ = ast_data(MPD_T_SORT | INVERT_MASK, $3); } +| %empty { $$ = NULL; } +; + +window: MPD_T_WINDOW MPD_T_NUM ':' MPD_T_NUM { $$ = ast_new(MPD_T_WINDOW, ast_int(MPD_T_NUM, $2), ast_int(MPD_T_NUM, $4)); } +| %empty { $$ = NULL; } +; + +position: MPD_T_POSITION MPD_T_NUM { if (asprintf(&($$), "%d", $2) < 0) YYABORT; } +| MPD_T_POSITION '+' MPD_T_NUM { if (asprintf(&($$), "+%d", $3) < 0) YYABORT; } +| MPD_T_POSITION '-' MPD_T_NUM { if (asprintf(&($$), "-%d", $3) < 0) YYABORT; } +| %empty { $$ = NULL; } +; + +groups: groups group { $$ = $1 ? ast_new(MPD_T_GROUP, $2, $1) : $2; } +| %empty { $$ = NULL; } +; + +group: MPD_T_GROUP MPD_T_STRTAG { $$ = ast_data(MPD_T_STRTAG, $2); } +| MPD_T_GROUP MPD_T_INTTAG { $$ = ast_data(MPD_T_INTTAG, $2); } +; + +// We accept inttags with numeric and string values, so both date == 2007 and date == '2007' +predicate: '(' MPD_T_STRTAG strbool MPD_T_STRING ')' { $$ = ast_new($3, ast_data(MPD_T_STRTAG, $2), ast_data(MPD_T_STRING, $4)); } +| '(' MPD_T_INTTAG strbool MPD_T_STRING ')' { $$ = ast_new($3, ast_data(MPD_T_STRTAG, $2), ast_data(MPD_T_STRING, $4)); } +| '(' MPD_T_INTTAG intbool MPD_T_NUM ')' { $$ = ast_new($3, ast_data(MPD_T_INTTAG, $2), ast_int(MPD_T_NUM, $4)); } +| '(' MPD_T_ANYTAG strbool MPD_T_STRING ')' { $$ = ast_new_any($3, $4); } +| '(' MPD_T_AUDIOFORMATTAG strbool MPD_T_STRING ')' { $$ = ast_new_audioformat($3, $4); } +| '(' MPD_T_SINCETAG MPD_T_STRING ')' { $$ = ast_new(MPD_T_GREATEREQUAL, ast_data(MPD_T_STRTAG, $2), ast_data(MPD_T_TIME, $3)); } +| '(' MPD_T_BASETAG MPD_T_STRING ')' { $$ = ast_new(MPD_T_STARTSWITH, ast_data(MPD_T_STRTAG, $2), ast_data(MPD_T_STRING, $3)); } +; + +strbool: MPD_T_EQUAL +| MPD_T_NOTEQUAL +| MPD_T_CONTAINS +| MPD_T_STARTSWITH +| MPD_T_ENDSWITH +; + +intbool: MPD_T_LESS +| MPD_T_LESSEQUAL +| MPD_T_GREATER +| MPD_T_GREATEREQUAL +; + +cmd_fsw: MPD_T_CMDPLAYLISTFIND +| MPD_T_CMDPLAYLISTSEARCH +| MPD_T_CMDSEARCH +| MPD_T_CMDFIND +; + +cmd_fswp: MPD_T_CMDFINDADD +| MPD_T_CMDSEARCHADD +; + +cmd_fg: MPD_T_CMDCOUNT +| MPD_T_CMDSEARCHCOUNT +; + +cmd_tfg: MPD_T_CMDLIST +; + +%% + From 75222cafd328368b6128e4bfdd096200b208b781 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Thu, 5 Sep 2024 14:12:45 +0200 Subject: [PATCH 10/65] [mpd] outputs: drop invalid outputsvolume key This key confuses some clients, and it isn't emitted by MPD, nor documented to exist: https://github.com/MusicPlayerDaemon/MPD/blob/9ff8e02e543ede2b1964e5ea3f26f00bf2ff90ec/src/output/Print.cxx It was added in bdb2c7493, but without explanation why it was added to outputs command. Signed-off-by: Fabian Groffen --- src/mpd.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/mpd.c b/src/mpd.c index c5584d6b..99a41f1a 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -3214,8 +3214,7 @@ mpd_command_toggleoutput(struct mpd_command_output *out, struct mpd_command_inpu * outputname: Computer * plugin: alsa * outputenabled: 1 - * outputvolume: 50 - * https://mpd.readthedocs.io/en/latest/protocol.html#audio-output-devices + * https://mpd.readthedocs.io/en/latest/protocol.html#command-outputs */ static void speaker_enum_cb(struct player_speaker_info *spk, void *arg) @@ -3240,13 +3239,11 @@ speaker_enum_cb(struct player_speaker_info *spk, void *arg) "outputid: %u\n" "outputname: %s\n" "plugin: %s\n" - "outputenabled: %d\n" - "outputvolume: %d\n", + "outputenabled: %d\n", param->nextid, spk->name, plugin, - spk->selected, - spk->absvol); + spk->selected); param->nextid++; } From 164d6ac9b24ecd6d40cd5c210f112bb6e540b08f Mon Sep 17 00:00:00 2001 From: Alain Nussbaumer Date: Tue, 24 Sep 2024 20:38:55 +0200 Subject: [PATCH 11/65] [web] Update to newer versions of libraries --- web-src/package-lock.json | 170 +++++++++++++++++++------------------- 1 file changed, 85 insertions(+), 85 deletions(-) diff --git a/web-src/package-lock.json b/web-src/package-lock.json index 1b86483e..e149775a 100644 --- a/web-src/package-lock.json +++ b/web-src/package-lock.json @@ -798,9 +798,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", - "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -812,9 +812,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", - "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -826,9 +826,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", - "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -840,9 +840,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", - "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -854,9 +854,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", - "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -868,9 +868,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", - "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -882,9 +882,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", - "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -896,9 +896,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", - "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -910,9 +910,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", - "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -924,9 +924,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", - "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -938,9 +938,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", - "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -952,9 +952,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", - "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -966,9 +966,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", - "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -980,9 +980,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", - "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -994,9 +994,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", - "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -1008,9 +1008,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", - "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -2336,9 +2336,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -2542,9 +2542,9 @@ "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "license": "ISC" }, "node_modules/picomatch": { @@ -2625,9 +2625,9 @@ } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -2645,8 +2645,8 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -2770,9 +2770,9 @@ } }, "node_modules/rollup": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", - "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "license": "MIT", "dependencies": { @@ -2786,22 +2786,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.0", - "@rollup/rollup-android-arm64": "4.21.0", - "@rollup/rollup-darwin-arm64": "4.21.0", - "@rollup/rollup-darwin-x64": "4.21.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", - "@rollup/rollup-linux-arm-musleabihf": "4.21.0", - "@rollup/rollup-linux-arm64-gnu": "4.21.0", - "@rollup/rollup-linux-arm64-musl": "4.21.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", - "@rollup/rollup-linux-riscv64-gnu": "4.21.0", - "@rollup/rollup-linux-s390x-gnu": "4.21.0", - "@rollup/rollup-linux-x64-gnu": "4.21.0", - "@rollup/rollup-linux-x64-musl": "4.21.0", - "@rollup/rollup-win32-arm64-msvc": "4.21.0", - "@rollup/rollup-win32-ia32-msvc": "4.21.0", - "@rollup/rollup-win32-x64-msvc": "4.21.0", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, @@ -2901,9 +2901,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3050,14 +3050,14 @@ "license": "MIT" }, "node_modules/vite": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", - "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", + "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.41", + "postcss": "^8.4.43", "rollup": "^4.20.0" }, "bin": { From dc41f0d84c087ffdc560b1d30b4f8ec7f7408b1b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 18:40:06 +0000 Subject: [PATCH 12/65] [web] Rebuild web interface --- htdocs/assets/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/assets/index.js b/htdocs/assets/index.js index 8b0cdca0..06db1a24 100644 --- a/htdocs/assets/index.js +++ b/htdocs/assets/index.js @@ -22,9 +22,9 @@ * pinia v2.2.2 * (c) 2024 Eduardo San Martin Morote * @license MIT - */let xg;const Il=e=>xg=e,Eg=Symbol();function gu(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var ii;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(ii||(ii={}));function P0(){const e=zl(!0),t=e.run(()=>In({}));let n=[],r=[];const o=wl({install(s){Il(o),o._a=s,s.provide(Eg,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!O0?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const $g=()=>{};function Xm(e,t,n,r=$g){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&rd()&&Rh(o),o}function jo(e,...t){e.slice().forEach(n=>{n(...t)})}const I0=e=>e(),Jm=Symbol(),pc=Symbol();function yu(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];gu(o)&&gu(r)&&e.hasOwnProperty(n)&&!At(r)&&!Sr(r)?e[n]=yu(o,r):e[n]=r}return e}const L0=Symbol();function N0(e){return!gu(e)||!e.hasOwnProperty(L0)}const{assign:jr}=Object;function D0(e){return!!(At(e)&&e.effect)}function R0(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function u(){a||(n.state.value[e]=o?o():{});const m=e_(n.state.value[e]);return jr(m,s,Object.keys(i||{}).reduce((d,f)=>(d[f]=wl(Ht(()=>{Il(n);const p=n._s.get(e);return i[f].call(p,p)})),d),{}))}return l=Tg(e,u,t,n,r,!0),l}function Tg(e,t,n={},r,o,s){let i;const a=jr({actions:{}},n),l={deep:!0};let u,m,d=[],f=[],p;const h=r.state.value[e];!s&&!h&&(r.state.value[e]={}),In({});let g;function z(D){let $;u=m=!1,typeof D=="function"?(D(r.state.value[e]),$={type:ii.patchFunction,storeId:e,events:p}):(yu(r.state.value[e],D),$={type:ii.patchObject,payload:D,storeId:e,events:p});const F=g=Symbol();Fo().then(()=>{g===F&&(u=!0)}),m=!0,jo(d,$,r.state.value[e])}const k=s?function(){const{state:$}=n,F=$?$():{};this.$patch(q=>{jr(q,F)})}:$g;function w(){i.stop(),d=[],f=[],r._s.delete(e)}const _=(D,$="")=>{if(Jm in D)return D[pc]=$,D;const F=function(){Il(r);const q=Array.from(arguments),U=[],W=[];function ne(re){U.push(re)}function me(re){W.push(re)}jo(f,{args:q,name:F[pc],store:S,after:ne,onError:me});let K;try{K=D.apply(this&&this.$id===e?this:S,q)}catch(re){throw jo(W,re),re}return K instanceof Promise?K.then(re=>(jo(U,re),re)).catch(re=>(jo(W,re),Promise.reject(re))):(jo(U,K),K)};return F[Jm]=!0,F[pc]=$,F},v={_p:r,$id:e,$onAction:Xm.bind(null,f),$patch:z,$reset:k,$subscribe(D,$={}){const F=Xm(d,D,$.detached,()=>q()),q=i.run(()=>Nn(()=>r.state.value[e],U=>{($.flush==="sync"?m:u)&&D({storeId:e,type:ii.direct,events:p},U)},jr({},l,$)));return F},$dispose:w},S=xs(v);r._s.set(e,S);const L=(r._a&&r._a.runWithContext||I0)(()=>r._e.run(()=>(i=zl()).run(()=>t({action:_}))));for(const D in L){const $=L[D];if(At($)&&!D0($)||Sr($))s||(h&&N0($)&&(At($)?$.value=h[D]:yu($,h[D])),r.state.value[e][D]=$);else if(typeof $=="function"){const F=_($,D);L[D]=F,a.actions[D]=$}}return jr(S,L),jr(Xe(S),L),Object.defineProperty(S,"$state",{get:()=>r.state.value[e],set:D=>{z($=>{jr($,D)})}}),r._p.forEach(D=>{jr(S,i.run(()=>D({store:S,app:r._a,pinia:r,options:a})))}),h&&s&&n.hydrate&&n.hydrate(S.$state,h),u=!0,m=!0,S}function Un(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(a,l){const u=b_();return a=a||(u?Ln(Eg,null):null),a&&Il(a),a=xg,a._s.has(r)||(s?Tg(r,t,o,a):R0(r,o,a)),a._s.get(r)}return i.$id=r,i}const Ad=Un("RemotesStore",{state:()=>({pairing:{}})});function Ag(e,t){return function(){return e.apply(t,arguments)}}const{toString:M0}=Object.prototype,{getPrototypeOf:Od}=Object,Ll=(e=>t=>{const n=M0.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),nr=e=>(e=e.toLowerCase(),t=>Ll(t)===e),Nl=e=>t=>typeof t===e,{isArray:$s}=Array,wi=Nl("undefined");function F0(e){return e!==null&&!wi(e)&&e.constructor!==null&&!wi(e.constructor)&&kn(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Og=nr("ArrayBuffer");function V0(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Og(e.buffer),t}const H0=Nl("string"),kn=Nl("function"),Pg=Nl("number"),Dl=e=>e!==null&&typeof e=="object",U0=e=>e===!0||e===!1,Sa=e=>{if(Ll(e)!=="object")return!1;const t=Od(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},j0=nr("Date"),B0=nr("File"),W0=nr("Blob"),q0=nr("FileList"),G0=e=>Dl(e)&&kn(e.pipe),K0=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||kn(e.append)&&((t=Ll(e))==="formdata"||t==="object"&&kn(e.toString)&&e.toString()==="[object FormData]"))},Z0=nr("URLSearchParams"),[Y0,X0,J0,Q0]=["ReadableStream","Request","Response","Headers"].map(nr),eC=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ri(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),$s(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const wo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Lg=e=>!wi(e)&&e!==wo;function zu(){const{caseless:e}=Lg(this)&&this||{},t={},n=(r,o)=>{const s=e&&Ig(t,o)||o;Sa(t[s])&&Sa(r)?t[s]=zu(t[s],r):Sa(r)?t[s]=zu({},r):$s(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(Ri(t,(o,s)=>{n&&kn(o)?e[s]=Ag(o,n):e[s]=o},{allOwnKeys:r}),e),nC=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),rC=(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)},oC=(e,t,n,r)=>{let o,s,i;const a={};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))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&Od(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},sC=(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},iC=e=>{if(!e)return null;if($s(e))return e;let t=e.length;if(!Pg(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},aC=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Od(Uint8Array)),lC=(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])}},cC=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},uC=nr("HTMLFormElement"),dC=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),Qm=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),mC=nr("RegExp"),Ng=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Ri(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},fC=e=>{Ng(e,(t,n)=>{if(kn(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(kn(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+"'")})}})},pC=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return $s(e)?r(e):r(String(e).split(t)),n},hC=()=>{},_C=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,hc="abcdefghijklmnopqrstuvwxyz",ef="0123456789",Dg={DIGIT:ef,ALPHA:hc,ALPHA_DIGIT:hc+hc.toUpperCase()+ef},gC=(e=16,t=Dg.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function yC(e){return!!(e&&kn(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const zC=e=>{const t=new Array(10),n=(r,o)=>{if(Dl(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=$s(r)?[]:{};return Ri(r,(i,a)=>{const l=n(i,o+1);!wi(l)&&(s[a]=l)}),t[o]=void 0,s}}return r};return n(e,0)},vC=nr("AsyncFunction"),bC=e=>e&&(Dl(e)||kn(e))&&kn(e.then)&&kn(e.catch),Rg=((e,t)=>e?setImmediate:t?((n,r)=>(wo.addEventListener("message",({source:o,data:s})=>{o===wo&&s===n&&r.length&&r.shift()()},!1),o=>{r.push(o),wo.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",kn(wo.postMessage)),CC=typeof queueMicrotask<"u"?queueMicrotask.bind(wo):typeof process<"u"&&process.nextTick||Rg,J={isArray:$s,isArrayBuffer:Og,isBuffer:F0,isFormData:K0,isArrayBufferView:V0,isString:H0,isNumber:Pg,isBoolean:U0,isObject:Dl,isPlainObject:Sa,isReadableStream:Y0,isRequest:X0,isResponse:J0,isHeaders:Q0,isUndefined:wi,isDate:j0,isFile:B0,isBlob:W0,isRegExp:mC,isFunction:kn,isStream:G0,isURLSearchParams:Z0,isTypedArray:aC,isFileList:q0,forEach:Ri,merge:zu,extend:tC,trim:eC,stripBOM:nC,inherits:rC,toFlatObject:oC,kindOf:Ll,kindOfTest:nr,endsWith:sC,toArray:iC,forEachEntry:lC,matchAll:cC,isHTMLForm:uC,hasOwnProperty:Qm,hasOwnProp:Qm,reduceDescriptors:Ng,freezeMethods:fC,toObjectSet:pC,toCamelCase:dC,noop:hC,toFiniteNumber:_C,findKey:Ig,global:wo,isContextDefined:Lg,ALPHABET:Dg,generateString:gC,isSpecCompliantForm:yC,toJSONObject:zC,isAsyncFn:vC,isThenable:bC,setImmediate:Rg,asap:CC};function Be(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)}J.inherits(Be,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:J.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Mg=Be.prototype,Fg={};["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=>{Fg[e]={value:e}});Object.defineProperties(Be,Fg);Object.defineProperty(Mg,"isAxiosError",{value:!0});Be.from=(e,t,n,r,o,s)=>{const i=Object.create(Mg);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),Be.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const wC=null;function vu(e){return J.isPlainObject(e)||J.isArray(e)}function Vg(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function tf(e,t,n){return e?e.concat(t).map(function(o,s){return o=Vg(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function kC(e){return J.isArray(e)&&!e.some(vu)}const SC=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function Rl(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,z){return!J.isUndefined(z[g])});const r=n.metaTokens,o=n.visitor||m,s=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(o))throw new TypeError("visitor must be a function");function u(h){if(h===null)return"";if(J.isDate(h))return h.toISOString();if(!l&&J.isBlob(h))throw new Be("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(h)||J.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function m(h,g,z){let k=h;if(h&&!z&&typeof h=="object"){if(J.endsWith(g,"{}"))g=r?g:g.slice(0,-2),h=JSON.stringify(h);else if(J.isArray(h)&&kC(h)||(J.isFileList(h)||J.endsWith(g,"[]"))&&(k=J.toArray(h)))return g=Vg(g),k.forEach(function(_,v){!(J.isUndefined(_)||_===null)&&t.append(i===!0?tf([g],v,s):i===null?g:g+"[]",u(_))}),!1}return vu(h)?!0:(t.append(tf(z,g,s),u(h)),!1)}const d=[],f=Object.assign(SC,{defaultVisitor:m,convertValue:u,isVisitable:vu});function p(h,g){if(!J.isUndefined(h)){if(d.indexOf(h)!==-1)throw Error("Circular reference detected in "+g.join("."));d.push(h),J.forEach(h,function(k,w){(!(J.isUndefined(k)||k===null)&&o.call(t,k,J.isString(w)?w.trim():w,g,f))===!0&&p(k,g?g.concat(w):[w])}),d.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return p(e),t}function nf(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Pd(e,t){this._pairs=[],e&&Rl(e,this,t)}const Hg=Pd.prototype;Hg.append=function(t,n){this._pairs.push([t,n])};Hg.toString=function(t){const n=t?function(r){return t.call(this,r,nf)}:nf;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function xC(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Ug(e,t,n){if(!t)return e;const r=n&&n.encode||xC,o=n&&n.serialize;let s;if(o?s=o(t,n):s=J.isURLSearchParams(t)?t.toString():new Pd(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class rf{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){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const jg={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},EC=typeof URLSearchParams<"u"?URLSearchParams:Pd,$C=typeof FormData<"u"?FormData:null,TC=typeof Blob<"u"?Blob:null,AC={isBrowser:!0,classes:{URLSearchParams:EC,FormData:$C,Blob:TC},protocols:["http","https","file","blob","url","data"]},Id=typeof window<"u"&&typeof document<"u",OC=(e=>Id&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),PC=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",IC=Id&&window.location.href||"http://localhost",LC=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Id,hasStandardBrowserEnv:OC,hasStandardBrowserWebWorkerEnv:PC,origin:IC},Symbol.toStringTag,{value:"Module"})),Xn={...LC,...AC};function NC(e,t){return Rl(e,new Xn.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return Xn.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function DC(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function RC(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&J.isArray(o)?o.length:i,l?(J.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!a):((!o[i]||!J.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&J.isArray(o[i])&&(o[i]=RC(o[i])),!a)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,o)=>{t(DC(r),o,n,0)}),n}return null}function MC(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const Mi={transitional:jg,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=J.isObject(t);if(s&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return o?JSON.stringify(Bg(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t)||J.isReadableStream(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return NC(t,this.formSerializer).toString();if((a=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Rl(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),MC(t)):t}],transformResponse:[function(t){const n=this.transitional||Mi.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(J.isResponse(t)||J.isReadableStream(t))return t;if(t&&J.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?Be.from(a,Be.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Xn.classes.FormData,Blob:Xn.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{Mi.headers[e]={}});const FC=J.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"]),VC=e=>{const t={};let n,r,o;return e&&e.split(` + */let xg;const Il=e=>xg=e,Eg=Symbol();function gu(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var ii;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(ii||(ii={}));function P0(){const e=zl(!0),t=e.run(()=>In({}));let n=[],r=[];const o=wl({install(s){Il(o),o._a=s,s.provide(Eg,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!O0?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const $g=()=>{};function Xm(e,t,n,r=$g){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&rd()&&Rh(o),o}function jo(e,...t){e.slice().forEach(n=>{n(...t)})}const I0=e=>e(),Jm=Symbol(),pc=Symbol();function yu(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];gu(o)&&gu(r)&&e.hasOwnProperty(n)&&!At(r)&&!Sr(r)?e[n]=yu(o,r):e[n]=r}return e}const L0=Symbol();function N0(e){return!gu(e)||!e.hasOwnProperty(L0)}const{assign:jr}=Object;function D0(e){return!!(At(e)&&e.effect)}function R0(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function u(){a||(n.state.value[e]=o?o():{});const m=e_(n.state.value[e]);return jr(m,s,Object.keys(i||{}).reduce((d,f)=>(d[f]=wl(Ht(()=>{Il(n);const p=n._s.get(e);return i[f].call(p,p)})),d),{}))}return l=Tg(e,u,t,n,r,!0),l}function Tg(e,t,n={},r,o,s){let i;const a=jr({actions:{}},n),l={deep:!0};let u,m,d=[],f=[],p;const h=r.state.value[e];!s&&!h&&(r.state.value[e]={}),In({});let g;function z(D){let $;u=m=!1,typeof D=="function"?(D(r.state.value[e]),$={type:ii.patchFunction,storeId:e,events:p}):(yu(r.state.value[e],D),$={type:ii.patchObject,payload:D,storeId:e,events:p});const F=g=Symbol();Fo().then(()=>{g===F&&(u=!0)}),m=!0,jo(d,$,r.state.value[e])}const k=s?function(){const{state:$}=n,F=$?$():{};this.$patch(q=>{jr(q,F)})}:$g;function w(){i.stop(),d=[],f=[],r._s.delete(e)}const _=(D,$="")=>{if(Jm in D)return D[pc]=$,D;const F=function(){Il(r);const q=Array.from(arguments),U=[],W=[];function ne(re){U.push(re)}function me(re){W.push(re)}jo(f,{args:q,name:F[pc],store:S,after:ne,onError:me});let K;try{K=D.apply(this&&this.$id===e?this:S,q)}catch(re){throw jo(W,re),re}return K instanceof Promise?K.then(re=>(jo(U,re),re)).catch(re=>(jo(W,re),Promise.reject(re))):(jo(U,K),K)};return F[Jm]=!0,F[pc]=$,F},v={_p:r,$id:e,$onAction:Xm.bind(null,f),$patch:z,$reset:k,$subscribe(D,$={}){const F=Xm(d,D,$.detached,()=>q()),q=i.run(()=>Nn(()=>r.state.value[e],U=>{($.flush==="sync"?m:u)&&D({storeId:e,type:ii.direct,events:p},U)},jr({},l,$)));return F},$dispose:w},S=xs(v);r._s.set(e,S);const L=(r._a&&r._a.runWithContext||I0)(()=>r._e.run(()=>(i=zl()).run(()=>t({action:_}))));for(const D in L){const $=L[D];if(At($)&&!D0($)||Sr($))s||(h&&N0($)&&(At($)?$.value=h[D]:yu($,h[D])),r.state.value[e][D]=$);else if(typeof $=="function"){const F=_($,D);L[D]=F,a.actions[D]=$}}return jr(S,L),jr(Xe(S),L),Object.defineProperty(S,"$state",{get:()=>r.state.value[e],set:D=>{z($=>{jr($,D)})}}),r._p.forEach(D=>{jr(S,i.run(()=>D({store:S,app:r._a,pinia:r,options:a})))}),h&&s&&n.hydrate&&n.hydrate(S.$state,h),u=!0,m=!0,S}function Un(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(a,l){const u=b_();return a=a||(u?Ln(Eg,null):null),a&&Il(a),a=xg,a._s.has(r)||(s?Tg(r,t,o,a):R0(r,o,a)),a._s.get(r)}return i.$id=r,i}const Ad=Un("RemotesStore",{state:()=>({pairing:{}})});function Ag(e,t){return function(){return e.apply(t,arguments)}}const{toString:M0}=Object.prototype,{getPrototypeOf:Od}=Object,Ll=(e=>t=>{const n=M0.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),nr=e=>(e=e.toLowerCase(),t=>Ll(t)===e),Nl=e=>t=>typeof t===e,{isArray:$s}=Array,wi=Nl("undefined");function F0(e){return e!==null&&!wi(e)&&e.constructor!==null&&!wi(e.constructor)&&kn(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Og=nr("ArrayBuffer");function V0(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Og(e.buffer),t}const H0=Nl("string"),kn=Nl("function"),Pg=Nl("number"),Dl=e=>e!==null&&typeof e=="object",U0=e=>e===!0||e===!1,Sa=e=>{if(Ll(e)!=="object")return!1;const t=Od(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},j0=nr("Date"),B0=nr("File"),W0=nr("Blob"),q0=nr("FileList"),G0=e=>Dl(e)&&kn(e.pipe),K0=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||kn(e.append)&&((t=Ll(e))==="formdata"||t==="object"&&kn(e.toString)&&e.toString()==="[object FormData]"))},Z0=nr("URLSearchParams"),[Y0,X0,J0,Q0]=["ReadableStream","Request","Response","Headers"].map(nr),eC=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ri(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),$s(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const wo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Lg=e=>!wi(e)&&e!==wo;function zu(){const{caseless:e}=Lg(this)&&this||{},t={},n=(r,o)=>{const s=e&&Ig(t,o)||o;Sa(t[s])&&Sa(r)?t[s]=zu(t[s],r):Sa(r)?t[s]=zu({},r):$s(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(Ri(t,(o,s)=>{n&&kn(o)?e[s]=Ag(o,n):e[s]=o},{allOwnKeys:r}),e),nC=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),rC=(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)},oC=(e,t,n,r)=>{let o,s,i;const a={};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))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&Od(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},sC=(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},iC=e=>{if(!e)return null;if($s(e))return e;let t=e.length;if(!Pg(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},aC=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Od(Uint8Array)),lC=(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])}},cC=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},uC=nr("HTMLFormElement"),dC=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),Qm=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),mC=nr("RegExp"),Ng=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Ri(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},fC=e=>{Ng(e,(t,n)=>{if(kn(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(kn(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+"'")})}})},pC=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return $s(e)?r(e):r(String(e).split(t)),n},hC=()=>{},_C=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,hc="abcdefghijklmnopqrstuvwxyz",ef="0123456789",Dg={DIGIT:ef,ALPHA:hc,ALPHA_DIGIT:hc+hc.toUpperCase()+ef},gC=(e=16,t=Dg.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function yC(e){return!!(e&&kn(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const zC=e=>{const t=new Array(10),n=(r,o)=>{if(Dl(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=$s(r)?[]:{};return Ri(r,(i,a)=>{const l=n(i,o+1);!wi(l)&&(s[a]=l)}),t[o]=void 0,s}}return r};return n(e,0)},vC=nr("AsyncFunction"),bC=e=>e&&(Dl(e)||kn(e))&&kn(e.then)&&kn(e.catch),Rg=((e,t)=>e?setImmediate:t?((n,r)=>(wo.addEventListener("message",({source:o,data:s})=>{o===wo&&s===n&&r.length&&r.shift()()},!1),o=>{r.push(o),wo.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",kn(wo.postMessage)),CC=typeof queueMicrotask<"u"?queueMicrotask.bind(wo):typeof process<"u"&&process.nextTick||Rg,J={isArray:$s,isArrayBuffer:Og,isBuffer:F0,isFormData:K0,isArrayBufferView:V0,isString:H0,isNumber:Pg,isBoolean:U0,isObject:Dl,isPlainObject:Sa,isReadableStream:Y0,isRequest:X0,isResponse:J0,isHeaders:Q0,isUndefined:wi,isDate:j0,isFile:B0,isBlob:W0,isRegExp:mC,isFunction:kn,isStream:G0,isURLSearchParams:Z0,isTypedArray:aC,isFileList:q0,forEach:Ri,merge:zu,extend:tC,trim:eC,stripBOM:nC,inherits:rC,toFlatObject:oC,kindOf:Ll,kindOfTest:nr,endsWith:sC,toArray:iC,forEachEntry:lC,matchAll:cC,isHTMLForm:uC,hasOwnProperty:Qm,hasOwnProp:Qm,reduceDescriptors:Ng,freezeMethods:fC,toObjectSet:pC,toCamelCase:dC,noop:hC,toFiniteNumber:_C,findKey:Ig,global:wo,isContextDefined:Lg,ALPHABET:Dg,generateString:gC,isSpecCompliantForm:yC,toJSONObject:zC,isAsyncFn:vC,isThenable:bC,setImmediate:Rg,asap:CC};function Be(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)}J.inherits(Be,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:J.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Mg=Be.prototype,Fg={};["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=>{Fg[e]={value:e}});Object.defineProperties(Be,Fg);Object.defineProperty(Mg,"isAxiosError",{value:!0});Be.from=(e,t,n,r,o,s)=>{const i=Object.create(Mg);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),Be.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const wC=null;function vu(e){return J.isPlainObject(e)||J.isArray(e)}function Vg(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function tf(e,t,n){return e?e.concat(t).map(function(o,s){return o=Vg(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function kC(e){return J.isArray(e)&&!e.some(vu)}const SC=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function Rl(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,z){return!J.isUndefined(z[g])});const r=n.metaTokens,o=n.visitor||m,s=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(o))throw new TypeError("visitor must be a function");function u(h){if(h===null)return"";if(J.isDate(h))return h.toISOString();if(!l&&J.isBlob(h))throw new Be("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(h)||J.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function m(h,g,z){let k=h;if(h&&!z&&typeof h=="object"){if(J.endsWith(g,"{}"))g=r?g:g.slice(0,-2),h=JSON.stringify(h);else if(J.isArray(h)&&kC(h)||(J.isFileList(h)||J.endsWith(g,"[]"))&&(k=J.toArray(h)))return g=Vg(g),k.forEach(function(_,v){!(J.isUndefined(_)||_===null)&&t.append(i===!0?tf([g],v,s):i===null?g:g+"[]",u(_))}),!1}return vu(h)?!0:(t.append(tf(z,g,s),u(h)),!1)}const d=[],f=Object.assign(SC,{defaultVisitor:m,convertValue:u,isVisitable:vu});function p(h,g){if(!J.isUndefined(h)){if(d.indexOf(h)!==-1)throw Error("Circular reference detected in "+g.join("."));d.push(h),J.forEach(h,function(k,w){(!(J.isUndefined(k)||k===null)&&o.call(t,k,J.isString(w)?w.trim():w,g,f))===!0&&p(k,g?g.concat(w):[w])}),d.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return p(e),t}function nf(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Pd(e,t){this._pairs=[],e&&Rl(e,this,t)}const Hg=Pd.prototype;Hg.append=function(t,n){this._pairs.push([t,n])};Hg.toString=function(t){const n=t?function(r){return t.call(this,r,nf)}:nf;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function xC(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Ug(e,t,n){if(!t)return e;const r=n&&n.encode||xC,o=n&&n.serialize;let s;if(o?s=o(t,n):s=J.isURLSearchParams(t)?t.toString():new Pd(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class rf{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){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const jg={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},EC=typeof URLSearchParams<"u"?URLSearchParams:Pd,$C=typeof FormData<"u"?FormData:null,TC=typeof Blob<"u"?Blob:null,AC={isBrowser:!0,classes:{URLSearchParams:EC,FormData:$C,Blob:TC},protocols:["http","https","file","blob","url","data"]},Id=typeof window<"u"&&typeof document<"u",OC=(e=>Id&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),PC=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",IC=Id&&window.location.href||"http://localhost",LC=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Id,hasStandardBrowserEnv:OC,hasStandardBrowserWebWorkerEnv:PC,origin:IC},Symbol.toStringTag,{value:"Module"})),Xn={...LC,...AC};function NC(e,t){return Rl(e,new Xn.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return Xn.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function DC(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function RC(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&J.isArray(o)?o.length:i,l?(J.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!a):((!o[i]||!J.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&J.isArray(o[i])&&(o[i]=RC(o[i])),!a)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,o)=>{t(DC(r),o,n,0)}),n}return null}function MC(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(0,JSON.stringify)(e)}const Mi={transitional:jg,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=J.isObject(t);if(s&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return o?JSON.stringify(Bg(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t)||J.isReadableStream(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return NC(t,this.formSerializer).toString();if((a=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Rl(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),MC(t)):t}],transformResponse:[function(t){const n=this.transitional||Mi.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(J.isResponse(t)||J.isReadableStream(t))return t;if(t&&J.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?Be.from(a,Be.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Xn.classes.FormData,Blob:Xn.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{Mi.headers[e]={}});const FC=J.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"]),VC=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]&&FC[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},of=Symbol("internals");function Rs(e){return e&&String(e).trim().toLowerCase()}function xa(e){return e===!1||e==null?e:J.isArray(e)?e.map(xa):String(e)}function HC(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 UC=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function _c(e,t,n,r,o){if(J.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!J.isString(t)){if(J.isString(r))return t.indexOf(r)!==-1;if(J.isRegExp(r))return r.test(t)}}function jC(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function BC(e,t){const n=J.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 fn{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(a,l,u){const m=Rs(l);if(!m)throw new Error("header name must be a non-empty string");const d=J.findKey(o,m);(!d||o[d]===void 0||u===!0||u===void 0&&o[d]!==!1)&&(o[d||l]=xa(a))}const i=(a,l)=>J.forEach(a,(u,m)=>s(u,m,l));if(J.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(J.isString(t)&&(t=t.trim())&&!UC(t))i(VC(t),n);else if(J.isHeaders(t))for(const[a,l]of t.entries())s(l,a,r);else t!=null&&s(n,t,r);return this}get(t,n){if(t=Rs(t),t){const r=J.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return HC(o);if(J.isFunction(n))return n.call(this,o,r);if(J.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Rs(t),t){const r=J.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||_c(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(i){if(i=Rs(i),i){const a=J.findKey(r,i);a&&(!n||_c(r,r[a],a,n))&&(delete r[a],o=!0)}}return J.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||_c(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return J.forEach(this,(o,s)=>{const i=J.findKey(r,s);if(i){n[i]=xa(o),delete n[s];return}const a=t?jC(s):String(s).trim();a!==s&&delete n[s],n[a]=xa(o),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return J.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&J.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[of]=this[of]={accessors:{}}).accessors,o=this.prototype;function s(i){const a=Rs(i);r[a]||(BC(o,i),r[a]=!0)}return J.isArray(t)?t.forEach(s):s(t),this}}fn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(fn.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(fn);function gc(e,t){const n=this||Mi,r=t||n,o=fn.from(r.headers);let s=r.data;return J.forEach(e,function(a){s=a.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function Wg(e){return!!(e&&e.__CANCEL__)}function Ts(e,t,n){Be.call(this,e??"canceled",Be.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(Ts,Be,{__CANCEL__:!0});function qg(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Be("Request failed with status code "+n.status,[Be.ERR_BAD_REQUEST,Be.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function WC(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function qC(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(l){const u=Date.now(),m=r[s];i||(i=u),n[o]=l,r[o]=u;let d=s,f=0;for(;d!==o;)f+=n[d++],d=d%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),u-i{n=m,o=null,s&&(clearTimeout(s),s=null),e.apply(null,u)};return[(...u)=>{const m=Date.now(),d=m-n;d>=r?i(u,m):(o=u,s||(s=setTimeout(()=>{s=null,i(o)},r-d)))},()=>o&&i(o)]}const Za=(e,t,n=3)=>{let r=0;const o=qC(50,250);return GC(s=>{const i=s.loaded,a=s.lengthComputable?s.total:void 0,l=i-r,u=o(l),m=i<=a;r=i;const d={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:u||void 0,estimated:u&&a&&m?(a-i)/u:void 0,event:s,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(d)},n)},sf=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},af=e=>(...t)=>J.asap(()=>e(...t)),KC=Xn.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 a=J.isString(i)?o(i):i;return a.protocol===r.protocol&&a.host===r.host}}():function(){return function(){return!0}}(),ZC=Xn.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.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 YC(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function XC(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function Gg(e,t){return e&&!YC(t)?XC(e,t):t}const lf=e=>e instanceof fn?{...e}:e;function No(e,t){t=t||{};const n={};function r(u,m,d){return J.isPlainObject(u)&&J.isPlainObject(m)?J.merge.call({caseless:d},u,m):J.isPlainObject(m)?J.merge({},m):J.isArray(m)?m.slice():m}function o(u,m,d){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u,d)}else return r(u,m,d)}function s(u,m){if(!J.isUndefined(m))return r(void 0,m)}function i(u,m){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u)}else return r(void 0,m)}function a(u,m,d){if(d in t)return r(u,m);if(d in e)return r(void 0,u)}const l={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:a,headers:(u,m)=>o(lf(u),lf(m),!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(m){const d=l[m]||o,f=d(e[m],t[m],m);J.isUndefined(f)&&d!==a||(n[m]=f)}),n}const Kg=e=>{const t=No({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=t;t.headers=i=fn.from(i),t.url=Ug(Gg(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(J.isFormData(n)){if(Xn.hasStandardBrowserEnv||Xn.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[u,...m]=l?l.split(";").map(d=>d.trim()).filter(Boolean):[];i.setContentType([u||"multipart/form-data",...m].join("; "))}}if(Xn.hasStandardBrowserEnv&&(r&&J.isFunction(r)&&(r=r(t)),r||r!==!1&&KC(t.url))){const u=o&&s&&ZC.read(s);u&&i.set(o,u)}return t},JC=typeof XMLHttpRequest<"u",QC=JC&&function(e){return new Promise(function(n,r){const o=Kg(e);let s=o.data;const i=fn.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:u}=o,m,d,f,p,h;function g(){p&&p(),h&&h(),o.cancelToken&&o.cancelToken.unsubscribe(m),o.signal&&o.signal.removeEventListener("abort",m)}let z=new XMLHttpRequest;z.open(o.method.toUpperCase(),o.url,!0),z.timeout=o.timeout;function k(){if(!z)return;const _=fn.from("getAllResponseHeaders"in z&&z.getAllResponseHeaders()),S={data:!a||a==="text"||a==="json"?z.responseText:z.response,status:z.status,statusText:z.statusText,headers:_,config:e,request:z};qg(function(L){n(L),g()},function(L){r(L),g()},S),z=null}"onloadend"in z?z.onloadend=k:z.onreadystatechange=function(){!z||z.readyState!==4||z.status===0&&!(z.responseURL&&z.responseURL.indexOf("file:")===0)||setTimeout(k)},z.onabort=function(){z&&(r(new Be("Request aborted",Be.ECONNABORTED,e,z)),z=null)},z.onerror=function(){r(new Be("Network Error",Be.ERR_NETWORK,e,z)),z=null},z.ontimeout=function(){let v=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const S=o.transitional||jg;o.timeoutErrorMessage&&(v=o.timeoutErrorMessage),r(new Be(v,S.clarifyTimeoutError?Be.ETIMEDOUT:Be.ECONNABORTED,e,z)),z=null},s===void 0&&i.setContentType(null),"setRequestHeader"in z&&J.forEach(i.toJSON(),function(v,S){z.setRequestHeader(S,v)}),J.isUndefined(o.withCredentials)||(z.withCredentials=!!o.withCredentials),a&&a!=="json"&&(z.responseType=o.responseType),u&&([f,h]=Za(u,!0),z.addEventListener("progress",f)),l&&z.upload&&([d,p]=Za(l),z.upload.addEventListener("progress",d),z.upload.addEventListener("loadend",p)),(o.cancelToken||o.signal)&&(m=_=>{z&&(r(!_||_.type?new Ts(null,e,z):_),z.abort(),z=null)},o.cancelToken&&o.cancelToken.subscribe(m),o.signal&&(o.signal.aborted?m():o.signal.addEventListener("abort",m)));const w=WC(o.url);if(w&&Xn.protocols.indexOf(w)===-1){r(new Be("Unsupported protocol "+w+":",Be.ERR_BAD_REQUEST,e));return}z.send(s||null)})},ew=(e,t)=>{let n=new AbortController,r;const o=function(l){if(!r){r=!0,i();const u=l instanceof Error?l:this.reason;n.abort(u instanceof Be?u:new Ts(u instanceof Error?u.message:u))}};let s=t&&setTimeout(()=>{o(new Be(`timeout ${t} of ms exceeded`,Be.ETIMEDOUT))},t);const i=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(l=>{l&&(l.removeEventListener?l.removeEventListener("abort",o):l.unsubscribe(o))}),e=null)};e.forEach(l=>l&&l.addEventListener&&l.addEventListener("abort",o));const{signal:a}=n;return a.unsubscribe=i,[a,()=>{s&&clearTimeout(s),s=null}]},tw=function*(e,t){let n=e.byteLength;if(!t||n{const s=nw(e,t,o);let i=0,a,l=u=>{a||(a=!0,r&&r(u))};return new ReadableStream({async pull(u){try{const{done:m,value:d}=await s.next();if(m){l(),u.close();return}let f=d.byteLength;if(n){let p=i+=f;n(p)}u.enqueue(new Uint8Array(d))}catch(m){throw l(m),m}},cancel(u){return l(u),s.return()}},{highWaterMark:2})},Ml=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",Zg=Ml&&typeof ReadableStream=="function",bu=Ml&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),Yg=(e,...t)=>{try{return!!e(...t)}catch{return!1}},rw=Zg&&Yg(()=>{let e=!1;const t=new Request(Xn.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),uf=64*1024,Cu=Zg&&Yg(()=>J.isReadableStream(new Response("").body)),Ya={stream:Cu&&(e=>e.body)};Ml&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!Ya[t]&&(Ya[t]=J.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Be(`Response type '${t}' is not supported`,Be.ERR_NOT_SUPPORT,r)})})})(new Response);const ow=async e=>{if(e==null)return 0;if(J.isBlob(e))return e.size;if(J.isSpecCompliantForm(e))return(await new Request(e).arrayBuffer()).byteLength;if(J.isArrayBufferView(e)||J.isArrayBuffer(e))return e.byteLength;if(J.isURLSearchParams(e)&&(e=e+""),J.isString(e))return(await bu(e)).byteLength},sw=async(e,t)=>{const n=J.toFiniteNumber(e.getContentLength());return n??ow(t)},iw=Ml&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:m,withCredentials:d="same-origin",fetchOptions:f}=Kg(e);u=u?(u+"").toLowerCase():"text";let[p,h]=o||s||i?ew([o,s],i):[],g,z;const k=()=>{!g&&setTimeout(()=>{p&&p.unsubscribe()}),g=!0};let w;try{if(l&&rw&&n!=="get"&&n!=="head"&&(w=await sw(m,r))!==0){let C=new Request(t,{method:"POST",body:r,duplex:"half"}),L;if(J.isFormData(r)&&(L=C.headers.get("content-type"))&&m.setContentType(L),C.body){const[D,$]=sf(w,Za(af(l)));r=cf(C.body,uf,D,$,bu)}}J.isString(d)||(d=d?"include":"omit"),z=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:m.normalize().toJSON(),body:r,duplex:"half",credentials:d});let _=await fetch(z);const v=Cu&&(u==="stream"||u==="response");if(Cu&&(a||v)){const C={};["status","statusText","headers"].forEach(F=>{C[F]=_[F]});const L=J.toFiniteNumber(_.headers.get("content-length")),[D,$]=a&&sf(L,Za(af(a),!0))||[];_=new Response(cf(_.body,uf,D,()=>{$&&$(),v&&k()},bu),C)}u=u||"text";let S=await Ya[J.findKey(Ya,u)||"text"](_,e);return!v&&k(),h&&h(),await new Promise((C,L)=>{qg(C,L,{data:S,headers:fn.from(_.headers),status:_.status,statusText:_.statusText,config:e,request:z})})}catch(_){throw k(),_&&_.name==="TypeError"&&/fetch/i.test(_.message)?Object.assign(new Be("Network Error",Be.ERR_NETWORK,e,z),{cause:_.cause||_}):Be.from(_,_&&_.code,e,z)}}),wu={http:wC,xhr:QC,fetch:iw};J.forEach(wu,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const df=e=>`- ${e}`,aw=e=>J.isFunction(e)||e===null||e===!1,Xg={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : +`)}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[of]=this[of]={accessors:{}}).accessors,o=this.prototype;function s(i){const a=Rs(i);r[a]||(BC(o,i),r[a]=!0)}return J.isArray(t)?t.forEach(s):s(t),this}}fn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(fn.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(fn);function gc(e,t){const n=this||Mi,r=t||n,o=fn.from(r.headers);let s=r.data;return J.forEach(e,function(a){s=a.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function Wg(e){return!!(e&&e.__CANCEL__)}function Ts(e,t,n){Be.call(this,e??"canceled",Be.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(Ts,Be,{__CANCEL__:!0});function qg(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Be("Request failed with status code "+n.status,[Be.ERR_BAD_REQUEST,Be.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function WC(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function qC(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(l){const u=Date.now(),m=r[s];i||(i=u),n[o]=l,r[o]=u;let d=s,f=0;for(;d!==o;)f+=n[d++],d=d%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),u-i{n=m,o=null,s&&(clearTimeout(s),s=null),e.apply(null,u)};return[(...u)=>{const m=Date.now(),d=m-n;d>=r?i(u,m):(o=u,s||(s=setTimeout(()=>{s=null,i(o)},r-d)))},()=>o&&i(o)]}const Za=(e,t,n=3)=>{let r=0;const o=qC(50,250);return GC(s=>{const i=s.loaded,a=s.lengthComputable?s.total:void 0,l=i-r,u=o(l),m=i<=a;r=i;const d={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:u||void 0,estimated:u&&a&&m?(a-i)/u:void 0,event:s,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(d)},n)},sf=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},af=e=>(...t)=>J.asap(()=>e(...t)),KC=Xn.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 a=J.isString(i)?o(i):i;return a.protocol===r.protocol&&a.host===r.host}}():function(){return function(){return!0}}(),ZC=Xn.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.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 YC(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function XC(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function Gg(e,t){return e&&!YC(t)?XC(e,t):t}const lf=e=>e instanceof fn?{...e}:e;function No(e,t){t=t||{};const n={};function r(u,m,d){return J.isPlainObject(u)&&J.isPlainObject(m)?J.merge.call({caseless:d},u,m):J.isPlainObject(m)?J.merge({},m):J.isArray(m)?m.slice():m}function o(u,m,d){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u,d)}else return r(u,m,d)}function s(u,m){if(!J.isUndefined(m))return r(void 0,m)}function i(u,m){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u)}else return r(void 0,m)}function a(u,m,d){if(d in t)return r(u,m);if(d in e)return r(void 0,u)}const l={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:a,headers:(u,m)=>o(lf(u),lf(m),!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(m){const d=l[m]||o,f=d(e[m],t[m],m);J.isUndefined(f)&&d!==a||(n[m]=f)}),n}const Kg=e=>{const t=No({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=t;t.headers=i=fn.from(i),t.url=Ug(Gg(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(J.isFormData(n)){if(Xn.hasStandardBrowserEnv||Xn.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[u,...m]=l?l.split(";").map(d=>d.trim()).filter(Boolean):[];i.setContentType([u||"multipart/form-data",...m].join("; "))}}if(Xn.hasStandardBrowserEnv&&(r&&J.isFunction(r)&&(r=r(t)),r||r!==!1&&KC(t.url))){const u=o&&s&&ZC.read(s);u&&i.set(o,u)}return t},JC=typeof XMLHttpRequest<"u",QC=JC&&function(e){return new Promise(function(n,r){const o=Kg(e);let s=o.data;const i=fn.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:u}=o,m,d,f,p,h;function g(){p&&p(),h&&h(),o.cancelToken&&o.cancelToken.unsubscribe(m),o.signal&&o.signal.removeEventListener("abort",m)}let z=new XMLHttpRequest;z.open(o.method.toUpperCase(),o.url,!0),z.timeout=o.timeout;function k(){if(!z)return;const _=fn.from("getAllResponseHeaders"in z&&z.getAllResponseHeaders()),S={data:!a||a==="text"||a==="json"?z.responseText:z.response,status:z.status,statusText:z.statusText,headers:_,config:e,request:z};qg(function(L){n(L),g()},function(L){r(L),g()},S),z=null}"onloadend"in z?z.onloadend=k:z.onreadystatechange=function(){!z||z.readyState!==4||z.status===0&&!(z.responseURL&&z.responseURL.indexOf("file:")===0)||setTimeout(k)},z.onabort=function(){z&&(r(new Be("Request aborted",Be.ECONNABORTED,e,z)),z=null)},z.onerror=function(){r(new Be("Network Error",Be.ERR_NETWORK,e,z)),z=null},z.ontimeout=function(){let v=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const S=o.transitional||jg;o.timeoutErrorMessage&&(v=o.timeoutErrorMessage),r(new Be(v,S.clarifyTimeoutError?Be.ETIMEDOUT:Be.ECONNABORTED,e,z)),z=null},s===void 0&&i.setContentType(null),"setRequestHeader"in z&&J.forEach(i.toJSON(),function(v,S){z.setRequestHeader(S,v)}),J.isUndefined(o.withCredentials)||(z.withCredentials=!!o.withCredentials),a&&a!=="json"&&(z.responseType=o.responseType),u&&([f,h]=Za(u,!0),z.addEventListener("progress",f)),l&&z.upload&&([d,p]=Za(l),z.upload.addEventListener("progress",d),z.upload.addEventListener("loadend",p)),(o.cancelToken||o.signal)&&(m=_=>{z&&(r(!_||_.type?new Ts(null,e,z):_),z.abort(),z=null)},o.cancelToken&&o.cancelToken.subscribe(m),o.signal&&(o.signal.aborted?m():o.signal.addEventListener("abort",m)));const w=WC(o.url);if(w&&Xn.protocols.indexOf(w)===-1){r(new Be("Unsupported protocol "+w+":",Be.ERR_BAD_REQUEST,e));return}z.send(s||null)})},ew=(e,t)=>{let n=new AbortController,r;const o=function(l){if(!r){r=!0,i();const u=l instanceof Error?l:this.reason;n.abort(u instanceof Be?u:new Ts(u instanceof Error?u.message:u))}};let s=t&&setTimeout(()=>{o(new Be(`timeout ${t} of ms exceeded`,Be.ETIMEDOUT))},t);const i=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(l=>{l&&(l.removeEventListener?l.removeEventListener("abort",o):l.unsubscribe(o))}),e=null)};e.forEach(l=>l&&l.addEventListener&&l.addEventListener("abort",o));const{signal:a}=n;return a.unsubscribe=i,[a,()=>{s&&clearTimeout(s),s=null}]},tw=function*(e,t){let n=e.byteLength;if(n{const s=nw(e,t,o);let i=0,a,l=u=>{a||(a=!0,r&&r(u))};return new ReadableStream({async pull(u){try{const{done:m,value:d}=await s.next();if(m){l(),u.close();return}let f=d.byteLength;if(n){let p=i+=f;n(p)}u.enqueue(new Uint8Array(d))}catch(m){throw l(m),m}},cancel(u){return l(u),s.return()}},{highWaterMark:2})},Ml=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",Zg=Ml&&typeof ReadableStream=="function",bu=Ml&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),Yg=(e,...t)=>{try{return!!e(...t)}catch{return!1}},rw=Zg&&Yg(()=>{let e=!1;const t=new Request(Xn.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),uf=64*1024,Cu=Zg&&Yg(()=>J.isReadableStream(new Response("").body)),Ya={stream:Cu&&(e=>e.body)};Ml&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!Ya[t]&&(Ya[t]=J.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Be(`Response type '${t}' is not supported`,Be.ERR_NOT_SUPPORT,r)})})})(new Response);const ow=async e=>{if(e==null)return 0;if(J.isBlob(e))return e.size;if(J.isSpecCompliantForm(e))return(await new Request(e).arrayBuffer()).byteLength;if(J.isArrayBufferView(e)||J.isArrayBuffer(e))return e.byteLength;if(J.isURLSearchParams(e)&&(e=e+""),J.isString(e))return(await bu(e)).byteLength},sw=async(e,t)=>{const n=J.toFiniteNumber(e.getContentLength());return n??ow(t)},iw=Ml&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:m,withCredentials:d="same-origin",fetchOptions:f}=Kg(e);u=u?(u+"").toLowerCase():"text";let[p,h]=o||s||i?ew([o,s],i):[],g,z;const k=()=>{!g&&setTimeout(()=>{p&&p.unsubscribe()}),g=!0};let w;try{if(l&&rw&&n!=="get"&&n!=="head"&&(w=await sw(m,r))!==0){let C=new Request(t,{method:"POST",body:r,duplex:"half"}),L;if(J.isFormData(r)&&(L=C.headers.get("content-type"))&&m.setContentType(L),C.body){const[D,$]=sf(w,Za(af(l)));r=cf(C.body,uf,D,$,bu)}}J.isString(d)||(d=d?"include":"omit"),z=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:m.normalize().toJSON(),body:r,duplex:"half",credentials:d});let _=await fetch(z);const v=Cu&&(u==="stream"||u==="response");if(Cu&&(a||v)){const C={};["status","statusText","headers"].forEach(F=>{C[F]=_[F]});const L=J.toFiniteNumber(_.headers.get("content-length")),[D,$]=a&&sf(L,Za(af(a),!0))||[];_=new Response(cf(_.body,uf,D,()=>{$&&$(),v&&k()},bu),C)}u=u||"text";let S=await Ya[J.findKey(Ya,u)||"text"](_,e);return!v&&k(),h&&h(),await new Promise((C,L)=>{qg(C,L,{data:S,headers:fn.from(_.headers),status:_.status,statusText:_.statusText,config:e,request:z})})}catch(_){throw k(),_&&_.name==="TypeError"&&/fetch/i.test(_.message)?Object.assign(new Be("Network Error",Be.ERR_NETWORK,e,z),{cause:_.cause||_}):Be.from(_,_&&_.code,e,z)}}),wu={http:wC,xhr:QC,fetch:iw};J.forEach(wu,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const df=e=>`- ${e}`,aw=e=>J.isFunction(e)||e===null||e===!1,Xg={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : `+s.map(df).join(` `):" "+df(s[0]):"as no adapter specified";throw new Be("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:wu};function yc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ts(null,e)}function mf(e){return yc(e),e.headers=fn.from(e.headers),e.data=gc.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Xg.getAdapter(e.adapter||Mi.adapter)(e).then(function(r){return yc(e),r.data=gc.call(e,e.transformResponse,r),r.headers=fn.from(r.headers),r},function(r){return Wg(r)||(yc(e),r&&r.response&&(r.response.data=gc.call(e,e.transformResponse,r.response),r.response.headers=fn.from(r.response.headers))),Promise.reject(r)})}const Jg="1.7.4",Ld={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Ld[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const ff={};Ld.transitional=function(t,n,r){function o(s,i){return"[Axios v"+Jg+"] Transitional option '"+s+"'"+i+(r?". "+r:"")}return(s,i,a)=>{if(t===!1)throw new Be(o(i," has been removed"+(n?" in "+n:"")),Be.ERR_DEPRECATED);return n&&!ff[i]&&(ff[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,i,a):!0}};function lw(e,t,n){if(typeof e!="object")throw new Be("options must be an object",Be.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 a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new Be("option "+s+" must be "+l,Be.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Be("Unknown option "+s,Be.ERR_BAD_OPTION)}}const ku={assertOptions:lw,validators:Ld},Dr=ku.validators;class Ao{constructor(t){this.defaults=t,this.interceptors={request:new rf,response:new rf}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let o;Error.captureStackTrace?Error.captureStackTrace(o={}):o=new Error;const s=o.stack?o.stack.replace(/^.+\n/,""):"";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(r.stack+=` `+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=No(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&ku.assertOptions(r,{silentJSONParsing:Dr.transitional(Dr.boolean),forcedJSONParsing:Dr.transitional(Dr.boolean),clarifyTimeoutError:Dr.transitional(Dr.boolean)},!1),o!=null&&(J.isFunction(o)?n.paramsSerializer={serialize:o}:ku.assertOptions(o,{encode:Dr.function,serialize:Dr.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=s&&J.merge(s.common,s[n.method]);s&&J.forEach(["delete","get","head","post","put","patch","common"],h=>{delete s[h]}),n.headers=fn.concat(i,s);const a=[];let l=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen=="function"&&g.runWhen(n)===!1||(l=l&&g.synchronous,a.unshift(g.fulfilled,g.rejected))});const u=[];this.interceptors.response.forEach(function(g){u.push(g.fulfilled,g.rejected)});let m,d=0,f;if(!l){const h=[mf.bind(this),void 0];for(h.unshift.apply(h,a),h.push.apply(h,u),f=h.length,m=Promise.resolve(n);d{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(a=>{r.subscribe(a),s=a}).then(o);return i.cancel=function(){r.unsubscribe(s)},i},t(function(s,i,a){r.reason||(r.reason=new Ts(s,i,a),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 Nd(function(o){t=o}),cancel:t}}}function cw(e){return function(n){return e.apply(null,n)}}function uw(e){return J.isObject(e)&&e.isAxiosError===!0}const Su={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(Su).forEach(([e,t])=>{Su[t]=e});function Qg(e){const t=new Ao(e),n=Ag(Ao.prototype.request,t);return J.extend(n,Ao.prototype,t,{allOwnKeys:!0}),J.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return Qg(No(e,o))},n}const ue=Qg(Mi);ue.Axios=Ao;ue.CanceledError=Ts;ue.CancelToken=Nd;ue.isCancel=Wg;ue.VERSION=Jg;ue.toFormData=Rl;ue.AxiosError=Be;ue.Cancel=ue.CanceledError;ue.all=function(t){return Promise.all(t)};ue.spread=cw;ue.isAxiosError=uw;ue.mergeConfig=No;ue.AxiosHeaders=fn;ue.formToJSON=e=>Bg(J.isHTMLForm(e)?new FormData(e):e);ue.getAdapter=Xg.getAdapter;ue.HttpStatusCode=Su;ue.default=ue;/*! From a983302b034daa9cb2a7aab41c3db6e83dcd2e2c Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Wed, 25 Sep 2024 19:28:53 +0200 Subject: [PATCH 13/65] [player] Add a index attribute to struct player_speaker_info + a getter --- src/player.c | 59 +++++++++++++++++++++++++++++++++++++++++++--------- src/player.h | 4 ++++ 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/player.c b/src/player.c index 6101f6f0..430a164b 100644 --- a/src/player.c +++ b/src/player.c @@ -164,6 +164,7 @@ struct speaker_get_param { uint64_t spk_id; uint32_t active_remote; + uint32_t index; const char *address; struct player_speaker_info *spk_info; }; @@ -2516,10 +2517,11 @@ playback_seek(void *arg, int *retval) } static void -device_to_speaker_info(struct player_speaker_info *spk, struct output_device *device) +device_to_speaker_info(struct player_speaker_info *spk, struct output_device *device, uint32_t index) { memset(spk, 0, sizeof(struct player_speaker_info)); spk->id = device->id; + spk->index = index; spk->active_remote = (uint32_t)device->id; strncpy(spk->name, device->name, sizeof(spk->name)); spk->name[sizeof(spk->name) - 1] = '\0'; @@ -2553,10 +2555,11 @@ speaker_enumerate(void *arg, int *retval) struct spk_enum *spk_enum = arg; struct output_device *device; struct player_speaker_info spk; + int i; - for (device = outputs_list(); device; device = device->next) + for (device = outputs_list(), i = 0; device; device = device->next, i++) { - device_to_speaker_info(&spk, device); + device_to_speaker_info(&spk, device, i); spk_enum->cb(&spk, spk_enum->arg); } @@ -2569,13 +2572,14 @@ speaker_get_byid(void *arg, int *retval) { struct speaker_get_param *spk_param = arg; struct output_device *device; + int i; - for (device = outputs_list(); device; device = device->next) + for (device = outputs_list(), i = 0; device; device = device->next, i++) { if ((device->advertised || device->selected) && device->id == spk_param->spk_id) { - device_to_speaker_info(spk_param->spk_info, device); + device_to_speaker_info(spk_param->spk_info, device, i); *retval = 0; return COMMAND_END; } @@ -2591,12 +2595,13 @@ speaker_get_byactiveremote(void *arg, int *retval) { struct speaker_get_param *spk_param = arg; struct output_device *device; + int i; - for (device = outputs_list(); device; device = device->next) + for (device = outputs_list(), i = 0; device; device = device->next, i++) { if ((uint32_t)device->id == spk_param->active_remote) { - device_to_speaker_info(spk_param->spk_info, device); + device_to_speaker_info(spk_param->spk_info, device, i); *retval = 0; return COMMAND_END; } @@ -2614,20 +2619,41 @@ speaker_get_byaddress(void *arg, int *retval) struct output_device *device; bool match_v4; bool match_v6; + int i; - for (device = outputs_list(); device; device = device->next) + for (device = outputs_list(), i = 0; device; device = device->next, i++) { match_v4 = device->v4_address && (strcmp(spk_param->address, device->v4_address) == 0); match_v6 = device->v6_address && (strcmp(spk_param->address, device->v6_address) == 0); if (match_v4 || match_v6) { - device_to_speaker_info(spk_param->spk_info, device); + device_to_speaker_info(spk_param->spk_info, device, i); + *retval = 0; + return COMMAND_END; + } + } + + *retval = -1; + return COMMAND_END; +} + +static enum command_state +speaker_get_byindex(void *arg, int *retval) +{ + struct speaker_get_param *spk_param = arg; + struct output_device *device; + int i; + + for (device = outputs_list(), i = 0; device; device = device->next, i++) + { + if (i == spk_param->index) + { + device_to_speaker_info(spk_param->spk_info, device, i); *retval = 0; return COMMAND_END; } } - // No output device found with matching id *retval = -1; return COMMAND_END; } @@ -3483,6 +3509,19 @@ player_speaker_get_byaddress(struct player_speaker_info *spk, const char *addres return ret; } +int +player_speaker_get_byindex(struct player_speaker_info *spk, uint32_t index) +{ + struct speaker_get_param param; + int ret; + + param.index = index; + param.spk_info = spk; + + ret = commands_exec_sync(cmdbase, speaker_get_byindex, NULL, ¶m); + return ret; +} + int player_speaker_enable(uint64_t id) { diff --git a/src/player.h b/src/player.h index 2292c5ea..371bbd5b 100644 --- a/src/player.h +++ b/src/player.h @@ -30,6 +30,7 @@ enum player_seek_mode { struct player_speaker_info { uint64_t id; + uint32_t index; uint32_t active_remote; char name[255]; char output_type[50]; @@ -106,6 +107,9 @@ player_speaker_get_byactiveremote(struct player_speaker_info *spk, uint32_t acti int player_speaker_get_byaddress(struct player_speaker_info *spk, const char *address); +int +player_speaker_get_byindex(struct player_speaker_info *spk, uint32_t index); + int player_speaker_enable(uint64_t id); From 17ef308489acbf29575969db4844d8cca652feef Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Wed, 25 Sep 2024 19:31:16 +0200 Subject: [PATCH 14/65] [mpd] Fix outputs enable/disable/toggle not working in v28.10 Also simplify code by using new speaker index from player and remove some code duplication. Regression from PR #1779. Fixes #1814. --- src/mpd.c | 194 ++++++++++++------------------------------------------ 1 file changed, 42 insertions(+), 152 deletions(-) diff --git a/src/mpd.c b/src/mpd.c index 99a41f1a..2d5098a0 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -208,29 +208,12 @@ struct mpd_command int wants_num; }; -struct output +struct param_output { - unsigned short shortid; - uint64_t id; - char *name; - - unsigned selected; + struct evbuffer *evbuf; + uint32_t last_shortid; }; -struct output_get_param -{ - unsigned short curid; - unsigned short shortid; - struct output *output; -}; - -struct output_outputs_param -{ - unsigned short nextid; - struct evbuffer *buf; -}; - - /* ---------------------------------- Globals ------------------------------- */ static pthread_t tid_mpd; @@ -240,6 +223,7 @@ static struct evhttp *evhttpd; static struct evconnlistener *mpd_listener; static int mpd_sockfd; static bool mpd_plugin_httpd; +static int mpd_plugin_httpd_shortid = -1; // Virtual path to the default playlist directory static char *default_pl_dir; @@ -382,16 +366,6 @@ client_ctx_add(void) return client_ctx; } -static void -free_output(struct output *output) -{ - if (!output) - return; - - free(output->name); - free(output); -} - /* * Creates a new string for the given path that starts with a '/'. * If 'path' already starts with a '/' the returned string is a duplicate @@ -3100,107 +3074,30 @@ mpd_command_binarylimit(struct mpd_command_output *out, struct mpd_command_input } /* - * Callback function for the 'player_speaker_enumerate' function. - * Expect a struct output_get_param as argument and allocates a struct output if - * the shortid of output_get_param matches the given speaker/output spk. - */ -static void -output_get_cb(struct player_speaker_info *spk, void *arg) -{ - struct output_get_param *param = arg; - - if (!param->output - && param->shortid == param->curid) - { - CHECK_NULL(L_MPD, param->output = calloc(1, sizeof(struct output))); - - param->output->id = spk->id; - param->output->shortid = param->shortid; - param->output->name = strdup(spk->name); - param->output->selected = spk->selected; - - param->curid++; - - DPRINTF(E_DBG, L_MPD, "Output found: shortid %d, id %" PRIu64 ", name '%s', selected %d\n", - param->output->shortid, param->output->id, param->output->name, param->output->selected); - } -} - -/* - * Command handler function for 'disableoutput' - * Expects argument argv[1] to be the id of the speaker to disable. + * Command handler function for 'disableoutput', 'enableoutput', 'toggleoutput' + * Expects argument argv[1] to be the id of the output. */ static int -mpd_command_disableoutput(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) +mpd_command_xoutput(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - uint32_t num = in->argv_u32val[1]; - struct output_get_param param = { .shortid = num }; + const char *action = in->argv[0]; + uint32_t shortid = in->argv_u32val[1]; + struct player_speaker_info spk; int ret; - player_speaker_enumerate(output_get_cb, ¶m); + if (shortid == mpd_plugin_httpd_shortid) + RETURN_ERROR(ACK_ERROR_ARG, "Output cannot be toggled"); - if (param.output && param.output->selected) - { - ret = player_speaker_disable(param.output->id); - free_output(param.output); + ret = player_speaker_get_byindex(&spk, shortid); + if (ret < 0) + RETURN_ERROR(ACK_ERROR_ARG, "Unknown output"); - if (ret < 0) - RETURN_ERROR(ACK_ERROR_UNKNOWN, "Speakers deactivation failed: %d", num); - } + if ((spk.selected && strcasecmp(action, "enable") == 0) || (!spk.selected && strcasecmp(action, "disable") == 0)) + return 0; // Nothing to do - return 0; -} - -/* - * Command handler function for 'enableoutput' - * Expects argument argv[1] to be the id of the speaker to enable. - */ -static int -mpd_command_enableoutput(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) -{ - uint32_t num = in->argv_u32val[1]; - struct output_get_param param = { .shortid = num }; - int ret; - - player_speaker_enumerate(output_get_cb, ¶m); - - if (param.output && !param.output->selected) - { - ret = player_speaker_enable(param.output->id); - free_output(param.output); - - if (ret < 0) - RETURN_ERROR(ACK_ERROR_UNKNOWN, "Speakers deactivation failed: %d", num); - } - - return 0; -} - -/* - * Command handler function for 'toggleoutput' - * Expects argument argv[1] to be the id of the speaker to enable/disable. - */ -static int -mpd_command_toggleoutput(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) -{ - uint32_t num = in->argv_u32val[1]; - struct output_get_param param = { .shortid = num }; - int ret; - - player_speaker_enumerate(output_get_cb, ¶m); - - if (param.output) - { - if (param.output->selected) - ret = player_speaker_disable(param.output->id); - else - ret = player_speaker_enable(param.output->id); - - free_output(param.output); - - if (ret < 0) - RETURN_ERROR(ACK_ERROR_UNKNOWN, "Toggle speaker failed: %d", num); - } + ret = spk.selected ? player_speaker_disable(spk.id) : player_speaker_enable(spk.id); + if (ret < 0) + RETURN_ERROR(ACK_ERROR_UNKNOWN, "Output error, see log"); return 0; } @@ -3219,8 +3116,7 @@ mpd_command_toggleoutput(struct mpd_command_output *out, struct mpd_command_inpu static void speaker_enum_cb(struct player_speaker_info *spk, void *arg) { - struct output_outputs_param *param = arg; - struct evbuffer *evbuf = param->buf; + struct param_output *param = arg; char plugin[sizeof(spk->output_type)]; char *p; char *q; @@ -3235,16 +3131,17 @@ speaker_enum_cb(struct player_speaker_info *spk, void *arg) } *q = '\0'; - evbuffer_add_printf(evbuf, + evbuffer_add_printf(param->evbuf, "outputid: %u\n" "outputname: %s\n" "plugin: %s\n" "outputenabled: %d\n", - param->nextid, + spk->index, spk->name, plugin, spk->selected); - param->nextid++; + + param->last_shortid = spk->index; } /* @@ -3254,28 +3151,25 @@ speaker_enum_cb(struct player_speaker_info *spk, void *arg) static int mpd_command_outputs(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) { - struct output_outputs_param param = { 0 }; + struct param_output param = { .evbuf = out->evbuf, .last_shortid = -1 }; /* Reference: * https://mpd.readthedocs.io/en/latest/protocol.html#audio-output-devices - * the ID returned by mpd may change between excutions, so what we do - * is simply enumerate the speakers, and for get/set commands we count - * ID times to the output referenced. */ - param.buf = out->evbuf; - + * the ID returned by mpd may change between excutions (!!), so what we do + * is simply enumerate the speakers with the speaker index */ player_speaker_enumerate(speaker_enum_cb, ¶m); /* streaming output is not in the speaker list, so add it as pseudo * element when configured to do so */ if (mpd_plugin_httpd) { - evbuffer_add_printf(out->evbuf, - "outputid: %u\n" - "outputname: MP3 stream\n" - "plugin: httpd\n" - "outputenabled: 1\n", - param.nextid); - param.nextid++; + mpd_plugin_httpd_shortid = param.last_shortid + 1; + evbuffer_add_printf(param.evbuf, + "outputid: %u\n" + "outputname: MP3 stream\n" + "plugin: httpd\n" + "outputenabled: 1\n", + mpd_plugin_httpd_shortid); } return 0; @@ -3284,18 +3178,14 @@ mpd_command_outputs(struct mpd_command_output *out, struct mpd_command_input *in static int outputvolume_set(uint32_t shortid, int volume) { - struct output_get_param param = { .shortid = shortid }; + struct player_speaker_info spk; int ret; - player_speaker_enumerate(output_get_cb, ¶m); - - if (!param.output) + ret = player_speaker_get_byindex(&spk, shortid); + if (ret < 0) return -1; - ret = player_volume_setabs_speaker(param.output->id, volume); - - free_output(param.output); - return ret; + return player_volume_setabs_speaker(spk.id, volume); } static int @@ -3687,9 +3577,9 @@ static struct mpd_command mpd_handlers[] = { "binarylimit", mpd_command_binarylimit, 2, MPD_WANTS_NUM_ARG1_UVAL }, // Audio output devices - { "disableoutput", mpd_command_disableoutput, 2, MPD_WANTS_NUM_ARG1_UVAL }, - { "enableoutput", mpd_command_enableoutput, 2, MPD_WANTS_NUM_ARG1_UVAL }, - { "toggleoutput", mpd_command_toggleoutput, 2, MPD_WANTS_NUM_ARG1_UVAL }, + { "disableoutput", mpd_command_xoutput, 2, MPD_WANTS_NUM_ARG1_UVAL }, + { "enableoutput", mpd_command_xoutput, 2, MPD_WANTS_NUM_ARG1_UVAL }, + { "toggleoutput", mpd_command_xoutput, 2, MPD_WANTS_NUM_ARG1_UVAL }, { "outputs", mpd_command_outputs, -1 }, // Custom command outputvolume (not supported by mpd) From ba4b2c8ddd2368397c2daae945feabf1dfd60861 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Sat, 28 Sep 2024 20:31:13 +0200 Subject: [PATCH 15/65] [httpd/daap] Improve logging of speaker profile selection --- src/httpd.c | 2 -- src/httpd_daap.c | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/httpd.c b/src/httpd.c index 96fe6508..96724948 100644 --- a/src/httpd.c +++ b/src/httpd.c @@ -1240,8 +1240,6 @@ httpd_xcode_profile_get(struct httpd_request *hreq) if (!hreq->peer_address) return XCODE_NONE; - DPRINTF(E_DBG, L_HTTPD, "Checking if client '%s' is a speaker\n", hreq->peer_address); - // A Roku Soundbridge may also be RCP device/speaker for which the user may // have set a prefered streaming format ret = player_speaker_get_byaddress(&spk, hreq->peer_address); diff --git a/src/httpd_daap.c b/src/httpd_daap.c index d5eee491..7a141f2a 100644 --- a/src/httpd_daap.c +++ b/src/httpd_daap.c @@ -1225,6 +1225,8 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist) spk_profile = httpd_xcode_profile_get(hreq); + DPRINTF(E_DBG, L_DAAP, "Speaker check of '%s' (codecs '%s') returned %d\n", hreq->user_agent, accept_codecs, spk_profile); + nsongs = 0; while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) { From 73864e82cd267da65b7245430bd1a2060d8bec81 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Sun, 29 Sep 2024 22:22:26 +0200 Subject: [PATCH 16/65] [daap] Fix for Apple Music/iTunes not working on Airplay host OwnTone selects ALAC for daap streaming because it thinks the client is an Airplay speaker. Regression in 28.10 coming from PR #1698. Fixes #1816 --- src/httpd_daap.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/httpd_daap.c b/src/httpd_daap.c index 7a141f2a..61a059b3 100644 --- a/src/httpd_daap.c +++ b/src/httpd_daap.c @@ -1149,7 +1149,6 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist) const char *accept_codecs; const char *tag; size_t len; - enum transcode_profile spk_profile; enum transcode_profile profile; struct transcode_metadata_string xcode_metadata; struct media_quality quality = { 0 }; @@ -1223,10 +1222,6 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist) accept_codecs = httpd_header_find(hreq->in_headers, "Accept-Codecs"); } - spk_profile = httpd_xcode_profile_get(hreq); - - DPRINTF(E_DBG, L_DAAP, "Speaker check of '%s' (codecs '%s') returned %d\n", hreq->user_agent, accept_codecs, spk_profile); - nsongs = 0; while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) { @@ -1241,9 +1236,6 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist) } else if (profile != XCODE_NONE) { - if (spk_profile != XCODE_NONE) - profile = spk_profile; - if (safe_atou32(dbmfi.song_length, &len_ms) < 0) len_ms = 3 * 60 * 1000; // just a fallback default From b9fa790f50dde504b2939aa1ae154d1a47c63799 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Mon, 30 Sep 2024 16:13:31 +0200 Subject: [PATCH 17/65] Revert "[daap] Fix for Apple Music/iTunes not working on Airplay host" This reverts commit 73864e82cd267da65b7245430bd1a2060d8bec81. --- src/httpd_daap.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/httpd_daap.c b/src/httpd_daap.c index 61a059b3..7a141f2a 100644 --- a/src/httpd_daap.c +++ b/src/httpd_daap.c @@ -1149,6 +1149,7 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist) const char *accept_codecs; const char *tag; size_t len; + enum transcode_profile spk_profile; enum transcode_profile profile; struct transcode_metadata_string xcode_metadata; struct media_quality quality = { 0 }; @@ -1222,6 +1223,10 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist) accept_codecs = httpd_header_find(hreq->in_headers, "Accept-Codecs"); } + spk_profile = httpd_xcode_profile_get(hreq); + + DPRINTF(E_DBG, L_DAAP, "Speaker check of '%s' (codecs '%s') returned %d\n", hreq->user_agent, accept_codecs, spk_profile); + nsongs = 0; while ((ret = db_query_fetch_file(&dbmfi, &qp)) == 0) { @@ -1236,6 +1241,9 @@ daap_reply_songlist_generic(struct httpd_request *hreq, int playlist) } else if (profile != XCODE_NONE) { + if (spk_profile != XCODE_NONE) + profile = spk_profile; + if (safe_atou32(dbmfi.song_length, &len_ms) < 0) len_ms = 3 * 60 * 1000; // just a fallback default From 81cf713a835cb732cd01f2c2e3756cb99502c95e Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Mon, 30 Sep 2024 19:59:34 +0200 Subject: [PATCH 18/65] [daap] Fix for Apple Music/iTunes not working on Airplay host (attempt 2) OwnTone selects ALAC for daap streaming because it thinks the client is an Airplay speaker. Regression in 28.10 coming from PR #1698. Fixes #1816 --- src/httpd.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/httpd.c b/src/httpd.c index 96724948..e61ec4d2 100644 --- a/src/httpd.c +++ b/src/httpd.c @@ -1237,11 +1237,15 @@ httpd_xcode_profile_get(struct httpd_request *hreq) // No peer address if the function is called from httpd_daap.c when the DAAP // cache is being updated - if (!hreq->peer_address) + if (!hreq->peer_address || !hreq->user_agent) return XCODE_NONE; // A Roku Soundbridge may also be RCP device/speaker for which the user may - // have set a prefered streaming format + // have set a prefered streaming format, but in all other cases we don't use + // speaker configuration (so caller will let transcode_needed decide) + if (strncmp(hreq->user_agent, "Roku", strlen("Roku")) != 0) + return XCODE_NONE; + ret = player_speaker_get_byaddress(&spk, hreq->peer_address); if (ret < 0) return XCODE_NONE; From 601f5a7657cd268869c34acf4742992d4d7f2a9b Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Mon, 7 Oct 2024 23:50:21 +0200 Subject: [PATCH 19/65] [gh-actions] Add FreeBSD build workflow using vmactions --- .github/workflows/freebsd.yml | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/freebsd.yml diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml new file mode 100644 index 00000000..f20ec137 --- /dev/null +++ b/.github/workflows/freebsd.yml @@ -0,0 +1,44 @@ +name: FreeBSD + +on: + push: + branches: + - master + paths-ignore: + - 'docs/**' + - 'htdocs/**' + - 'web-src/**' + pull_request: + branches: + - master + paths-ignore: + - 'docs/**' + - 'htdocs/**' + - 'web-src/**' + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Build + uses: vmactions/freebsd-vm@v1 + with: + prepare: | + pkg install -y gmake autoconf automake libtool pkgconf gettext gperf glib ffmpeg libconfuse libevent libxml2 libgcrypt libunistring libiconv curl libplist libinotify avahi sqlite3 alsa-lib libsodium json-c libwebsockets protobuf-c bison flex + pw user add owntone -m -d /usr/local/var/cache/owntone + + run: | + autoreconf -vi + export CFLAGS="${ARCH} -g -I/usr/local/include -I/usr/include" + export LDFLAGS="-L/usr/local/lib -L/usr/lib" + ./configure --disable-install-system + gmake + gmake install + mkdir -p /srv/music + service dbus onestart + service avahi-daemon onestart + /usr/local/sbin/owntone -f -t From ebec99cc9ddb749f6a850ff52d55f52f8ee49407 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Tue, 8 Oct 2024 20:34:54 +0200 Subject: [PATCH 20/65] [mpc] Support for readpicture and albumart --- src/mpd.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/mpd.c b/src/mpd.c index 2d5098a0..374189a5 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -2335,6 +2335,61 @@ mpd_command_save(struct mpd_command_output *out, struct mpd_command_input *in, s return 0; } +/* + * albumart {uri} {offset} + * or + * readpicture {uri} {offset} + * + * From the docs the offset appears to be mandatory even if 0, but we treat it + * as optional. We don't differentiate between getting album or picture (track) + * artwork, since the artwork module will do its own thing. If no artwork can + * be found we return a 0 byte response, as per the docs. + */ +static int +mpd_command_albumart(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) +{ + char *virtual_path; + uint32_t offset = in->argv_u32val[2]; + struct evbuffer *artwork; + size_t total_size; + size_t len; + int format; + int id; + + virtual_path = prepend_slash(in->argv[1]); + id = db_file_id_byvirtualpath(virtual_path); + free(virtual_path); + if (id <= 0) + RETURN_ERROR(ACK_ERROR_ARG, "Invalid path"); + + CHECK_NULL(L_MPD, artwork = evbuffer_new()); + + // Ref. docs: "If the song file was recognized, but there is no picture, the + // response is successful, but is otherwise empty" + format = artwork_get_item(artwork, id, ART_DEFAULT_WIDTH, ART_DEFAULT_HEIGHT, 0); + if (format == ART_FMT_PNG) + evbuffer_add_printf(out->evbuf, "type: image/png\n"); + else if (format == ART_FMT_JPEG) + evbuffer_add_printf(out->evbuf, "type: image/jpeg\n"); + else + goto out; + + total_size = evbuffer_get_length(artwork); + evbuffer_add_printf(out->evbuf, "size: %zu\n", total_size); + + evbuffer_drain(artwork, offset); + + len = MIN(ctx->binarylimit, evbuffer_get_length(artwork)); + evbuffer_add_printf(out->evbuf, "binary: %zu\n", len); + + evbuffer_remove_buffer(artwork, out->evbuf, len); + evbuffer_add(out->evbuf, "\n", 1); + + out: + evbuffer_free(artwork); + return 0; +} + /* * count [FILTER] [group {GROUPTYPE}] * @@ -3545,6 +3600,7 @@ static struct mpd_command mpd_handlers[] = { "save", mpd_command_save, 2 }, // The music database + { "albumart", mpd_command_albumart, 2, MPD_WANTS_NUM_ARG2_UVAL }, { "count", mpd_command_count, -1 }, { "find", mpd_command_find, 2 }, { "findadd", mpd_command_findadd, 2 }, @@ -3556,6 +3612,7 @@ static struct mpd_command mpd_handlers[] = { "listfiles", mpd_command_listfiles, -1 }, { "lsinfo", mpd_command_lsinfo, -1 }, // { "readcomments", mpd_command_readcomments, -1 }, + { "readpicture", mpd_command_albumart, 2, MPD_WANTS_NUM_ARG2_UVAL }, // { "searchaddpl", mpd_command_searchaddpl, -1 }, { "update", mpd_command_update, -1 }, // { "rescan", mpd_command_rescan, -1 }, From 75a1082b0a4e60eddc030fbf75060786b225ce98 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Tue, 8 Oct 2024 23:43:34 +0200 Subject: [PATCH 21/65] [mpd] Add getvol, bump version to 0.23.0 --- src/mpd.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/mpd.c b/src/mpd.c index 374189a5..ced05c14 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -72,7 +72,17 @@ // According to the mpd protocol send "OK MPD \n" to the client, where // version is the version of the supported mpd protocol and not the server version -#define MPD_PROTOCOL_VERSION_OK "OK MPD 0.22.4\n" +// 0.22.4 binarylimit +// 0.23 getvol, addid relative position "+3", searchadd position param +// TODO: +// 0.23.1 load plname 0: +3 +// 0.23.3 add position param, playlistadd position param, playlistdelete plname songpos +// 0.23.4 searchaddpl position param +// 0.23.5 searchadd relative position +// 0.24 case sensitive operands, added tag in response, oneshot status, +// consume oneshot, listplaylist/listplaylistinfo range, playlistmove +// range, save mode, sticker find sort uri/value/value_int +#define MPD_PROTOCOL_VERSION_OK "OK MPD 0.23.0\n" /** * from MPD source: @@ -1208,6 +1218,19 @@ mpd_command_setvol(struct mpd_command_output *out, struct mpd_command_input *in, return 0; } +/* + * Read the (master) volume + */ +static int +mpd_command_getvol(struct mpd_command_output *out, struct mpd_command_input *in, struct mpd_client_ctx *ctx) +{ + struct player_status status; + + player_get_status(&status); + evbuffer_add_printf(out->evbuf, "volume: %d\n", status.volume); + return 0; +} + /* * Command handler function for 'single' * Sets the repeat mode, expects argument argv[1] to be an integer or @@ -1574,7 +1597,8 @@ mpd_queue_add(char *path, bool exact_match, int position) } /* - * Command handler function for 'add' + * add "file:/srv/music/Blue Foundation/Life Of A Ghost 2/07 Ghost.mp3" +1 + * * Adds the all songs under the given path to the end of the playqueue (directories add recursively). * Expects argument argv[1] to be a path to a single file or directory. */ @@ -1602,7 +1626,8 @@ mpd_command_add(struct mpd_command_output *out, struct mpd_command_input *in, st } /* - * Command handler function for 'addid' + * addid "file:/srv/music/Blue Foundation/Life Of A Ghost 2/07 Ghost.mp3" +1 + * * Adds the song under the given path to the end or to the given position of the playqueue. * Expects argument argv[1] to be a path to a single file. argv[2] is optional, if present * as int is the absolute new position, if present as "+x" og "-x" it is relative. @@ -3546,6 +3571,7 @@ static struct mpd_command mpd_handlers[] = { "random", mpd_command_random, 2, MPD_WANTS_NUM_ARG1_UVAL }, { "repeat", mpd_command_repeat, 2, MPD_WANTS_NUM_ARG1_UVAL }, { "setvol", mpd_command_setvol, 2, MPD_WANTS_NUM_ARG1_UVAL }, + { "getvol", mpd_command_getvol, -1 }, { "single", mpd_command_single, 2 }, { "replay_gain_mode", mpd_command_ignore, -1 }, { "replay_gain_status", mpd_command_replay_gain_status, -1 }, From 7da811e3b3b5627020e5022f5859a5806d4e442d Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Fri, 11 Oct 2024 19:29:49 +0200 Subject: [PATCH 22/65] [docs] Brush up the documentation * Try to organize after expected user need * Update mkdocs stuff and fix a broken link * Move web building info to building.md * Add info about Roku Soundbridge * Add note about Google Nest not working --- docs/{outputs => audio-outputs}/airplay.md | 3 +- docs/{outputs => audio-outputs}/chromecast.md | 5 + .../{outputs => audio-outputs}/local-audio.md | 0 docs/audio-outputs/mobile.md | 19 +++ docs/audio-outputs/roku.md | 9 ++ docs/{outputs => audio-outputs}/streaming.md | 21 +-- docs/audio-outputs/web.md | 19 +++ docs/building.md | 24 ++- docs/clients/mpd.md | 22 --- docs/clients/remote.md | 71 --------- docs/clients/supported-clients.md | 42 ------ docs/clients/web-interface.md | 123 --------------- docs/configuration.md | 4 +- .../cli.md => control-clients/cli-api.md} | 28 +++- docs/control-clients/desktop.md | 52 +++++++ docs/control-clients/mobile.md | 141 ++++++++++++++++++ docs/control-clients/web.md | 44 ++++++ docs/index.md | 2 +- docs/media-clients.md | 28 ++++ mkdocs.yml | 29 ++-- 20 files changed, 388 insertions(+), 298 deletions(-) rename docs/{outputs => audio-outputs}/airplay.md (91%) rename docs/{outputs => audio-outputs}/chromecast.md (54%) rename docs/{outputs => audio-outputs}/local-audio.md (100%) create mode 100644 docs/audio-outputs/mobile.md create mode 100644 docs/audio-outputs/roku.md rename docs/{outputs => audio-outputs}/streaming.md (62%) create mode 100644 docs/audio-outputs/web.md delete mode 100644 docs/clients/mpd.md delete mode 100644 docs/clients/remote.md delete mode 100644 docs/clients/supported-clients.md delete mode 100644 docs/clients/web-interface.md rename docs/{clients/cli.md => control-clients/cli-api.md} (59%) create mode 100644 docs/control-clients/desktop.md create mode 100644 docs/control-clients/mobile.md create mode 100644 docs/control-clients/web.md create mode 100644 docs/media-clients.md diff --git a/docs/outputs/airplay.md b/docs/audio-outputs/airplay.md similarity index 91% rename from docs/outputs/airplay.md rename to docs/audio-outputs/airplay.md index 893e8130..82606f71 100644 --- a/docs/outputs/airplay.md +++ b/docs/audio-outputs/airplay.md @@ -11,8 +11,7 @@ interface: Select the device and then enter the PIN that the Apple TV displays. If your speaker is silent when you start playback, and there is no obvious error message in the log, you can try disabling ipv6 in the config. Some speakers -announce that they support ipv6, but in fact don't (at least not with forked- -daapd). +announce that they support ipv6, but for some reason don't work with OwnTone. If the speaker becomes unselected when you start playback, and you in the log see "ANNOUNCE request failed in session startup: 400 Bad Request", then try diff --git a/docs/outputs/chromecast.md b/docs/audio-outputs/chromecast.md similarity index 54% rename from docs/outputs/chromecast.md rename to docs/audio-outputs/chromecast.md index 3117359a..242736d5 100644 --- a/docs/outputs/chromecast.md +++ b/docs/audio-outputs/chromecast.md @@ -2,3 +2,8 @@ OwnTone will discover Chromecast devices available on your network, and you can then select the device as a speaker. There is no configuration required. + +Take note that: + +- Chromecast playback can't be precisely sync'ed with other outputs e.g. AirPlay +- Playback to Google Nest doesn't work diff --git a/docs/outputs/local-audio.md b/docs/audio-outputs/local-audio.md similarity index 100% rename from docs/outputs/local-audio.md rename to docs/audio-outputs/local-audio.md diff --git a/docs/audio-outputs/mobile.md b/docs/audio-outputs/mobile.md new file mode 100644 index 00000000..a22475a3 --- /dev/null +++ b/docs/audio-outputs/mobile.md @@ -0,0 +1,19 @@ +# Listening on your Mobile Device + +## iOS + +On iOS, the options are limited because there are no Media Client apps with DAAP +support and because Apple doesn't allow AirPlay receiver apps. OwnTone also +can't share music via Home Sharing, which is the protocol Apple uses for sharing +media between devices. + +That leaves the following options, which all rely on OwnTone's streaming: + +- listen via the [web interface](web.md) +- use a [MPD client app](../control-clients/mobile.md#mpd-client-apps) that supports local playback +- connect to the [streaming](streaming.md) endpoint with a media player like VLC + +## Android + +On Android, you can use the same streaming methods described for iOS, but you +can also find apps that act as AirPlay receivers. diff --git a/docs/audio-outputs/roku.md b/docs/audio-outputs/roku.md new file mode 100644 index 00000000..71f6dea3 --- /dev/null +++ b/docs/audio-outputs/roku.md @@ -0,0 +1,9 @@ +# Roku devices/speakers + +OwnTone can stream audio to classic RSP/RCP-based devices like Roku Soundbridge +M1001 and M2000. + +If the source file is in a non-supported format, like flac, OwnTone will +transcode to wav. Transmitting wav requires some bandwidth and the legacy +network interfaces of these devices may struggle with that. If so, you can +change the transcoding format for the speaker to alac via the [JSON API](../json-api.md#change-an-output). diff --git a/docs/outputs/streaming.md b/docs/audio-outputs/streaming.md similarity index 62% rename from docs/outputs/streaming.md rename to docs/audio-outputs/streaming.md index 7545d271..a2f9dc49 100644 --- a/docs/outputs/streaming.md +++ b/docs/audio-outputs/streaming.md @@ -1,20 +1,10 @@ # Streaming The streaming option is useful when you want to listen to audio played by -OwnTone in a browser or a media player of your choice [^1],[^3]. +OwnTone in a browser or a media player of your choice [^1],[^2]. -Moreover, Apple Remote or the web interface can be used to control the -playback. - -## Listening to Audio in a Browser - -To listen to audio being played by OwnTone in a browser, follow these -steps: - -1. Start playing audio in OwnTone. -2. In the web interface, activate the stream in the output menu by clicking - on the icon :material-broadcast: next to HTTP Stream. - After a few seconds, the audio should play in the background [^2]. +You can control playback via the web interface or any of the supported control +clients. ## Listening to Audio in a Media Player @@ -37,10 +27,7 @@ steps: audio, since Apple does not allow AirPlay receiver apps, and because Home Sharing cannot be supported by OwnTone. -[^2]: On iOS devices, playing audio in the background when the device is locked - is not supported in a private browser tab. - -[^3]: For the streaming option to work, MP3 encoding must be supported by +[^2]: For the streaming option to work, MP3 encoding must be supported by `libavcodec`. If it is not, a message will appear in the log file. For example, on Debian or Ubuntu, MP3 encoding support is provided by the package `libavcodec-extra`. diff --git a/docs/audio-outputs/web.md b/docs/audio-outputs/web.md new file mode 100644 index 00000000..c3566bff --- /dev/null +++ b/docs/audio-outputs/web.md @@ -0,0 +1,19 @@ +# Listening to Audio in a Browser + +To listen to audio being played by OwnTone in a browser, follow these +steps: + +1. Start playing audio in OwnTone. +2. In the web interface, activate the stream in the output menu by clicking + on the icon :material-broadcast: next to HTTP Stream. + After a few seconds, the audio should play in the background [^1]. + +![Outputs](../assets/images/screenshot-outputs.png){: class="zoom" } + +For the streaming option to work, MP3 encoding must be supported by +`libavcodec`. If it is not, a message will appear in the log file. For example, +on Debian or Ubuntu, MP3 encoding support is provided by the package +`libavcodec-extra`. + +[^1]: On iOS devices, playing audio in the background when the device is locked + is not supported in a private browser tab. diff --git a/docs/building.md b/docs/building.md index 7e9f19bc..1f8b69c6 100644 --- a/docs/building.md +++ b/docs/building.md @@ -272,7 +272,12 @@ The source for the player web interface is located under the `web-src` folder an requires nodejs >= 6.0 to be built. In the `web-src` folder run `npm install` to install all dependencies for the player web interface. After that run `npm run build`. This will build the web interface and update the `htdocs` folder. -(See [Web interface](clients/web-interface.md) for more informations) + +To serve the web interface locally you can run `npm run serve`, which will make +it reachable at [localhost:3000](http://localhost:3000). The command expects the +server be running at [localhost:3689](http://localhost:3689) and proxies API +calls to this location. If the server is running at a different location you +can use `export VITE_OWNTONE_URL=http://owntone.local:3689`. Building with libwebsockets is required if you want the web interface. It will be enabled if the library is present (with headers). @@ -308,6 +313,23 @@ if it's started as root. This user must have read permission to your library and read/write permissions to the database location (`$localstatedir/cache/owntone` by default). +## Web source formatting/linting + +The source code follows certain formatting conventions for maintainability and +readability. To ensure that the source code follows these conventions, +[Prettier](https://prettier.io/) is used. + +The command `npm run format` applies formatting conventions to the source code +based on a preset configuration. Note that a additional configuration is made in +the file `.prettierrc.json`. + +To flag programming errors, bugs, stylistic errors and suspicious constructs in +the source code, [ESLint](https://eslint.org) is used. + +ESLint has been configured following this [guide](https://vueschool.io/articles/vuejs-tutorials/eslint-and-prettier-with-vite-and-vue-js-3/). + +`npm run lint` lints the source code and fixes all automatically fixable errors. + ## Non-Priviliged User Version for Development OwnTone is meant to be run as system wide daemon, but for development purposes diff --git a/docs/clients/mpd.md b/docs/clients/mpd.md deleted file mode 100644 index 207e6016..00000000 --- a/docs/clients/mpd.md +++ /dev/null @@ -1,22 +0,0 @@ -# MPD Clients - -You can - to some extent - use clients for MPD to control OwnTone. - -By default OwnTone listens on port 6600 for MPD clients. You can change -this in the configuration file. - -Currently only a subset of the commands offered by MPD (see [MPD Protocol](https://mpd.readthedocs.io/en/latest/protocol.html)) are supported. - -Due to some differences between OwnTone and MPD not all commands will act the -same way they would running MPD: - -- crossfade, mixrampdb, mixrampdelay and replaygain will have no effect -- single, repeat: unlike MPD, OwnTone does not support setting single and repeat separately - on/off, instead repeat off, repeat all and repeat single are supported. Thus setting single on will result in repeat single, repeat on results in repeat all. - -The following table shows what is working for a selection of MPD clients: - -| Client | Type | Status | -| --------------------------------------------- | ------ | --------------- | -| [mpc](https://www.musicpd.org/clients/mpc/) | CLI | Working commands: mpc, add, crop, current, del (ranges are not yet supported), play, next, prev (behaves like cdprev), pause, toggle, cdprev, seek, clear, outputs, enable, disable, playlist, ls, load, volume, repeat, random, single, search, find, list, update (initiates an init-rescan, the path argument is not supported) | -| [ympd](http://www.ympd.org/) | Web | Everything except "add stream" should work | diff --git a/docs/clients/remote.md b/docs/clients/remote.md deleted file mode 100644 index 3c5c7f13..00000000 --- a/docs/clients/remote.md +++ /dev/null @@ -1,71 +0,0 @@ -# Using Remote - -Remote gets a list of output devices from the server; this list includes any -and all devices on the network we know of that advertise AirPlay: AirPort -Express, Apple TV, … It also includes the local audio output, that is, the -sound card on the server (even if there is no sound card). - -OwnTone remembers your selection and the individual volume for each -output device; selected devices will be automatically re-selected, except if -they return online during playback. - -## Pairing - -1. Open the [web interface](http://owntone.local:3689) -2. Start Remote, go to Settings, Add Library -3. Enter the pair code in the web interface (reload the browser page if - it does not automatically pick up the pairing request) - -If Remote does not connect to OwnTone after you entered the pairing code -something went wrong. Check the log file to see the error message. Here are -some common reasons: - -- You did not enter the correct pairing code - - You will see an error in the log about pairing failure with a HTTP response code - that is *not* 0. - - Solution: Try again. - -- No response from Remote, possibly a network issue - - If you see an error in the log with either: - - - a HTTP response code that is 0 - - "Empty pairing request callback" - - it means that OwnTone could not establish a connection to Remote. This - might be a network issue, your router may not be allowing multicast between the - Remote device and the host OwnTone is running on. - - Solution 1: Sometimes it resolves the issue if you force Remote to quit, restart - it and do the pairing process again. Another trick is to establish some other - connection (eg SSH) from the iPod/iPhone/iPad to the host. - - Solution 2: Check your router settings if you can whitelist multicast addresses - under IGMP settings. For Apple Bonjour, setting a multicast address of - 224.0.0.251 and a netmask of 255.255.255.255 should work. - -- Otherwise try using `avahi-browse` for troubleshooting: - - - in a terminal, run: - - ```shell - avahi-browse -r -k _touch-remote._tcp - ``` - - - start Remote, goto Settings, Add Library - - after a couple seconds at most, you should get something similar to this: - - ```shell - + ath0 IPv4 59eff13ea2f98dbbef6c162f9df71b784a3ef9a3 _touch-remote._tcp local - = ath0 IPv4 59eff13ea2f98dbbef6c162f9df71b784a3ef9a3 _touch-remote._tcp local - hostname = [Foobar.local] - address = [192.168.1.1] - port = [49160] - txt = ["DvTy=iPod touch" "RemN=Remote" "txtvers=1" "RemV=10000" "Pair=FAEA410630AEC05E" "DvNm=Foobar"] - ``` - - Hit Ctrl+C to terminate `avahi-browse`. - -- To check for network issues you can try to connect to the server address and port with [`nc`](https://en.wikipedia.org/wiki/Netcat) or [`telnet`](https://en.wikipedia.org/wiki/Telnet) commands. diff --git a/docs/clients/supported-clients.md b/docs/clients/supported-clients.md deleted file mode 100644 index f9bd3882..00000000 --- a/docs/clients/supported-clients.md +++ /dev/null @@ -1,42 +0,0 @@ -# Supported Clients - -OwnTone supports these kinds of clients: - -- DAAP clients, like iTunes or Rhythmbox -- Remote clients, like Apple Remote or compatibles for Android/Windows Phone -- AirPlay devices, like AirPort Express, Shairport and various AirPlay speakers -- Chromecast devices -- MPD clients, like mpc -- MP3 network stream clients, like VLC and almost any other music player -- RSP clients, like Roku Soundbridge - -Like iTunes, you can control OwnTone with Remote and stream your music to -AirPlay devices. - -A single OwnTone instance can handle several clients concurrently, regardless of -the protocol. - -By default all clients on 192.168.* (and the ipv6 equivalent) are allowed to -connect without authentication. You can change that in the configuration file. - -Here is a list of working and non-working DAAP and Remote clients. The list is -probably obsolete when you read it :-) - -| Client | Developer | Type | Platform | Working (vers.) | -| ------------------------ | ----------- | ------ | --------------- | --------------- | -| iTunes | Apple | DAAP | Win | Yes (12.10.1) | -| Apple Music | Apple | DAAP | macOS | Yes | -| Rhythmbox | Gnome | DAAP | Linux | Yes | -| Diapente | diapente | DAAP | Android | Yes | -| WinAmp DAAPClient | WardFamily | DAAP | WinAmp | Yes | -| Amarok w/DAAP plugin | KDE | DAAP | Linux/Win | Yes (2.8.0) | -| Banshee | | DAAP | Linux/Win/macOS | No (2.6.2) | -| jtunes4 | | DAAP | Java | No | -| Firefly Client | | (DAAP) | Java | No | -| Remote | Apple | Remote | iOS | Yes (4.3) | -| Retune | SquallyDoc | Remote | Android | Yes (3.5.23) | -| TunesRemote+ | Melloware | Remote | Android | Yes (2.5.3) | -| Remote for iTunes | Hyperfine | Remote | Android | Yes | -| Remote for Windows Phone | Komodex | Remote | Windows Phone | Yes (2.2.1.0) | -| TunesRemote SE | | Remote | Java | Yes (r108) | -| rtRemote for Windows | bizmodeller | Remote | Windows | Yes (1.2.0.67) | diff --git a/docs/clients/web-interface.md b/docs/clients/web-interface.md deleted file mode 100644 index 84fe0354..00000000 --- a/docs/clients/web-interface.md +++ /dev/null @@ -1,123 +0,0 @@ -# Web Interface - -The web interface is a mobile-friendly music player and browser for OwnTone. - -You can reach it at [http://owntone.local:3689](http://owntone.local:3689) -or depending on the OwnTone installation at `http://:`. - -This interface becomes useful when you need to control playback, trigger -manual library rescans, pair with remotes, select speakers, grant access to -Spotify, and for many other operations. - -## Screenshots - -Below you have a selection of screenshots that shows different part of the -interface. - -![Now playing](../assets/images/screenshot-now-playing.png){: class="zoom" } -![Queue](../assets/images/screenshot-queue.png){: class="zoom" } -![Music browse](../assets/images/screenshot-music-browse.png){: class="zoom" } -![Music artists](../assets/images/screenshot-music-artists.png){: class="zoom" } -![Music artist](../assets/images/screenshot-music-artist.png){: class="zoom" } -![Music albums](../assets/images/screenshot-music-albums.png){: class="zoom" } -![Music albums options](../assets/images/screenshot-music-albums-options.png){: class="zoom" } -![Music album](../assets/images/screenshot-music-album.png){: class="zoom" } -![Spotify](../assets/images/screenshot-music-spotify.png){: class="zoom" } -![Audiobooks authors](../assets/images/screenshot-audiobooks-authors.png){: class="zoom" } -![Audiobooks](../assets/images/screenshot-audiobooks-books.png){: class="zoom" } -![Podcasts](../assets/images/screenshot-podcasts.png){: class="zoom" } -![Podcast](../assets/images/screenshot-podcast.png){: class="zoom" } -![Files](../assets/images/screenshot-files.png){: class="zoom" } -![Search](../assets/images/screenshot-search.png){: class="zoom" } -![Menu](../assets/images/screenshot-menu.png){: class="zoom" } -![Outputs](../assets/images/screenshot-outputs.png){: class="zoom" } - -## Usage - -The web interface is usually reachable at [http://owntone.local:3689](http://owntone.local:3689). -But depending on the setup of OwnTone you might need to adjust the server name -and port of the server accordingly `http://:`. - -## Building and Serving - -The web interface is built with [Vite](https://vitejs.dev/) and [Bulma](http://bulma.io). - -Its source code is located in the `web-src` folder and therefore all `npm` -commands must be run under this folder. - -To switch to this folder, run the command hereafter. - -```shell -cd web-src -``` - -### Dependencies Installation - -First of all, the dependencies to libraries must be installed with the command -below. - -```shell -npm install -``` - -Once the libraries installed, you can either [build](#source-code-building), -[format](#source-code-formatting), and [lint](#source-code-linting) the source -code, or [serve](#serving) the web interface locally. - -### Source Code Building - -The following command builds the web interface for production with minification -and stores it under the folder `../htdocs`. - -```shell -npm run build -``` - -### Source Code Formatting - -The source code follows certain formatting conventions for maintainability and -readability. To ensure that the source code follows these conventions, -[Prettier](https://prettier.io/) is used. - -The command below applies formatting conventions to the source code based on a -preset configuration. Note that a additional configuration is made in the file -`.prettierrc.json`. - -```shell -npm run format -``` - -### Source Code Linting - -In order to flag programming errors, bugs, stylistic errors and suspicious -constructs in the source code, [ESLint](https://eslint.org) is used. - -Note that ESLint has been configured following this [guide](https://vueschool.io/articles/vuejs-tutorials/eslint-and-prettier-with-vite-and-vue-js-3/). - -The following command lints the source code and fixes all automatically fixable -errors. - -```shell -npm run lint -``` - -### Serving - -In order to serve locally the web interface, the following command can be run. - -```shell -npm run serve -``` - -After running `npm run serve` the web interface is reachable at [localhost:3000](http://localhost:3000). - -By default the above command expects the OwnTone server to be running at -[localhost:3689](http://localhost:3689) and proxies API calls to this location. - -If the server is running at a different location you have to set the -environment variable `VITE_OWNTONE_URL`, like in the example below. - -```shell -export VITE_OWNTONE_URL=http://owntone.local:3689 -npm run serve -``` diff --git a/docs/configuration.md b/docs/configuration.md index 1816781c..6d786a28 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -11,7 +11,7 @@ The configuration of OwnTone - usually located in `/etc/owntone.conf` - is split - [`airplay`](#per-airplay-device-settings) - Settings for a specific AirPlay device. - [`chromecast`](#per-chromecast-device-settings) - Settings for a specific Chromecast device. - [`spotify`](#spotify-settings) - Settings for the Spotify playback. -- [`rcp`](#rcp--roku-soundbridge-settings) - Settings for RCP / Roku Soundbridge devices. +- [`rcp`](#rcproku-soundbridge-settings) - Settings for RCP / Roku Soundbridge devices. - [`mpd`](#mpd-settings) - Settings for MPD clients. - [`sqlite`](#sqlite-settings) - Settings for SQLite operation. - [`streaming`](#streaming-settings) - Settings for the streaming. @@ -1233,7 +1233,7 @@ Flag to indicate to use the playlist name as the album name. album_override = ``` -## RCP / Roku Soundbridge Settings +## RCP/Roku Soundbridge Settings ```conf rcp "" { diff --git a/docs/clients/cli.md b/docs/control-clients/cli-api.md similarity index 59% rename from docs/clients/cli.md rename to docs/control-clients/cli-api.md index 07e746b7..420ff5df 100644 --- a/docs/clients/cli.md +++ b/docs/control-clients/cli-api.md @@ -1,10 +1,30 @@ -# Command Line +# API and Command Line You can choose between: -- a [MPD command line client](mpd.md) (easiest) like `mpc` -- curl with OwnTone's JSON API (see [JSON API docs](../json-api.md)) -- curl with DAAP/DACP commands (hardest) +- [The JSON API](#json-api) +- [A MPD command line client like mpc](#mpc) +- [DAAP/DACP commands](#daapdacp) + +The JSON API is the most versatile and the recommended method, but for simple +command line operations, mpc is easier. DAAP/DACP is only for masochists. + + +## JSON API + +See the [JSON API docs](../json-api.md) + + +## mpc + +[mpc](https://www.musicpd.org/clients/mpc/) is easy to use for simple operations +like enabling speakers, changing volume and getting status. + +Due to differences in implementation between OwnTone and MPD, some mpc commands +will work differently or not at all. + + +## DAAP/DACP Here is an example of how to use curl with DAAP/DACP. Say you have a playlist with a radio station, and you want to make a script that starts playback of that diff --git a/docs/control-clients/desktop.md b/docs/control-clients/desktop.md new file mode 100644 index 00000000..e5cebf75 --- /dev/null +++ b/docs/control-clients/desktop.md @@ -0,0 +1,52 @@ +# Desktop Remote Control + +To control OwnTone from Linux, Windows or Mac, you can use: + +- [The web interface](#the-web-interface) +- [A remote for iTunes/Apple Music](#remotes-for-itunesapple-music) +- [A MPD client](#mpd-clients) + +The web interface is the most feature complete and works on all platforms, so +on desktop there isn't much reason to use anything else. + +However, instead of a remote control application, you can also connect to +OwnTone via a Media Client e.g. iTunes or Apple Music. Media clients will get +the media from OwnTone and do the playback themselves (remotes just control +OwnTone playback). See [Media Clients](../media-clients.md) for more +information. + + +## The web interface + +See [web interface](web.md). + + +## Remotes for iTunes/Apple Music + +There are only a few of these, see the below table. + +| Client | Developer | Type | Platform | Working (vers.) | +| ------------------------ | ----------- | ------ | --------------- | --------------- | +| TunesRemote SE | | Remote | Java | Yes (r108) | +| rtRemote for Windows | bizmodeller | Remote | Windows | Yes (1.2.0.67) | + + +## MPD clients + +There's a range of MPD clients available that also work with OwnTone e.g. +Cantata and Plattenalbum. + +The better ones support local playback, speaker control, artwork and automatic +discovery of OwnTone's MPD server. + +By default OwnTone listens on port 6600 for MPD clients. You can change +this in the configuration file. + +Due to some differences between OwnTone and MPD not all commands will act the +same way they would running MPD: + +- crossfade, mixrampdb, mixrampdelay and replaygain will have no effect +- single, repeat: unlike MPD, OwnTone does not support setting single and repeat + separately on/off, instead repeat off, repeat all and repeat single are + supported. Thus setting single on will result in repeat single, repeat on + results in repeat all. diff --git a/docs/control-clients/mobile.md b/docs/control-clients/mobile.md new file mode 100644 index 00000000..ae862850 --- /dev/null +++ b/docs/control-clients/mobile.md @@ -0,0 +1,141 @@ +# Mobile Remote Control + +To control OwnTone from your mobile device, you can use: + +- [The web interface](#the-web-interface) +- [(iOS) The Remote app from Apple](#apple-remote-app-ios) +- [(Android) An iTunes/Apple Music remote app](#remotes-for-itunesapple-music-android) +- [A MPD client app](#mpd-client-apps) + +The web interface is the most feature complete, but apps may have UX advantages. +The table below shows how some features compare. + +| Feature | Remote | MPD client | Web | +| ------------------------------------- | ---------- | ---------- | ---------- | +| Browse library | yes | yes | yes | +| Control playback and queue | yes | yes | yes | +| Artwork | yes | yes | yes | +| Individual speaker selection | yes | some | yes | +| Individual speaker volume | yes | no | yes | +| Volume control using phone buttons | no | ? | no | +| Listen on phone | no | some | yes | +| Access non-library Spotify tracks | no | no | yes | +| Edit and save m3u playlists | no | some | yes | + +While OwnTone supports playing tracks from Spotify, there is no support for +Spotify Connect, so you can't control from the Spotify app. + + +## The web interface + +See [web interface](web.md). + + +## Apple Remote app (iOS) + +Remote gets a list of output devices from the server; this list includes any +and all devices on the network we know of that advertise AirPlay: AirPort +Express, Apple TV, … It also includes the local audio output, that is, the +sound card on the server (even if there is no sound card). + +OwnTone remembers your selection and the individual volume for each +output device; selected devices will be automatically re-selected, except if +they return online during playback. + +### Pairing + +1. Open the [web interface](web.md) at either [http://owntone.local:3689](http://owntone.local:3689) + or `http://SERVER-IP-ADDRESS:3689` +2. Start Remote, go to Settings, Add Library +3. Enter the pair code in the web interface (reload the browser page if + it does not automatically pick up the pairing request) + +If Remote does not connect to OwnTone after you entered the pairing code +something went wrong. Check the log file to see the error message. Here are +some common reasons: + +- You did not enter the correct pairing code + + You will see an error in the log about pairing failure with a HTTP response code + that is *not* 0. + + Solution: Try again. + +- No response from Remote, possibly a network issue + + If you see an error in the log with either: + + - a HTTP response code that is 0 + - "Empty pairing request callback" + + it means that OwnTone could not establish a connection to Remote. This + might be a network issue, your router may not be allowing multicast between the + Remote device and the host OwnTone is running on. + + Solution 1: Sometimes it resolves the issue if you force Remote to quit, restart + it and do the pairing process again. Another trick is to establish some other + connection (eg SSH) from the iPod/iPhone/iPad to the host. + + Solution 2: Check your router settings if you can whitelist multicast addresses + under IGMP settings. For Apple Bonjour, setting a multicast address of + 224.0.0.251 and a netmask of 255.255.255.255 should work. + +- Otherwise try using `avahi-browse` for troubleshooting: + + - in a terminal, run: + + ```shell + avahi-browse -r -k _touch-remote._tcp + ``` + + - start Remote, goto Settings, Add Library + - after a couple seconds at most, you should get something similar to this: + + ```shell + + ath0 IPv4 59eff13ea2f98dbbef6c162f9df71b784a3ef9a3 _touch-remote._tcp local + = ath0 IPv4 59eff13ea2f98dbbef6c162f9df71b784a3ef9a3 _touch-remote._tcp local + hostname = [Foobar.local] + address = [192.168.1.1] + port = [49160] + txt = ["DvTy=iPod touch" "RemN=Remote" "txtvers=1" "RemV=10000" "Pair=FAEA410630AEC05E" "DvNm=Foobar"] + ``` + + Hit Ctrl+C to terminate `avahi-browse`. + +- To check for network issues you can try to connect to the server address and + port with [`nc`](https://en.wikipedia.org/wiki/Netcat) or + [`telnet`](https://en.wikipedia.org/wiki/Telnet) commands. + + +## Remotes for iTunes/Apple Music (Android) + +The below Android remote apps work with OwnTone. + +| Client | Developer | Type | Working (vers.) | +| ------------------------ | ----------- | ------ | --------------- | +| Retune | SquallyDoc | Remote | Yes (3.5.23) | +| TunesRemote+ | Melloware | Remote | Yes (2.5.3) | +| Remote for iTunes | Hyperfine | Remote | Yes | + +For usage and troubleshooting details, see the instructions for [Apple Remote](#apple-remote-app-ios). + + +## MPD client apps + +There's a range of MPD clients available from app store that also work with +OwnTone e.g. MPD Pilot, MaximumMPD, Rigelian and Stylophone. + +The better ones support local playback, speaker control, artwork and automatic +discovery of OwnTone's MPD server. + +By default OwnTone listens on port 6600 for MPD clients. You can change +this in the configuration file. + +Due to some differences between OwnTone and MPD not all commands will act the +same way they would running MPD: + +- crossfade, mixrampdb, mixrampdelay and replaygain will have no effect +- single, repeat: unlike MPD, OwnTone does not support setting single and repeat + separately on/off, instead repeat off, repeat all and repeat single are + supported. Thus setting single on will result in repeat single, repeat on + results in repeat all. diff --git a/docs/control-clients/web.md b/docs/control-clients/web.md new file mode 100644 index 00000000..6bc403ac --- /dev/null +++ b/docs/control-clients/web.md @@ -0,0 +1,44 @@ +# Web Interface + +The built-in web interface is a mobile-friendly music player and browser for +OwnTone. + +You can reach it at [http://owntone.local:3689](http://owntone.local:3689) +or depending on the OwnTone installation at `http://:`. + +This interface becomes useful when you need to control playback, trigger +manual library rescans, pair with remotes, select speakers, grant access to +Spotify, and for many other operations. + +Alternatively, you can use a MPD web client like for instance [ympd](http://www.ympd.org/). + + +## Screenshots + +Below you have a selection of screenshots that shows different part of the +interface. + +![Now playing](../assets/images/screenshot-now-playing.png){: class="zoom" } +![Queue](../assets/images/screenshot-queue.png){: class="zoom" } +![Music browse](../assets/images/screenshot-music-browse.png){: class="zoom" } +![Music artists](../assets/images/screenshot-music-artists.png){: class="zoom" } +![Music artist](../assets/images/screenshot-music-artist.png){: class="zoom" } +![Music albums](../assets/images/screenshot-music-albums.png){: class="zoom" } +![Music albums options](../assets/images/screenshot-music-albums-options.png){: class="zoom" } +![Music album](../assets/images/screenshot-music-album.png){: class="zoom" } +![Spotify](../assets/images/screenshot-music-spotify.png){: class="zoom" } +![Audiobooks authors](../assets/images/screenshot-audiobooks-authors.png){: class="zoom" } +![Audiobooks](../assets/images/screenshot-audiobooks-books.png){: class="zoom" } +![Podcasts](../assets/images/screenshot-podcasts.png){: class="zoom" } +![Podcast](../assets/images/screenshot-podcast.png){: class="zoom" } +![Files](../assets/images/screenshot-files.png){: class="zoom" } +![Search](../assets/images/screenshot-search.png){: class="zoom" } +![Menu](../assets/images/screenshot-menu.png){: class="zoom" } +![Outputs](../assets/images/screenshot-outputs.png){: class="zoom" } + + +## Usage + +The web interface is usually reachable at [http://owntone.local:3689](http://owntone.local:3689). +But depending on the setup of OwnTone you might need to adjust the server name +and port of the server accordingly `http://:`. diff --git a/docs/index.md b/docs/index.md index 156e420c..fa0ebae0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -54,7 +54,7 @@ OwnTone is written in C with a web interface written in Vue.js. ![Music browse](assets/images/screenshot-music-browse.png){: class="zoom" } ![Music album](assets/images/screenshot-music-album.png){: class="zoom" } -_(You can find more screenshots from OwnTone's web interface [here](clients/web-interface.md))_ +_(You can find more screenshots from OwnTone's web interface [here](control-clients/web.md))_ {: class="text-center" } --- diff --git a/docs/media-clients.md b/docs/media-clients.md new file mode 100644 index 00000000..702292cd --- /dev/null +++ b/docs/media-clients.md @@ -0,0 +1,28 @@ +# Media Clients + +Media Clients are applications that download the media from the server and do +the playback themselves. OwnTone supports media clients via the DAAP and RSP +protocols (so not UPNP). + +Some Media Clients are also able to play video from OwnTone. + +OwnTone can't serve Spotify, internet radio and streams to Media Clients. For +that you must let OwnTone do the playback. + +Here is a list of working and non-working DAAP clients. The list is probably +obsolete when you read it :-) + +| Client | Developer | Type | Platform | Working (vers.) | +| ------------------------ | ----------- | ------ | --------------- | --------------- | +| iTunes | Apple | DAAP | Win | Yes (12.10.1) | +| Apple Music | Apple | DAAP | macOS | Yes | +| Rhythmbox | Gnome | DAAP | Linux | Yes | +| Diapente | diapente | DAAP | Android | Yes | +| WinAmp DAAPClient | WardFamily | DAAP | WinAmp | Yes | +| Amarok w/DAAP plugin | KDE | DAAP | Linux/Win | Yes (2.8.0) | +| Banshee | | DAAP | Linux/Win/macOS | No (2.6.2) | +| jtunes4 | | DAAP | Java | No | +| Firefly Client | | (DAAP) | Java | No | + +Technically, devices like the Roku Soundbridge are both media clients and +audio outputs. You can find information about them [here](audio-outputs/roku.md). diff --git a/mkdocs.yml b/mkdocs.yml index a5a28ce2..e0f54b60 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -100,8 +100,8 @@ markdown_extensions: - pymdownx.caret - pymdownx.details - pymdownx.emoji: - emoji_generator: !!python/name:materialx.emoji.to_svg - emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + emoji_index: !!python/name:material.extensions.emoji.twemoji - pymdownx.highlight: anchor_linenums: true - pymdownx.inlinehilite @@ -132,20 +132,23 @@ nav: - Configuration: configuration.md - Building: building.md - Library: library.md + - Control: + - Mobile Device: control-clients/mobile.md + - Desktop: control-clients/desktop.md + - Browser: control-clients/web.md + - API and CLI: control-clients/cli-api.md + - Audio Outputs: + - AirPlay: audio-outputs/airplay.md + - Chromecast: audio-outputs/chromecast.md + - Local Audio: audio-outputs/local-audio.md + - Mobile Device: audio-outputs/mobile.md + - Web: audio-outputs/web.md + - Roku: audio-outputs/roku.md + - Streaming: audio-outputs/streaming.md + - Media Clients: media-clients.md - Artwork: artwork.md - Playlists and Radio: playlists.md - Smart Playlists: smart-playlists.md - - Clients: - - Supported Clients: clients/supported-clients.md - - Remote: clients/remote.md - - Web Interface: clients/web-interface.md - - MPD Clients: clients/mpd.md - - Command Line: clients/cli.md - - Outputs: - - Local Audio: outputs/local-audio.md - - AirPlay: outputs/airplay.md - - Chromecast: outputs/chromecast.md - - Streaming: outputs/streaming.md - Services Integration: - Spotify: integrations/spotify.md - LastFM: integrations/lastfm.md From 09a70ad99388442ee0bedb0c972ce4349a60eb97 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Fri, 11 Oct 2024 19:43:06 +0200 Subject: [PATCH 23/65] [docs] Update Makefile.am with updated doc sources --- Makefile.am | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/Makefile.am b/Makefile.am index eaa0781b..d1c00102 100644 --- a/Makefile.am +++ b/Makefile.am @@ -23,24 +23,29 @@ dist_man_MANS = owntone.8 nobase_dist_doc_DATA = \ UPGRADING \ README.md \ + docs/index.md \ + docs/getting-started.md \ + docs/installation.md \ + docs/configuration.md \ + docs/building.md \ + docs/library.md \ + docs/control-clients/mobile.md \ + docs/control-clients/desktop.md \ + docs/control-clients/web.md \ + docs/control-clients/cli-api.md \ + docs/audio-outputs/airplay.md \ + docs/audio-outputs/chromecast.md \ + docs/audio-outputs/local-audio.md \ + docs/audio-outputs/mobile.md \ + docs/audio-outputs/web.md \ + docs/audio-outputs/roku.md \ + docs/audio-outputs/streaming.md \ + docs/media-clients.md \ + docs/artwork.md \ docs/playlists.md \ + docs/smart-playlists.md \ docs/integrations/spotify.md \ docs/integrations/lastfm.md \ - docs/index.md \ - docs/outputs/streaming.md \ - docs/outputs/chromecast.md \ - docs/outputs/airplay.md \ - docs/outputs/local-audio.md \ - docs/installation.md \ - docs/clients/web-interface.md \ - docs/clients/remote.md \ - docs/clients/cli.md \ - docs/clients/supported-clients.md \ - docs/clients/mpd.md \ - docs/smart-playlists.md \ - docs/artwork.md \ - docs/library.md \ - docs/getting-started.md \ docs/advanced/radio-streams.md \ docs/advanced/multiple-instances.md \ docs/advanced/outputs-alsa.md \ From 8ae25aaf3e5f5f556d28a78a610bed9f8f9557dc Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Mon, 14 Oct 2024 23:09:43 +0200 Subject: [PATCH 24/65] [docs] Update Chromecast note about Nest Hub --- docs/audio-outputs/chromecast.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/audio-outputs/chromecast.md b/docs/audio-outputs/chromecast.md index 242736d5..3a9eb845 100644 --- a/docs/audio-outputs/chromecast.md +++ b/docs/audio-outputs/chromecast.md @@ -6,4 +6,4 @@ can then select the device as a speaker. There is no configuration required. Take note that: - Chromecast playback can't be precisely sync'ed with other outputs e.g. AirPlay -- Playback to Google Nest doesn't work +- Playback to Google Nest Hub doesn't work (Nest Mini does work) From 880f5b2bf67a06ea95d412629baf868f9a358edf Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Wed, 16 Oct 2024 16:42:24 +0200 Subject: [PATCH 25/65] [json_api] Method for setting skip_count and for setting play_count directly --- docs/json-api.md | 5 +++-- src/httpd_jsonapi.c | 19 ++++++++++++++++++- src/library.c | 7 +++++++ src/library.h | 1 + 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/docs/json-api.md b/docs/json-api.md index 8de4674d..3a531212 100644 --- a/docs/json-api.md +++ b/docs/json-api.md @@ -1622,7 +1622,7 @@ curl -X GET "http://localhost:3689/api/library/tracks/27/playlists" ### Update track properties -Change properties of one or more tracks (supported properties are "rating", "play_count" and "usermark") +Change properties of one or more tracks (supported properties are "rating", "play_count", "skip_count" and "usermark") **Endpoint** @@ -1663,7 +1663,8 @@ PUT /api/library/tracks/{id} | Parameter | Value | | --------------- | ----------------------------------------------------------- | | rating | The new rating (0 - 100) | -| play_count | Either `increment` or `reset`. `increment` will increment `play_count` and update `time_played`, `reset` will set `play_count` and `skip_count` to zero and delete `time_played` and `time_skipped` | +| play_count | Either `increment` or `reset` or the new count. `increment` will increment `play_count` and update `time_played`, `reset` will set `play_count` and `skip_count` to zero and delete `time_played` and `time_skipped` | +| skip_count | The new skip count | | usermark | The new usermark (>= 0) | **Response** diff --git a/src/httpd_jsonapi.c b/src/httpd_jsonapi.c index 09984541..edee06d5 100644 --- a/src/httpd_jsonapi.c +++ b/src/httpd_jsonapi.c @@ -3305,13 +3305,30 @@ jsonapi_reply_library_tracks_put_byid(struct httpd_request *hreq) { db_file_reset_playskip_count(track_id); } + else if (safe_atou32(param, &val) == 0) + { + library_item_attrib_save(track_id, LIBRARY_ATTRIB_PLAY_COUNT, val); + } else { - DPRINTF(E_WARN, L_WEB, "Ignoring invalid play_count value '%s' for track '%d'.\n", param, track_id); + DPRINTF(E_WARN, L_WEB, "Invalid play_count value '%s' for track '%d'.\n", param, track_id); return HTTP_BADREQUEST; } } + param = httpd_query_value_find(hreq->query, "skip_count"); + if (param) + { + ret = safe_atou32(param, &val); + if (ret < 0) + { + DPRINTF(E_WARN, L_WEB, "Invalid skip_count value '%s' for track '%d'.\n", param, track_id); + return HTTP_BADREQUEST; + } + + library_item_attrib_save(track_id, LIBRARY_ATTRIB_SKIP_COUNT, val); + } + param = httpd_query_value_find(hreq->query, "rating"); if (param) { diff --git a/src/library.c b/src/library.c index 4d4f8428..b9d4b32d 100644 --- a/src/library.c +++ b/src/library.c @@ -692,6 +692,13 @@ item_attrib_save(void *arg, int *retval) mfi->play_count = param->value; break; + case LIBRARY_ATTRIB_SKIP_COUNT: + if (param->value < 0) + goto error; + + mfi->skip_count = param->value; + break; + default: goto error; } diff --git a/src/library.h b/src/library.h index 5201d951..82f0b166 100644 --- a/src/library.h +++ b/src/library.h @@ -52,6 +52,7 @@ enum library_attrib LIBRARY_ATTRIB_RATING, LIBRARY_ATTRIB_USERMARK, LIBRARY_ATTRIB_PLAY_COUNT, + LIBRARY_ATTRIB_SKIP_COUNT, }; /* From 5d7e3dc09033c185aa60aabb9c88620c5e0823c9 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Thu, 17 Oct 2024 19:48:14 +0200 Subject: [PATCH 26/65] [httpd] Add parameter "no_register_playback" for DAAP/RSP streaming --- src/httpd.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/httpd.c b/src/httpd.c index e61ec4d2..0bcc8592 100644 --- a/src/httpd.c +++ b/src/httpd.c @@ -102,7 +102,7 @@ struct stream_ctx { off_t offset; off_t start_offset; off_t end_offset; - int marked; + bool no_register_playback; struct transcode_ctx *xcode; }; @@ -666,11 +666,11 @@ stream_end(struct stream_ctx *st) static void stream_end_register(struct stream_ctx *st) { - if (!st->marked + if (!st->no_register_playback && (st->stream_size > ((st->size * 50) / 100)) && (st->offset > ((st->size * 80) / 100))) { - st->marked = 1; + st->no_register_playback = true; worker_execute(playcount_inc_cb, &st->id, sizeof(int), 0); #ifdef LASTFM worker_execute(scrobble_cb, &st->id, sizeof(int), 1); @@ -697,6 +697,7 @@ stream_new(struct media_file_info *mfi, struct httpd_request *hreq, event_callba event_active(st->ev, 0, 0); + st->no_register_playback = httpd_query_value_find(hreq->query, "no_register_playback"); st->id = mfi->id; st->hreq = hreq; return st; From 750f83b7e04039f07b3b03b5ee7ec563c3866023 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Thu, 17 Oct 2024 19:58:25 +0200 Subject: [PATCH 27/65] [httpd] Fixup commit 5d7e3dc0 in case NULL isn't zero --- src/httpd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/httpd.c b/src/httpd.c index 0bcc8592..8bdf5bb3 100644 --- a/src/httpd.c +++ b/src/httpd.c @@ -697,7 +697,9 @@ stream_new(struct media_file_info *mfi, struct httpd_request *hreq, event_callba event_active(st->ev, 0, 0); - st->no_register_playback = httpd_query_value_find(hreq->query, "no_register_playback"); + if (httpd_query_value_find(hreq->query, "no_register_playback")) + st->no_register_playback = true; + st->id = mfi->id; st->hreq = hreq; return st; From 12f728629f84fb201327fc7d4d31614a8b285e7a Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Thu, 17 Oct 2024 23:31:46 +0200 Subject: [PATCH 28/65] [json-api] Setting of track attribs time_played/time_skipped and make generic --- src/httpd_jsonapi.c | 95 ++++++++++++++++++++------------------------- src/library.c | 19 +++++---- src/library.h | 2 + 3 files changed, 53 insertions(+), 63 deletions(-) diff --git a/src/httpd_jsonapi.c b/src/httpd_jsonapi.c index edee06d5..f7e349c2 100644 --- a/src/httpd_jsonapi.c +++ b/src/httpd_jsonapi.c @@ -59,6 +59,22 @@ # include "inputs/spotify.h" #endif +struct track_attribs +{ + enum library_attrib type; + const char *name; +}; + +// Currently these must all be uint32 +static const struct track_attribs track_attribs[] = +{ + { LIBRARY_ATTRIB_PLAY_COUNT, "play_count", }, + { LIBRARY_ATTRIB_SKIP_COUNT, "skip_count", }, + { LIBRARY_ATTRIB_TIME_PLAYED, "time_played", }, + { LIBRARY_ATTRIB_TIME_SKIPPED, "time_skipped", }, + { LIBRARY_ATTRIB_RATING, "rating", }, + { LIBRARY_ATTRIB_USERMARK, "usermark", }, +}; static bool allow_modifying_stored_playlists; static char *default_playlist_directory; @@ -3221,6 +3237,7 @@ jsonapi_reply_library_tracks_put(struct httpd_request *hreq) int err; int32_t track_id; int i; + int j; request = jparse_obj_from_evbuffer(hreq->in_body); if (!request) @@ -3257,13 +3274,18 @@ jsonapi_reply_library_tracks_put(struct httpd_request *hreq) goto error; } - // These are async, so no error check - if (jparse_contains_key(track, "rating", json_type_int)) - library_item_attrib_save(track_id, LIBRARY_ATTRIB_RATING, jparse_int_from_obj(track, "rating")); - if (jparse_contains_key(track, "usermark", json_type_int)) - library_item_attrib_save(track_id, LIBRARY_ATTRIB_USERMARK, jparse_int_from_obj(track, "usermark")); - if (jparse_contains_key(track, "play_count", json_type_int)) - library_item_attrib_save(track_id, LIBRARY_ATTRIB_PLAY_COUNT, jparse_int_from_obj(track, "play_count")); + for (j = 0; j < ARRAY_SIZE(track_attribs); j++) + { + if (!jparse_contains_key(track, track_attribs[j].name, json_type_int)) + continue; + + ret = jparse_int_from_obj(track, track_attribs[j].name); + if (ret < 0) + continue; + + // async, so no error check + library_item_attrib_save(track_id, track_attribs[j].type, ret); + } i++; } @@ -3286,6 +3308,7 @@ jsonapi_reply_library_tracks_put_byid(struct httpd_request *hreq) const char *param; uint32_t val; int ret; + int i; ret = safe_atoi32(hreq->path_parts[3], &track_id); if (ret < 0 || !db_file_id_exists(track_id)) @@ -3294,66 +3317,32 @@ jsonapi_reply_library_tracks_put_byid(struct httpd_request *hreq) return HTTP_NOTFOUND; } - param = httpd_query_value_find(hreq->query, "play_count"); - if (param) + for (i = 0; i < ARRAY_SIZE(track_attribs); i++) { - if (strcmp(param, "increment") == 0) + param = httpd_query_value_find(hreq->query, track_attribs[i].name); + if (!param) + continue; + + // Special cases + if (track_attribs[i].type == LIBRARY_ATTRIB_PLAY_COUNT && strcmp(param, "increment") == 0) { db_file_inc_playcount(track_id); + continue; } - else if (strcmp(param, "reset") == 0) + if (track_attribs[i].type == LIBRARY_ATTRIB_PLAY_COUNT && strcmp(param, "reset") == 0) { db_file_reset_playskip_count(track_id); + continue; } - else if (safe_atou32(param, &val) == 0) - { - library_item_attrib_save(track_id, LIBRARY_ATTRIB_PLAY_COUNT, val); - } - else - { - DPRINTF(E_WARN, L_WEB, "Invalid play_count value '%s' for track '%d'.\n", param, track_id); - return HTTP_BADREQUEST; - } - } - param = httpd_query_value_find(hreq->query, "skip_count"); - if (param) - { ret = safe_atou32(param, &val); if (ret < 0) { - DPRINTF(E_WARN, L_WEB, "Invalid skip_count value '%s' for track '%d'.\n", param, track_id); + DPRINTF(E_WARN, L_WEB, "Invalid %s value '%s' for track '%d'.\n", track_attribs[i].name, param, track_id); return HTTP_BADREQUEST; } - library_item_attrib_save(track_id, LIBRARY_ATTRIB_SKIP_COUNT, val); - } - - param = httpd_query_value_find(hreq->query, "rating"); - if (param) - { - ret = safe_atou32(param, &val); - if (ret < 0 || val > DB_FILES_RATING_MAX) - { - DPRINTF(E_WARN, L_WEB, "Invalid rating value '%s' for track '%d'.\n", param, track_id); - return HTTP_BADREQUEST; - } - - library_item_attrib_save(track_id, LIBRARY_ATTRIB_RATING, val); - } - - // Retreive marked tracks via "/api/search?type=tracks&expression=usermark+=+1" - param = httpd_query_value_find(hreq->query, "usermark"); - if (param) - { - ret = safe_atou32(param, &val); - if (ret < 0) - { - DPRINTF(E_WARN, L_WEB, "Invalid usermark value '%s' for track '%d'.\n", param, track_id); - return HTTP_BADREQUEST; - } - - library_item_attrib_save(track_id, LIBRARY_ATTRIB_USERMARK, val); + library_item_attrib_save(track_id, track_attribs[i].type, val); } return HTTP_OK; diff --git a/src/library.c b/src/library.c index b9d4b32d..a21f22e5 100644 --- a/src/library.c +++ b/src/library.c @@ -667,7 +667,7 @@ item_attrib_save(void *arg, int *retval) switch (param->attrib) { case LIBRARY_ATTRIB_RATING: - if (param->value < 0 || param->value > DB_FILES_RATING_MAX) + if (param->value > DB_FILES_RATING_MAX) goto error; mfi->rating = param->value; @@ -679,26 +679,25 @@ item_attrib_save(void *arg, int *retval) break; case LIBRARY_ATTRIB_USERMARK: - if (param->value < 0) - goto error; - mfi->usermark = param->value; break; case LIBRARY_ATTRIB_PLAY_COUNT: - if (param->value < 0) - goto error; - mfi->play_count = param->value; break; case LIBRARY_ATTRIB_SKIP_COUNT: - if (param->value < 0) - goto error; - mfi->skip_count = param->value; break; + case LIBRARY_ATTRIB_TIME_PLAYED: + mfi->time_played = param->value; + break; + + case LIBRARY_ATTRIB_TIME_SKIPPED: + mfi->time_skipped = param->value; + break; + default: goto error; } diff --git a/src/library.h b/src/library.h index 82f0b166..9bb09bd2 100644 --- a/src/library.h +++ b/src/library.h @@ -53,6 +53,8 @@ enum library_attrib LIBRARY_ATTRIB_USERMARK, LIBRARY_ATTRIB_PLAY_COUNT, LIBRARY_ATTRIB_SKIP_COUNT, + LIBRARY_ATTRIB_TIME_PLAYED, + LIBRARY_ATTRIB_TIME_SKIPPED, }; /* From 3b28960675778bfa8a83f414d4868e10f9f6309c Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Thu, 17 Oct 2024 23:42:09 +0200 Subject: [PATCH 29/65] [docs] Document changing track attribs time_played/time_skipped --- docs/json-api.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/json-api.md b/docs/json-api.md index 3a531212..f12469bf 100644 --- a/docs/json-api.md +++ b/docs/json-api.md @@ -1622,7 +1622,7 @@ curl -X GET "http://localhost:3689/api/library/tracks/27/playlists" ### Update track properties -Change properties of one or more tracks (supported properties are "rating", "play_count", "skip_count" and "usermark") +Change properties of one or more tracks. **Endpoint** @@ -1636,6 +1636,8 @@ PUT /api/library/tracks | --------------- | -------- | ----------------------- | | tracks | array | Array of track objects | +See query parameters for update of a single track for a list of properties that can be modified. + **Response** On success returns the HTTP `204 No Content` success status response code. @@ -1666,6 +1668,8 @@ PUT /api/library/tracks/{id} | play_count | Either `increment` or `reset` or the new count. `increment` will increment `play_count` and update `time_played`, `reset` will set `play_count` and `skip_count` to zero and delete `time_played` and `time_skipped` | | skip_count | The new skip count | | usermark | The new usermark (>= 0) | +| time_played | Modify last played timestamp | +| time_skipped | Modify last skipped timestamp | **Response** From b39dfefd7254d66ccbb16f29ee966455cf310ad8 Mon Sep 17 00:00:00 2001 From: aaronk6 Date: Mon, 11 Nov 2024 22:32:55 +0100 Subject: [PATCH 30/65] [docs] Change cache_path to cache_dir --- docs/configuration.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 6d786a28..4cb3b61f 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -188,11 +188,11 @@ Specific IP address to which the server is bound. bind_address = "" ``` -### cache_path +### cache_dir -Full path to the cache database file. +Directory where the server keeps cached data. -**Default:** unset +**Default:** `"/var/cache/owntone"` ```conf cache_path = "" From fd0060b1993ad71974d47983dd0cf8922f526aed Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Tue, 12 Nov 2024 16:55:24 +0100 Subject: [PATCH 31/65] [docs] Reduce doc duplication between configuration.md and actual config file Link to the config file instead of repeating documentation, since keeping the two in sync is cumbersome maintaincewise. --- docs/configuration.md | 1414 +---------------------------------------- 1 file changed, 11 insertions(+), 1403 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 4cb3b61f..1f471a29 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1,25 +1,9 @@ # Configuration -The configuration of OwnTone - usually located in `/etc/owntone.conf` - is split into multiple sections: - -- [`general`](#general-settings) - Main settings of OwnTone. -- [`library`](#library-settings) - Settings of local library. -- [`audio`](#local-audio-settings) - Settings for the local audio. -- [`alsa`](#per-alsa-device-settings) - Settings for ALSA devices. -- [`fifo`](#fifo-settings) - Settings for named pipe. -- [`airplay_shared`](#shared-airplay-settings) - Settings shared across AirPlay devices. -- [`airplay`](#per-airplay-device-settings) - Settings for a specific AirPlay device. -- [`chromecast`](#per-chromecast-device-settings) - Settings for a specific Chromecast device. -- [`spotify`](#spotify-settings) - Settings for the Spotify playback. -- [`rcp`](#rcproku-soundbridge-settings) - Settings for RCP / Roku Soundbridge devices. -- [`mpd`](#mpd-settings) - Settings for MPD clients. -- [`sqlite`](#sqlite-settings) - Settings for SQLite operation. -- [`streaming`](#streaming-settings) - Settings for the streaming. +The configuration of OwnTone is usually located in `/etc/owntone.conf`. ## Format -Each section consists of a name enclosing settings within parentheses. - Each setting consists of a name and a value. There are different types of settings: string, integer, boolean, and list. Comments are preceded by a hash sign. @@ -40,1402 +24,26 @@ section { } ``` -**Note:** For a regular use, the most important settings are: - -- the `directories` (see [`library`](#library-settings) section), which should be the location of your media, and -- the `uid` (see [`general`](#general-settings) section), which must have read access to those directories. - -## General Settings +Some settings are device specific, in which case you add a section where you specify the device name in the heading. Say you're tired of loud death metal coming from your teenager's room: ```conf -general { - … +airplay "Jared's Room" { + max_volume = 3 } ``` -The `general` section accepts the settings below. +## Most important settings -### uid +### general: uid Identifier of the user running OwnTone. -**Notes:** +Make sure that this user has read access to your configuration of `directories` in the `library` config section, and has write access to the database (`db_path`), cache directory (`cache_dir`) and log file (`logfile`). If you plan on using local audio then the user must also have access to that. -- Make sure that this user has read access to the `directories` ([`library`](#library-settings) section) section and write access to the database (`db_path`), log file (`logfile`) and local audio ([`audio`](#local-audio-settings) section). -- This setting is mandatory. +### library: directories -**Default:** `"nobody"` +Path to the directory or directories containing the media to index (your library). -```conf -uid = "" -``` +## Other settings -### db_path - -Full path to the database file. - -**Note:** This setting is mandatory. - -**Default:** `"/var/cache/owntone/songs3.db"` - -```conf -db_path = "" -``` - -### db_backup_path - -Full path to the database file backup. - -**Note:** Backups are triggered from an API endpoint. - -**Default:** unset - -```conf -db_backup_path = "" -``` - -### logfile - -Full path to the log file. - -**Default:** `"/var/log/owntone.log"` - -```conf -logfile = "" -``` - -### loglevel - -Level of verbosity of the logging. - -**Note:** There are 6 levels of verbosity (hereunder from the less verbose to the most verbose). The level `log` is recommended for regular usage. - -**Valid values:** `fatal`, `log`, `warning`, `info`, `debug`, `spam` - -**Default:** `"log"` - -```conf -loglevel = "" -``` - -### admin_password - -Password for the web interface. - -**Note:** If a user is accessing the web interface from a device located in one of the `trusted_networks`, no password is required. - -**Default:** unset - -```conf -admin_password = "" -``` - -### websocket_port - -Port number used to answer requests from the web interface. - -**Default:** `3688` - -```conf -websocket_port = -``` - -### websocket_interface - -Network interface on which the web socket is listening: e.g., eth0, en0. - -**Note:** When this setting is unset, it means that the web socket listens on all available interfaces. - -**Default:** unset - -```conf -websocket_interface = "" -``` - -### trusted_networks - -List of networks considered safe to access OwnTone without authorisation (see also `admin_password`). - -**Note:** This applies to these client types: remotes, DAAP clients (e.g., Apple Music, iTunes) and the web interface. - -**Valid values:** `any`, `localhost`, or the prefix to one or more IP networks. - -**Default:** `{ "localhost", "192.168", "fd" }` - -```conf -trusted_networks = { <"any"|"localhost"|"ip-range-prefix">, <...> } -``` - -### ipv6 - -Flag to indicate whether or not IPv6 must used. - -**Default:** `true` - -```conf -ipv6 = -``` - -### bind_address - -Specific IP address to which the server is bound. - -**Note:** It can be an IPv4 or IPv6 address and by default the server listens on all IP addresses. - -**Default:** unset - -```conf -bind_address = "" -``` - -### cache_dir - -Directory where the server keeps cached data. - -**Default:** `"/var/cache/owntone"` - -```conf -cache_path = "" -``` - -### cache_daap_threshold - -Threshold in milliseconds for DAAP requests. - -**Note:** Set to `0` to disable caching. - -**Default:** `1000` - -```conf -cache_daap_threshold = -``` - -### speaker_autoselect - -Flag to automatically select the speaker when starting the playback if none of the previously selected speakers / outputs are available. - -**Default:** `false` - -```conf -speaker_autoselect = -``` - -### high_resolution_clock - -Flag to indicate whether or not the high-resolution clock must be set. - -**Note:** Most modern operating systems have a high-resolution clock, but if OwnTone is running on an unusual platform and drop-outs are experienced, this setting set to `true`. - -**Default:** `false` on FreeBSD-based operating systems, `true` otherwise - -```conf -high_resolution_clock = -``` - -## Library Settings - -```conf -library { - … -} -``` - -The `library` section accepts the settings below. - -### name - -Name of the library as displayed by the clients. - -**Notes:** - -- If you change the name after pairing with Remote you may have to redo the pairing. -- The place holder `%h` can be used to display the hostname. - -**Default:** `"My Music on %h"` - -```conf -name = "" -``` - -### port - -TCP port to listen on. - -**Default:** `3689` - -```conf -port = 3689 -``` - -### password - -Password for the library. - -**Default:** unset - -```conf -password = "" -``` - -### directories - -Path to the directories containing the media to index. - -**Default:** unset - -```conf -directories = { "", "<...>" } -``` - -### follow_symlinks - -Flag to indicate whether or not symbolic links must be followed. - -**Default:** `true`. - -```conf -follow_symlinks = -``` - -### podcasts - -List of directories containing podcasts. - -**Note:** For each directory that is indexed, the path is matched against these names. If there is a match, all items in the directory are marked as podcasts. If you index `/srv/music`, and your podcasts are in `/srv/music/Podcasts`, then you can set this to `{ "/Podcasts" }`. Changing this setting only takes effect after a rescan. - -**Default:** unset - -```conf -podcasts = { "", "<...>" } -``` - -### audiobooks - -List of directories containing audiobooks. - -**Note:** For each directory that is indexed, the path is matched against these names. If there is a match, all items in the directory are marked as audiobooks. If you index `/srv/music`, and your podcasts are in `/srv/music/Audiobooks`, then you can set this to `{ "/Audiobooks" }`.Changing this setting only takes effect after a rescan. - -**Default:** unset - -```conf -audiobooks = { "/Audiobooks" } -``` - -### compilations - -List of directories containing compilations: e.g., greatest hits, best of, soundtracks. - -**Note:** For each directory that is indexed, the path is matched against these names. If there is a match, all items in the directory are marked as compilations.Changing this setting only takes effect after a rescan. - -**Default:** unset - -```conf -compilations = { "/Compilations" } -``` - -### compilation_artist - -Artist name of compilation albums. - -**Note:** Compilations usually have multiple artists, and sometimes may have no album artist. If you don't want every artist to be listed, you can set a single name which will be used for all compilation tracks without an album artist, and for all tracks in the compilation directories. Changing this setting only takes effect after a rescan. - -**Default:** unset - -```conf -compilation_artist = "" -``` - -### hide_singles - -Flag to indicate whether or not single albums must be hidden. - -**Note:** If your album and artist lists are cluttered, you can choose to hide albums and artists with only one track. The tracks will still be visible in other lists, e.g., tracks and playlists. This setting currently only works with some remotes. - -**Default:** `false` - -```conf -hide_singles = -``` - -### radio_playlists - -Flag to show internet streams in normal playlists. - -**Note:** By default the internet streams are shown in the "Radio" library, like iTunes does. However, some clients (like TunesRemote+) won't show the "Radio" library. - -**Default:** `false` - -```conf -radio_playlists = -``` - -### name_library - -Name of the default playlist _Library_. - -**Note:** This is a default playlist, which can be renamed with this setting. - -**Default:** `"Library"` - -```conf -name_library = "" -``` - -### name_music - -Name of the default playlist _Music_. - -**Note:** This is a default playlist, which can be renamed with this setting. - -**Default:** `"Music"` - -```conf -name_music = "" -``` - -### name_movies - -Name of the default playlist _Movies_. - -**Note:** This is a default playlist, which can be renamed with this setting. - -**Default:** `"Movies"` - -```conf -name_movies = "" -``` - -### name_tvshows - -Name of the default playlist _TV Shows_. - -**Note:** This is a default playlist, which can be renamed with this setting. - -**Default:** `"TV Shows"` - -```conf -name_tvshows = "" -``` - -### name_podcasts - -Name of the default playlist _Podcasts_. - -**Note:** This is a default playlist, which can be renamed with this setting. - -**Default:** `"Podcasts"` - -```conf -name_podcasts = "" -``` - -### name_audiobooks - -Name of the default playlist _Audiobooks_. - -**Note:** This is a default playlist, which can be renamed with this setting. - -**Default:** `"Audiobooks"` - -```conf -name_audiobooks = "" -``` - -### name_radio - -Name of the default playlist _Radio_. - -**Note:** This is a default playlist, which can be renamed with this setting. - -**Default:** `"Radio"` - -```conf -name_radio = "" -``` - -### name_unknown_title - -Name of tracks having an undefined title. - -**Default:** `"Unknown title"` - -```conf -name_unknown_title = "" -``` - -### name_unknown_artist - -Name of artist having an undefined name. - -**Default:** `"Unknown artist"` - -```conf -name_unknown_artist = "" -``` - -### name_unknown_album - -Name of album having an undefined title. - -**Default:** `"Unknown album"` - -```conf -name_unknown_album = "" -``` - -### name_unknown_genre - -Name of genre having an undefined name. - -**Default:** `"Unknown genre"` - -```conf -name_unknown_genre = "" -``` - -### name_unknown_composer - -Name of composer having an undefined name. - -**Default:** `"Unknown composer"` - -```conf -name_unknown_composer = "" -``` - -### artwork_basenames - -List of base names for artwork files (file names without extension). - -**Note:** - -- OwnTone searches for JPEG and PNG files with these base names. -- More information regarding artwork can be found [here](artwork.md). - -**Default:** `{ "artwork", "cover", "Folder" }` - -```conf -artwork_basenames = { "", "<...>" } -``` - -### artwork_individual - -Flag to indicate whether or not the search for artwork corresponding to each individual media file must be done instead of only looking for the album artwork. - -**Notes:** - -- Disable this setting to reduce cache size. -- More information regarding artwork can be found [here](artwork.md). - -**Default:** `false` - -```conf -artwork_individual = -``` - -### artwork_online_sources - -List of online resources for artwork. - -**Notes:** - -- More information regarding artwork can be found [here](artwork.md). - -**Default:** unset - -```conf -artwork_online_sources = { "", "<...>"} -``` - -### filetypes_ignore - -List of file types ignored by the scanner. - -**Note:** Non-audio files will never be added to the database, but here you can prevent the scanner from even probing them. This might reduce scan time. - -**Default:** `{ ".db", ".ini", ".db-journal", ".pdf", ".metadata" }` - -```conf -filetypes_ignore = { "", "<...>" } -``` - -### filepath_ignore - -List of paths ignored by the scanner. - -**Note:** If you want to exclude files on a more advanced basis you can enter one or more POSIX regular expressions, and any file with a matching path will be ignored. - -**Default:** unset - -```conf -filepath_ignore = { "" } -``` - -### filescan_disable - -Flag to indicate whether or not the startup file scanning must be disabled. - -**Note:** When OwnTone starts it will do an initial file scan of the library and then watch it for changes. If you are sure your library never changes while OwnTone is not running, you can disable the initial file scan and save some system ressources. Disabling this scan may lead to OwnTone's database coming out of sync with the library. If that happens read the instructions in the README on how to trigger a rescan. - -**Default:** `false` - -```conf -filescan_disable = -``` - -### only_first_genre - -Flag to indicate whether or not the first genre only found in metadata must be displayed. - -**Note:** Some tracks have multiple genres separated by semicolon in the same tag, e.g., 'Pop;Rock'. If you don't want them listed like this, you can enable this setting and only the first genre will be used (i.e. 'Pop'). - -**Default:** `false` - -```conf -only_first_genre = -``` - -### m3u_overrides - -Flag to indicate whether or not the metadata provided by radio streams must be overridden by metadata from m3u playlists, e.g., artist and title in EXTINF. - -**Default:** `false` - -```conf -m3u_overrides = -``` - -### itunes_overrides - -Flag to indicate whether or not the library metadata must be overridden by iTunes metadata. - -**Default:** `false` - -```conf -itunes_overrides = -``` - -### itunes_smartpl - -Flag to import Should we import the content of iTunes smart playlists. - -**Default:** `false` - -```conf -itunes_smartpl = -``` - -### no_decode - -List of formats that are never decoded. - -**Note:** Decoding options for DAAP and RSP clients. Since iTunes has native support for mpeg, mp4a, mp4v, alac and wav, such files will be sent as they are. Any other formats will be decoded to raw wav. If OwnTone detects a non-iTunes DAAP client, it is assumed to only support mpeg and wav, other formats will be decoded. Here you can change when to decode. Note that these settings only affect serving media to DAAP and RSP clients, they have no effect on direct AirPlay, Chromecast and local audio playback - -**Valid values:** `mp4a`, `mp4v`, `mpeg`, `alac`, `flac`, `mpc`, `ogg`, `wma`, `wmal`, `wmav`, `aif`, `wav`. - -**Default:** unset - -```conf -no_decode = { "", "<...>" } -``` - -### force_decode - -List of formats that are always decoded. - -**Note:** See note for `no_decode` setting. - -**Valid values:** `mp4a`, `mp4v`, `mpeg`, `alac`, `flac`, `mpc`, `ogg`, `wma`, `wmal`, `wmav`, `aif`, `wav`. - -**Default:** unset - -```conf -force_decode = { "", "<...>" } -``` - -### prefer_format - -Preferred format to be used. - -**Default:** unset - -```conf -prefer_format = "" -``` - -### decode_audio_filters - -List of audio filters used at decoding time. - -**Note:** These filters are ffmpeg filters: i.e. similar to those specified on the command line `ffmpeg -af `. Examples: `"volume=replaygain=track"` to use replay gain of the track metadata, or `loudnorm=I=-16:LRA=11:TP=-1.5` to normalise volume. - -**Default:** unset - -```conf -decode_audio_filters = { "" } -``` - -### decode_video_filters - -List of video filters used at decoding time. - -**Note:** These filters are ffmpeg filters: i.e. similar to those specified on the command line `ffmpeg -vf `. - -**Default:** unset - -```conf -decode_video_filters = { "" } -``` - -### pipe_autostart - -Flag to indicate whether or not named pipes must start automatically when data is provided. - -**Note:** To exclude specific pipes from watching, consider using the `filepath_ignore` setting. - -```conf -pipe_autostart = true -``` - -### pipe_sample_rate - -Sampling rate of the pipe. - -**Default:** `44100`. - -```conf -pipe_sample_rate = -``` - -### pipe_bits_per_sample - -Bits per sample of the pipe. - -**Default:** `16` - -```conf -pipe_bits_per_sample = -``` - -### rating_updates - -Flag to indicate whether or not ratings are automatically updated. - -**Note:** When enabled, the rating is automatically updated after a song has either been played or skipped (only skipping to the next song is taken into account). The calculation is taken from the beets plugin "mpdstats" (see [here](https://beets.readthedocs.io/en/latest/plugins/mpdstats.html)). It consists of calculating a stable rating based only on the play and skip count and a rolling rating based on the current rating and the action (played or skipped). Both results are combined with a mix factor of 0.75. **Formula:** new rating = 0.75 × stable rating + 0.25 × rolling rating - -**Default:** `false` - -```conf -rating_updates = -``` - -### read_rating - -Flag to indicate whether or not the rating is read from media file metadata. - -**Default:** `false` - -```conf -read_rating = -``` - -### write_rating - -Flag to indicate whether or not the rating is written back to the file metadata. - -**Note:** By default, ratings are only saved in the database. To avoid excessive writing to the library, automatic rating updates are not written, even with the write_rating setting enabled. - -**Default:** `false` - -```conf -write_rating = -``` - -### max_rating - -Scale used when reading and writing ratings to media files. - -**Default:** `100` - -```conf -max_rating = -``` - -### allow_modifying_stored_playlists - -Flag to indicate whether or not M3U playlists can be created, modified, or deleted in the playlist directories. - -**Note:** This setting is only supported through the web interface and some MPD clients. - -**Default:** `false` - -```conf -allow_modifying_stored_playlists = false -``` - -### default_playlist_directory - -Name of the directory in one of the library directories that will be used as the default playlist directory. - -**Note:** OwnTone creates new playlists in this directory. This setting requires `allow_modify_stored_playlists` set to true. - -**Default:** unset - -```conf -default_playlist_directory = "" -``` - -### clear_queue_on_stop_disable - -Flag to indicate whether or not the queue is cleared when the playback is stopped. - -**Note:** By default OwnTone will, like iTunes, clear the play queue if playback stops. Setting clear_queue_on_stop_disable to true will keep the playlist like MPD does. Moreover, some dacp clients do not show the play queue if playback is stopped. - -**Default:** `false` - -```conf -clear_queue_on_stop_disable = -``` - -## Local Audio Settings - -```conf -audio { - … -} -``` - -The `audio` section is meant to configure the local audio output. It accepts the settings below. - -### nickname - -Name appearing in the speaker list. - -**Default:** `"Computer"` - -```conf -nickname = "Computer" -``` - -### type - -Type of the output. - -**Valid values:** `alsa`, `pulseaudio`, `dummy`, `disabled` - -**Default:** unset - -```conf -type = "" -``` - -- `server` - For pulseaudio output, an optional server hostname or IP can be specified (e.g. "localhost"). If not set, connection is made via local socket. - -**Default:** unset - -```conf -server = "" -``` - -- `card` - Name of the local audio PCM device. - -**Note:** ALSA only. - -**Default:** `"default"` - -```conf -card = "" -``` - -### mixer - -Mixer channel used for volume control. - -**Note:** Usable with ALSA only. If not set, PCM will be used if available, otherwise Master. - -**Default:** unset - -```conf -mixer = "" -``` - -### mixer_device - -Name of the mixer device to use for volume control. - -**Note:** Usable with ALSA only. - -**Default:** unset - -```conf -mixer_device = "" -``` - -### sync_disable - -Flag to indicate whether or not audio resampling has to be enabled to keep local audio in sync with, for example, AirPlay. - -**Note:** This feature relies on accurate ALSA measurements of delay, and some devices don't provide that. If that is the case you are better off disabling the feature. - -**Default:** `false` - -```conf -sync_disable = -``` - -### offset_ms - -Start delay in milliseconds relatively to other speakers, for example AirPlay. - -**Note:** Negative values correspond to moving local audio ahead, positive correspond to delaying it. - -**Valid values:** -1000 to 1000 - -**Default:** `0` - -```conf -offset_ms = 0 -``` - -### adjust_period_seconds - -Period in seconds used to collect measurements for drift and latency adjustments. - -**Note:** To calculate if resampling is required and if yes what value, local audio delay is measured each second. After a period the collected measurements are used to estimate drift and latency, which determines if corrections are required. - -**Default:** `100` - -```conf -adjust_period_seconds = -``` - -## Per ALSA Device Settings - -```conf -alsa "" { - …. -} -``` - -Each `alsa` section is meant to configure a named ALSA output: one named section per device. It accepts the settings below. - -**Note:** Make sure to set the `""` correctly. Moreover, these settings will override the ALSA settings in the `audio` section above. - -### nickname - -Name appearing in the speaker list. - -**Default:** `""` - -```conf -nickname = "" -``` - -### mixer - -Mixer channel used for volume control. - -**Note:** If not set, PCM will be used if available, otherwise Master. - -```conf -mixer = "" -``` - -### mixer_device - -Name of the mixer device to use for volume control. - -**Default:** `""` - -```conf -mixer_device = "" -``` - -### offset_ms - -Start delay in milliseconds relatively to other speakers, for example AirPlay. - -**Note:** Negative values correspond to moving local audio ahead, positive correspond to delaying it. - -**Valid values:** -1000 to 1000 - -**Default:** `0` - -```conf -offset_ms = 0 -``` - -## FIFO Settings - -```conf -fifo { - -} -``` - -The `fifo` section, is meant to configure the named pipe audio output. It accepts the settings below. - -### nickname - -The name appearing in the speaker list. - -**Default:** `"fifo"` - -```conf -nickname = "" -``` - -### path - -Path to the named pipe. - -**Default:** unset - -```conf -path = "" -``` - -## Shared AirPlay Settings - -```conf -airplay_shared { - … -} -``` - -The `airplay_shared` section describes the settings that are shared across all the AirPlay devices. - -### control_port - -Number of the UDP control port used when AirPlay devices make connections back to OwnTone. - -**Note:** Choosing specific ports may be helpful when running OwnTone behind a firewall. - -**Default:** `0` - -```conf -control_port = 0 -``` - -### timing_port - -Number of the UDP timing port used when AirPlay devices make connections back to OwnTone. - -**Note:** Choosing specific ports may be helpful when running OwnTone behind a firewall. - -**Default:** `0` - -```conf -timing_port = 0 -``` - -### uncompressed_alac - -Switch AirPlay 1 streams to uncompressed ALAC (as opposed to regular, compressed ALAC). Reduces CPU use at the cost of network bandwidth. - -**Default:** `false` - -```conf -uncompressed_alac = -``` - -## Per AirPlay Device Settings - -```conf -airplay "" { - -} -``` - -Each `airplay` section is meant to configure a named AirPlay output: one named section per device. It accepts the settings below. - -**Note:** The capitalisation of the device name is relevant. - -### max_volume - -Maximum value of the volume. - -**Note:** If that's more than your setup can handle set a lower value. - -**Default:** `11` - -```conf -max_volume = -``` - -### exclude - -Flag indicating if the device must be excluded from the speaker list. - -**Default:** `false` - -```conf -exclude = -``` - -### permanent - -Flag to indicate to keep the device in the speaker list and thus ignore mdns notifications about it no longer being present. The speaker will remain until restart of OwnTone. - -**Default:** `false` - -```conf -permanent = -``` - -### reconnect - -Flag to indicate whether or not OwnTone must explicitly reconnect with the device. - -**Note:** Some devices spuriously disconnect during playback, and based on the device type OwnTone may attempt to reconnect. - -**Default:** `false` - -```conf -reconnect = -``` - -### password - -- ``- Password of the device. - -**Default:** unset - -```conf -password = "" -``` - -### raop_disable - -Flag to indicate whether or not AirPlay 1 (RAOP) must be disabled. - -**Default:** `false` - -```conf -raop_disable = -``` - -### nickname - -Name appearing in the speaker list. - -**Note:** The defined name overrides the name of the device. - -**Default:** unset - -```conf -nickname = "" -``` - -## Per Chromecast Device Settings - -```conf -chromecast "" { - … -} -``` - -Each `chromecast` section is meant to configure a named Chromecast output: one named section per device. It accepts the settings below. - -**Note:** The capitalisation of the device name is relevant. - -### max_volume - -Maximum value of the volume. - -**Note:** If that's more than your setup can handle set a lower value. - -**Default:** `11` - -```conf -max_volume = -``` - -### exclude - -Flag indicating if the device must be excluded from the speaker list. - -**Default:** `false` - -```conf -exclude = -``` - -### nickname - -Name appearing in the speaker list. - -**Note:** The defined name overrides the name of the device. - -**Default:** unset - -```conf -nickname = "" -``` - -## Spotify Settings - -```conf -spotify { - … -} -``` - -The `spotify` section accepts the settings below. - -**Note:** These settings only have effect if OwnTone is built with Spotify support. - -### bitrate - -Bit rate of the stream. - -**Valid values:** `0` (No preference), `1` (96 kb/s), `2` (160 kb/s), `3` (320 kb/s) - -**Default:** `0` - -```conf -bitrate = <0|1|2|3> -``` - -### base_playlist_disable - -Flag to indicate whether or not Spotify playlists are placed into the library playlist folder. - -**Note:** Spotify playlists are by default located in a _Spotify_ playlist folder. - -**Default:** `false` - -```conf -base_playlist_disable = -``` - -### artist_override - -Flag indicating whether or not the compilation artist must be used as the album artist. - -**Note:** Spotify playlists usually have many artists, and if you don't want every artist to be listed when artist browsing in Remote, you can set this flag to true. - -**Default:** `false` - -```conf -artist_override = -``` - -### album_override - -Flag to indicate to use the playlist name as the album name. - -**Note:** Similar to the different artists in Spotify playlists, the playlist items belong to different albums, and if you do not want every album to be listed when browsing in Remote, you can set the album_override flag to true. Moreover, if an item is in more than one playlist, it will only appear randomly in one album when browsing. - -**Default:** `false` - -```conf -album_override = -``` - -## RCP/Roku Soundbridge Settings - -```conf -rcp "" { - -} -``` - -Each `rcp` section is meant to configure a named RCP output: one named section per device. It accepts the settings below. - -**Note:** The capitalisation of the device name is relevant. - -### exclude - -Enable this option to exclude the device from the speaker list. - -**Default:** `false` - -```conf -exclude = -``` - -### clear_on_close - -Flag indicating whether or not the power on the device is maintained. - -**Note:** A Roku / SoundBridge can power up in 2 modes: (default) reconnect to the previously used library (i.e. OwnTone) or in a _cleared library_ mode. The Roku power up behaviour is affected by how OwnTone disconnects from the Roku device. Set to false to maintain the default Roku _power on_ behaviour. - -**Default:** `false` - -```conf -clear_on_close = false -``` - -## MPD Settings - -```conf -mpd { - … -} -``` - -The `mpd` section defines the settings for MPD clients. It accepts the settings below. - -**Note:** These settings only have effect if OwnTone is built with Spotify support. - -### port - -TCP port to listen for MPD client requests. - -**Note:** Setting the port to `0` disables the support for MPD. - -**Default:** `6600` - -```conf -port = 6600 -``` - -### http_port - -HTTP port to listen for artwork requests. - -**Notes:** - -- This setting is only supported by some MPD clients and will need additional configuration in the MPD client to work. -- Setting the port to `0` disables the serving of artwork. - -**Default:** `0` - -```conf -http_port = 0 -``` - -## SQLite Settings - -```conf -sqlite { - … -} -``` - -The `sqlite` section defines how the SQLite database operates and accepts the settings below. - -**Note:** Make sure to read the SQLite documentation for the corresponding PRAGMA statements as changing them from the defaults may increase the possibility of database corruption. By default, the SQLite default values are used. - -### pragma_cache_size_library - -Cache size in number of database pages for the library database. - -**Note:** SQLite default page size is 1024 bytes and cache size is 2000 pages. - -```conf -pragma_cache_size_library = -``` - -### pragma_cache_size_cache - -Cache size in number of db pages for the cache database. - -**Note:** SQLite default page size is 1024 bytes and cache size is 2000 pages. - -```conf -pragma_cache_size_cache = -``` - -### pragma_journal_mode - -Sets the journal mode for the database. Valid values are: `DELETE`, `TRUNCATE`, `PERSIST`, `MEMORY`, `WAL`, and `OFF`. - -**Default:** `"DELETE"` - -```conf -pragma_journal_mode = "" -``` - -### pragma_synchronous - -Change the setting of the "synchronous" flag. - -**Valid values:** `0` (off), `1` (normal), `2` (full) - -**Default:** `2` - -```conf -pragma_synchronous = <0|1|2> -``` - -### pragma_mmap_size_library - -Number of bytes set aside for memory-mapped I/O for the library database. - -**Notes:** This setting requires SQLite 3.7.17+. - -**Valid values:** `0` (mmap disabled), `` (bytes for mmap) - -**Default:** `0` - -```conf -pragma_mmap_size_library = -``` - -### pragma_mmap_size_cache - -Number of bytes set aside for memory-mapped I/O for the cache database. - -**Note:** This setting requires SQLite 3.7.17+. - -**Valid values:** `0` (mmap disabled), `` (bytes for mmap) - -```conf -pragma_mmap_size_cache = -``` - -### vacuum - -Flag indicating whether or not the database must be vacuumed on startup. - -**Note:** This setting increases the startup time, but may reduce database size. - -**Default:** `true` - -```conf -vacuum = -``` - -## Streaming Settings - -```conf -streaming { - … -} -``` - -The `streaming` section defines the audio settings for the streaming URL (`http://:/stream.mp3`) and accepts the settings below. - -### sample_rate - -Sampling rate of the stream: e.g., 44100, 48000, etc. - -**Default:** `44100` - -```conf -sample_rate = -``` - -### bit_rate - -Bit rate of the stream (in kb/s). - -**Valid values:** `64`, `96`, `128`, `192`, and `320`. - -**Default:** `192` - -```conf -bit_rate = <64|96|128|192|320> -``` - -### icy_metaint - -Number of bytes of media stream data between each metadata chunk. - -**Default:** `16384` - -```conf -icy_metaint = -``` +See the [template configuration file](https://raw.githubusercontent.com/owntone/owntone-server/refs/heads/master/owntone.conf.in) for a description of all the settings. From 74ce03deed7e72bd57af04cde44147c1d6c3d7bc Mon Sep 17 00:00:00 2001 From: Alain Nussbaumer Date: Thu, 5 Dec 2024 01:04:54 +0100 Subject: [PATCH 32/65] [web] Fix security warnings --- web-src/package-lock.json | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/web-src/package-lock.json b/web-src/package-lock.json index e149775a..5d09a858 100644 --- a/web-src/package-lock.json +++ b/web-src/package-lock.json @@ -641,13 +641,13 @@ } }, "node_modules/@intlify/core-base": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.0.tgz", - "integrity": "sha512-zJn0imh9HIsZZUtt9v8T16PeVstPv6bP2YzlrYJwoF8F30gs4brZBwW2KK6EI5WYKFi3NeqX6+UU4gniz5TkGg==", + "version": "9.14.2", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.2.tgz", + "integrity": "sha512-DZyQ4Hk22sC81MP4qiCDuU+LdaYW91A6lCjq8AWPvY3+mGMzhGDfOCzvyR6YBQxtlPjFqMoFk9ylnNYRAQwXtQ==", "license": "MIT", "dependencies": { - "@intlify/message-compiler": "9.14.0", - "@intlify/shared": "9.14.0" + "@intlify/message-compiler": "9.14.2", + "@intlify/shared": "9.14.2" }, "engines": { "node": ">= 16" @@ -657,12 +657,12 @@ } }, "node_modules/@intlify/message-compiler": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.0.tgz", - "integrity": "sha512-sXNsoMI0YsipSXW8SR75drmVK56tnJHoYbPXUv2Cf9lz6FzvwsosFm6JtC1oQZI/kU+n7qx0qRrEWkeYFTgETA==", + "version": "9.14.2", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.2.tgz", + "integrity": "sha512-YsKKuV4Qv4wrLNsvgWbTf0E40uRv+Qiw1BeLQ0LAxifQuhiMe+hfTIzOMdWj/ZpnTDj4RSZtkXjJM7JDiiB5LQ==", "license": "MIT", "dependencies": { - "@intlify/shared": "9.14.0", + "@intlify/shared": "9.14.2", "source-map-js": "^1.0.2" }, "engines": { @@ -673,9 +673,9 @@ } }, "node_modules/@intlify/shared": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.0.tgz", - "integrity": "sha512-r+N8KRQL7LgN1TMTs1A2svfuAU0J94Wu9wWdJVJqYsoMMLIeJxrPjazihfHpmJqfgZq0ah3Y9Q4pgWV2O90Fyg==", + "version": "9.14.2", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.2.tgz", + "integrity": "sha512-uRAHAxYPeF+G5DBIboKpPgC/Waecd4Jz8ihtkpJQD5ycb5PwXp0k/+hBGl5dAjwF7w+l74kz/PKA8r8OK//RUw==", "license": "MIT", "engines": { "node": ">= 16" @@ -1447,9 +1447,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -3204,13 +3204,13 @@ } }, "node_modules/vue-i18n": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.0.tgz", - "integrity": "sha512-LxmpRuCt2rI8gqU+kxeflRZMQn4D5+4M3oP3PWZdowW/ePJraHqhF7p4CuaME52mUxdw3Mmy2yAUKgfZYgCRjA==", + "version": "9.14.2", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.2.tgz", + "integrity": "sha512-JK9Pm80OqssGJU2Y6F7DcM8RFHqVG4WkuCqOZTVsXkEzZME7ABejAUqUdA931zEBedc4thBgSUWxeQh4uocJAQ==", "license": "MIT", "dependencies": { - "@intlify/core-base": "9.14.0", - "@intlify/shared": "9.14.0", + "@intlify/core-base": "9.14.2", + "@intlify/shared": "9.14.2", "@vue/devtools-api": "^6.5.0" }, "engines": { From 2f8b007d327b56e217507f9ddc77a4def3ebf818 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:05:23 +0000 Subject: [PATCH 33/65] [web] Rebuild web interface --- htdocs/assets/index.js | 58 +++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/htdocs/assets/index.js b/htdocs/assets/index.js index 06db1a24..a62a13eb 100644 --- a/htdocs/assets/index.js +++ b/htdocs/assets/index.js @@ -2,70 +2,70 @@ * @vue/shared v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function _l(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const ot={},is=[],mn=()=>{},yz=()=>!1,Ai=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ju=e=>e.startsWith("onUpdate:"),wt=Object.assign,Qu=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},zz=Object.prototype.hasOwnProperty,tt=(e,t)=>zz.call(e,t),ze=Array.isArray,as=e=>Ss(e)==="[object Map]",Ro=e=>Ss(e)==="[object Set]",dm=e=>Ss(e)==="[object Date]",vz=e=>Ss(e)==="[object RegExp]",Oe=e=>typeof e=="function",vt=e=>typeof e=="string",fr=e=>typeof e=="symbol",mt=e=>e!==null&&typeof e=="object",ed=e=>(mt(e)||Oe(e))&&Oe(e.then)&&Oe(e.catch),Th=Object.prototype.toString,Ss=e=>Th.call(e),bz=e=>Ss(e).slice(8,-1),Ah=e=>Ss(e)==="[object Object]",td=e=>vt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ls=_l(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),gl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Cz=/-(\w)/g,Yt=gl(e=>e.replace(Cz,(t,n)=>n?n.toUpperCase():"")),wz=/\B([A-Z])/g,dn=gl(e=>e.replace(wz,"-$1").toLowerCase()),Oi=gl(e=>e.charAt(0).toUpperCase()+e.slice(1)),ei=gl(e=>e?`on${Oi(e)}`:""),tn=(e,t)=>!Object.is(e,t),cs=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Ra=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ma=e=>{const t=vt(e)?Number(e):NaN;return isNaN(t)?e:t};let mm;const Ph=()=>mm||(mm=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),kz="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error",Sz=_l(kz);function ao(e){if(ze(e)){const t={};for(let n=0;n{if(n){const r=n.split(Ez);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function ke(e){let t="";if(vt(e))t=e;else if(ze(e))for(let n=0;nno(n,t))}const Lh=e=>!!(e&&e.__v_isRef===!0),y=e=>vt(e)?e:e==null?"":ze(e)||mt(e)&&(e.toString===Th||!Oe(e.toString))?Lh(e)?y(e.value):JSON.stringify(e,Nh,2):String(e),Nh=(e,t)=>Lh(t)?Nh(e,t.value):as(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[sc(r,s)+" =>"]=o,n),{})}:Ro(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>sc(n))}:fr(t)?sc(t):mt(t)&&!ze(t)&&!Ah(t)?String(t):t,sc=(e,t="")=>{var n;return fr(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +**//*! #__NO_SIDE_EFFECTS__ */function vl(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const st={},cs=[],fn=()=>{},kz=()=>!1,Li=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),rd=e=>e.startsWith("onUpdate:"),kt=Object.assign,od=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Sz=Object.prototype.hasOwnProperty,tt=(e,t)=>Sz.call(e,t),ze=Array.isArray,us=e=>$s(e)==="[object Map]",Vo=e=>$s(e)==="[object Set]",gm=e=>$s(e)==="[object Date]",xz=e=>$s(e)==="[object RegExp]",Oe=e=>typeof e=="function",bt=e=>typeof e=="string",hr=e=>typeof e=="symbol",ft=e=>e!==null&&typeof e=="object",sd=e=>(ft(e)||Oe(e))&&Oe(e.then)&&Oe(e.catch),Nh=Object.prototype.toString,$s=e=>Nh.call(e),Ez=e=>$s(e).slice(8,-1),Dh=e=>$s(e)==="[object Object]",id=e=>bt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ds=vl(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),bl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$z=/-(\w)/g,Xt=bl(e=>e.replace($z,(t,n)=>n?n.toUpperCase():"")),Tz=/\B([A-Z])/g,mn=bl(e=>e.replace(Tz,"-$1").toLowerCase()),Ni=bl(e=>e.charAt(0).toUpperCase()+e.slice(1)),ri=bl(e=>e?`on${Ni(e)}`:""),nn=(e,t)=>!Object.is(e,t),ms=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Ua=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ja=e=>{const t=bt(e)?Number(e):NaN;return isNaN(t)?e:t};let ym;const Mh=()=>ym||(ym=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),Az="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error",Oz=vl(Az);function co(e){if(ze(e)){const t={};for(let n=0;n{if(n){const r=n.split(Iz);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function ke(e){let t="";if(bt(e))t=e;else if(ze(e))for(let n=0;noo(n,t))}const Vh=e=>!!(e&&e.__v_isRef===!0),y=e=>bt(e)?e:e==null?"":ze(e)||ft(e)&&(e.toString===Nh||!Oe(e.toString))?Vh(e)?y(e.value):JSON.stringify(e,Hh,2):String(e),Hh=(e,t)=>Vh(t)?Hh(e,t.value):us(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[cc(r,s)+" =>"]=o,n),{})}:Vo(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>cc(n))}:hr(t)?cc(t):ft(t)&&!ze(t)&&!Dh(t)?String(t):t,cc=(e,t="")=>{var n;return hr(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** * @vue/reactivity v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let vn;class nd{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=vn,!t&&vn&&(this.index=(vn.scopes||(vn.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=vn;try{return vn=this,t()}finally{vn=n}}}on(){vn=this}off(){vn=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),co()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=eo,n=So;try{return eo=!0,So=this,this._runnings++,fm(this),this.fn()}finally{pm(this),this._runnings--,So=n,eo=t}}stop(){this.active&&(fm(this),pm(this),this.onStop&&this.onStop(),this.active=!1)}}function Iz(e){return e.value}function fm(e){e._trackId++,e._depsLength=0}function pm(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{n.dirty&&n.run()});t&&(wt(n,t),t.scope&&Dh(n,t.scope)),(!t||!t.lazy)&&n.run();const r=n.run.bind(n);return r.effect=n,r}function Nz(e){e.effect.stop()}let eo=!0,Yc=0;const Fh=[];function lo(){Fh.push(eo),eo=!1}function co(){const e=Fh.pop();eo=e===void 0?!0:e}function od(){Yc++}function sd(){for(Yc--;!Yc&&Xc.length;)Xc.shift()()}function Vh(e,t,n){if(t.get(e)!==e._trackId){t.set(e,e._trackId);const r=e.deps[e._depsLength];r!==t?(r&&Mh(r,e),e.deps[e._depsLength++]=t):e._depsLength++}}const Xc=[];function Hh(e,t,n){od();for(const r of e.keys()){let o;r._dirtyLevel{const n=new Map;return n.cleanup=e,n.computed=t,n},Fa=new WeakMap,xo=Symbol(""),Jc=Symbol("");function pn(e,t,n){if(eo&&So){let r=Fa.get(e);r||Fa.set(e,r=new Map);let o=r.get(n);o||r.set(n,o=Uh(()=>r.delete(n))),Vh(So,o)}}function kr(e,t,n,r,o,s){const i=Fa.get(e);if(!i)return;let a=[];if(t==="clear")a=[...i.values()];else if(n==="length"&&ze(e)){const l=Number(r);i.forEach((u,m)=>{(m==="length"||!fr(m)&&m>=l)&&a.push(u)})}else switch(n!==void 0&&a.push(i.get(n)),t){case"add":ze(e)?td(n)&&a.push(i.get("length")):(a.push(i.get(xo)),as(e)&&a.push(i.get(Jc)));break;case"delete":ze(e)||(a.push(i.get(xo)),as(e)&&a.push(i.get(Jc)));break;case"set":as(e)&&a.push(i.get(xo));break}od();for(const l of a)l&&Hh(l,4);sd()}function Dz(e,t){const n=Fa.get(e);return n&&n.get(t)}const Rz=_l("__proto__,__v_isRef,__isVue"),jh=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(fr)),hm=Mz();function Mz(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Xe(this);for(let s=0,i=this.length;s{e[t]=function(...n){lo(),od();const r=Xe(this)[t].apply(this,n);return sd(),co(),r}}),e}function Fz(e){fr(e)||(e=String(e));const t=Xe(this);return pn(t,"has",e),t.hasOwnProperty(e)}class Bh{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?Yh:Zh:s?Kh:Gh).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=ze(t);if(!o){if(i&&tt(hm,n))return Reflect.get(hm,n,r);if(n==="hasOwnProperty")return Fz}const a=Reflect.get(t,n,r);return(fr(n)?jh.has(n):Rz(n))||(o||pn(t,"get",n),s)?a:At(a)?i&&td(n)?a:a.value:mt(a)?o?ld(a):xs(a):a}}class Wh extends Bh{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const l=ro(s);if(!Po(r)&&!ro(r)&&(s=Xe(s),r=Xe(r)),!ze(t)&&At(s)&&!At(r))return l?!1:(s.value=r,!0)}const i=ze(t)&&td(n)?Number(n)e,vl=e=>Reflect.getPrototypeOf(e);function qi(e,t,n=!1,r=!1){e=e.__v_raw;const o=Xe(e),s=Xe(t);n||(tn(t,s)&&pn(o,"get",t),pn(o,"get",s));const{has:i}=vl(o),a=r?id:n?ud:_i;if(i.call(o,t))return a(e.get(t));if(i.call(o,s))return a(e.get(s));e!==o&&e.get(t)}function Gi(e,t=!1){const n=this.__v_raw,r=Xe(n),o=Xe(e);return t||(tn(e,o)&&pn(r,"has",e),pn(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Ki(e,t=!1){return e=e.__v_raw,!t&&pn(Xe(e),"iterate",xo),Reflect.get(e,"size",e)}function _m(e,t=!1){!t&&!Po(e)&&!ro(e)&&(e=Xe(e));const n=Xe(this);return vl(n).has.call(n,e)||(n.add(e),kr(n,"add",e,e)),this}function gm(e,t,n=!1){!n&&!Po(t)&&!ro(t)&&(t=Xe(t));const r=Xe(this),{has:o,get:s}=vl(r);let i=o.call(r,e);i||(e=Xe(e),i=o.call(r,e));const a=s.call(r,e);return r.set(e,t),i?tn(t,a)&&kr(r,"set",e,t):kr(r,"add",e,t),this}function ym(e){const t=Xe(this),{has:n,get:r}=vl(t);let o=n.call(t,e);o||(e=Xe(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&kr(t,"delete",e,void 0),s}function zm(){const e=Xe(this),t=e.size!==0,n=e.clear();return t&&kr(e,"clear",void 0,void 0),n}function Zi(e,t){return function(r,o){const s=this,i=s.__v_raw,a=Xe(i),l=t?id:e?ud:_i;return!e&&pn(a,"iterate",xo),i.forEach((u,m)=>r.call(o,l(u),l(m),s))}}function Yi(e,t,n){return function(...r){const o=this.__v_raw,s=Xe(o),i=as(s),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,u=o[e](...r),m=n?id:t?ud:_i;return!t&&pn(s,"iterate",l?Jc:xo),{next(){const{value:d,done:f}=u.next();return f?{value:d,done:f}:{value:a?[m(d[0]),m(d[1])]:m(d),done:f}},[Symbol.iterator](){return this}}}}function Lr(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Bz(){const e={get(s){return qi(this,s)},get size(){return Ki(this)},has:Gi,add:_m,set:gm,delete:ym,clear:zm,forEach:Zi(!1,!1)},t={get(s){return qi(this,s,!1,!0)},get size(){return Ki(this)},has:Gi,add(s){return _m.call(this,s,!0)},set(s,i){return gm.call(this,s,i,!0)},delete:ym,clear:zm,forEach:Zi(!1,!0)},n={get(s){return qi(this,s,!0)},get size(){return Ki(this,!0)},has(s){return Gi.call(this,s,!0)},add:Lr("add"),set:Lr("set"),delete:Lr("delete"),clear:Lr("clear"),forEach:Zi(!0,!1)},r={get(s){return qi(this,s,!0,!0)},get size(){return Ki(this,!0)},has(s){return Gi.call(this,s,!0)},add:Lr("add"),set:Lr("set"),delete:Lr("delete"),clear:Lr("clear"),forEach:Zi(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=Yi(s,!1,!1),n[s]=Yi(s,!0,!1),t[s]=Yi(s,!1,!0),r[s]=Yi(s,!0,!0)}),[e,n,t,r]}const[Wz,qz,Gz,Kz]=Bz();function bl(e,t){const n=t?e?Kz:Gz:e?qz:Wz;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(tt(n,o)&&o in r?n:r,o,s)}const Zz={get:bl(!1,!1)},Yz={get:bl(!1,!0)},Xz={get:bl(!0,!1)},Jz={get:bl(!0,!0)},Gh=new WeakMap,Kh=new WeakMap,Zh=new WeakMap,Yh=new WeakMap;function Qz(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ev(e){return e.__v_skip||!Object.isExtensible(e)?0:Qz(bz(e))}function xs(e){return ro(e)?e:Cl(e,!1,Vz,Zz,Gh)}function ad(e){return Cl(e,!1,Uz,Yz,Kh)}function ld(e){return Cl(e,!0,Hz,Xz,Zh)}function tv(e){return Cl(e,!0,jz,Jz,Yh)}function Cl(e,t,n,r,o){if(!mt(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=ev(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return o.set(e,a),a}function Sr(e){return ro(e)?Sr(e.__v_raw):!!(e&&e.__v_isReactive)}function ro(e){return!!(e&&e.__v_isReadonly)}function Po(e){return!!(e&&e.__v_isShallow)}function cd(e){return e?!!e.__v_raw:!1}function Xe(e){const t=e&&e.__v_raw;return t?Xe(t):e}function wl(e){return Object.isExtensible(e)&&Oh(e,"__v_skip",!0),e}const _i=e=>mt(e)?xs(e):e,ud=e=>mt(e)?ld(e):e;class Xh{constructor(t,n,r,o){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new hs(()=>t(this._value),()=>us(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=Xe(this);return(!t._cacheable||t.effect.dirty)&&tn(t._value,t._value=t.effect.run())&&us(t,4),dd(t),t.effect._dirtyLevel>=2&&us(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function nv(e,t,n=!1){let r,o;const s=Oe(e);return s?(r=e,o=mn):(r=e.get,o=e.set),new Xh(r,o,s||!o,n)}function dd(e){var t;eo&&So&&(e=Xe(e),Vh(So,(t=e.dep)!=null?t:e.dep=Uh(()=>e.dep=void 0,e instanceof Xh?e:void 0)))}function us(e,t=4,n,r){e=Xe(e);const o=e.dep;o&&Hh(o,t)}function At(e){return!!(e&&e.__v_isRef===!0)}function In(e){return Jh(e,!1)}function md(e){return Jh(e,!0)}function Jh(e,t){return At(e)?e:new rv(e,t)}class rv{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Xe(t),this._value=n?t:_i(t)}get value(){return dd(this),this._value}set value(t){const n=this.__v_isShallow||Po(t)||ro(t);t=n?t:Xe(t),tn(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:_i(t),us(this,4))}}function ov(e){us(e,4)}function bn(e){return At(e)?e.value:e}function sv(e){return Oe(e)?e():bn(e)}const iv={get:(e,t,n)=>bn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return At(o)&&!At(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function fd(e){return Sr(e)?e:new Proxy(e,iv)}class av{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>dd(this),()=>us(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function Qh(e){return new av(e)}function e_(e){const t=ze(e)?new Array(e.length):{};for(const n in e)t[n]=t_(e,n);return t}class lv{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 Dz(Xe(this._object),this._key)}}class cv{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function uv(e,t,n){return At(e)?e:Oe(e)?new cv(e):mt(e)&&arguments.length>1?t_(e,t,n):In(e)}function t_(e,t,n){const r=e[t];return At(r)?r:new lv(e,t,n)}const dv={GET:"get",HAS:"has",ITERATE:"iterate"},mv={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"};/** +**/let bn;class ad{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=bn,!t&&bn&&(this.index=(bn.scopes||(bn.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=bn;try{return bn=this,t()}finally{bn=n}}}on(){bn=this}off(){bn=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),mo()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=no,n=$o;try{return no=!0,$o=this,this._runnings++,zm(this),this.fn()}finally{vm(this),this._runnings--,$o=n,no=t}}stop(){this.active&&(zm(this),vm(this),this.onStop&&this.onStop(),this.active=!1)}}function Fz(e){return e.value}function zm(e){e._trackId++,e._depsLength=0}function vm(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{n.dirty&&n.run()});t&&(kt(n,t),t.scope&&Uh(n,t.scope)),(!t||!t.lazy)&&n.run();const r=n.run.bind(n);return r.effect=n,r}function Hz(e){e.effect.stop()}let no=!0,tu=0;const Wh=[];function uo(){Wh.push(no),no=!1}function mo(){const e=Wh.pop();no=e===void 0?!0:e}function cd(){tu++}function ud(){for(tu--;!tu&&nu.length;)nu.shift()()}function qh(e,t,n){if(t.get(e)!==e._trackId){t.set(e,e._trackId);const r=e.deps[e._depsLength];r!==t?(r&&Bh(r,e),e.deps[e._depsLength++]=t):e._depsLength++}}const nu=[];function Gh(e,t,n){cd();for(const r of e.keys()){let o;r._dirtyLevel{const n=new Map;return n.cleanup=e,n.computed=t,n},Ba=new WeakMap,To=Symbol(""),ru=Symbol("");function hn(e,t,n){if(no&&$o){let r=Ba.get(e);r||Ba.set(e,r=new Map);let o=r.get(n);o||r.set(n,o=Kh(()=>r.delete(n))),qh($o,o)}}function xr(e,t,n,r,o,s){const i=Ba.get(e);if(!i)return;let a=[];if(t==="clear")a=[...i.values()];else if(n==="length"&&ze(e)){const l=Number(r);i.forEach((u,m)=>{(m==="length"||!hr(m)&&m>=l)&&a.push(u)})}else switch(n!==void 0&&a.push(i.get(n)),t){case"add":ze(e)?id(n)&&a.push(i.get("length")):(a.push(i.get(To)),us(e)&&a.push(i.get(ru)));break;case"delete":ze(e)||(a.push(i.get(To)),us(e)&&a.push(i.get(ru)));break;case"set":us(e)&&a.push(i.get(To));break}cd();for(const l of a)l&&Gh(l,4);ud()}function Uz(e,t){const n=Ba.get(e);return n&&n.get(t)}const jz=vl("__proto__,__v_isRef,__isVue"),Zh=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(hr)),bm=Bz();function Bz(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Xe(this);for(let s=0,i=this.length;s{e[t]=function(...n){uo(),cd();const r=Xe(this)[t].apply(this,n);return ud(),mo(),r}}),e}function Wz(e){hr(e)||(e=String(e));const t=Xe(this);return hn(t,"has",e),t.hasOwnProperty(e)}class Yh{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?n_:t_:s?e_:Qh).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=ze(t);if(!o){if(i&&tt(bm,n))return Reflect.get(bm,n,r);if(n==="hasOwnProperty")return Wz}const a=Reflect.get(t,n,r);return(hr(n)?Zh.has(n):jz(n))||(o||hn(t,"get",n),s)?a:Ot(a)?i&&id(n)?a:a.value:ft(a)?o?fd(a):Ts(a):a}}class Xh extends Yh{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const l=so(s);if(!No(r)&&!so(r)&&(s=Xe(s),r=Xe(r)),!ze(t)&&Ot(s)&&!Ot(r))return l?!1:(s.value=r,!0)}const i=ze(t)&&id(n)?Number(n)e,kl=e=>Reflect.getPrototypeOf(e);function Yi(e,t,n=!1,r=!1){e=e.__v_raw;const o=Xe(e),s=Xe(t);n||(nn(t,s)&&hn(o,"get",t),hn(o,"get",s));const{has:i}=kl(o),a=r?dd:n?hd:zi;if(i.call(o,t))return a(e.get(t));if(i.call(o,s))return a(e.get(s));e!==o&&e.get(t)}function Xi(e,t=!1){const n=this.__v_raw,r=Xe(n),o=Xe(e);return t||(nn(e,o)&&hn(r,"has",e),hn(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Ji(e,t=!1){return e=e.__v_raw,!t&&hn(Xe(e),"iterate",To),Reflect.get(e,"size",e)}function Cm(e,t=!1){!t&&!No(e)&&!so(e)&&(e=Xe(e));const n=Xe(this);return kl(n).has.call(n,e)||(n.add(e),xr(n,"add",e,e)),this}function wm(e,t,n=!1){!n&&!No(t)&&!so(t)&&(t=Xe(t));const r=Xe(this),{has:o,get:s}=kl(r);let i=o.call(r,e);i||(e=Xe(e),i=o.call(r,e));const a=s.call(r,e);return r.set(e,t),i?nn(t,a)&&xr(r,"set",e,t):xr(r,"add",e,t),this}function km(e){const t=Xe(this),{has:n,get:r}=kl(t);let o=n.call(t,e);o||(e=Xe(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&xr(t,"delete",e,void 0),s}function Sm(){const e=Xe(this),t=e.size!==0,n=e.clear();return t&&xr(e,"clear",void 0,void 0),n}function Qi(e,t){return function(r,o){const s=this,i=s.__v_raw,a=Xe(i),l=t?dd:e?hd:zi;return!e&&hn(a,"iterate",To),i.forEach((u,m)=>r.call(o,l(u),l(m),s))}}function ea(e,t,n){return function(...r){const o=this.__v_raw,s=Xe(o),i=us(s),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,u=o[e](...r),m=n?dd:t?hd:zi;return!t&&hn(s,"iterate",l?ru:To),{next(){const{value:d,done:f}=u.next();return f?{value:d,done:f}:{value:a?[m(d[0]),m(d[1])]:m(d),done:f}},[Symbol.iterator](){return this}}}}function Dr(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Yz(){const e={get(s){return Yi(this,s)},get size(){return Ji(this)},has:Xi,add:Cm,set:wm,delete:km,clear:Sm,forEach:Qi(!1,!1)},t={get(s){return Yi(this,s,!1,!0)},get size(){return Ji(this)},has:Xi,add(s){return Cm.call(this,s,!0)},set(s,i){return wm.call(this,s,i,!0)},delete:km,clear:Sm,forEach:Qi(!1,!0)},n={get(s){return Yi(this,s,!0)},get size(){return Ji(this,!0)},has(s){return Xi.call(this,s,!0)},add:Dr("add"),set:Dr("set"),delete:Dr("delete"),clear:Dr("clear"),forEach:Qi(!0,!1)},r={get(s){return Yi(this,s,!0,!0)},get size(){return Ji(this,!0)},has(s){return Xi.call(this,s,!0)},add:Dr("add"),set:Dr("set"),delete:Dr("delete"),clear:Dr("clear"),forEach:Qi(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=ea(s,!1,!1),n[s]=ea(s,!0,!1),t[s]=ea(s,!1,!0),r[s]=ea(s,!0,!0)}),[e,n,t,r]}const[Xz,Jz,Qz,ev]=Yz();function Sl(e,t){const n=t?e?ev:Qz:e?Jz:Xz;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(tt(n,o)&&o in r?n:r,o,s)}const tv={get:Sl(!1,!1)},nv={get:Sl(!1,!0)},rv={get:Sl(!0,!1)},ov={get:Sl(!0,!0)},Qh=new WeakMap,e_=new WeakMap,t_=new WeakMap,n_=new WeakMap;function sv(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function iv(e){return e.__v_skip||!Object.isExtensible(e)?0:sv(Ez(e))}function Ts(e){return so(e)?e:xl(e,!1,qz,tv,Qh)}function md(e){return xl(e,!1,Kz,nv,e_)}function fd(e){return xl(e,!0,Gz,rv,t_)}function av(e){return xl(e,!0,Zz,ov,n_)}function xl(e,t,n,r,o){if(!ft(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=iv(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return o.set(e,a),a}function Er(e){return so(e)?Er(e.__v_raw):!!(e&&e.__v_isReactive)}function so(e){return!!(e&&e.__v_isReadonly)}function No(e){return!!(e&&e.__v_isShallow)}function pd(e){return e?!!e.__v_raw:!1}function Xe(e){const t=e&&e.__v_raw;return t?Xe(t):e}function El(e){return Object.isExtensible(e)&&Rh(e,"__v_skip",!0),e}const zi=e=>ft(e)?Ts(e):e,hd=e=>ft(e)?fd(e):e;class r_{constructor(t,n,r,o){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new ys(()=>t(this._value),()=>fs(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=Xe(this);return(!t._cacheable||t.effect.dirty)&&nn(t._value,t._value=t.effect.run())&&fs(t,4),_d(t),t.effect._dirtyLevel>=2&&fs(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function lv(e,t,n=!1){let r,o;const s=Oe(e);return s?(r=e,o=fn):(r=e.get,o=e.set),new r_(r,o,s||!o,n)}function _d(e){var t;no&&$o&&(e=Xe(e),qh($o,(t=e.dep)!=null?t:e.dep=Kh(()=>e.dep=void 0,e instanceof r_?e:void 0)))}function fs(e,t=4,n,r){e=Xe(e);const o=e.dep;o&&Gh(o,t)}function Ot(e){return!!(e&&e.__v_isRef===!0)}function Ln(e){return o_(e,!1)}function gd(e){return o_(e,!0)}function o_(e,t){return Ot(e)?e:new cv(e,t)}class cv{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Xe(t),this._value=n?t:zi(t)}get value(){return _d(this),this._value}set value(t){const n=this.__v_isShallow||No(t)||so(t);t=n?t:Xe(t),nn(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:zi(t),fs(this,4))}}function uv(e){fs(e,4)}function Cn(e){return Ot(e)?e.value:e}function dv(e){return Oe(e)?e():Cn(e)}const mv={get:(e,t,n)=>Cn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Ot(o)&&!Ot(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function yd(e){return Er(e)?e:new Proxy(e,mv)}class fv{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>_d(this),()=>fs(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function s_(e){return new fv(e)}function i_(e){const t=ze(e)?new Array(e.length):{};for(const n in e)t[n]=a_(e,n);return t}class pv{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 Uz(Xe(this._object),this._key)}}class hv{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function _v(e,t,n){return Ot(e)?e:Oe(e)?new hv(e):ft(e)&&arguments.length>1?a_(e,t,n):Ln(e)}function a_(e,t,n){const r=e[t];return Ot(r)?r:new pv(e,t,n)}const gv={GET:"get",HAS:"has",ITERATE:"iterate"},yv={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"};/** * @vue/runtime-core v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/function fv(e,t){}const pv={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",WATCH_GETTER:2,2:"WATCH_GETTER",WATCH_CALLBACK:3,3:"WATCH_CALLBACK",WATCH_CLEANUP:4,4:"WATCH_CLEANUP",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE"},hv={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update"};function xr(e,t,n,r){try{return r?e(...r):e()}catch(o){Mo(o,t,n)}}function wn(e,t,n,r){if(Oe(e)){const o=xr(e,t,n,r);return o&&ed(o)&&o.catch(s=>{Mo(s,t,n)}),o}if(ze(e)){const o=[];for(let s=0;s>>1,o=qt[r],s=yi(o);slr&&qt.splice(t,1)}function Va(e){ze(e)?ds.push(...e):(!Br||!Br.includes(e,e.allowRecurse?Co+1:Co))&&ds.push(e),r_()}function vm(e,t,n=gi?lr+1:0){for(;nyi(n)-yi(r));if(ds.length=0,Br){Br.push(...t);return}for(Br=t,Co=0;Coe.id==null?1/0:e.id,zv=(e,t)=>{const n=yi(e)-yi(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function o_(e){Qc=!1,gi=!0,qt.sort(zv);try{for(lr=0;lrXo.emit(o,...s)),Xi=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{s_(s,t)}),setTimeout(()=>{Xo||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,Xi=[])},3e3)):Xi=[]}let Mt=null,Sl=null;function zi(e){const t=Mt;return Mt=e,Sl=e&&e.type.__scopeId||null,t}function vv(e){Sl=e}function bv(){Sl=null}const Cv=e=>N;function N(e,t=Mt,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&lu(-1);const s=zi(t);let i;try{i=e(...o)}finally{zi(s),r._d&&lu(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function pt(e,t){if(Mt===null)return e;const n=Di(Mt),r=e.dirs||(e.dirs=[]);for(let o=0;o{e.isMounted=!0}),Tl(()=>{e.isUnmounting=!0}),e}const En=[Function,Array],_d={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:En,onEnter:En,onAfterEnter:En,onEnterCancelled:En,onBeforeLeave:En,onLeave:En,onAfterLeave:En,onLeaveCancelled:En,onBeforeAppear:En,onAppear:En,onAfterAppear:En,onAppearCancelled:En},i_=e=>{const t=e.subTree;return t.component?i_(t.component):t},wv={name:"BaseTransition",props:_d,setup(e,{slots:t}){const n=Hn(),r=hd();return()=>{const o=t.default&&xl(t.default(),!0);if(!o||!o.length)return;let s=o[0];if(o.length>1){for(const f of o)if(f.type!==Dt){s=f;break}}const i=Xe(e),{mode:a}=i;if(r.isLeaving)return ic(s);const l=bm(s);if(!l)return ic(s);let u=_s(l,i,r,n,f=>u=f);oo(l,u);const m=n.subTree,d=m&&bm(m);if(d&&d.type!==Dt&&!Zn(l,d)&&i_(n).type!==Dt){const f=_s(d,i,r,n);if(oo(d,f),a==="out-in"&&l.type!==Dt)return r.isLeaving=!0,f.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},ic(s);a==="in-out"&&l.type!==Dt&&(f.delayLeave=(p,h,g)=>{const z=l_(r,d);z[String(d.key)]=d,p[Wr]=()=>{h(),p[Wr]=void 0,delete u.delayedLeave},u.delayedLeave=g})}return s}}},a_=wv;function l_(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function _s(e,t,n,r,o){const{appear:s,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:m,onEnterCancelled:d,onBeforeLeave:f,onLeave:p,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:z,onAppear:k,onAfterAppear:w,onAppearCancelled:_}=t,v=String(e.key),S=l_(n,e),C=($,F)=>{$&&wn($,r,9,F)},L=($,F)=>{const q=F[1];C($,F),ze($)?$.every(U=>U.length<=1)&&q():$.length<=1&&q()},D={mode:i,persisted:a,beforeEnter($){let F=l;if(!n.isMounted)if(s)F=z||l;else return;$[Wr]&&$[Wr](!0);const q=S[v];q&&Zn(e,q)&&q.el[Wr]&&q.el[Wr](),C(F,[$])},enter($){let F=u,q=m,U=d;if(!n.isMounted)if(s)F=k||u,q=w||m,U=_||d;else return;let W=!1;const ne=$[Ji]=me=>{W||(W=!0,me?C(U,[$]):C(q,[$]),D.delayedLeave&&D.delayedLeave(),$[Ji]=void 0)};F?L(F,[$,ne]):ne()},leave($,F){const q=String(e.key);if($[Ji]&&$[Ji](!0),n.isUnmounting)return F();C(f,[$]);let U=!1;const W=$[Wr]=ne=>{U||(U=!0,F(),ne?C(g,[$]):C(h,[$]),$[Wr]=void 0,S[q]===e&&delete S[q])};S[q]=e,p?L(p,[$,W]):W()},clone($){const F=_s($,t,n,r,o);return o&&o(F),F}};return D}function ic(e){if(Pi(e))return e=pr(e),e.children=null,e}function bm(e){if(!Pi(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Oe(n.default))return n.default()}}function oo(e,t){e.shapeFlag&6&&e.component?oo(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function xl(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function kv(e){Oe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:i=!0,onError:a}=e;let l=null,u,m=0;const d=()=>(m++,l=null,f()),f=()=>{let p;return l||(p=l=t().catch(h=>{if(h=h instanceof Error?h:new Error(String(h)),a)return new Promise((g,z)=>{a(h,()=>g(d()),()=>z(h),m+1)});throw h}).then(h=>p!==l&&l?l:(h&&(h.__esModule||h[Symbol.toStringTag]==="Module")&&(h=h.default),u=h,h)))};return Ar({name:"AsyncComponentWrapper",__asyncLoader:f,get __asyncResolved(){return u},setup(){const p=Rt;if(u)return()=>ac(u,p);const h=w=>{l=null,Mo(w,p,13,!r)};if(i&&p.suspense||Ni)return f().then(w=>()=>ac(w,p)).catch(w=>(h(w),()=>r?b(r,{error:w}):null));const g=In(!1),z=In(),k=In(!!o);return o&&setTimeout(()=>{k.value=!1},o),s!=null&&setTimeout(()=>{if(!g.value&&!z.value){const w=new Error(`Async component timed out after ${s}ms.`);h(w),z.value=w}},s),f().then(()=>{g.value=!0,p.parent&&Pi(p.parent.vnode)&&(p.parent.effect.dirty=!0,kl(p.parent.update))}).catch(w=>{h(w),z.value=w}),()=>{if(g.value&&u)return ac(u,p);if(z.value&&r)return b(r,{error:z.value});if(n&&!k.value)return b(n)}}})}function ac(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=b(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const Pi=e=>e.type.__isKeepAlive,Sv={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Hn(),r=n.ctx;if(!r.renderer)return()=>{const w=t.default&&t.default();return w&&w.length===1?w[0]:w};const o=new Map,s=new Set;let i=null;const a=n.suspense,{renderer:{p:l,m:u,um:m,o:{createElement:d}}}=r,f=d("div");r.activate=(w,_,v,S,C)=>{const L=w.component;u(w,_,v,0,a),l(L.vnode,w,_,v,L,a,S,w.slotScopeIds,C),Vt(()=>{L.isDeactivated=!1,L.a&&cs(L.a);const D=w.props&&w.props.onVnodeMounted;D&&ln(D,L.parent,w)},a)},r.deactivate=w=>{const _=w.component;Ba(_.m),Ba(_.a),u(w,f,null,1,a),Vt(()=>{_.da&&cs(_.da);const v=w.props&&w.props.onVnodeUnmounted;v&&ln(v,_.parent,w),_.isDeactivated=!0},a)};function p(w){lc(w),m(w,n,a,!0)}function h(w){o.forEach((_,v)=>{const S=fu(_.type);S&&(!w||!w(S))&&g(v)})}function g(w){const _=o.get(w);_&&(!i||!Zn(_,i))?p(_):i&&lc(i),o.delete(w),s.delete(w)}Nn(()=>[e.include,e.exclude],([w,_])=>{w&&h(v=>qs(w,v)),_&&h(v=>!qs(_,v))},{flush:"post",deep:!0});let z=null;const k=()=>{z!=null&&(iu(n.subTree.type)?Vt(()=>{o.set(z,Qi(n.subTree))},n.subTree.suspense):o.set(z,Qi(n.subTree)))};return Es(k),$l(k),Tl(()=>{o.forEach(w=>{const{subTree:_,suspense:v}=n,S=Qi(_);if(w.type===S.type&&w.key===S.key){lc(S);const C=S.component.da;C&&Vt(C,v);return}p(w)})}),()=>{if(z=null,!t.default)return null;const w=t.default(),_=w[0];if(w.length>1)return i=null,w;if(!so(_)||!(_.shapeFlag&4)&&!(_.shapeFlag&128))return i=null,_;let v=Qi(_);if(v.type===Dt)return i=null,v;const S=v.type,C=fu(Eo(v)?v.type.__asyncResolved||{}:S),{include:L,exclude:D,max:$}=e;if(L&&(!C||!qs(L,C))||D&&C&&qs(D,C))return i=v,_;const F=v.key==null?S:v.key,q=o.get(F);return v.el&&(v=pr(v),_.shapeFlag&128&&(_.ssContent=v)),z=F,q?(v.el=q.el,v.component=q.component,v.transition&&oo(v,v.transition),v.shapeFlag|=512,s.delete(F),s.add(F)):(s.add(F),$&&s.size>parseInt($,10)&&g(s.values().next().value)),v.shapeFlag|=256,i=v,iu(_.type)?_:v}}},xv=Sv;function qs(e,t){return ze(e)?e.some(n=>qs(n,t)):vt(e)?e.split(",").includes(t):vz(e)?e.test(t):!1}function c_(e,t){d_(e,"a",t)}function u_(e,t){d_(e,"da",t)}function d_(e,t,n=Rt){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(El(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Pi(o.parent.vnode)&&Ev(r,t,n,o),o=o.parent}}function Ev(e,t,n,r){const o=El(t,e,r,!0);Ii(()=>{Qu(r[t],o)},n)}function lc(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Qi(e){return e.shapeFlag&128?e.ssContent:e}function El(e,t,n=Rt,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{lo();const a=Lo(n),l=wn(t,n,e,i);return a(),co(),l});return r?o.unshift(s):o.push(s),s}}const Or=e=>(t,n=Rt)=>{(!Ni||e==="sp")&&El(e,(...r)=>t(...r),n)},gd=Or("bm"),Es=Or("m"),m_=Or("bu"),$l=Or("u"),Tl=Or("bum"),Ii=Or("um"),f_=Or("sp"),p_=Or("rtg"),h_=Or("rtc");function __(e,t=Rt){El("ec",e,t)}const yd="components",$v="directives";function O(e,t){return vd(yd,e,!0,t)||e}const g_=Symbol.for("v-ndc");function Al(e){return vt(e)?vd(yd,e,!1)||e:e||g_}function zd(e){return vd($v,e)}function vd(e,t,n=!0,r=!1){const o=Mt||Rt;if(o){const s=o.type;if(e===yd){const a=fu(s,!1);if(a&&(a===t||a===Yt(t)||a===Oi(Yt(t))))return s}const i=Cm(o[e]||s[e],t)||Cm(o.appContext[e],t);return!i&&r?s:i}}function Cm(e,t){return e&&(e[t]||e[Yt(t)]||e[Oi(Yt(t))])}function ht(e,t,n,r){let o;const s=n&&n[r];if(ze(e)||vt(e)){o=new Array(e.length);for(let i=0,a=e.length;it(i,a,void 0,s&&s[a]));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,l=i.length;a{const s=r.fn(...o);return s&&(s.key=r.key),s}:r.fn)}return e}function zt(e,t,n={},r,o){if(Mt.isCE||Mt.parent&&Eo(Mt.parent)&&Mt.parent.isCE)return t!=="default"&&(n.name=t),b("slot",n,r&&r());let s=e[t];s&&s._c&&(s._d=!1),x();const i=s&&Cd(s(n)),a=we(ve,{key:(n.key||i&&i.key||`_${t}`)+(!i&&r?"_fb":"")},i||(r?r():[]),i&&e._===1?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),s&&s._c&&(s._d=!0),a}function Cd(e){return e.some(t=>so(t)?!(t.type===Dt||t.type===ve&&!Cd(t.children)):!0)?e:null}function Tv(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:ei(r)]=e[r];return n}const eu=e=>e?eg(e)?Di(e):eu(e.parent):null,ti=wt(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=>eu(e.parent),$root:e=>eu(e.root),$emit:e=>e.emit,$options:e=>wd(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,kl(e.update)}),$nextTick:e=>e.n||(e.n=Fo.bind(e.proxy)),$watch:e=>ub.bind(e)}),cc=(e,t)=>e!==ot&&!e.__isScriptSetup&&tt(e,t),tu={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let u;if(t[0]!=="$"){const p=i[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(cc(r,t))return i[t]=1,r[t];if(o!==ot&&tt(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&tt(u,t))return i[t]=3,s[t];if(n!==ot&&tt(n,t))return i[t]=4,n[t];nu&&(i[t]=0)}}const m=ti[t];let d,f;if(m)return t==="$attrs"&&pn(e.attrs,"get",""),m(e);if((d=a.__cssModules)&&(d=d[t]))return d;if(n!==ot&&tt(n,t))return i[t]=4,n[t];if(f=l.config.globalProperties,tt(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return cc(o,t)?(o[t]=n,!0):r!==ot&&tt(r,t)?(r[t]=n,!0):tt(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 a;return!!n[i]||e!==ot&&tt(e,i)||cc(t,i)||(a=s[0])&&tt(a,i)||tt(r,i)||tt(ti,i)||tt(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:tt(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},Av=wt({},tu,{get(e,t){if(t!==Symbol.unscopables)return tu.get(e,t,e)},has(e,t){return t[0]!=="_"&&!Sz(t)}});function Ov(){return null}function Pv(){return null}function Iv(e){}function Lv(e){}function Nv(){return null}function Dv(){}function Rv(e,t){return null}function Mv(){return y_().slots}function Fv(){return y_().attrs}function y_(){const e=Hn();return e.setupContext||(e.setupContext=rg(e))}function vi(e){return ze(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function Vv(e,t){const n=vi(e);for(const r in t){if(r.startsWith("__skip"))continue;let o=n[r];o?ze(o)||Oe(o)?o=n[r]={type:o,default:t[r]}:o.default=t[r]:o===null&&(o=n[r]={default:t[r]}),o&&t[`__skip_${r}`]&&(o.skipFactory=!0)}return n}function Hv(e,t){return!e||!t?e||t:ze(e)&&ze(t)?e.concat(t):wt({},vi(e),vi(t))}function Uv(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function jv(e){const t=Hn();let n=e();return uu(),ed(n)&&(n=n.catch(r=>{throw Lo(t),r})),[n,()=>Lo(t)]}let nu=!0;function Bv(e){const t=wd(e),n=e.proxy,r=e.ctx;nu=!1,t.beforeCreate&&wm(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:u,created:m,beforeMount:d,mounted:f,beforeUpdate:p,updated:h,activated:g,deactivated:z,beforeDestroy:k,beforeUnmount:w,destroyed:_,unmounted:v,render:S,renderTracked:C,renderTriggered:L,errorCaptured:D,serverPrefetch:$,expose:F,inheritAttrs:q,components:U,directives:W,filters:ne}=t;if(u&&Wv(u,r,null),i)for(const re in i){const ce=i[re];Oe(ce)&&(r[re]=ce.bind(n))}if(o){const re=o.call(n,n);mt(re)&&(e.data=xs(re))}if(nu=!0,s)for(const re in s){const ce=s[re],Ne=Oe(ce)?ce.bind(n,n):Oe(ce.get)?ce.get.bind(n,n):mn,st=!Oe(ce)&&Oe(ce.set)?ce.set.bind(n):mn,Ve=Ht({get:Ne,set:st});Object.defineProperty(r,re,{enumerable:!0,configurable:!0,get:()=>Ve.value,set:He=>Ve.value=He})}if(a)for(const re in a)z_(a[re],r,n,re);if(l){const re=Oe(l)?l.call(n):l;Reflect.ownKeys(re).forEach(ce=>{ni(ce,re[ce])})}m&&wm(m,e,"c");function K(re,ce){ze(ce)?ce.forEach(Ne=>re(Ne.bind(n))):ce&&re(ce.bind(n))}if(K(gd,d),K(Es,f),K(m_,p),K($l,h),K(c_,g),K(u_,z),K(__,D),K(h_,C),K(p_,L),K(Tl,w),K(Ii,v),K(f_,$),ze(F))if(F.length){const re=e.exposed||(e.exposed={});F.forEach(ce=>{Object.defineProperty(re,ce,{get:()=>n[ce],set:Ne=>n[ce]=Ne})})}else e.exposed||(e.exposed={});S&&e.render===mn&&(e.render=S),q!=null&&(e.inheritAttrs=q),U&&(e.components=U),W&&(e.directives=W)}function Wv(e,t,n=mn){ze(e)&&(e=ru(e));for(const r in e){const o=e[r];let s;mt(o)?"default"in o?s=Ln(o.from||r,o.default,!0):s=Ln(o.from||r):s=Ln(o),At(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function wm(e,t,n){wn(ze(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function z_(e,t,n,r){const o=r.includes(".")?B_(n,r):()=>n[r];if(vt(e)){const s=t[e];Oe(s)&&Nn(o,s)}else if(Oe(e))Nn(o,e.bind(n));else if(mt(e))if(ze(e))e.forEach(s=>z_(s,t,n,r));else{const s=Oe(e.handler)?e.handler.bind(n):t[e.handler];Oe(s)&&Nn(o,s,e)}}function wd(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(u=>Ua(l,u,i,!0)),Ua(l,t,i)),mt(t)&&s.set(t,l),l}function Ua(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&Ua(e,s,n,!0),o&&o.forEach(i=>Ua(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const a=qv[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const qv={data:km,props:Sm,emits:Sm,methods:Gs,computed:Gs,beforeCreate:Jt,created:Jt,beforeMount:Jt,mounted:Jt,beforeUpdate:Jt,updated:Jt,beforeDestroy:Jt,beforeUnmount:Jt,destroyed:Jt,unmounted:Jt,activated:Jt,deactivated:Jt,errorCaptured:Jt,serverPrefetch:Jt,components:Gs,directives:Gs,watch:Kv,provide:km,inject:Gv};function km(e,t){return t?e?function(){return wt(Oe(e)?e.call(this,this):e,Oe(t)?t.call(this,this):t)}:t:e}function Gv(e,t){return Gs(ru(e),ru(t))}function ru(e){if(ze(e)){const t={};for(let n=0;n1)return n&&Oe(t)?t.call(r&&r.proxy):t}}function b_(){return!!(Rt||Mt||$o)}const C_={},w_=()=>Object.create(C_),k_=e=>Object.getPrototypeOf(e)===C_;function Xv(e,t,n,r=!1){const o={},s=w_();e.propsDefaults=Object.create(null),S_(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:ad(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function Jv(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=Xe(o),[l]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const m=e.vnode.dynamicProps;for(let d=0;d{l=!0;const[f,p]=x_(d,t,!0);wt(i,f),p&&a.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(m),e.extends&&m(e.extends),e.mixins&&e.mixins.forEach(m)}if(!s&&!l)return mt(e)&&r.set(e,is),is;if(ze(s))for(let m=0;me[0]==="_"||e==="$stable",kd=e=>ze(e)?e.map(cn):[cn(e)],eb=(e,t,n)=>{if(t._n)return t;const r=N((...o)=>kd(t(...o)),n);return r._c=!1,r},$_=(e,t,n)=>{const r=e._ctx;for(const o in e){if(E_(o))continue;const s=e[o];if(Oe(s))t[o]=eb(o,s,r);else if(s!=null){const i=kd(s);t[o]=()=>i}}},T_=(e,t)=>{const n=kd(t);e.slots.default=()=>n},A_=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},tb=(e,t,n)=>{const r=e.slots=w_();if(e.vnode.shapeFlag&32){const o=t._;o?(A_(r,t,n),n&&Oh(r,"_",o,!0)):$_(t,r)}else t&&T_(e,t)},nb=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=ot;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:A_(o,t,n):(s=!t.$stable,$_(t,o)),i=t}else t&&(T_(e,t),i={default:1});if(s)for(const a in o)!E_(a)&&i[a]==null&&delete o[a]};function ja(e,t,n,r,o=!1){if(ze(e)){e.forEach((f,p)=>ja(f,t&&(ze(t)?t[p]:t),n,r,o));return}if(Eo(r)&&!o)return;const s=r.shapeFlag&4?Di(r.component):r.el,i=o?null:s,{i:a,r:l}=e,u=t&&t.r,m=a.refs===ot?a.refs={}:a.refs,d=a.setupState;if(u!=null&&u!==l&&(vt(u)?(m[u]=null,tt(d,u)&&(d[u]=null)):At(u)&&(u.value=null)),Oe(l))xr(l,a,12,[i,m]);else{const f=vt(l),p=At(l);if(f||p){const h=()=>{if(e.f){const g=f?tt(d,l)?d[l]:m[l]:l.value;o?ze(g)&&Qu(g,s):ze(g)?g.includes(s)||g.push(s):f?(m[l]=[s],tt(d,l)&&(d[l]=m[l])):(l.value=[s],e.k&&(m[e.k]=l.value))}else f?(m[l]=i,tt(d,l)&&(d[l]=i)):p&&(l.value=i,e.k&&(m[e.k]=i))};i?(h.id=-1,Vt(h,n)):h()}}}const O_=Symbol("_vte"),rb=e=>e.__isTeleport,ri=e=>e&&(e.disabled||e.disabled===""),Em=e=>typeof SVGElement<"u"&&e instanceof SVGElement,$m=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,su=(e,t)=>{const n=e&&e.to;return vt(n)?t?t(n):null:n},ob={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,i,a,l,u){const{mc:m,pc:d,pbc:f,o:{insert:p,querySelector:h,createText:g,createComment:z}}=u,k=ri(t.props);let{shapeFlag:w,children:_,dynamicChildren:v}=t;if(e==null){const S=t.el=g(""),C=t.anchor=g("");p(S,n,r),p(C,n,r);const L=t.target=su(t.props,h),D=I_(L,t,g,p);L&&(i==="svg"||Em(L)?i="svg":(i==="mathml"||$m(L))&&(i="mathml"));const $=(F,q)=>{w&16&&m(_,F,q,o,s,i,a,l)};k?$(n,C):L&&$(L,D)}else{t.el=e.el,t.targetStart=e.targetStart;const S=t.anchor=e.anchor,C=t.target=e.target,L=t.targetAnchor=e.targetAnchor,D=ri(e.props),$=D?n:C,F=D?S:L;if(i==="svg"||Em(C)?i="svg":(i==="mathml"||$m(C))&&(i="mathml"),v?(f(e.dynamicChildren,v,$,o,s,i,a),Sd(e,t,!0)):l||d(e,t,$,F,o,s,i,a,!1),k)D?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):ea(t,n,S,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const q=t.target=su(t.props,h);q&&ea(t,q,null,u,0)}else D&&ea(t,C,L,u,1)}P_(t)},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:i,children:a,anchor:l,targetStart:u,targetAnchor:m,target:d,props:f}=e;if(d&&(o(u),o(m)),s&&o(l),i&16){const p=s||!ri(f);for(let h=0;h{Tm||(console.error("Hydration completed but contains mismatches."),Tm=!0)},ib=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",ab=e=>e.namespaceURI.includes("MathML"),ta=e=>{if(ib(e))return"svg";if(ab(e))return"mathml"},na=e=>e.nodeType===8;function lb(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:a,insert:l,createComment:u}}=e,m=(_,v)=>{if(!v.hasChildNodes()){n(null,_,v),Ha(),v._vnode=_;return}d(v.firstChild,_,null,null,null),Ha(),v._vnode=_},d=(_,v,S,C,L,D=!1)=>{D=D||!!v.dynamicChildren;const $=na(_)&&_.data==="[",F=()=>g(_,v,S,C,L,$),{type:q,ref:U,shapeFlag:W,patchFlag:ne}=v;let me=_.nodeType;v.el=_,ne===-2&&(D=!1,v.dynamicChildren=null);let K=null;switch(q){case Er:me!==3?v.children===""?(l(v.el=o(""),i(_),_),K=_):K=F():(_.data!==v.children&&(Uo(),_.data=v.children),K=s(_));break;case Dt:w(_)?(K=s(_),k(v.el=_.content.firstChild,_,S)):me!==8||$?K=F():K=s(_);break;case To:if($&&(_=s(_),me=_.nodeType),me===1||me===3){K=_;const re=!v.children.length;for(let ce=0;ce{D=D||!!v.dynamicChildren;const{type:$,props:F,patchFlag:q,shapeFlag:U,dirs:W,transition:ne}=v,me=$==="input"||$==="option";if(me||q!==-1){W&&ar(v,null,S,"created");let K=!1;if(w(_)){K=R_(C,ne)&&S&&S.vnode.props&&S.vnode.props.appear;const ce=_.content.firstChild;K&&ne.beforeEnter(ce),k(ce,_,S),v.el=_=ce}if(U&16&&!(F&&(F.innerHTML||F.textContent))){let ce=p(_.firstChild,v,_,S,C,L,D);for(;ce;){Uo();const Ne=ce;ce=ce.nextSibling,a(Ne)}}else U&8&&_.textContent!==v.children&&(Uo(),_.textContent=v.children);if(F){if(me||!D||q&48){const ce=_.tagName.includes("-");for(const Ne in F)(me&&(Ne.endsWith("value")||Ne==="indeterminate")||Ai(Ne)&&!ls(Ne)||Ne[0]==="."||ce)&&r(_,Ne,null,F[Ne],void 0,S)}else if(F.onClick)r(_,"onClick",null,F.onClick,void 0,S);else if(q&4&&Sr(F.style))for(const ce in F.style)F.style[ce]}let re;(re=F&&F.onVnodeBeforeMount)&&ln(re,S,v),W&&ar(v,null,S,"beforeMount"),((re=F&&F.onVnodeMounted)||W||K)&&K_(()=>{re&&ln(re,S,v),K&&ne.enter(_),W&&ar(v,null,S,"mounted")},C)}return _.nextSibling},p=(_,v,S,C,L,D,$)=>{$=$||!!v.dynamicChildren;const F=v.children,q=F.length;for(let U=0;U{const{slotScopeIds:$}=v;$&&(L=L?L.concat($):$);const F=i(_),q=p(s(_),v,F,S,C,L,D);return q&&na(q)&&q.data==="]"?s(v.anchor=q):(Uo(),l(v.anchor=u("]"),F,q),q)},g=(_,v,S,C,L,D)=>{if(Uo(),v.el=null,D){const q=z(_);for(;;){const U=s(_);if(U&&U!==q)a(U);else break}}const $=s(_),F=i(_);return a(_),n(null,v,F,$,S,C,ta(F),L),$},z=(_,v="[",S="]")=>{let C=0;for(;_;)if(_=s(_),_&&na(_)&&(_.data===v&&C++,_.data===S)){if(C===0)return s(_);C--}return _},k=(_,v,S)=>{const C=v.parentNode;C&&C.replaceChild(_,v);let L=S;for(;L;)L.vnode.el===v&&(L.vnode.el=L.subTree.el=_),L=L.parent},w=_=>_.nodeType===1&&_.tagName.toLowerCase()==="template";return[m,d]}const Vt=K_;function L_(e){return D_(e)}function N_(e){return D_(e,lb)}function D_(e,t){const n=Ph();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:u,setElementText:m,parentNode:d,nextSibling:f,setScopeId:p=mn,insertStaticContent:h}=e,g=(A,P,j,te=null,X=null,ie=null,pe=void 0,E=null,T=!!P.dynamicChildren)=>{if(A===P)return;A&&!Zn(A,P)&&(te=Y(A),He(A,X,ie,!0),A=null),P.patchFlag===-2&&(T=!1,P.dynamicChildren=null);const{type:R,ref:Q,shapeFlag:de}=P;switch(R){case Er:z(A,P,j,te);break;case Dt:k(A,P,j,te);break;case To:A==null&&w(P,j,te,pe);break;case ve:U(A,P,j,te,X,ie,pe,E,T);break;default:de&1?S(A,P,j,te,X,ie,pe,E,T):de&6?W(A,P,j,te,X,ie,pe,E,T):(de&64||de&128)&&R.process(A,P,j,te,X,ie,pe,E,T,ge)}Q!=null&&X&&ja(Q,A&&A.ref,ie,P||A,!P)},z=(A,P,j,te)=>{if(A==null)r(P.el=a(P.children),j,te);else{const X=P.el=A.el;P.children!==A.children&&u(X,P.children)}},k=(A,P,j,te)=>{A==null?r(P.el=l(P.children||""),j,te):P.el=A.el},w=(A,P,j,te)=>{[A.el,A.anchor]=h(A.children,P,j,te,A.el,A.anchor)},_=({el:A,anchor:P},j,te)=>{let X;for(;A&&A!==P;)X=f(A),r(A,j,te),A=X;r(P,j,te)},v=({el:A,anchor:P})=>{let j;for(;A&&A!==P;)j=f(A),o(A),A=j;o(P)},S=(A,P,j,te,X,ie,pe,E,T)=>{P.type==="svg"?pe="svg":P.type==="math"&&(pe="mathml"),A==null?C(P,j,te,X,ie,pe,E,T):$(A,P,X,ie,pe,E,T)},C=(A,P,j,te,X,ie,pe,E)=>{let T,R;const{props:Q,shapeFlag:de,transition:se,dirs:H}=A;if(T=A.el=i(A.type,ie,Q&&Q.is,Q),de&8?m(T,A.children):de&16&&D(A.children,T,null,te,X,uc(A,ie),pe,E),H&&ar(A,null,te,"created"),L(T,A,A.scopeId,pe,te),Q){for(const Se in Q)Se!=="value"&&!ls(Se)&&s(T,Se,null,Q[Se],ie,te);"value"in Q&&s(T,"value",null,Q.value,ie),(R=Q.onVnodeBeforeMount)&&ln(R,te,A)}H&&ar(A,null,te,"beforeMount");const Z=R_(X,se);Z&&se.beforeEnter(T),r(T,P,j),((R=Q&&Q.onVnodeMounted)||Z||H)&&Vt(()=>{R&&ln(R,te,A),Z&&se.enter(T),H&&ar(A,null,te,"mounted")},X)},L=(A,P,j,te,X)=>{if(j&&p(A,j),te)for(let ie=0;ie{for(let R=T;R{const E=P.el=A.el;let{patchFlag:T,dynamicChildren:R,dirs:Q}=P;T|=A.patchFlag&16;const de=A.props||ot,se=P.props||ot;let H;if(j&&fo(j,!1),(H=se.onVnodeBeforeUpdate)&&ln(H,j,P,A),Q&&ar(P,A,j,"beforeUpdate"),j&&fo(j,!0),(de.innerHTML&&se.innerHTML==null||de.textContent&&se.textContent==null)&&m(E,""),R?F(A.dynamicChildren,R,E,j,te,uc(P,X),ie):pe||ce(A,P,E,null,j,te,uc(P,X),ie,!1),T>0){if(T&16)q(E,de,se,j,X);else if(T&2&&de.class!==se.class&&s(E,"class",null,se.class,X),T&4&&s(E,"style",de.style,se.style,X),T&8){const Z=P.dynamicProps;for(let Se=0;Se{H&&ln(H,j,P,A),Q&&ar(P,A,j,"updated")},te)},F=(A,P,j,te,X,ie,pe)=>{for(let E=0;E{if(P!==j){if(P!==ot)for(const ie in P)!ls(ie)&&!(ie in j)&&s(A,ie,P[ie],null,X,te);for(const ie in j){if(ls(ie))continue;const pe=j[ie],E=P[ie];pe!==E&&ie!=="value"&&s(A,ie,E,pe,X,te)}"value"in j&&s(A,"value",P.value,j.value,X)}},U=(A,P,j,te,X,ie,pe,E,T)=>{const R=P.el=A?A.el:a(""),Q=P.anchor=A?A.anchor:a("");let{patchFlag:de,dynamicChildren:se,slotScopeIds:H}=P;H&&(E=E?E.concat(H):H),A==null?(r(R,j,te),r(Q,j,te),D(P.children||[],j,Q,X,ie,pe,E,T)):de>0&&de&64&&se&&A.dynamicChildren?(F(A.dynamicChildren,se,j,X,ie,pe,E),(P.key!=null||X&&P===X.subTree)&&Sd(A,P,!0)):ce(A,P,j,Q,X,ie,pe,E,T)},W=(A,P,j,te,X,ie,pe,E,T)=>{P.slotScopeIds=E,A==null?P.shapeFlag&512?X.ctx.activate(P,j,te,pe,T):ne(P,j,te,X,ie,pe,T):me(A,P,T)},ne=(A,P,j,te,X,ie,pe)=>{const E=A.component=Q_(A,te,X);if(Pi(A)&&(E.ctx.renderer=ge),tg(E,!1,pe),E.asyncDep){if(X&&X.registerDep(E,K,pe),!A.el){const T=E.subTree=b(Dt);k(null,T,P,j)}}else K(E,A,P,j,X,ie,pe)},me=(A,P,j)=>{const te=P.component=A.component;if(_b(A,P,j))if(te.asyncDep&&!te.asyncResolved){re(te,P,j);return}else te.next=P,yv(te.update),te.effect.dirty=!0,te.update();else P.el=A.el,te.vnode=P},K=(A,P,j,te,X,ie,pe)=>{const E=()=>{if(A.isMounted){let{next:Q,bu:de,u:se,parent:H,vnode:Z}=A;{const oe=M_(A);if(oe){Q&&(Q.el=Z.el,re(A,Q,pe)),oe.asyncDep.then(()=>{A.isUnmounted||E()});return}}let Se=Q,M;fo(A,!1),Q?(Q.el=Z.el,re(A,Q,pe)):Q=Z,de&&cs(de),(M=Q.props&&Q.props.onVnodeBeforeUpdate)&&ln(M,H,Q,Z),fo(A,!0);const V=Ca(A),G=A.subTree;A.subTree=V,g(G,V,d(G.el),Y(G),A,X,ie),Q.el=V.el,Se===null&&xd(A,V.el),se&&Vt(se,X),(M=Q.props&&Q.props.onVnodeUpdated)&&Vt(()=>ln(M,H,Q,Z),X)}else{let Q;const{el:de,props:se}=P,{bm:H,m:Z,parent:Se}=A,M=Eo(P);if(fo(A,!1),H&&cs(H),!M&&(Q=se&&se.onVnodeBeforeMount)&&ln(Q,Se,P),fo(A,!0),de&&Ge){const V=()=>{A.subTree=Ca(A),Ge(de,A.subTree,A,X,null)};M?P.type.__asyncLoader().then(()=>!A.isUnmounted&&V()):V()}else{const V=A.subTree=Ca(A);g(null,V,j,te,A,X,ie),P.el=V.el}if(Z&&Vt(Z,X),!M&&(Q=se&&se.onVnodeMounted)){const V=P;Vt(()=>ln(Q,Se,V),X)}(P.shapeFlag&256||Se&&Eo(Se.vnode)&&Se.vnode.shapeFlag&256)&&A.a&&Vt(A.a,X),A.isMounted=!0,P=j=te=null}},T=A.effect=new hs(E,mn,()=>kl(R),A.scope),R=A.update=()=>{T.dirty&&T.run()};R.i=A,R.id=A.uid,fo(A,!0),R()},re=(A,P,j)=>{P.component=A;const te=A.vnode.props;A.vnode=P,A.next=null,Jv(A,P.props,te,j),nb(A,P.children,j),lo(),vm(A),co()},ce=(A,P,j,te,X,ie,pe,E,T=!1)=>{const R=A&&A.children,Q=A?A.shapeFlag:0,de=P.children,{patchFlag:se,shapeFlag:H}=P;if(se>0){if(se&128){st(R,de,j,te,X,ie,pe,E,T);return}else if(se&256){Ne(R,de,j,te,X,ie,pe,E,T);return}}H&8?(Q&16&&We(R,X,ie),de!==R&&m(j,de)):Q&16?H&16?st(R,de,j,te,X,ie,pe,E,T):We(R,X,ie,!0):(Q&8&&m(j,""),H&16&&D(de,j,te,X,ie,pe,E,T))},Ne=(A,P,j,te,X,ie,pe,E,T)=>{A=A||is,P=P||is;const R=A.length,Q=P.length,de=Math.min(R,Q);let se;for(se=0;seQ?We(A,X,ie,!0,!1,de):D(P,j,te,X,ie,pe,E,T,de)},st=(A,P,j,te,X,ie,pe,E,T)=>{let R=0;const Q=P.length;let de=A.length-1,se=Q-1;for(;R<=de&&R<=se;){const H=A[R],Z=P[R]=T?qr(P[R]):cn(P[R]);if(Zn(H,Z))g(H,Z,j,null,X,ie,pe,E,T);else break;R++}for(;R<=de&&R<=se;){const H=A[de],Z=P[se]=T?qr(P[se]):cn(P[se]);if(Zn(H,Z))g(H,Z,j,null,X,ie,pe,E,T);else break;de--,se--}if(R>de){if(R<=se){const H=se+1,Z=Hse)for(;R<=de;)He(A[R],X,ie,!0),R++;else{const H=R,Z=R,Se=new Map;for(R=Z;R<=se;R++){const Re=P[R]=T?qr(P[R]):cn(P[R]);Re.key!=null&&Se.set(Re.key,R)}let M,V=0;const G=se-Z+1;let oe=!1,ye=0;const $e=new Array(G);for(R=0;R=G){He(Re,X,ie,!0);continue}let nt;if(Re.key!=null)nt=Se.get(Re.key);else for(M=Z;M<=se;M++)if($e[M-Z]===0&&Zn(Re,P[M])){nt=M;break}nt===void 0?He(Re,X,ie,!0):($e[nt-Z]=R+1,nt>=ye?ye=nt:oe=!0,g(Re,P[nt],j,null,X,ie,pe,E,T),V++)}const Me=oe?cb($e):is;for(M=Me.length-1,R=G-1;R>=0;R--){const Re=Z+R,nt=P[Re],Pe=Re+1{const{el:ie,type:pe,transition:E,children:T,shapeFlag:R}=A;if(R&6){Ve(A.component.subTree,P,j,te);return}if(R&128){A.suspense.move(P,j,te);return}if(R&64){pe.move(A,P,j,ge);return}if(pe===ve){r(ie,P,j);for(let de=0;deE.enter(ie),X);else{const{leave:de,delayLeave:se,afterLeave:H}=E,Z=()=>r(ie,P,j),Se=()=>{de(ie,()=>{Z(),H&&H()})};se?se(ie,Z,Se):Se()}else r(ie,P,j)},He=(A,P,j,te=!1,X=!1)=>{const{type:ie,props:pe,ref:E,children:T,dynamicChildren:R,shapeFlag:Q,patchFlag:de,dirs:se,cacheIndex:H}=A;if(de===-2&&(X=!1),E!=null&&ja(E,null,j,A,!0),H!=null&&(P.renderCache[H]=void 0),Q&256){P.ctx.deactivate(A);return}const Z=Q&1&&se,Se=!Eo(A);let M;if(Se&&(M=pe&&pe.onVnodeBeforeUnmount)&&ln(M,P,A),Q&6)ut(A.component,j,te);else{if(Q&128){A.suspense.unmount(j,te);return}Z&&ar(A,null,P,"beforeUnmount"),Q&64?A.type.remove(A,P,j,ge,te):R&&!R.hasOnce&&(ie!==ve||de>0&&de&64)?We(R,P,j,!1,!0):(ie===ve&&de&384||!X&&Q&16)&&We(T,P,j),te&&it(A)}(Se&&(M=pe&&pe.onVnodeUnmounted)||Z)&&Vt(()=>{M&&ln(M,P,A),Z&&ar(A,null,P,"unmounted")},j)},it=A=>{const{type:P,el:j,anchor:te,transition:X}=A;if(P===ve){at(j,te);return}if(P===To){v(A);return}const ie=()=>{o(j),X&&!X.persisted&&X.afterLeave&&X.afterLeave()};if(A.shapeFlag&1&&X&&!X.persisted){const{leave:pe,delayLeave:E}=X,T=()=>pe(j,ie);E?E(A.el,ie,T):T()}else ie()},at=(A,P)=>{let j;for(;A!==P;)j=f(A),o(A),A=j;o(P)},ut=(A,P,j)=>{const{bum:te,scope:X,update:ie,subTree:pe,um:E,m:T,a:R}=A;Ba(T),Ba(R),te&&cs(te),X.stop(),ie&&(ie.active=!1,He(pe,A,P,j)),E&&Vt(E,P),Vt(()=>{A.isUnmounted=!0},P),P&&P.pendingBranch&&!P.isUnmounted&&A.asyncDep&&!A.asyncResolved&&A.suspenseId===P.pendingId&&(P.deps--,P.deps===0&&P.resolve())},We=(A,P,j,te=!1,X=!1,ie=0)=>{for(let pe=ie;pe{if(A.shapeFlag&6)return Y(A.component.subTree);if(A.shapeFlag&128)return A.suspense.next();const P=f(A.anchor||A.el),j=P&&P[O_];return j?f(j):P};let fe=!1;const le=(A,P,j)=>{A==null?P._vnode&&He(P._vnode,null,null,!0):g(P._vnode||null,A,P,null,null,null,j),P._vnode=A,fe||(fe=!0,vm(),Ha(),fe=!1)},ge={p:g,um:He,m:Ve,r:it,mt:ne,mc:D,pc:ce,pbc:F,n:Y,o:e};let Ue,Ge;return t&&([Ue,Ge]=t(ge)),{render:le,hydrate:Ue,createApp:Yv(le,Ue)}}function uc({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function fo({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function R_(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Sd(e,t,n=!1){const r=e.children,o=t.children;if(ze(r)&&ze(o))for(let s=0;s>1,e[n[a]]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}function M_(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:M_(t)}function Ba(e){if(e)for(let t=0;tLn(F_);function H_(e,t){return Li(e,null,t)}function U_(e,t){return Li(e,null,{flush:"post"})}function j_(e,t){return Li(e,null,{flush:"sync"})}const ra={};function Nn(e,t,n){return Li(e,t,n)}function Li(e,t,{immediate:n,deep:r,flush:o,once:s,onTrack:i,onTrigger:a}=ot){if(t&&s){const C=t;t=(...L)=>{C(...L),S()}}const l=Rt,u=C=>r===!0?C:Yr(C,r===!1?1:void 0);let m,d=!1,f=!1;if(At(e)?(m=()=>e.value,d=Po(e)):Sr(e)?(m=()=>u(e),d=!0):ze(e)?(f=!0,d=e.some(C=>Sr(C)||Po(C)),m=()=>e.map(C=>{if(At(C))return C.value;if(Sr(C))return u(C);if(Oe(C))return xr(C,l,2)})):Oe(e)?t?m=()=>xr(e,l,2):m=()=>(p&&p(),wn(e,l,3,[h])):m=mn,t&&r){const C=m;m=()=>Yr(C())}let p,h=C=>{p=_.onStop=()=>{xr(C,l,4),p=_.onStop=void 0}},g;if(Ni)if(h=mn,t?n&&wn(t,l,3,[m(),f?[]:void 0,h]):m(),o==="sync"){const C=V_();g=C.__watcherHandles||(C.__watcherHandles=[])}else return mn;let z=f?new Array(e.length).fill(ra):ra;const k=()=>{if(!(!_.active||!_.dirty))if(t){const C=_.run();(r||d||(f?C.some((L,D)=>tn(L,z[D])):tn(C,z)))&&(p&&p(),wn(t,l,3,[C,z===ra?void 0:f&&z[0]===ra?[]:z,h]),z=C)}else _.run()};k.allowRecurse=!!t;let w;o==="sync"?w=k:o==="post"?w=()=>Vt(k,l&&l.suspense):(k.pre=!0,l&&(k.id=l.uid),w=()=>kl(k));const _=new hs(m,mn,w),v=rd(),S=()=>{_.stop(),v&&Qu(v.effects,_)};return t?n?k():z=_.run():o==="post"?Vt(_.run.bind(_),l&&l.suspense):_.run(),g&&g.push(S),S}function ub(e,t,n){const r=this.proxy,o=vt(e)?e.includes(".")?B_(r,e):()=>r[e]:e.bind(r,r);let s;Oe(t)?s=t:(s=t.handler,n=t);const i=Lo(this),a=Li(o,s.bind(r),n);return i(),a}function B_(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Yr(r,t,n)});else if(Ah(e)){for(const r in e)Yr(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Yr(e[r],t,n)}return e}function db(e,t,n=ot){const r=Hn(),o=Yt(t),s=dn(t),i=W_(e,t),a=Qh((l,u)=>{let m,d=ot,f;return j_(()=>{const p=e[t];tn(m,p)&&(m=p,u())}),{get(){return l(),n.get?n.get(m):m},set(p){const h=n.set?n.set(p):p;if(!tn(h,m)&&!(d!==ot&&tn(p,d)))return;const g=r.vnode.props;g&&(t in g||o in g||s in g)&&(`onUpdate:${t}`in g||`onUpdate:${o}`in g||`onUpdate:${s}`in g)||(m=p,u()),r.emit(`update:${t}`,h),tn(p,h)&&tn(p,d)&&!tn(h,f)&&u(),d=p,f=h}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?i||ot:a,done:!1}:{done:!0}}}},a}const W_=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Yt(t)}Modifiers`]||e[`${dn(t)}Modifiers`];function mb(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||ot;let o=n;const s=t.startsWith("update:"),i=s&&W_(r,t.slice(7));i&&(i.trim&&(o=n.map(m=>vt(m)?m.trim():m)),i.number&&(o=n.map(Ra)));let a,l=r[a=ei(t)]||r[a=ei(Yt(t))];!l&&s&&(l=r[a=ei(dn(t))]),l&&wn(l,e,6,o);const u=r[a+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,wn(u,e,6,o)}}function q_(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!Oe(e)){const l=u=>{const m=q_(u,t,!0);m&&(a=!0,wt(i,m))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(mt(e)&&r.set(e,null),null):(ze(s)?s.forEach(l=>i[l]=null):wt(i,s),mt(e)&&r.set(e,i),i)}function Ol(e,t){return!e||!Ai(t)?!1:(t=t.slice(2).replace(/Once$/,""),tt(e,t[0].toLowerCase()+t.slice(1))||tt(e,dn(t))||tt(e,t))}function Ca(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:i,attrs:a,emit:l,render:u,renderCache:m,props:d,data:f,setupState:p,ctx:h,inheritAttrs:g}=e,z=zi(e);let k,w;try{if(n.shapeFlag&4){const v=o||r,S=v;k=cn(u.call(S,v,m,d,p,f,h)),w=a}else{const v=t;k=cn(v.length>1?v(d,{attrs:a,slots:i,emit:l}):v(d,null)),w=t.props?a:pb(a)}}catch(v){oi.length=0,Mo(v,e,1),k=b(Dt)}let _=k;if(w&&g!==!1){const v=Object.keys(w),{shapeFlag:S}=_;v.length&&S&7&&(s&&v.some(Ju)&&(w=hb(w,s)),_=pr(_,w,!1,!0))}return n.dirs&&(_=pr(_,null,!1,!0),_.dirs=_.dirs?_.dirs.concat(n.dirs):n.dirs),n.transition&&(_.transition=n.transition),k=_,zi(z),k}function fb(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||Ai(n))&&((t||(t={}))[n]=e[n]);return t},hb=(e,t)=>{const n={};for(const r in e)(!Ju(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function _b(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?Am(r,i,u):!!i;if(l&8){const m=t.dynamicProps;for(let d=0;de.__isSuspense;let au=0;const gb={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,s,i,a,l,u){if(e==null)zb(t,n,r,o,s,i,a,l,u);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}vb(e,t,n,r,o,i,a,l,u)}},hydrate:bb,normalize:Cb},yb=gb;function bi(e,t){const n=e.props&&e.props[t];Oe(n)&&n()}function zb(e,t,n,r,o,s,i,a,l){const{p:u,o:{createElement:m}}=l,d=m("div"),f=e.suspense=G_(e,o,r,t,d,n,s,i,a,l);u(null,f.pendingBranch=e.ssContent,d,null,r,f,s,i),f.deps>0?(bi(e,"onPending"),bi(e,"onFallback"),u(null,e.ssFallback,t,n,r,null,s,i),ms(f,e.ssFallback)):f.resolve(!1,!0)}function vb(e,t,n,r,o,s,i,a,{p:l,um:u,o:{createElement:m}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,p=t.ssFallback,{activeBranch:h,pendingBranch:g,isInFallback:z,isHydrating:k}=d;if(g)d.pendingBranch=f,Zn(f,g)?(l(g,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():z&&(k||(l(h,p,n,r,o,null,s,i,a),ms(d,p)))):(d.pendingId=au++,k?(d.isHydrating=!1,d.activeBranch=g):u(g,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=m("div"),z?(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():(l(h,p,n,r,o,null,s,i,a),ms(d,p))):h&&Zn(f,h)?(l(h,f,n,r,o,d,s,i,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0&&d.resolve()));else if(h&&Zn(f,h))l(h,f,n,r,o,d,s,i,a),ms(d,f);else if(bi(t,"onPending"),d.pendingBranch=f,f.shapeFlag&512?d.pendingId=f.component.suspenseId:d.pendingId=au++,l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0)d.resolve();else{const{timeout:w,pendingId:_}=d;w>0?setTimeout(()=>{d.pendingId===_&&d.fallback(p)},w):w===0&&d.fallback(p)}}function G_(e,t,n,r,o,s,i,a,l,u,m=!1){const{p:d,m:f,um:p,n:h,o:{parentNode:g,remove:z}}=u;let k;const w=wb(e);w&&t&&t.pendingBranch&&(k=t.pendingId,t.deps++);const _=e.props?Ma(e.props.timeout):void 0,v=s,S={vnode:e,parent:t,parentComponent:n,namespace:i,container:r,hiddenContainer:o,deps:0,pendingId:au++,timeout:typeof _=="number"?_:-1,activeBranch:null,pendingBranch:null,isInFallback:!m,isHydrating:m,isUnmounted:!1,effects:[],resolve(C=!1,L=!1){const{vnode:D,activeBranch:$,pendingBranch:F,pendingId:q,effects:U,parentComponent:W,container:ne}=S;let me=!1;S.isHydrating?S.isHydrating=!1:C||(me=$&&F.transition&&F.transition.mode==="out-in",me&&($.transition.afterLeave=()=>{q===S.pendingId&&(f(F,ne,s===v?h($):s,0),Va(U))}),$&&(g($.el)!==S.hiddenContainer&&(s=h($)),p($,W,S,!0)),me||f(F,ne,s,0)),ms(S,F),S.pendingBranch=null,S.isInFallback=!1;let K=S.parent,re=!1;for(;K;){if(K.pendingBranch){K.effects.push(...U),re=!0;break}K=K.parent}!re&&!me&&Va(U),S.effects=[],w&&t&&t.pendingBranch&&k===t.pendingId&&(t.deps--,t.deps===0&&!L&&t.resolve()),bi(D,"onResolve")},fallback(C){if(!S.pendingBranch)return;const{vnode:L,activeBranch:D,parentComponent:$,container:F,namespace:q}=S;bi(L,"onFallback");const U=h(D),W=()=>{S.isInFallback&&(d(null,C,F,U,$,null,q,a,l),ms(S,C))},ne=C.transition&&C.transition.mode==="out-in";ne&&(D.transition.afterLeave=W),S.isInFallback=!0,p(D,$,null,!0),ne||W()},move(C,L,D){S.activeBranch&&f(S.activeBranch,C,L,D),S.container=C},next(){return S.activeBranch&&h(S.activeBranch)},registerDep(C,L,D){const $=!!S.pendingBranch;$&&S.deps++;const F=C.vnode.el;C.asyncDep.catch(q=>{Mo(q,C,0)}).then(q=>{if(C.isUnmounted||S.isUnmounted||S.pendingId!==C.suspenseId)return;C.asyncResolved=!0;const{vnode:U}=C;du(C,q,!1),F&&(U.el=F);const W=!F&&C.subTree.el;L(C,U,g(F||C.subTree.el),F?null:h(C.subTree),S,i,D),W&&z(W),xd(C,U.el),$&&--S.deps===0&&S.resolve()})},unmount(C,L){S.isUnmounted=!0,S.activeBranch&&p(S.activeBranch,n,C,L),S.pendingBranch&&p(S.pendingBranch,n,C,L)}};return S}function bb(e,t,n,r,o,s,i,a,l){const u=t.suspense=G_(t,r,n,e.parentNode,document.createElement("div"),null,o,s,i,a,!0),m=l(e,u.pendingBranch=t.ssContent,n,u,s,i);return u.deps===0&&u.resolve(!1,!0),m}function Cb(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=Om(r?n.default:n),e.ssFallback=r?Om(n.fallback):b(Dt)}function Om(e){let t;if(Oe(e)){const n=Io&&e._c;n&&(e._d=!1,x()),e=e(),n&&(e._d=!0,t=Zt,Z_())}return ze(e)&&(e=fb(e)),e=cn(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function K_(e,t){t&&t.pendingBranch?ze(e)?t.effects.push(...e):t.effects.push(e):Va(e)}function ms(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;for(;!o&&t.component;)t=t.component.subTree,o=t.el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,xd(r,o))}function wb(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const ve=Symbol.for("v-fgt"),Er=Symbol.for("v-txt"),Dt=Symbol.for("v-cmt"),To=Symbol.for("v-stc"),oi=[];let Zt=null;function x(e=!1){oi.push(Zt=e?null:[])}function Z_(){oi.pop(),Zt=oi[oi.length-1]||null}let Io=1;function lu(e){Io+=e,e<0&&Zt&&(Zt.hasOnce=!0)}function Y_(e){return e.dynamicChildren=Io>0?Zt||is:null,Z_(),Io>0&&Zt&&Zt.push(e),e}function I(e,t,n,r,o,s){return Y_(c(e,t,n,r,o,s,!0))}function we(e,t,n,r,o){return Y_(b(e,t,n,r,o,!0))}function so(e){return e?e.__v_isVNode===!0:!1}function Zn(e,t){return e.type===t.type&&e.key===t.key}function kb(e){}const X_=({key:e})=>e??null,wa=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?vt(e)||At(e)||Oe(e)?{i:Mt,r:e,k:t,f:!!n}:e:null);function c(e,t=null,n=null,r=0,o=null,s=e===ve?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&X_(t),ref:t&&wa(t),scopeId:Sl,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Mt};return a?(Ed(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=vt(n)?8:16),Io>0&&!i&&Zt&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&Zt.push(l),l}const b=Sb;function Sb(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===g_)&&(e=Dt),so(e)){const a=pr(e,t,!0);return n&&Ed(a,n),Io>0&&!s&&Zt&&(a.shapeFlag&6?Zt[Zt.indexOf(e)]=a:Zt.push(a)),a.patchFlag=-2,a}if(Ib(e)&&(e=e.__vccOpts),t){t=J_(t);let{class:a,style:l}=t;a&&!vt(a)&&(t.class=ke(a)),mt(l)&&(cd(l)&&!ze(l)&&(l=wt({},l)),t.style=ao(l))}const i=vt(e)?1:iu(e)?128:rb(e)?64:mt(e)?4:Oe(e)?2:0;return c(e,t,n,r,o,i,s,!0)}function J_(e){return e?cd(e)||k_(e)?wt({},e):e:null}function pr(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:i,children:a,transition:l}=e,u=t?rs(o||{},t):o,m={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&X_(u),ref:t&&t.ref?n&&s?ze(s)?s.concat(wa(t)):[s,wa(t)]:wa(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ve?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&pr(e.ssContent),ssFallback:e.ssFallback&&pr(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&oo(m,l.clone(m)),m}function Lt(e=" ",t=0){return b(Er,null,e,t)}function xb(e,t){const n=b(To,null,e);return n.staticCount=t,n}function ee(e="",t=!1){return t?(x(),we(Dt,null,e)):b(Dt,null,e)}function cn(e){return e==null||typeof e=="boolean"?b(Dt):ze(e)?b(ve,null,e.slice()):typeof e=="object"?qr(e):b(Er,null,String(e))}function qr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:pr(e)}function Ed(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ze(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Ed(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!k_(t)?t._ctx=Mt:o===3&&Mt&&(Mt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Oe(t)?(t={default:t,_ctx:Mt},n=32):(t=String(t),r&64?(n=16,t=[Lt(t)]):n=8);e.children=t,e.shapeFlag|=n}function rs(...e){const t={};for(let n=0;nRt||Mt;let Wa,cu;{const e=Ph(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(i=>i(s)):o[0](s)}};Wa=t("__VUE_INSTANCE_SETTERS__",n=>Rt=n),cu=t("__VUE_SSR_SETTERS__",n=>Ni=n)}const Lo=e=>{const t=Rt;return Wa(e),e.scope.on(),()=>{e.scope.off(),Wa(t)}},uu=()=>{Rt&&Rt.scope.off(),Wa(null)};function eg(e){return e.vnode.shapeFlag&4}let Ni=!1;function tg(e,t=!1,n=!1){t&&cu(t);const{props:r,children:o}=e.vnode,s=eg(e);Xv(e,r,s,t),tb(e,o,n);const i=s?Tb(e,t):void 0;return t&&cu(!1),i}function Tb(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,tu);const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?rg(e):null,s=Lo(e);lo();const i=xr(r,e,0,[e.props,o]);if(co(),s(),ed(i)){if(i.then(uu,uu),t)return i.then(a=>{du(e,a,t)}).catch(a=>{Mo(a,e,0)});e.asyncDep=i}else du(e,i,t)}else ng(e,t)}function du(e,t,n){Oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:mt(t)&&(e.setupState=fd(t)),ng(e,n)}let qa,mu;function Ab(e){qa=e,mu=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,Av))}}const Ob=()=>!qa;function ng(e,t,n){const r=e.type;if(!e.render){if(!t&&qa&&!r.render){const o=r.template||wd(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,u=wt(wt({isCustomElement:s,delimiters:a},i),l);r.render=qa(o,u)}}e.render=r.render||mn,mu&&mu(e)}{const o=Lo(e);lo();try{Bv(e)}finally{co(),o()}}}const Pb={get(e,t){return pn(e,"get",""),e[t]}};function rg(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Pb),slots:e.slots,emit:e.emit,expose:t}}function Di(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(fd(wl(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ti)return ti[n](e)},has(t,n){return n in t||n in ti}})):e.proxy}function fu(e,t=!0){return Oe(e)?e.displayName||e.name:e.name||t&&e.__name}function Ib(e){return Oe(e)&&"__vccOpts"in e}const Ht=(e,t)=>nv(e,t,Ni);function ur(e,t,n){const r=arguments.length;return r===2?mt(t)&&!ze(t)?so(t)?b(e,null,[t]):b(e,t):b(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&so(n)&&(n=[n]),b(e,t,n))}function Lb(){}function Nb(e,t,n,r){const o=n[r];if(o&&og(o,e))return o;const s=t();return s.memo=e.slice(),s.cacheIndex=r,n[r]=s}function og(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r0&&Zt&&Zt.push(e),!0}const sg="3.4.38",Db=mn,Rb=hv,Mb=Xo,Fb=s_,Vb={createComponentInstance:Q_,setupComponent:tg,renderComponentRoot:Ca,setCurrentRenderingInstance:zi,isVNode:so,normalizeVNode:cn,getComponentPublicInstance:Di,ensureValidVNode:Cd},Hb=Vb,Ub=null,jb=null,Bb=null;/** +**/function zv(e,t){}const vv={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",WATCH_GETTER:2,2:"WATCH_GETTER",WATCH_CALLBACK:3,3:"WATCH_CALLBACK",WATCH_CLEANUP:4,4:"WATCH_CLEANUP",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE"},bv={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update"};function $r(e,t,n,r){try{return r?e(...r):e()}catch(o){Ho(o,t,n)}}function kn(e,t,n,r){if(Oe(e)){const o=$r(e,t,n,r);return o&&sd(o)&&o.catch(s=>{Ho(s,t,n)}),o}if(ze(e)){const o=[];for(let s=0;s>>1,o=Gt[r],s=bi(o);sur&&Gt.splice(t,1)}function Wa(e){ze(e)?ps.push(...e):(!qr||!qr.includes(e,e.allowRecurse?So+1:So))&&ps.push(e),c_()}function xm(e,t,n=vi?ur+1:0){for(;nbi(n)-bi(r));if(ps.length=0,qr){qr.push(...t);return}for(qr=t,So=0;Soe.id==null?1/0:e.id,Sv=(e,t)=>{const n=bi(e)-bi(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function u_(e){ou=!1,vi=!0,Gt.sort(Sv);try{for(ur=0;ures.emit(o,...s)),ta=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{d_(s,t)}),setTimeout(()=>{es||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,ta=[])},3e3)):ta=[]}let Vt=null,Tl=null;function Ci(e){const t=Vt;return Vt=e,Tl=e&&e.type.__scopeId||null,t}function xv(e){Tl=e}function Ev(){Tl=null}const $v=e=>N;function N(e,t=Vt,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&fu(-1);const s=Ci(t);let i;try{i=e(...o)}finally{Ci(s),r._d&&fu(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function ht(e,t){if(Vt===null)return e;const n=Vi(Vt),r=e.dirs||(e.dirs=[]);for(let o=0;o{e.isMounted=!0}),Il(()=>{e.isUnmounting=!0}),e}const $n=[Function,Array],bd={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$n,onEnter:$n,onAfterEnter:$n,onEnterCancelled:$n,onBeforeLeave:$n,onLeave:$n,onAfterLeave:$n,onLeaveCancelled:$n,onBeforeAppear:$n,onAppear:$n,onAfterAppear:$n,onAppearCancelled:$n},m_=e=>{const t=e.subTree;return t.component?m_(t.component):t},Tv={name:"BaseTransition",props:bd,setup(e,{slots:t}){const n=Un(),r=vd();return()=>{const o=t.default&&Al(t.default(),!0);if(!o||!o.length)return;let s=o[0];if(o.length>1){for(const f of o)if(f.type!==Mt){s=f;break}}const i=Xe(e),{mode:a}=i;if(r.isLeaving)return uc(s);const l=Em(s);if(!l)return uc(s);let u=zs(l,i,r,n,f=>u=f);io(l,u);const m=n.subTree,d=m&&Em(m);if(d&&d.type!==Mt&&!Yn(l,d)&&m_(n).type!==Mt){const f=zs(d,i,r,n);if(io(d,f),a==="out-in"&&l.type!==Mt)return r.isLeaving=!0,f.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},uc(s);a==="in-out"&&l.type!==Mt&&(f.delayLeave=(p,h,g)=>{const z=p_(r,d);z[String(d.key)]=d,p[Gr]=()=>{h(),p[Gr]=void 0,delete u.delayedLeave},u.delayedLeave=g})}return s}}},f_=Tv;function p_(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function zs(e,t,n,r,o){const{appear:s,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:m,onEnterCancelled:d,onBeforeLeave:f,onLeave:p,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:z,onAppear:k,onAfterAppear:w,onAppearCancelled:_}=t,v=String(e.key),S=p_(n,e),C=($,F)=>{$&&kn($,r,9,F)},L=($,F)=>{const q=F[1];C($,F),ze($)?$.every(U=>U.length<=1)&&q():$.length<=1&&q()},D={mode:i,persisted:a,beforeEnter($){let F=l;if(!n.isMounted)if(s)F=z||l;else return;$[Gr]&&$[Gr](!0);const q=S[v];q&&Yn(e,q)&&q.el[Gr]&&q.el[Gr](),C(F,[$])},enter($){let F=u,q=m,U=d;if(!n.isMounted)if(s)F=k||u,q=w||m,U=_||d;else return;let W=!1;const ne=$[na]=me=>{W||(W=!0,me?C(U,[$]):C(q,[$]),D.delayedLeave&&D.delayedLeave(),$[na]=void 0)};F?L(F,[$,ne]):ne()},leave($,F){const q=String(e.key);if($[na]&&$[na](!0),n.isUnmounting)return F();C(f,[$]);let U=!1;const W=$[Gr]=ne=>{U||(U=!0,F(),ne?C(g,[$]):C(h,[$]),$[Gr]=void 0,S[q]===e&&delete S[q])};S[q]=e,p?L(p,[$,W]):W()},clone($){const F=zs($,t,n,r,o);return o&&o(F),F}};return D}function uc(e){if(Di(e))return e=_r(e),e.children=null,e}function Em(e){if(!Di(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Oe(n.default))return n.default()}}function io(e,t){e.shapeFlag&6&&e.component?io(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Al(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Av(e){Oe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:i=!0,onError:a}=e;let l=null,u,m=0;const d=()=>(m++,l=null,f()),f=()=>{let p;return l||(p=l=t().catch(h=>{if(h=h instanceof Error?h:new Error(String(h)),a)return new Promise((g,z)=>{a(h,()=>g(d()),()=>z(h),m+1)});throw h}).then(h=>p!==l&&l?l:(h&&(h.__esModule||h[Symbol.toStringTag]==="Module")&&(h=h.default),u=h,h)))};return Pr({name:"AsyncComponentWrapper",__asyncLoader:f,get __asyncResolved(){return u},setup(){const p=Ft;if(u)return()=>dc(u,p);const h=w=>{l=null,Ho(w,p,13,!r)};if(i&&p.suspense||Fi)return f().then(w=>()=>dc(w,p)).catch(w=>(h(w),()=>r?b(r,{error:w}):null));const g=Ln(!1),z=Ln(),k=Ln(!!o);return o&&setTimeout(()=>{k.value=!1},o),s!=null&&setTimeout(()=>{if(!g.value&&!z.value){const w=new Error(`Async component timed out after ${s}ms.`);h(w),z.value=w}},s),f().then(()=>{g.value=!0,p.parent&&Di(p.parent.vnode)&&(p.parent.effect.dirty=!0,$l(p.parent.update))}).catch(w=>{h(w),z.value=w}),()=>{if(g.value&&u)return dc(u,p);if(z.value&&r)return b(r,{error:z.value});if(n&&!k.value)return b(n)}}})}function dc(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=b(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const Di=e=>e.type.__isKeepAlive,Ov={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Un(),r=n.ctx;if(!r.renderer)return()=>{const w=t.default&&t.default();return w&&w.length===1?w[0]:w};const o=new Map,s=new Set;let i=null;const a=n.suspense,{renderer:{p:l,m:u,um:m,o:{createElement:d}}}=r,f=d("div");r.activate=(w,_,v,S,C)=>{const L=w.component;u(w,_,v,0,a),l(L.vnode,w,_,v,L,a,S,w.slotScopeIds,C),Ut(()=>{L.isDeactivated=!1,L.a&&ms(L.a);const D=w.props&&w.props.onVnodeMounted;D&&cn(D,L.parent,w)},a)},r.deactivate=w=>{const _=w.component;Za(_.m),Za(_.a),u(w,f,null,1,a),Ut(()=>{_.da&&ms(_.da);const v=w.props&&w.props.onVnodeUnmounted;v&&cn(v,_.parent,w),_.isDeactivated=!0},a)};function p(w){mc(w),m(w,n,a,!0)}function h(w){o.forEach((_,v)=>{const S=yu(_.type);S&&(!w||!w(S))&&g(v)})}function g(w){const _=o.get(w);_&&(!i||!Yn(_,i))?p(_):i&&mc(i),o.delete(w),s.delete(w)}Dn(()=>[e.include,e.exclude],([w,_])=>{w&&h(v=>Zs(w,v)),_&&h(v=>!Zs(_,v))},{flush:"post",deep:!0});let z=null;const k=()=>{z!=null&&(du(n.subTree.type)?Ut(()=>{o.set(z,ra(n.subTree))},n.subTree.suspense):o.set(z,ra(n.subTree)))};return As(k),Pl(k),Il(()=>{o.forEach(w=>{const{subTree:_,suspense:v}=n,S=ra(_);if(w.type===S.type&&w.key===S.key){mc(S);const C=S.component.da;C&&Ut(C,v);return}p(w)})}),()=>{if(z=null,!t.default)return null;const w=t.default(),_=w[0];if(w.length>1)return i=null,w;if(!ao(_)||!(_.shapeFlag&4)&&!(_.shapeFlag&128))return i=null,_;let v=ra(_);if(v.type===Mt)return i=null,v;const S=v.type,C=yu(Ao(v)?v.type.__asyncResolved||{}:S),{include:L,exclude:D,max:$}=e;if(L&&(!C||!Zs(L,C))||D&&C&&Zs(D,C))return i=v,_;const F=v.key==null?S:v.key,q=o.get(F);return v.el&&(v=_r(v),_.shapeFlag&128&&(_.ssContent=v)),z=F,q?(v.el=q.el,v.component=q.component,v.transition&&io(v,v.transition),v.shapeFlag|=512,s.delete(F),s.add(F)):(s.add(F),$&&s.size>parseInt($,10)&&g(s.values().next().value)),v.shapeFlag|=256,i=v,du(_.type)?_:v}}},Pv=Ov;function Zs(e,t){return ze(e)?e.some(n=>Zs(n,t)):bt(e)?e.split(",").includes(t):xz(e)?e.test(t):!1}function h_(e,t){g_(e,"a",t)}function __(e,t){g_(e,"da",t)}function g_(e,t,n=Ft){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ol(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Di(o.parent.vnode)&&Iv(r,t,n,o),o=o.parent}}function Iv(e,t,n,r){const o=Ol(t,e,r,!0);Ri(()=>{od(r[t],o)},n)}function mc(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ra(e){return e.shapeFlag&128?e.ssContent:e}function Ol(e,t,n=Ft,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{uo();const a=Ro(n),l=kn(t,n,e,i);return a(),mo(),l});return r?o.unshift(s):o.push(s),s}}const Ir=e=>(t,n=Ft)=>{(!Fi||e==="sp")&&Ol(e,(...r)=>t(...r),n)},Cd=Ir("bm"),As=Ir("m"),y_=Ir("bu"),Pl=Ir("u"),Il=Ir("bum"),Ri=Ir("um"),z_=Ir("sp"),v_=Ir("rtg"),b_=Ir("rtc");function C_(e,t=Ft){Ol("ec",e,t)}const wd="components",Lv="directives";function O(e,t){return Sd(wd,e,!0,t)||e}const w_=Symbol.for("v-ndc");function Ll(e){return bt(e)?Sd(wd,e,!1)||e:e||w_}function kd(e){return Sd(Lv,e)}function Sd(e,t,n=!0,r=!1){const o=Vt||Ft;if(o){const s=o.type;if(e===wd){const a=yu(s,!1);if(a&&(a===t||a===Xt(t)||a===Ni(Xt(t))))return s}const i=$m(o[e]||s[e],t)||$m(o.appContext[e],t);return!i&&r?s:i}}function $m(e,t){return e&&(e[t]||e[Xt(t)]||e[Ni(Xt(t))])}function _t(e,t,n,r){let o;const s=n&&n[r];if(ze(e)||bt(e)){o=new Array(e.length);for(let i=0,a=e.length;it(i,a,void 0,s&&s[a]));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,l=i.length;a{const s=r.fn(...o);return s&&(s.key=r.key),s}:r.fn)}return e}function vt(e,t,n={},r,o){if(Vt.isCE||Vt.parent&&Ao(Vt.parent)&&Vt.parent.isCE)return t!=="default"&&(n.name=t),b("slot",n,r&&r());let s=e[t];s&&s._c&&(s._d=!1),x();const i=s&&Ed(s(n)),a=we(ve,{key:(n.key||i&&i.key||`_${t}`)+(!i&&r?"_fb":"")},i||(r?r():[]),i&&e._===1?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),s&&s._c&&(s._d=!0),a}function Ed(e){return e.some(t=>ao(t)?!(t.type===Mt||t.type===ve&&!Ed(t.children)):!0)?e:null}function Nv(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:ri(r)]=e[r];return n}const su=e=>e?ig(e)?Vi(e):su(e.parent):null,oi=kt(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=>su(e.parent),$root:e=>su(e.root),$emit:e=>e.emit,$options:e=>$d(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,$l(e.update)}),$nextTick:e=>e.n||(e.n=Uo.bind(e.proxy)),$watch:e=>_b.bind(e)}),fc=(e,t)=>e!==st&&!e.__isScriptSetup&&tt(e,t),iu={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let u;if(t[0]!=="$"){const p=i[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(fc(r,t))return i[t]=1,r[t];if(o!==st&&tt(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&tt(u,t))return i[t]=3,s[t];if(n!==st&&tt(n,t))return i[t]=4,n[t];au&&(i[t]=0)}}const m=oi[t];let d,f;if(m)return t==="$attrs"&&hn(e.attrs,"get",""),m(e);if((d=a.__cssModules)&&(d=d[t]))return d;if(n!==st&&tt(n,t))return i[t]=4,n[t];if(f=l.config.globalProperties,tt(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return fc(o,t)?(o[t]=n,!0):r!==st&&tt(r,t)?(r[t]=n,!0):tt(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 a;return!!n[i]||e!==st&&tt(e,i)||fc(t,i)||(a=s[0])&&tt(a,i)||tt(r,i)||tt(oi,i)||tt(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:tt(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},Dv=kt({},iu,{get(e,t){if(t!==Symbol.unscopables)return iu.get(e,t,e)},has(e,t){return t[0]!=="_"&&!Oz(t)}});function Rv(){return null}function Mv(){return null}function Fv(e){}function Vv(e){}function Hv(){return null}function Uv(){}function jv(e,t){return null}function Bv(){return k_().slots}function Wv(){return k_().attrs}function k_(){const e=Un();return e.setupContext||(e.setupContext=cg(e))}function wi(e){return ze(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function qv(e,t){const n=wi(e);for(const r in t){if(r.startsWith("__skip"))continue;let o=n[r];o?ze(o)||Oe(o)?o=n[r]={type:o,default:t[r]}:o.default=t[r]:o===null&&(o=n[r]={default:t[r]}),o&&t[`__skip_${r}`]&&(o.skipFactory=!0)}return n}function Gv(e,t){return!e||!t?e||t:ze(e)&&ze(t)?e.concat(t):kt({},wi(e),wi(t))}function Kv(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function Zv(e){const t=Un();let n=e();return hu(),sd(n)&&(n=n.catch(r=>{throw Ro(t),r})),[n,()=>Ro(t)]}let au=!0;function Yv(e){const t=$d(e),n=e.proxy,r=e.ctx;au=!1,t.beforeCreate&&Tm(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:u,created:m,beforeMount:d,mounted:f,beforeUpdate:p,updated:h,activated:g,deactivated:z,beforeDestroy:k,beforeUnmount:w,destroyed:_,unmounted:v,render:S,renderTracked:C,renderTriggered:L,errorCaptured:D,serverPrefetch:$,expose:F,inheritAttrs:q,components:U,directives:W,filters:ne}=t;if(u&&Xv(u,r,null),i)for(const re in i){const ce=i[re];Oe(ce)&&(r[re]=ce.bind(n))}if(o){const re=o.call(n,n);ft(re)&&(e.data=Ts(re))}if(au=!0,s)for(const re in s){const ce=s[re],Ne=Oe(ce)?ce.bind(n,n):Oe(ce.get)?ce.get.bind(n,n):fn,it=!Oe(ce)&&Oe(ce.set)?ce.set.bind(n):fn,Ve=jt({get:Ne,set:it});Object.defineProperty(r,re,{enumerable:!0,configurable:!0,get:()=>Ve.value,set:He=>Ve.value=He})}if(a)for(const re in a)S_(a[re],r,n,re);if(l){const re=Oe(l)?l.call(n):l;Reflect.ownKeys(re).forEach(ce=>{si(ce,re[ce])})}m&&Tm(m,e,"c");function K(re,ce){ze(ce)?ce.forEach(Ne=>re(Ne.bind(n))):ce&&re(ce.bind(n))}if(K(Cd,d),K(As,f),K(y_,p),K(Pl,h),K(h_,g),K(__,z),K(C_,D),K(b_,C),K(v_,L),K(Il,w),K(Ri,v),K(z_,$),ze(F))if(F.length){const re=e.exposed||(e.exposed={});F.forEach(ce=>{Object.defineProperty(re,ce,{get:()=>n[ce],set:Ne=>n[ce]=Ne})})}else e.exposed||(e.exposed={});S&&e.render===fn&&(e.render=S),q!=null&&(e.inheritAttrs=q),U&&(e.components=U),W&&(e.directives=W)}function Xv(e,t,n=fn){ze(e)&&(e=lu(e));for(const r in e){const o=e[r];let s;ft(o)?"default"in o?s=Nn(o.from||r,o.default,!0):s=Nn(o.from||r):s=Nn(o),Ot(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function Tm(e,t,n){kn(ze(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function S_(e,t,n,r){const o=r.includes(".")?Y_(n,r):()=>n[r];if(bt(e)){const s=t[e];Oe(s)&&Dn(o,s)}else if(Oe(e))Dn(o,e.bind(n));else if(ft(e))if(ze(e))e.forEach(s=>S_(s,t,n,r));else{const s=Oe(e.handler)?e.handler.bind(n):t[e.handler];Oe(s)&&Dn(o,s,e)}}function $d(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(u=>Ga(l,u,i,!0)),Ga(l,t,i)),ft(t)&&s.set(t,l),l}function Ga(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&Ga(e,s,n,!0),o&&o.forEach(i=>Ga(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const a=Jv[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const Jv={data:Am,props:Om,emits:Om,methods:Ys,computed:Ys,beforeCreate:Qt,created:Qt,beforeMount:Qt,mounted:Qt,beforeUpdate:Qt,updated:Qt,beforeDestroy:Qt,beforeUnmount:Qt,destroyed:Qt,unmounted:Qt,activated:Qt,deactivated:Qt,errorCaptured:Qt,serverPrefetch:Qt,components:Ys,directives:Ys,watch:eb,provide:Am,inject:Qv};function Am(e,t){return t?e?function(){return kt(Oe(e)?e.call(this,this):e,Oe(t)?t.call(this,this):t)}:t:e}function Qv(e,t){return Ys(lu(e),lu(t))}function lu(e){if(ze(e)){const t={};for(let n=0;n1)return n&&Oe(t)?t.call(r&&r.proxy):t}}function E_(){return!!(Ft||Vt||Oo)}const $_={},T_=()=>Object.create($_),A_=e=>Object.getPrototypeOf(e)===$_;function rb(e,t,n,r=!1){const o={},s=T_();e.propsDefaults=Object.create(null),O_(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:md(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function ob(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=Xe(o),[l]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const m=e.vnode.dynamicProps;for(let d=0;d{l=!0;const[f,p]=P_(d,t,!0);kt(i,f),p&&a.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(m),e.extends&&m(e.extends),e.mixins&&e.mixins.forEach(m)}if(!s&&!l)return ft(e)&&r.set(e,cs),cs;if(ze(s))for(let m=0;me[0]==="_"||e==="$stable",Td=e=>ze(e)?e.map(un):[un(e)],ib=(e,t,n)=>{if(t._n)return t;const r=N((...o)=>Td(t(...o)),n);return r._c=!1,r},L_=(e,t,n)=>{const r=e._ctx;for(const o in e){if(I_(o))continue;const s=e[o];if(Oe(s))t[o]=ib(o,s,r);else if(s!=null){const i=Td(s);t[o]=()=>i}}},N_=(e,t)=>{const n=Td(t);e.slots.default=()=>n},D_=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},ab=(e,t,n)=>{const r=e.slots=T_();if(e.vnode.shapeFlag&32){const o=t._;o?(D_(r,t,n),n&&Rh(r,"_",o,!0)):L_(t,r)}else t&&N_(e,t)},lb=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=st;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:D_(o,t,n):(s=!t.$stable,L_(t,o)),i=t}else t&&(N_(e,t),i={default:1});if(s)for(const a in o)!I_(a)&&i[a]==null&&delete o[a]};function Ka(e,t,n,r,o=!1){if(ze(e)){e.forEach((f,p)=>Ka(f,t&&(ze(t)?t[p]:t),n,r,o));return}if(Ao(r)&&!o)return;const s=r.shapeFlag&4?Vi(r.component):r.el,i=o?null:s,{i:a,r:l}=e,u=t&&t.r,m=a.refs===st?a.refs={}:a.refs,d=a.setupState;if(u!=null&&u!==l&&(bt(u)?(m[u]=null,tt(d,u)&&(d[u]=null)):Ot(u)&&(u.value=null)),Oe(l))$r(l,a,12,[i,m]);else{const f=bt(l),p=Ot(l);if(f||p){const h=()=>{if(e.f){const g=f?tt(d,l)?d[l]:m[l]:l.value;o?ze(g)&&od(g,s):ze(g)?g.includes(s)||g.push(s):f?(m[l]=[s],tt(d,l)&&(d[l]=m[l])):(l.value=[s],e.k&&(m[e.k]=l.value))}else f?(m[l]=i,tt(d,l)&&(d[l]=i)):p&&(l.value=i,e.k&&(m[e.k]=i))};i?(h.id=-1,Ut(h,n)):h()}}}const R_=Symbol("_vte"),cb=e=>e.__isTeleport,ii=e=>e&&(e.disabled||e.disabled===""),Im=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Lm=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,uu=(e,t)=>{const n=e&&e.to;return bt(n)?t?t(n):null:n},ub={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,i,a,l,u){const{mc:m,pc:d,pbc:f,o:{insert:p,querySelector:h,createText:g,createComment:z}}=u,k=ii(t.props);let{shapeFlag:w,children:_,dynamicChildren:v}=t;if(e==null){const S=t.el=g(""),C=t.anchor=g("");p(S,n,r),p(C,n,r);const L=t.target=uu(t.props,h),D=F_(L,t,g,p);L&&(i==="svg"||Im(L)?i="svg":(i==="mathml"||Lm(L))&&(i="mathml"));const $=(F,q)=>{w&16&&m(_,F,q,o,s,i,a,l)};k?$(n,C):L&&$(L,D)}else{t.el=e.el,t.targetStart=e.targetStart;const S=t.anchor=e.anchor,C=t.target=e.target,L=t.targetAnchor=e.targetAnchor,D=ii(e.props),$=D?n:C,F=D?S:L;if(i==="svg"||Im(C)?i="svg":(i==="mathml"||Lm(C))&&(i="mathml"),v?(f(e.dynamicChildren,v,$,o,s,i,a),Ad(e,t,!0)):l||d(e,t,$,F,o,s,i,a,!1),k)D?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):oa(t,n,S,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const q=t.target=uu(t.props,h);q&&oa(t,q,null,u,0)}else D&&oa(t,C,L,u,1)}M_(t)},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:i,children:a,anchor:l,targetStart:u,targetAnchor:m,target:d,props:f}=e;if(d&&(o(u),o(m)),s&&o(l),i&16){const p=s||!ii(f);for(let h=0;h{Nm||(console.error("Hydration completed but contains mismatches."),Nm=!0)},mb=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",fb=e=>e.namespaceURI.includes("MathML"),sa=e=>{if(mb(e))return"svg";if(fb(e))return"mathml"},ia=e=>e.nodeType===8;function pb(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:a,insert:l,createComment:u}}=e,m=(_,v)=>{if(!v.hasChildNodes()){n(null,_,v),qa(),v._vnode=_;return}d(v.firstChild,_,null,null,null),qa(),v._vnode=_},d=(_,v,S,C,L,D=!1)=>{D=D||!!v.dynamicChildren;const $=ia(_)&&_.data==="[",F=()=>g(_,v,S,C,L,$),{type:q,ref:U,shapeFlag:W,patchFlag:ne}=v;let me=_.nodeType;v.el=_,ne===-2&&(D=!1,v.dynamicChildren=null);let K=null;switch(q){case Tr:me!==3?v.children===""?(l(v.el=o(""),i(_),_),K=_):K=F():(_.data!==v.children&&(Wo(),_.data=v.children),K=s(_));break;case Mt:w(_)?(K=s(_),k(v.el=_.content.firstChild,_,S)):me!==8||$?K=F():K=s(_);break;case Po:if($&&(_=s(_),me=_.nodeType),me===1||me===3){K=_;const re=!v.children.length;for(let ce=0;ce{D=D||!!v.dynamicChildren;const{type:$,props:F,patchFlag:q,shapeFlag:U,dirs:W,transition:ne}=v,me=$==="input"||$==="option";if(me||q!==-1){W&&cr(v,null,S,"created");let K=!1;if(w(_)){K=j_(C,ne)&&S&&S.vnode.props&&S.vnode.props.appear;const ce=_.content.firstChild;K&&ne.beforeEnter(ce),k(ce,_,S),v.el=_=ce}if(U&16&&!(F&&(F.innerHTML||F.textContent))){let ce=p(_.firstChild,v,_,S,C,L,D);for(;ce;){Wo();const Ne=ce;ce=ce.nextSibling,a(Ne)}}else U&8&&_.textContent!==v.children&&(Wo(),_.textContent=v.children);if(F){if(me||!D||q&48){const ce=_.tagName.includes("-");for(const Ne in F)(me&&(Ne.endsWith("value")||Ne==="indeterminate")||Li(Ne)&&!ds(Ne)||Ne[0]==="."||ce)&&r(_,Ne,null,F[Ne],void 0,S)}else if(F.onClick)r(_,"onClick",null,F.onClick,void 0,S);else if(q&4&&Er(F.style))for(const ce in F.style)F.style[ce]}let re;(re=F&&F.onVnodeBeforeMount)&&cn(re,S,v),W&&cr(v,null,S,"beforeMount"),((re=F&&F.onVnodeMounted)||W||K)&&eg(()=>{re&&cn(re,S,v),K&&ne.enter(_),W&&cr(v,null,S,"mounted")},C)}return _.nextSibling},p=(_,v,S,C,L,D,$)=>{$=$||!!v.dynamicChildren;const F=v.children,q=F.length;for(let U=0;U{const{slotScopeIds:$}=v;$&&(L=L?L.concat($):$);const F=i(_),q=p(s(_),v,F,S,C,L,D);return q&&ia(q)&&q.data==="]"?s(v.anchor=q):(Wo(),l(v.anchor=u("]"),F,q),q)},g=(_,v,S,C,L,D)=>{if(Wo(),v.el=null,D){const q=z(_);for(;;){const U=s(_);if(U&&U!==q)a(U);else break}}const $=s(_),F=i(_);return a(_),n(null,v,F,$,S,C,sa(F),L),$},z=(_,v="[",S="]")=>{let C=0;for(;_;)if(_=s(_),_&&ia(_)&&(_.data===v&&C++,_.data===S)){if(C===0)return s(_);C--}return _},k=(_,v,S)=>{const C=v.parentNode;C&&C.replaceChild(_,v);let L=S;for(;L;)L.vnode.el===v&&(L.vnode.el=L.subTree.el=_),L=L.parent},w=_=>_.nodeType===1&&_.tagName.toLowerCase()==="template";return[m,d]}const Ut=eg;function V_(e){return U_(e)}function H_(e){return U_(e,pb)}function U_(e,t){const n=Mh();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:u,setElementText:m,parentNode:d,nextSibling:f,setScopeId:p=fn,insertStaticContent:h}=e,g=(A,P,j,te=null,X=null,ie=null,pe=void 0,E=null,T=!!P.dynamicChildren)=>{if(A===P)return;A&&!Yn(A,P)&&(te=Y(A),He(A,X,ie,!0),A=null),P.patchFlag===-2&&(T=!1,P.dynamicChildren=null);const{type:R,ref:Q,shapeFlag:de}=P;switch(R){case Tr:z(A,P,j,te);break;case Mt:k(A,P,j,te);break;case Po:A==null&&w(P,j,te,pe);break;case ve:U(A,P,j,te,X,ie,pe,E,T);break;default:de&1?S(A,P,j,te,X,ie,pe,E,T):de&6?W(A,P,j,te,X,ie,pe,E,T):(de&64||de&128)&&R.process(A,P,j,te,X,ie,pe,E,T,ge)}Q!=null&&X&&Ka(Q,A&&A.ref,ie,P||A,!P)},z=(A,P,j,te)=>{if(A==null)r(P.el=a(P.children),j,te);else{const X=P.el=A.el;P.children!==A.children&&u(X,P.children)}},k=(A,P,j,te)=>{A==null?r(P.el=l(P.children||""),j,te):P.el=A.el},w=(A,P,j,te)=>{[A.el,A.anchor]=h(A.children,P,j,te,A.el,A.anchor)},_=({el:A,anchor:P},j,te)=>{let X;for(;A&&A!==P;)X=f(A),r(A,j,te),A=X;r(P,j,te)},v=({el:A,anchor:P})=>{let j;for(;A&&A!==P;)j=f(A),o(A),A=j;o(P)},S=(A,P,j,te,X,ie,pe,E,T)=>{P.type==="svg"?pe="svg":P.type==="math"&&(pe="mathml"),A==null?C(P,j,te,X,ie,pe,E,T):$(A,P,X,ie,pe,E,T)},C=(A,P,j,te,X,ie,pe,E)=>{let T,R;const{props:Q,shapeFlag:de,transition:se,dirs:H}=A;if(T=A.el=i(A.type,ie,Q&&Q.is,Q),de&8?m(T,A.children):de&16&&D(A.children,T,null,te,X,pc(A,ie),pe,E),H&&cr(A,null,te,"created"),L(T,A,A.scopeId,pe,te),Q){for(const Se in Q)Se!=="value"&&!ds(Se)&&s(T,Se,null,Q[Se],ie,te);"value"in Q&&s(T,"value",null,Q.value,ie),(R=Q.onVnodeBeforeMount)&&cn(R,te,A)}H&&cr(A,null,te,"beforeMount");const Z=j_(X,se);Z&&se.beforeEnter(T),r(T,P,j),((R=Q&&Q.onVnodeMounted)||Z||H)&&Ut(()=>{R&&cn(R,te,A),Z&&se.enter(T),H&&cr(A,null,te,"mounted")},X)},L=(A,P,j,te,X)=>{if(j&&p(A,j),te)for(let ie=0;ie{for(let R=T;R{const E=P.el=A.el;let{patchFlag:T,dynamicChildren:R,dirs:Q}=P;T|=A.patchFlag&16;const de=A.props||st,se=P.props||st;let H;if(j&&_o(j,!1),(H=se.onVnodeBeforeUpdate)&&cn(H,j,P,A),Q&&cr(P,A,j,"beforeUpdate"),j&&_o(j,!0),(de.innerHTML&&se.innerHTML==null||de.textContent&&se.textContent==null)&&m(E,""),R?F(A.dynamicChildren,R,E,j,te,pc(P,X),ie):pe||ce(A,P,E,null,j,te,pc(P,X),ie,!1),T>0){if(T&16)q(E,de,se,j,X);else if(T&2&&de.class!==se.class&&s(E,"class",null,se.class,X),T&4&&s(E,"style",de.style,se.style,X),T&8){const Z=P.dynamicProps;for(let Se=0;Se{H&&cn(H,j,P,A),Q&&cr(P,A,j,"updated")},te)},F=(A,P,j,te,X,ie,pe)=>{for(let E=0;E{if(P!==j){if(P!==st)for(const ie in P)!ds(ie)&&!(ie in j)&&s(A,ie,P[ie],null,X,te);for(const ie in j){if(ds(ie))continue;const pe=j[ie],E=P[ie];pe!==E&&ie!=="value"&&s(A,ie,E,pe,X,te)}"value"in j&&s(A,"value",P.value,j.value,X)}},U=(A,P,j,te,X,ie,pe,E,T)=>{const R=P.el=A?A.el:a(""),Q=P.anchor=A?A.anchor:a("");let{patchFlag:de,dynamicChildren:se,slotScopeIds:H}=P;H&&(E=E?E.concat(H):H),A==null?(r(R,j,te),r(Q,j,te),D(P.children||[],j,Q,X,ie,pe,E,T)):de>0&&de&64&&se&&A.dynamicChildren?(F(A.dynamicChildren,se,j,X,ie,pe,E),(P.key!=null||X&&P===X.subTree)&&Ad(A,P,!0)):ce(A,P,j,Q,X,ie,pe,E,T)},W=(A,P,j,te,X,ie,pe,E,T)=>{P.slotScopeIds=E,A==null?P.shapeFlag&512?X.ctx.activate(P,j,te,pe,T):ne(P,j,te,X,ie,pe,T):me(A,P,T)},ne=(A,P,j,te,X,ie,pe)=>{const E=A.component=sg(A,te,X);if(Di(A)&&(E.ctx.renderer=ge),ag(E,!1,pe),E.asyncDep){if(X&&X.registerDep(E,K,pe),!A.el){const T=E.subTree=b(Mt);k(null,T,P,j)}}else K(E,A,P,j,X,ie,pe)},me=(A,P,j)=>{const te=P.component=A.component;if(Cb(A,P,j))if(te.asyncDep&&!te.asyncResolved){re(te,P,j);return}else te.next=P,kv(te.update),te.effect.dirty=!0,te.update();else P.el=A.el,te.vnode=P},K=(A,P,j,te,X,ie,pe)=>{const E=()=>{if(A.isMounted){let{next:Q,bu:de,u:se,parent:H,vnode:Z}=A;{const oe=B_(A);if(oe){Q&&(Q.el=Z.el,re(A,Q,pe)),oe.asyncDep.then(()=>{A.isUnmounted||E()});return}}let Se=Q,M;_o(A,!1),Q?(Q.el=Z.el,re(A,Q,pe)):Q=Z,de&&ms(de),(M=Q.props&&Q.props.onVnodeBeforeUpdate)&&cn(M,H,Q,Z),_o(A,!0);const V=Ea(A),G=A.subTree;A.subTree=V,g(G,V,d(G.el),Y(G),A,X,ie),Q.el=V.el,Se===null&&Od(A,V.el),se&&Ut(se,X),(M=Q.props&&Q.props.onVnodeUpdated)&&Ut(()=>cn(M,H,Q,Z),X)}else{let Q;const{el:de,props:se}=P,{bm:H,m:Z,parent:Se}=A,M=Ao(P);if(_o(A,!1),H&&ms(H),!M&&(Q=se&&se.onVnodeBeforeMount)&&cn(Q,Se,P),_o(A,!0),de&&Ge){const V=()=>{A.subTree=Ea(A),Ge(de,A.subTree,A,X,null)};M?P.type.__asyncLoader().then(()=>!A.isUnmounted&&V()):V()}else{const V=A.subTree=Ea(A);g(null,V,j,te,A,X,ie),P.el=V.el}if(Z&&Ut(Z,X),!M&&(Q=se&&se.onVnodeMounted)){const V=P;Ut(()=>cn(Q,Se,V),X)}(P.shapeFlag&256||Se&&Ao(Se.vnode)&&Se.vnode.shapeFlag&256)&&A.a&&Ut(A.a,X),A.isMounted=!0,P=j=te=null}},T=A.effect=new ys(E,fn,()=>$l(R),A.scope),R=A.update=()=>{T.dirty&&T.run()};R.i=A,R.id=A.uid,_o(A,!0),R()},re=(A,P,j)=>{P.component=A;const te=A.vnode.props;A.vnode=P,A.next=null,ob(A,P.props,te,j),lb(A,P.children,j),uo(),xm(A),mo()},ce=(A,P,j,te,X,ie,pe,E,T=!1)=>{const R=A&&A.children,Q=A?A.shapeFlag:0,de=P.children,{patchFlag:se,shapeFlag:H}=P;if(se>0){if(se&128){it(R,de,j,te,X,ie,pe,E,T);return}else if(se&256){Ne(R,de,j,te,X,ie,pe,E,T);return}}H&8?(Q&16&&We(R,X,ie),de!==R&&m(j,de)):Q&16?H&16?it(R,de,j,te,X,ie,pe,E,T):We(R,X,ie,!0):(Q&8&&m(j,""),H&16&&D(de,j,te,X,ie,pe,E,T))},Ne=(A,P,j,te,X,ie,pe,E,T)=>{A=A||cs,P=P||cs;const R=A.length,Q=P.length,de=Math.min(R,Q);let se;for(se=0;seQ?We(A,X,ie,!0,!1,de):D(P,j,te,X,ie,pe,E,T,de)},it=(A,P,j,te,X,ie,pe,E,T)=>{let R=0;const Q=P.length;let de=A.length-1,se=Q-1;for(;R<=de&&R<=se;){const H=A[R],Z=P[R]=T?Kr(P[R]):un(P[R]);if(Yn(H,Z))g(H,Z,j,null,X,ie,pe,E,T);else break;R++}for(;R<=de&&R<=se;){const H=A[de],Z=P[se]=T?Kr(P[se]):un(P[se]);if(Yn(H,Z))g(H,Z,j,null,X,ie,pe,E,T);else break;de--,se--}if(R>de){if(R<=se){const H=se+1,Z=Hse)for(;R<=de;)He(A[R],X,ie,!0),R++;else{const H=R,Z=R,Se=new Map;for(R=Z;R<=se;R++){const Re=P[R]=T?Kr(P[R]):un(P[R]);Re.key!=null&&Se.set(Re.key,R)}let M,V=0;const G=se-Z+1;let oe=!1,ye=0;const $e=new Array(G);for(R=0;R=G){He(Re,X,ie,!0);continue}let nt;if(Re.key!=null)nt=Se.get(Re.key);else for(M=Z;M<=se;M++)if($e[M-Z]===0&&Yn(Re,P[M])){nt=M;break}nt===void 0?He(Re,X,ie,!0):($e[nt-Z]=R+1,nt>=ye?ye=nt:oe=!0,g(Re,P[nt],j,null,X,ie,pe,E,T),V++)}const Me=oe?hb($e):cs;for(M=Me.length-1,R=G-1;R>=0;R--){const Re=Z+R,nt=P[Re],Pe=Re+1{const{el:ie,type:pe,transition:E,children:T,shapeFlag:R}=A;if(R&6){Ve(A.component.subTree,P,j,te);return}if(R&128){A.suspense.move(P,j,te);return}if(R&64){pe.move(A,P,j,ge);return}if(pe===ve){r(ie,P,j);for(let de=0;deE.enter(ie),X);else{const{leave:de,delayLeave:se,afterLeave:H}=E,Z=()=>r(ie,P,j),Se=()=>{de(ie,()=>{Z(),H&&H()})};se?se(ie,Z,Se):Se()}else r(ie,P,j)},He=(A,P,j,te=!1,X=!1)=>{const{type:ie,props:pe,ref:E,children:T,dynamicChildren:R,shapeFlag:Q,patchFlag:de,dirs:se,cacheIndex:H}=A;if(de===-2&&(X=!1),E!=null&&Ka(E,null,j,A,!0),H!=null&&(P.renderCache[H]=void 0),Q&256){P.ctx.deactivate(A);return}const Z=Q&1&&se,Se=!Ao(A);let M;if(Se&&(M=pe&&pe.onVnodeBeforeUnmount)&&cn(M,P,A),Q&6)ut(A.component,j,te);else{if(Q&128){A.suspense.unmount(j,te);return}Z&&cr(A,null,P,"beforeUnmount"),Q&64?A.type.remove(A,P,j,ge,te):R&&!R.hasOnce&&(ie!==ve||de>0&&de&64)?We(R,P,j,!1,!0):(ie===ve&&de&384||!X&&Q&16)&&We(T,P,j),te&&at(A)}(Se&&(M=pe&&pe.onVnodeUnmounted)||Z)&&Ut(()=>{M&&cn(M,P,A),Z&&cr(A,null,P,"unmounted")},j)},at=A=>{const{type:P,el:j,anchor:te,transition:X}=A;if(P===ve){lt(j,te);return}if(P===Po){v(A);return}const ie=()=>{o(j),X&&!X.persisted&&X.afterLeave&&X.afterLeave()};if(A.shapeFlag&1&&X&&!X.persisted){const{leave:pe,delayLeave:E}=X,T=()=>pe(j,ie);E?E(A.el,ie,T):T()}else ie()},lt=(A,P)=>{let j;for(;A!==P;)j=f(A),o(A),A=j;o(P)},ut=(A,P,j)=>{const{bum:te,scope:X,update:ie,subTree:pe,um:E,m:T,a:R}=A;Za(T),Za(R),te&&ms(te),X.stop(),ie&&(ie.active=!1,He(pe,A,P,j)),E&&Ut(E,P),Ut(()=>{A.isUnmounted=!0},P),P&&P.pendingBranch&&!P.isUnmounted&&A.asyncDep&&!A.asyncResolved&&A.suspenseId===P.pendingId&&(P.deps--,P.deps===0&&P.resolve())},We=(A,P,j,te=!1,X=!1,ie=0)=>{for(let pe=ie;pe{if(A.shapeFlag&6)return Y(A.component.subTree);if(A.shapeFlag&128)return A.suspense.next();const P=f(A.anchor||A.el),j=P&&P[R_];return j?f(j):P};let fe=!1;const le=(A,P,j)=>{A==null?P._vnode&&He(P._vnode,null,null,!0):g(P._vnode||null,A,P,null,null,null,j),P._vnode=A,fe||(fe=!0,xm(),qa(),fe=!1)},ge={p:g,um:He,m:Ve,r:at,mt:ne,mc:D,pc:ce,pbc:F,n:Y,o:e};let Ue,Ge;return t&&([Ue,Ge]=t(ge)),{render:le,hydrate:Ue,createApp:nb(le,Ue)}}function pc({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function _o({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function j_(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ad(e,t,n=!1){const r=e.children,o=t.children;if(ze(r)&&ze(o))for(let s=0;s>1,e[n[a]]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}function B_(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:B_(t)}function Za(e){if(e)for(let t=0;tNn(W_);function G_(e,t){return Mi(e,null,t)}function K_(e,t){return Mi(e,null,{flush:"post"})}function Z_(e,t){return Mi(e,null,{flush:"sync"})}const aa={};function Dn(e,t,n){return Mi(e,t,n)}function Mi(e,t,{immediate:n,deep:r,flush:o,once:s,onTrack:i,onTrigger:a}=st){if(t&&s){const C=t;t=(...L)=>{C(...L),S()}}const l=Ft,u=C=>r===!0?C:Jr(C,r===!1?1:void 0);let m,d=!1,f=!1;if(Ot(e)?(m=()=>e.value,d=No(e)):Er(e)?(m=()=>u(e),d=!0):ze(e)?(f=!0,d=e.some(C=>Er(C)||No(C)),m=()=>e.map(C=>{if(Ot(C))return C.value;if(Er(C))return u(C);if(Oe(C))return $r(C,l,2)})):Oe(e)?t?m=()=>$r(e,l,2):m=()=>(p&&p(),kn(e,l,3,[h])):m=fn,t&&r){const C=m;m=()=>Jr(C())}let p,h=C=>{p=_.onStop=()=>{$r(C,l,4),p=_.onStop=void 0}},g;if(Fi)if(h=fn,t?n&&kn(t,l,3,[m(),f?[]:void 0,h]):m(),o==="sync"){const C=q_();g=C.__watcherHandles||(C.__watcherHandles=[])}else return fn;let z=f?new Array(e.length).fill(aa):aa;const k=()=>{if(!(!_.active||!_.dirty))if(t){const C=_.run();(r||d||(f?C.some((L,D)=>nn(L,z[D])):nn(C,z)))&&(p&&p(),kn(t,l,3,[C,z===aa?void 0:f&&z[0]===aa?[]:z,h]),z=C)}else _.run()};k.allowRecurse=!!t;let w;o==="sync"?w=k:o==="post"?w=()=>Ut(k,l&&l.suspense):(k.pre=!0,l&&(k.id=l.uid),w=()=>$l(k));const _=new ys(m,fn,w),v=ld(),S=()=>{_.stop(),v&&od(v.effects,_)};return t?n?k():z=_.run():o==="post"?Ut(_.run.bind(_),l&&l.suspense):_.run(),g&&g.push(S),S}function _b(e,t,n){const r=this.proxy,o=bt(e)?e.includes(".")?Y_(r,e):()=>r[e]:e.bind(r,r);let s;Oe(t)?s=t:(s=t.handler,n=t);const i=Ro(this),a=Mi(o,s.bind(r),n);return i(),a}function Y_(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Jr(r,t,n)});else if(Dh(e)){for(const r in e)Jr(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Jr(e[r],t,n)}return e}function gb(e,t,n=st){const r=Un(),o=Xt(t),s=mn(t),i=X_(e,t),a=s_((l,u)=>{let m,d=st,f;return Z_(()=>{const p=e[t];nn(m,p)&&(m=p,u())}),{get(){return l(),n.get?n.get(m):m},set(p){const h=n.set?n.set(p):p;if(!nn(h,m)&&!(d!==st&&nn(p,d)))return;const g=r.vnode.props;g&&(t in g||o in g||s in g)&&(`onUpdate:${t}`in g||`onUpdate:${o}`in g||`onUpdate:${s}`in g)||(m=p,u()),r.emit(`update:${t}`,h),nn(p,h)&&nn(p,d)&&!nn(h,f)&&u(),d=p,f=h}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?i||st:a,done:!1}:{done:!0}}}},a}const X_=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Xt(t)}Modifiers`]||e[`${mn(t)}Modifiers`];function yb(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||st;let o=n;const s=t.startsWith("update:"),i=s&&X_(r,t.slice(7));i&&(i.trim&&(o=n.map(m=>bt(m)?m.trim():m)),i.number&&(o=n.map(Ua)));let a,l=r[a=ri(t)]||r[a=ri(Xt(t))];!l&&s&&(l=r[a=ri(mn(t))]),l&&kn(l,e,6,o);const u=r[a+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,kn(u,e,6,o)}}function J_(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!Oe(e)){const l=u=>{const m=J_(u,t,!0);m&&(a=!0,kt(i,m))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(ft(e)&&r.set(e,null),null):(ze(s)?s.forEach(l=>i[l]=null):kt(i,s),ft(e)&&r.set(e,i),i)}function Nl(e,t){return!e||!Li(t)?!1:(t=t.slice(2).replace(/Once$/,""),tt(e,t[0].toLowerCase()+t.slice(1))||tt(e,mn(t))||tt(e,t))}function Ea(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:i,attrs:a,emit:l,render:u,renderCache:m,props:d,data:f,setupState:p,ctx:h,inheritAttrs:g}=e,z=Ci(e);let k,w;try{if(n.shapeFlag&4){const v=o||r,S=v;k=un(u.call(S,v,m,d,p,f,h)),w=a}else{const v=t;k=un(v.length>1?v(d,{attrs:a,slots:i,emit:l}):v(d,null)),w=t.props?a:vb(a)}}catch(v){ai.length=0,Ho(v,e,1),k=b(Mt)}let _=k;if(w&&g!==!1){const v=Object.keys(w),{shapeFlag:S}=_;v.length&&S&7&&(s&&v.some(rd)&&(w=bb(w,s)),_=_r(_,w,!1,!0))}return n.dirs&&(_=_r(_,null,!1,!0),_.dirs=_.dirs?_.dirs.concat(n.dirs):n.dirs),n.transition&&(_.transition=n.transition),k=_,Ci(z),k}function zb(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||Li(n))&&((t||(t={}))[n]=e[n]);return t},bb=(e,t)=>{const n={};for(const r in e)(!rd(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Cb(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?Dm(r,i,u):!!i;if(l&8){const m=t.dynamicProps;for(let d=0;de.__isSuspense;let mu=0;const wb={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,s,i,a,l,u){if(e==null)Sb(t,n,r,o,s,i,a,l,u);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}xb(e,t,n,r,o,i,a,l,u)}},hydrate:Eb,normalize:$b},kb=wb;function ki(e,t){const n=e.props&&e.props[t];Oe(n)&&n()}function Sb(e,t,n,r,o,s,i,a,l){const{p:u,o:{createElement:m}}=l,d=m("div"),f=e.suspense=Q_(e,o,r,t,d,n,s,i,a,l);u(null,f.pendingBranch=e.ssContent,d,null,r,f,s,i),f.deps>0?(ki(e,"onPending"),ki(e,"onFallback"),u(null,e.ssFallback,t,n,r,null,s,i),hs(f,e.ssFallback)):f.resolve(!1,!0)}function xb(e,t,n,r,o,s,i,a,{p:l,um:u,o:{createElement:m}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,p=t.ssFallback,{activeBranch:h,pendingBranch:g,isInFallback:z,isHydrating:k}=d;if(g)d.pendingBranch=f,Yn(f,g)?(l(g,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():z&&(k||(l(h,p,n,r,o,null,s,i,a),hs(d,p)))):(d.pendingId=mu++,k?(d.isHydrating=!1,d.activeBranch=g):u(g,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=m("div"),z?(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():(l(h,p,n,r,o,null,s,i,a),hs(d,p))):h&&Yn(f,h)?(l(h,f,n,r,o,d,s,i,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0&&d.resolve()));else if(h&&Yn(f,h))l(h,f,n,r,o,d,s,i,a),hs(d,f);else if(ki(t,"onPending"),d.pendingBranch=f,f.shapeFlag&512?d.pendingId=f.component.suspenseId:d.pendingId=mu++,l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0)d.resolve();else{const{timeout:w,pendingId:_}=d;w>0?setTimeout(()=>{d.pendingId===_&&d.fallback(p)},w):w===0&&d.fallback(p)}}function Q_(e,t,n,r,o,s,i,a,l,u,m=!1){const{p:d,m:f,um:p,n:h,o:{parentNode:g,remove:z}}=u;let k;const w=Tb(e);w&&t&&t.pendingBranch&&(k=t.pendingId,t.deps++);const _=e.props?ja(e.props.timeout):void 0,v=s,S={vnode:e,parent:t,parentComponent:n,namespace:i,container:r,hiddenContainer:o,deps:0,pendingId:mu++,timeout:typeof _=="number"?_:-1,activeBranch:null,pendingBranch:null,isInFallback:!m,isHydrating:m,isUnmounted:!1,effects:[],resolve(C=!1,L=!1){const{vnode:D,activeBranch:$,pendingBranch:F,pendingId:q,effects:U,parentComponent:W,container:ne}=S;let me=!1;S.isHydrating?S.isHydrating=!1:C||(me=$&&F.transition&&F.transition.mode==="out-in",me&&($.transition.afterLeave=()=>{q===S.pendingId&&(f(F,ne,s===v?h($):s,0),Wa(U))}),$&&(g($.el)!==S.hiddenContainer&&(s=h($)),p($,W,S,!0)),me||f(F,ne,s,0)),hs(S,F),S.pendingBranch=null,S.isInFallback=!1;let K=S.parent,re=!1;for(;K;){if(K.pendingBranch){K.effects.push(...U),re=!0;break}K=K.parent}!re&&!me&&Wa(U),S.effects=[],w&&t&&t.pendingBranch&&k===t.pendingId&&(t.deps--,t.deps===0&&!L&&t.resolve()),ki(D,"onResolve")},fallback(C){if(!S.pendingBranch)return;const{vnode:L,activeBranch:D,parentComponent:$,container:F,namespace:q}=S;ki(L,"onFallback");const U=h(D),W=()=>{S.isInFallback&&(d(null,C,F,U,$,null,q,a,l),hs(S,C))},ne=C.transition&&C.transition.mode==="out-in";ne&&(D.transition.afterLeave=W),S.isInFallback=!0,p(D,$,null,!0),ne||W()},move(C,L,D){S.activeBranch&&f(S.activeBranch,C,L,D),S.container=C},next(){return S.activeBranch&&h(S.activeBranch)},registerDep(C,L,D){const $=!!S.pendingBranch;$&&S.deps++;const F=C.vnode.el;C.asyncDep.catch(q=>{Ho(q,C,0)}).then(q=>{if(C.isUnmounted||S.isUnmounted||S.pendingId!==C.suspenseId)return;C.asyncResolved=!0;const{vnode:U}=C;_u(C,q,!1),F&&(U.el=F);const W=!F&&C.subTree.el;L(C,U,g(F||C.subTree.el),F?null:h(C.subTree),S,i,D),W&&z(W),Od(C,U.el),$&&--S.deps===0&&S.resolve()})},unmount(C,L){S.isUnmounted=!0,S.activeBranch&&p(S.activeBranch,n,C,L),S.pendingBranch&&p(S.pendingBranch,n,C,L)}};return S}function Eb(e,t,n,r,o,s,i,a,l){const u=t.suspense=Q_(t,r,n,e.parentNode,document.createElement("div"),null,o,s,i,a,!0),m=l(e,u.pendingBranch=t.ssContent,n,u,s,i);return u.deps===0&&u.resolve(!1,!0),m}function $b(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=Rm(r?n.default:n),e.ssFallback=r?Rm(n.fallback):b(Mt)}function Rm(e){let t;if(Oe(e)){const n=Do&&e._c;n&&(e._d=!1,x()),e=e(),n&&(e._d=!0,t=Yt,tg())}return ze(e)&&(e=zb(e)),e=un(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function eg(e,t){t&&t.pendingBranch?ze(e)?t.effects.push(...e):t.effects.push(e):Wa(e)}function hs(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;for(;!o&&t.component;)t=t.component.subTree,o=t.el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,Od(r,o))}function Tb(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const ve=Symbol.for("v-fgt"),Tr=Symbol.for("v-txt"),Mt=Symbol.for("v-cmt"),Po=Symbol.for("v-stc"),ai=[];let Yt=null;function x(e=!1){ai.push(Yt=e?null:[])}function tg(){ai.pop(),Yt=ai[ai.length-1]||null}let Do=1;function fu(e){Do+=e,e<0&&Yt&&(Yt.hasOnce=!0)}function ng(e){return e.dynamicChildren=Do>0?Yt||cs:null,tg(),Do>0&&Yt&&Yt.push(e),e}function I(e,t,n,r,o,s){return ng(c(e,t,n,r,o,s,!0))}function we(e,t,n,r,o){return ng(b(e,t,n,r,o,!0))}function ao(e){return e?e.__v_isVNode===!0:!1}function Yn(e,t){return e.type===t.type&&e.key===t.key}function Ab(e){}const rg=({key:e})=>e??null,$a=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?bt(e)||Ot(e)||Oe(e)?{i:Vt,r:e,k:t,f:!!n}:e:null);function c(e,t=null,n=null,r=0,o=null,s=e===ve?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&rg(t),ref:t&&$a(t),scopeId:Tl,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Vt};return a?(Pd(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=bt(n)?8:16),Do>0&&!i&&Yt&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&Yt.push(l),l}const b=Ob;function Ob(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===w_)&&(e=Mt),ao(e)){const a=_r(e,t,!0);return n&&Pd(a,n),Do>0&&!s&&Yt&&(a.shapeFlag&6?Yt[Yt.indexOf(e)]=a:Yt.push(a)),a.patchFlag=-2,a}if(Fb(e)&&(e=e.__vccOpts),t){t=og(t);let{class:a,style:l}=t;a&&!bt(a)&&(t.class=ke(a)),ft(l)&&(pd(l)&&!ze(l)&&(l=kt({},l)),t.style=co(l))}const i=bt(e)?1:du(e)?128:cb(e)?64:ft(e)?4:Oe(e)?2:0;return c(e,t,n,r,o,i,s,!0)}function og(e){return e?pd(e)||A_(e)?kt({},e):e:null}function _r(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:i,children:a,transition:l}=e,u=t?is(o||{},t):o,m={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&rg(u),ref:t&&t.ref?n&&s?ze(s)?s.concat($a(t)):[s,$a(t)]:$a(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ve?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&_r(e.ssContent),ssFallback:e.ssFallback&&_r(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&io(m,l.clone(m)),m}function Dt(e=" ",t=0){return b(Tr,null,e,t)}function Pb(e,t){const n=b(Po,null,e);return n.staticCount=t,n}function ee(e="",t=!1){return t?(x(),we(Mt,null,e)):b(Mt,null,e)}function un(e){return e==null||typeof e=="boolean"?b(Mt):ze(e)?b(ve,null,e.slice()):typeof e=="object"?Kr(e):b(Tr,null,String(e))}function Kr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:_r(e)}function Pd(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ze(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Pd(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!A_(t)?t._ctx=Vt:o===3&&Vt&&(Vt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Oe(t)?(t={default:t,_ctx:Vt},n=32):(t=String(t),r&64?(n=16,t=[Dt(t)]):n=8);e.children=t,e.shapeFlag|=n}function is(...e){const t={};for(let n=0;nFt||Vt;let Ya,pu;{const e=Mh(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(i=>i(s)):o[0](s)}};Ya=t("__VUE_INSTANCE_SETTERS__",n=>Ft=n),pu=t("__VUE_SSR_SETTERS__",n=>Fi=n)}const Ro=e=>{const t=Ft;return Ya(e),e.scope.on(),()=>{e.scope.off(),Ya(t)}},hu=()=>{Ft&&Ft.scope.off(),Ya(null)};function ig(e){return e.vnode.shapeFlag&4}let Fi=!1;function ag(e,t=!1,n=!1){t&&pu(t);const{props:r,children:o}=e.vnode,s=ig(e);rb(e,r,s,t),ab(e,o,n);const i=s?Nb(e,t):void 0;return t&&pu(!1),i}function Nb(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,iu);const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?cg(e):null,s=Ro(e);uo();const i=$r(r,e,0,[e.props,o]);if(mo(),s(),sd(i)){if(i.then(hu,hu),t)return i.then(a=>{_u(e,a,t)}).catch(a=>{Ho(a,e,0)});e.asyncDep=i}else _u(e,i,t)}else lg(e,t)}function _u(e,t,n){Oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ft(t)&&(e.setupState=yd(t)),lg(e,n)}let Xa,gu;function Db(e){Xa=e,gu=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,Dv))}}const Rb=()=>!Xa;function lg(e,t,n){const r=e.type;if(!e.render){if(!t&&Xa&&!r.render){const o=r.template||$d(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,u=kt(kt({isCustomElement:s,delimiters:a},i),l);r.render=Xa(o,u)}}e.render=r.render||fn,gu&&gu(e)}{const o=Ro(e);uo();try{Yv(e)}finally{mo(),o()}}}const Mb={get(e,t){return hn(e,"get",""),e[t]}};function cg(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Mb),slots:e.slots,emit:e.emit,expose:t}}function Vi(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(yd(El(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in oi)return oi[n](e)},has(t,n){return n in t||n in oi}})):e.proxy}function yu(e,t=!0){return Oe(e)?e.displayName||e.name:e.name||t&&e.__name}function Fb(e){return Oe(e)&&"__vccOpts"in e}const jt=(e,t)=>lv(e,t,Fi);function mr(e,t,n){const r=arguments.length;return r===2?ft(t)&&!ze(t)?ao(t)?b(e,null,[t]):b(e,t):b(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&ao(n)&&(n=[n]),b(e,t,n))}function Vb(){}function Hb(e,t,n,r){const o=n[r];if(o&&ug(o,e))return o;const s=t();return s.memo=e.slice(),s.cacheIndex=r,n[r]=s}function ug(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r0&&Yt&&Yt.push(e),!0}const dg="3.4.38",Ub=fn,jb=bv,Bb=es,Wb=d_,qb={createComponentInstance:sg,setupComponent:ag,renderComponentRoot:Ea,setCurrentRenderingInstance:Ci,isVNode:ao,normalizeVNode:un,getComponentPublicInstance:Vi,ensureValidVNode:Ed},Gb=qb,Kb=null,Zb=null,Yb=null;/** * @vue/runtime-dom v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const Wb="http://www.w3.org/2000/svg",qb="http://www.w3.org/1998/Math/MathML",br=typeof document<"u"?document:null,Pm=br&&br.createElement("template"),Gb={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==="svg"?br.createElementNS(Wb,e):t==="mathml"?br.createElementNS(qb,e):n?br.createElement(e,{is:n}):br.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>br.createTextNode(e),createComment:e=>br.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>br.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{Pm.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const a=Pm.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Nr="transition",Ns="animation",gs=Symbol("_vtc"),Nt=(e,{slots:t})=>ur(a_,ag(e),t);Nt.displayName="Transition";const ig={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Kb=Nt.props=wt({},_d,ig),po=(e,t=[])=>{ze(e)?e.forEach(n=>n(...t)):e&&e(...t)},Im=e=>e?ze(e)?e.some(t=>t.length>1):e.length>1:!1;function ag(e){const t={};for(const U in e)U in ig||(t[U]=e[U]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=i,appearToClass:m=a,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,h=Zb(o),g=h&&h[0],z=h&&h[1],{onBeforeEnter:k,onEnter:w,onEnterCancelled:_,onLeave:v,onLeaveCancelled:S,onBeforeAppear:C=k,onAppear:L=w,onAppearCancelled:D=_}=t,$=(U,W,ne)=>{Ur(U,W?m:a),Ur(U,W?u:i),ne&&ne()},F=(U,W)=>{U._isLeaving=!1,Ur(U,d),Ur(U,p),Ur(U,f),W&&W()},q=U=>(W,ne)=>{const me=U?L:w,K=()=>$(W,U,ne);po(me,[W,K]),Lm(()=>{Ur(W,U?l:s),vr(W,U?m:a),Im(me)||Nm(W,r,g,K)})};return wt(t,{onBeforeEnter(U){po(k,[U]),vr(U,s),vr(U,i)},onBeforeAppear(U){po(C,[U]),vr(U,l),vr(U,u)},onEnter:q(!1),onAppear:q(!0),onLeave(U,W){U._isLeaving=!0;const ne=()=>F(U,W);vr(U,d),vr(U,f),cg(),Lm(()=>{U._isLeaving&&(Ur(U,d),vr(U,p),Im(v)||Nm(U,r,z,ne))}),po(v,[U,ne])},onEnterCancelled(U){$(U,!1),po(_,[U])},onAppearCancelled(U){$(U,!0),po(D,[U])},onLeaveCancelled(U){F(U),po(S,[U])}})}function Zb(e){if(e==null)return null;if(mt(e))return[dc(e.enter),dc(e.leave)];{const t=dc(e);return[t,t]}}function dc(e){return Ma(e)}function vr(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[gs]||(e[gs]=new Set)).add(t)}function Ur(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[gs];n&&(n.delete(t),n.size||(e[gs]=void 0))}function Lm(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Yb=0;function Nm(e,t,n,r){const o=e._endId=++Yb,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=lg(e,t);if(!i)return r();const u=i+"end";let m=0;const d=()=>{e.removeEventListener(u,f),s()},f=p=>{p.target===e&&++m>=l&&d()};setTimeout(()=>{m(n[h]||"").split(", "),o=r(`${Nr}Delay`),s=r(`${Nr}Duration`),i=Dm(o,s),a=r(`${Ns}Delay`),l=r(`${Ns}Duration`),u=Dm(a,l);let m=null,d=0,f=0;t===Nr?i>0&&(m=Nr,d=i,f=s.length):t===Ns?u>0&&(m=Ns,d=u,f=l.length):(d=Math.max(i,u),m=d>0?i>u?Nr:Ns:null,f=m?m===Nr?s.length:l.length:0);const p=m===Nr&&/\b(transform|all)(,|$)/.test(r(`${Nr}Property`).toString());return{type:m,timeout:d,propCount:f,hasTransform:p}}function Dm(e,t){for(;e.lengthRm(n)+Rm(e[r])))}function Rm(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function cg(){return document.body.offsetHeight}function Xb(e,t,n){const r=e[gs];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ga=Symbol("_vod"),ug=Symbol("_vsh"),Ci={beforeMount(e,{value:t},{transition:n}){e[Ga]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Ds(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Ds(e,!0),r.enter(e)):r.leave(e,()=>{Ds(e,!1)}):Ds(e,t))},beforeUnmount(e,{value:t}){Ds(e,t)}};function Ds(e,t){e.style.display=t?e[Ga]:"none",e[ug]=!t}function Jb(){Ci.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const dg=Symbol("");function Qb(e){const t=Hn();if(!t)return;const n=t.ut=(o=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(s=>hu(s,o))},r=()=>{const o=e(t.proxy);pu(t.subTree,o),n(o)};gd(()=>{U_(r)}),Es(()=>{const o=new MutationObserver(r);o.observe(t.subTree.el.parentNode,{childList:!0}),Ii(()=>o.disconnect())})}function pu(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{pu(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)hu(e.el,t);else if(e.type===ve)e.children.forEach(n=>pu(n,t));else if(e.type===To){let{el:n,anchor:r}=e;for(;n&&(hu(n,t),n!==r);)n=n.nextSibling}}function hu(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const o in t)n.setProperty(`--${o}`,t[o]),r+=`--${o}: ${t[o]};`;n[dg]=r}}const e0=/(^|;)\s*display\s*:/;function t0(e,t,n){const r=e.style,o=vt(n);let s=!1;if(n&&!o){if(t)if(vt(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&ka(r,a,"")}else for(const i in t)n[i]==null&&ka(r,i,"");for(const i in n)i==="display"&&(s=!0),ka(r,i,n[i])}else if(o){if(t!==n){const i=r[dg];i&&(n+=";"+i),r.cssText=n,s=e0.test(n)}}else t&&e.removeAttribute("style");Ga in e&&(e[Ga]=s?r.display:"",e[ug]&&(r.display="none"))}const Mm=/\s*!important$/;function ka(e,t,n){if(ze(n))n.forEach(r=>ka(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=n0(e,t);Mm.test(n)?e.setProperty(dn(r),n.replace(Mm,""),"important"):e[r]=n}}const Fm=["Webkit","Moz","ms"],mc={};function n0(e,t){const n=mc[t];if(n)return n;let r=Yt(t);if(r!=="filter"&&r in e)return mc[t]=r;r=Oi(r);for(let o=0;ofc||(a0.then(()=>fc=0),fc=Date.now());function c0(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;wn(u0(r,n.value),t,5,[r])};return n.value=e,n.attached=l0(),n}function u0(e,t){if(ze(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 Bm=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,d0=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?Xb(e,r,i):t==="style"?t0(e,n,r):Ai(t)?Ju(t)||s0(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):m0(e,t,r,i))?(r0(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Hm(e,t,r,i,s,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Hm(e,t,r,i))};function m0(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Bm(t)&&Oe(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;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Bm(t)&&vt(n)?!1:t in e}/*! #__NO_SIDE_EFFECTS__ */function mg(e,t,n){const r=Ar(e,t);class o extends Pl{constructor(i){super(r,i,n)}}return o.def=r,o}/*! #__NO_SIDE_EFFECTS__ */const f0=(e,t)=>mg(e,t,Cg),p0=typeof HTMLElement<"u"?HTMLElement:class{};class Pl extends p0{constructor(t,n={},r){super(),this._def=t,this._props=n,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this._ob=null,this.shadowRoot&&r?r(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,Fo(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),_u(null,this.shadowRoot),this._instance=null)})}_resolveDef(){this._resolved=!0;for(let r=0;r{for(const o of r)this._setAttr(o.attributeName)}),this._ob.observe(this,{attributes:!0});const t=(r,o=!1)=>{const{props:s,styles:i}=r;let a;if(s&&!ze(s))for(const l in s){const u=s[l];(u===Number||u&&u.type===Number)&&(l in this._props&&(this._props[l]=Ma(this._props[l])),(a||(a=Object.create(null)))[Yt(l)]=!0)}this._numberProps=a,o&&this._resolveProps(r),this._applyStyles(i),this._update()},n=this._def.__asyncLoader;n?n().then(r=>t(r,!0)):t(this._def)}_resolveProps(t){const{props:n}=t,r=ze(n)?n:Object.keys(n||{});for(const o of Object.keys(this))o[0]!=="_"&&r.includes(o)&&this._setProp(o,this[o],!0,!1);for(const o of r.map(Yt))Object.defineProperty(this,o,{get(){return this._getProp(o)},set(s){this._setProp(o,s)}})}_setAttr(t){let n=this.hasAttribute(t)?this.getAttribute(t):void 0;const r=Yt(t);this._numberProps&&this._numberProps[r]&&(n=Ma(n)),this._setProp(r,n,!1)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,o=!0){n!==this._props[t]&&(this._props[t]=n,o&&this._instance&&this._update(),r&&(n===!0?this.setAttribute(dn(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(dn(t),n+""):n||this.removeAttribute(dn(t))))}_update(){_u(this._createVNode(),this.shadowRoot)}_createVNode(){const t=b(this._def,wt({},this._props));return this._instance||(t.ce=n=>{this._instance=n,n.isCE=!0;const r=(s,i)=>{this.dispatchEvent(new CustomEvent(s,{detail:i}))};n.emit=(s,...i)=>{r(s,i),dn(s)!==s&&r(dn(s),i)};let o=this;for(;o=o&&(o.parentNode||o.host);)if(o instanceof Pl){n.parent=o._instance,n.provides=o._instance.provides;break}}),t}_applyStyles(t){t&&t.forEach(n=>{const r=document.createElement("style");r.textContent=n,this.shadowRoot.appendChild(r)})}}function h0(e="$style"){{const t=Hn();if(!t)return ot;const n=t.type.__cssModules;if(!n)return ot;const r=n[e];return r||ot}}const fg=new WeakMap,pg=new WeakMap,Ka=Symbol("_moveCb"),Wm=Symbol("_enterCb"),hg={name:"TransitionGroup",props:wt({},Kb,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Hn(),r=hd();let o,s;return $l(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!b0(o[0].el,n.vnode.el,i))return;o.forEach(y0),o.forEach(z0);const a=o.filter(v0);cg(),a.forEach(l=>{const u=l.el,m=u.style;vr(u,i),m.transform=m.webkitTransform=m.transitionDuration="";const d=u[Ka]=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener("transitionend",d),u[Ka]=null,Ur(u,i))};u.addEventListener("transitionend",d)})}),()=>{const i=Xe(e),a=ag(i);let l=i.tag||ve;if(o=[],s)for(let u=0;udelete e.mode;hg.props;const g0=hg;function y0(e){const t=e.el;t[Ka]&&t[Ka](),t[Wm]&&t[Wm]()}function z0(e){pg.set(e,e.el.getBoundingClientRect())}function v0(e){const t=fg.get(e),n=pg.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${o}px)`,s.transitionDuration="0s",e}}function b0(e,t,n){const r=e.cloneNode(),o=e[gs];o&&o.forEach(a=>{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=lg(r);return s.removeChild(r),i}const io=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ze(t)?n=>cs(t,n):t};function C0(e){e.target.composing=!0}function qm(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Dn=Symbol("_assign"),hn={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Dn]=io(o);const s=r||o.props&&o.props.type==="number";Cr(e,t?"change":"input",i=>{if(i.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=Ra(a)),e[Dn](a)}),n&&Cr(e,"change",()=>{e.value=e.value.trim()}),t||(Cr(e,"compositionstart",C0),Cr(e,"compositionend",qm),Cr(e,"change",qm))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:s}},i){if(e[Dn]=io(i),e.composing)return;const a=(s||e.type==="number")&&!/^0\d/.test(e.value)?Ra(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===l)||(e.value=l))}},Rn={deep:!0,created(e,t,n){e[Dn]=io(n),Cr(e,"change",()=>{const r=e._modelValue,o=ys(e),s=e.checked,i=e[Dn];if(ze(r)){const a=yl(r,o),l=a!==-1;if(s&&!l)i(r.concat(o));else if(!s&&l){const u=[...r];u.splice(a,1),i(u)}}else if(Ro(r)){const a=new Set(r);s?a.add(o):a.delete(o),i(a)}else i(_g(e,s))})},mounted:Gm,beforeUpdate(e,t,n){e[Dn]=io(n),Gm(e,t,n)}};function Gm(e,{value:t,oldValue:n},r){e._modelValue=t,ze(t)?e.checked=yl(t,r.props.value)>-1:Ro(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=no(t,_g(e,!0)))}const $d={created(e,{value:t},n){e.checked=no(t,n.props.value),e[Dn]=io(n),Cr(e,"change",()=>{e[Dn](ys(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Dn]=io(r),t!==n&&(e.checked=no(t,r.props.value))}},Td={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=Ro(t);Cr(e,"change",()=>{const s=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?Ra(ys(i)):ys(i));e[Dn](e.multiple?o?new Set(s):s:s[0]),e._assigning=!0,Fo(()=>{e._assigning=!1})}),e[Dn]=io(r)},mounted(e,{value:t,modifiers:{number:n}}){Km(e,t)},beforeUpdate(e,t,n){e[Dn]=io(n)},updated(e,{value:t,modifiers:{number:n}}){e._assigning||Km(e,t)}};function Km(e,t,n){const r=e.multiple,o=ze(t);if(!(r&&!o&&!Ro(t))){for(let s=0,i=e.options.length;sString(m)===String(l)):a.selected=yl(t,l)>-1}else a.selected=t.has(l);else if(no(ys(a),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!r&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function ys(e){return"_value"in e?e._value:e.value}function _g(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const gg={created(e,t,n){oa(e,t,n,null,"created")},mounted(e,t,n){oa(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){oa(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){oa(e,t,n,r,"updated")}};function yg(e,t){switch(e){case"SELECT":return Td;case"TEXTAREA":return hn;default:switch(t){case"checkbox":return Rn;case"radio":return $d;default:return hn}}}function oa(e,t,n,r,o){const i=yg(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}function w0(){hn.getSSRProps=({value:e})=>({value:e}),$d.getSSRProps=({value:e},t)=>{if(t.props&&no(t.props.value,e))return{checked:!0}},Rn.getSSRProps=({value:e},t)=>{if(ze(e)){if(t.props&&yl(e,t.props.value)>-1)return{checked:!0}}else if(Ro(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},gg.getSSRProps=(e,t)=>{if(typeof t.type!="string")return;const n=yg(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const k0=["ctrl","shift","alt","meta"],S0={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)=>k0.some(n=>e[`${n}Key`]&&!t.includes(n))},_t=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...s)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=dn(o.key);if(t.some(i=>i===s||x0[i]===s))return e(o)})},zg=wt({patchProp:d0},Gb);let si,Zm=!1;function vg(){return si||(si=L_(zg))}function bg(){return si=Zm?si:N_(zg),Zm=!0,si}const _u=(...e)=>{vg().render(...e)},Cg=(...e)=>{bg().hydrate(...e)},wg=(...e)=>{const t=vg().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Sg(r);if(!o)return;const s=t._component;!Oe(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,kg(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t},E0=(...e)=>{const t=bg().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Sg(r);if(o)return n(o,!0,kg(o))},t};function kg(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Sg(e){return vt(e)?document.querySelector(e):e}let Ym=!1;const $0=()=>{Ym||(Ym=!0,w0(),Jb())};/** +**/const Xb="http://www.w3.org/2000/svg",Jb="http://www.w3.org/1998/Math/MathML",wr=typeof document<"u"?document:null,Mm=wr&&wr.createElement("template"),Qb={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==="svg"?wr.createElementNS(Xb,e):t==="mathml"?wr.createElementNS(Jb,e):n?wr.createElement(e,{is:n}):wr.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>wr.createTextNode(e),createComment:e=>wr.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>wr.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{Mm.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const a=Mm.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Rr="transition",Ms="animation",vs=Symbol("_vtc"),Rt=(e,{slots:t})=>mr(f_,fg(e),t);Rt.displayName="Transition";const mg={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},e0=Rt.props=kt({},bd,mg),go=(e,t=[])=>{ze(e)?e.forEach(n=>n(...t)):e&&e(...t)},Fm=e=>e?ze(e)?e.some(t=>t.length>1):e.length>1:!1;function fg(e){const t={};for(const U in e)U in mg||(t[U]=e[U]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=i,appearToClass:m=a,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,h=t0(o),g=h&&h[0],z=h&&h[1],{onBeforeEnter:k,onEnter:w,onEnterCancelled:_,onLeave:v,onLeaveCancelled:S,onBeforeAppear:C=k,onAppear:L=w,onAppearCancelled:D=_}=t,$=(U,W,ne)=>{Br(U,W?m:a),Br(U,W?u:i),ne&&ne()},F=(U,W)=>{U._isLeaving=!1,Br(U,d),Br(U,p),Br(U,f),W&&W()},q=U=>(W,ne)=>{const me=U?L:w,K=()=>$(W,U,ne);go(me,[W,K]),Vm(()=>{Br(W,U?l:s),Cr(W,U?m:a),Fm(me)||Hm(W,r,g,K)})};return kt(t,{onBeforeEnter(U){go(k,[U]),Cr(U,s),Cr(U,i)},onBeforeAppear(U){go(C,[U]),Cr(U,l),Cr(U,u)},onEnter:q(!1),onAppear:q(!0),onLeave(U,W){U._isLeaving=!0;const ne=()=>F(U,W);Cr(U,d),Cr(U,f),hg(),Vm(()=>{U._isLeaving&&(Br(U,d),Cr(U,p),Fm(v)||Hm(U,r,z,ne))}),go(v,[U,ne])},onEnterCancelled(U){$(U,!1),go(_,[U])},onAppearCancelled(U){$(U,!0),go(D,[U])},onLeaveCancelled(U){F(U),go(S,[U])}})}function t0(e){if(e==null)return null;if(ft(e))return[hc(e.enter),hc(e.leave)];{const t=hc(e);return[t,t]}}function hc(e){return ja(e)}function Cr(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[vs]||(e[vs]=new Set)).add(t)}function Br(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[vs];n&&(n.delete(t),n.size||(e[vs]=void 0))}function Vm(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let n0=0;function Hm(e,t,n,r){const o=e._endId=++n0,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=pg(e,t);if(!i)return r();const u=i+"end";let m=0;const d=()=>{e.removeEventListener(u,f),s()},f=p=>{p.target===e&&++m>=l&&d()};setTimeout(()=>{m(n[h]||"").split(", "),o=r(`${Rr}Delay`),s=r(`${Rr}Duration`),i=Um(o,s),a=r(`${Ms}Delay`),l=r(`${Ms}Duration`),u=Um(a,l);let m=null,d=0,f=0;t===Rr?i>0&&(m=Rr,d=i,f=s.length):t===Ms?u>0&&(m=Ms,d=u,f=l.length):(d=Math.max(i,u),m=d>0?i>u?Rr:Ms:null,f=m?m===Rr?s.length:l.length:0);const p=m===Rr&&/\b(transform|all)(,|$)/.test(r(`${Rr}Property`).toString());return{type:m,timeout:d,propCount:f,hasTransform:p}}function Um(e,t){for(;e.lengthjm(n)+jm(e[r])))}function jm(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function hg(){return document.body.offsetHeight}function r0(e,t,n){const r=e[vs];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ja=Symbol("_vod"),_g=Symbol("_vsh"),Si={beforeMount(e,{value:t},{transition:n}){e[Ja]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Fs(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Fs(e,!0),r.enter(e)):r.leave(e,()=>{Fs(e,!1)}):Fs(e,t))},beforeUnmount(e,{value:t}){Fs(e,t)}};function Fs(e,t){e.style.display=t?e[Ja]:"none",e[_g]=!t}function o0(){Si.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const gg=Symbol("");function s0(e){const t=Un();if(!t)return;const n=t.ut=(o=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(s=>vu(s,o))},r=()=>{const o=e(t.proxy);zu(t.subTree,o),n(o)};Cd(()=>{K_(r)}),As(()=>{const o=new MutationObserver(r);o.observe(t.subTree.el.parentNode,{childList:!0}),Ri(()=>o.disconnect())})}function zu(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{zu(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)vu(e.el,t);else if(e.type===ve)e.children.forEach(n=>zu(n,t));else if(e.type===Po){let{el:n,anchor:r}=e;for(;n&&(vu(n,t),n!==r);)n=n.nextSibling}}function vu(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const o in t)n.setProperty(`--${o}`,t[o]),r+=`--${o}: ${t[o]};`;n[gg]=r}}const i0=/(^|;)\s*display\s*:/;function a0(e,t,n){const r=e.style,o=bt(n);let s=!1;if(n&&!o){if(t)if(bt(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&Ta(r,a,"")}else for(const i in t)n[i]==null&&Ta(r,i,"");for(const i in n)i==="display"&&(s=!0),Ta(r,i,n[i])}else if(o){if(t!==n){const i=r[gg];i&&(n+=";"+i),r.cssText=n,s=i0.test(n)}}else t&&e.removeAttribute("style");Ja in e&&(e[Ja]=s?r.display:"",e[_g]&&(r.display="none"))}const Bm=/\s*!important$/;function Ta(e,t,n){if(ze(n))n.forEach(r=>Ta(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=l0(e,t);Bm.test(n)?e.setProperty(mn(r),n.replace(Bm,""),"important"):e[r]=n}}const Wm=["Webkit","Moz","ms"],_c={};function l0(e,t){const n=_c[t];if(n)return n;let r=Xt(t);if(r!=="filter"&&r in e)return _c[t]=r;r=Ni(r);for(let o=0;ogc||(f0.then(()=>gc=0),gc=Date.now());function h0(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;kn(_0(r,n.value),t,5,[r])};return n.value=e,n.attached=p0(),n}function _0(e,t){if(ze(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 Ym=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,g0=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?r0(e,r,i):t==="style"?a0(e,n,r):Li(t)?rd(t)||d0(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):y0(e,t,r,i))?(c0(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Gm(e,t,r,i,s,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Gm(e,t,r,i))};function y0(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ym(t)&&Oe(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;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Ym(t)&&bt(n)?!1:t in e}/*! #__NO_SIDE_EFFECTS__ */function yg(e,t,n){const r=Pr(e,t);class o extends Dl{constructor(i){super(r,i,n)}}return o.def=r,o}/*! #__NO_SIDE_EFFECTS__ */const z0=(e,t)=>yg(e,t,$g),v0=typeof HTMLElement<"u"?HTMLElement:class{};class Dl extends v0{constructor(t,n={},r){super(),this._def=t,this._props=n,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this._ob=null,this.shadowRoot&&r?r(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,Uo(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),bu(null,this.shadowRoot),this._instance=null)})}_resolveDef(){this._resolved=!0;for(let r=0;r{for(const o of r)this._setAttr(o.attributeName)}),this._ob.observe(this,{attributes:!0});const t=(r,o=!1)=>{const{props:s,styles:i}=r;let a;if(s&&!ze(s))for(const l in s){const u=s[l];(u===Number||u&&u.type===Number)&&(l in this._props&&(this._props[l]=ja(this._props[l])),(a||(a=Object.create(null)))[Xt(l)]=!0)}this._numberProps=a,o&&this._resolveProps(r),this._applyStyles(i),this._update()},n=this._def.__asyncLoader;n?n().then(r=>t(r,!0)):t(this._def)}_resolveProps(t){const{props:n}=t,r=ze(n)?n:Object.keys(n||{});for(const o of Object.keys(this))o[0]!=="_"&&r.includes(o)&&this._setProp(o,this[o],!0,!1);for(const o of r.map(Xt))Object.defineProperty(this,o,{get(){return this._getProp(o)},set(s){this._setProp(o,s)}})}_setAttr(t){let n=this.hasAttribute(t)?this.getAttribute(t):void 0;const r=Xt(t);this._numberProps&&this._numberProps[r]&&(n=ja(n)),this._setProp(r,n,!1)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,o=!0){n!==this._props[t]&&(this._props[t]=n,o&&this._instance&&this._update(),r&&(n===!0?this.setAttribute(mn(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(mn(t),n+""):n||this.removeAttribute(mn(t))))}_update(){bu(this._createVNode(),this.shadowRoot)}_createVNode(){const t=b(this._def,kt({},this._props));return this._instance||(t.ce=n=>{this._instance=n,n.isCE=!0;const r=(s,i)=>{this.dispatchEvent(new CustomEvent(s,{detail:i}))};n.emit=(s,...i)=>{r(s,i),mn(s)!==s&&r(mn(s),i)};let o=this;for(;o=o&&(o.parentNode||o.host);)if(o instanceof Dl){n.parent=o._instance,n.provides=o._instance.provides;break}}),t}_applyStyles(t){t&&t.forEach(n=>{const r=document.createElement("style");r.textContent=n,this.shadowRoot.appendChild(r)})}}function b0(e="$style"){{const t=Un();if(!t)return st;const n=t.type.__cssModules;if(!n)return st;const r=n[e];return r||st}}const zg=new WeakMap,vg=new WeakMap,Qa=Symbol("_moveCb"),Xm=Symbol("_enterCb"),bg={name:"TransitionGroup",props:kt({},e0,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Un(),r=vd();let o,s;return Pl(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!E0(o[0].el,n.vnode.el,i))return;o.forEach(k0),o.forEach(S0);const a=o.filter(x0);hg(),a.forEach(l=>{const u=l.el,m=u.style;Cr(u,i),m.transform=m.webkitTransform=m.transitionDuration="";const d=u[Qa]=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener("transitionend",d),u[Qa]=null,Br(u,i))};u.addEventListener("transitionend",d)})}),()=>{const i=Xe(e),a=fg(i);let l=i.tag||ve;if(o=[],s)for(let u=0;udelete e.mode;bg.props;const w0=bg;function k0(e){const t=e.el;t[Qa]&&t[Qa](),t[Xm]&&t[Xm]()}function S0(e){vg.set(e,e.el.getBoundingClientRect())}function x0(e){const t=zg.get(e),n=vg.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${o}px)`,s.transitionDuration="0s",e}}function E0(e,t,n){const r=e.cloneNode(),o=e[vs];o&&o.forEach(a=>{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=pg(r);return s.removeChild(r),i}const lo=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ze(t)?n=>ms(t,n):t};function $0(e){e.target.composing=!0}function Jm(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Rn=Symbol("_assign"),_n={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Rn]=lo(o);const s=r||o.props&&o.props.type==="number";kr(e,t?"change":"input",i=>{if(i.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=Ua(a)),e[Rn](a)}),n&&kr(e,"change",()=>{e.value=e.value.trim()}),t||(kr(e,"compositionstart",$0),kr(e,"compositionend",Jm),kr(e,"change",Jm))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:s}},i){if(e[Rn]=lo(i),e.composing)return;const a=(s||e.type==="number")&&!/^0\d/.test(e.value)?Ua(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===l)||(e.value=l))}},Mn={deep:!0,created(e,t,n){e[Rn]=lo(n),kr(e,"change",()=>{const r=e._modelValue,o=bs(e),s=e.checked,i=e[Rn];if(ze(r)){const a=Cl(r,o),l=a!==-1;if(s&&!l)i(r.concat(o));else if(!s&&l){const u=[...r];u.splice(a,1),i(u)}}else if(Vo(r)){const a=new Set(r);s?a.add(o):a.delete(o),i(a)}else i(Cg(e,s))})},mounted:Qm,beforeUpdate(e,t,n){e[Rn]=lo(n),Qm(e,t,n)}};function Qm(e,{value:t,oldValue:n},r){e._modelValue=t,ze(t)?e.checked=Cl(t,r.props.value)>-1:Vo(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=oo(t,Cg(e,!0)))}const Id={created(e,{value:t},n){e.checked=oo(t,n.props.value),e[Rn]=lo(n),kr(e,"change",()=>{e[Rn](bs(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Rn]=lo(r),t!==n&&(e.checked=oo(t,r.props.value))}},Ld={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=Vo(t);kr(e,"change",()=>{const s=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?Ua(bs(i)):bs(i));e[Rn](e.multiple?o?new Set(s):s:s[0]),e._assigning=!0,Uo(()=>{e._assigning=!1})}),e[Rn]=lo(r)},mounted(e,{value:t,modifiers:{number:n}}){ef(e,t)},beforeUpdate(e,t,n){e[Rn]=lo(n)},updated(e,{value:t,modifiers:{number:n}}){e._assigning||ef(e,t)}};function ef(e,t,n){const r=e.multiple,o=ze(t);if(!(r&&!o&&!Vo(t))){for(let s=0,i=e.options.length;sString(m)===String(l)):a.selected=Cl(t,l)>-1}else a.selected=t.has(l);else if(oo(bs(a),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!r&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function bs(e){return"_value"in e?e._value:e.value}function Cg(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const wg={created(e,t,n){la(e,t,n,null,"created")},mounted(e,t,n){la(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){la(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){la(e,t,n,r,"updated")}};function kg(e,t){switch(e){case"SELECT":return Ld;case"TEXTAREA":return _n;default:switch(t){case"checkbox":return Mn;case"radio":return Id;default:return _n}}}function la(e,t,n,r,o){const i=kg(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}function T0(){_n.getSSRProps=({value:e})=>({value:e}),Id.getSSRProps=({value:e},t)=>{if(t.props&&oo(t.props.value,e))return{checked:!0}},Mn.getSSRProps=({value:e},t)=>{if(ze(e)){if(t.props&&Cl(e,t.props.value)>-1)return{checked:!0}}else if(Vo(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},wg.getSSRProps=(e,t)=>{if(typeof t.type!="string")return;const n=kg(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const A0=["ctrl","shift","alt","meta"],O0={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)=>A0.some(n=>e[`${n}Key`]&&!t.includes(n))},gt=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...s)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=mn(o.key);if(t.some(i=>i===s||P0[i]===s))return e(o)})},Sg=kt({patchProp:g0},Qb);let li,tf=!1;function xg(){return li||(li=V_(Sg))}function Eg(){return li=tf?li:H_(Sg),tf=!0,li}const bu=(...e)=>{xg().render(...e)},$g=(...e)=>{Eg().hydrate(...e)},Tg=(...e)=>{const t=xg().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Og(r);if(!o)return;const s=t._component;!Oe(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,Ag(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t},I0=(...e)=>{const t=Eg().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Og(r);if(o)return n(o,!0,Ag(o))},t};function Ag(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Og(e){return bt(e)?document.querySelector(e):e}let nf=!1;const L0=()=>{nf||(nf=!0,T0(),o0())};/** * vue v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const T0=()=>{},A0=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:a_,BaseTransitionPropsValidators:_d,Comment:Dt,DeprecationTypes:Bb,EffectScope:nd,ErrorCodes:pv,ErrorTypeStrings:Rb,Fragment:ve,KeepAlive:xv,ReactiveEffect:hs,Static:To,Suspense:yb,Teleport:Vn,Text:Er,TrackOpTypes:dv,Transition:Nt,TransitionGroup:g0,TriggerOpTypes:mv,VueElement:Pl,assertNumber:fv,callWithAsyncErrorHandling:wn,callWithErrorHandling:xr,camelize:Yt,capitalize:Oi,cloneVNode:pr,compatUtils:jb,compile:T0,computed:Ht,createApp:wg,createBlock:we,createCommentVNode:ee,createElementBlock:I,createElementVNode:c,createHydrationRenderer:N_,createPropsRestProxy:Uv,createRenderer:L_,createSSRApp:E0,createSlots:bd,createStaticVNode:xb,createTextVNode:Lt,createVNode:b,customRef:Qh,defineAsyncComponent:kv,defineComponent:Ar,defineCustomElement:mg,defineEmits:Pv,defineExpose:Iv,defineModel:Dv,defineOptions:Lv,defineProps:Ov,defineSSRCustomElement:f0,defineSlots:Nv,devtools:Mb,effect:Lz,effectScope:zl,getCurrentInstance:Hn,getCurrentScope:rd,getTransitionRawChildren:xl,guardReactiveProps:J_,h:ur,handleError:Mo,hasInjectionContext:b_,hydrate:Cg,initCustomFormatter:Lb,initDirectivesForSSR:$0,inject:Ln,isMemoSame:og,isProxy:cd,isReactive:Sr,isReadonly:ro,isRef:At,isRuntimeOnly:Ob,isShallow:Po,isVNode:so,markRaw:wl,mergeDefaults:Vv,mergeModels:Hv,mergeProps:rs,nextTick:Fo,normalizeClass:ke,normalizeProps:Ws,normalizeStyle:ao,onActivated:c_,onBeforeMount:gd,onBeforeUnmount:Tl,onBeforeUpdate:m_,onDeactivated:u_,onErrorCaptured:__,onMounted:Es,onRenderTracked:h_,onRenderTriggered:p_,onScopeDispose:Rh,onServerPrefetch:f_,onUnmounted:Ii,onUpdated:$l,openBlock:x,popScopeId:bv,provide:ni,proxyRefs:fd,pushScopeId:vv,queuePostFlushCb:Va,reactive:xs,readonly:ld,ref:In,registerRuntimeCompiler:Ab,render:_u,renderList:ht,renderSlot:zt,resolveComponent:O,resolveDirective:zd,resolveDynamicComponent:Al,resolveFilter:Ub,resolveTransitionHooks:_s,setBlockTracking:lu,setDevtoolsHook:Fb,setTransitionHooks:oo,shallowReactive:ad,shallowReadonly:tv,shallowRef:md,ssrContextKey:F_,ssrUtils:Hb,stop:Nz,toDisplayString:y,toHandlerKey:ei,toHandlers:Tv,toRaw:Xe,toRef:uv,toRefs:e_,toValue:sv,transformVNodeArgs:kb,triggerRef:ov,unref:bn,useAttrs:Fv,useCssModule:h0,useCssVars:Qb,useModel:db,useSSRContext:V_,useSlots:Mv,useTransitionState:hd,vModelCheckbox:Rn,vModelDynamic:gg,vModelRadio:$d,vModelSelect:Td,vModelText:hn,vShow:Ci,version:sg,warn:Db,watch:Nn,watchEffect:H_,watchPostEffect:U_,watchSyncEffect:j_,withAsyncContext:jv,withCtx:N,withDefaults:Rv,withDirectives:pt,withKeys:un,withMemo:Nb,withModifiers:_t,withScopeId:Cv},Symbol.toStringTag,{value:"Module"}));var O0=!1;/*! +**/const N0=()=>{},D0=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:f_,BaseTransitionPropsValidators:bd,Comment:Mt,DeprecationTypes:Yb,EffectScope:ad,ErrorCodes:vv,ErrorTypeStrings:jb,Fragment:ve,KeepAlive:Pv,ReactiveEffect:ys,Static:Po,Suspense:kb,Teleport:Hn,Text:Tr,TrackOpTypes:gv,Transition:Rt,TransitionGroup:w0,TriggerOpTypes:yv,VueElement:Dl,assertNumber:zv,callWithAsyncErrorHandling:kn,callWithErrorHandling:$r,camelize:Xt,capitalize:Ni,cloneVNode:_r,compatUtils:Zb,compile:N0,computed:jt,createApp:Tg,createBlock:we,createCommentVNode:ee,createElementBlock:I,createElementVNode:c,createHydrationRenderer:H_,createPropsRestProxy:Kv,createRenderer:V_,createSSRApp:I0,createSlots:xd,createStaticVNode:Pb,createTextVNode:Dt,createVNode:b,customRef:s_,defineAsyncComponent:Av,defineComponent:Pr,defineCustomElement:yg,defineEmits:Mv,defineExpose:Fv,defineModel:Uv,defineOptions:Vv,defineProps:Rv,defineSSRCustomElement:z0,defineSlots:Hv,devtools:Bb,effect:Vz,effectScope:wl,getCurrentInstance:Un,getCurrentScope:ld,getTransitionRawChildren:Al,guardReactiveProps:og,h:mr,handleError:Ho,hasInjectionContext:E_,hydrate:$g,initCustomFormatter:Vb,initDirectivesForSSR:L0,inject:Nn,isMemoSame:ug,isProxy:pd,isReactive:Er,isReadonly:so,isRef:Ot,isRuntimeOnly:Rb,isShallow:No,isVNode:ao,markRaw:El,mergeDefaults:qv,mergeModels:Gv,mergeProps:is,nextTick:Uo,normalizeClass:ke,normalizeProps:Ks,normalizeStyle:co,onActivated:h_,onBeforeMount:Cd,onBeforeUnmount:Il,onBeforeUpdate:y_,onDeactivated:__,onErrorCaptured:C_,onMounted:As,onRenderTracked:b_,onRenderTriggered:v_,onScopeDispose:jh,onServerPrefetch:z_,onUnmounted:Ri,onUpdated:Pl,openBlock:x,popScopeId:Ev,provide:si,proxyRefs:yd,pushScopeId:xv,queuePostFlushCb:Wa,reactive:Ts,readonly:fd,ref:Ln,registerRuntimeCompiler:Db,render:bu,renderList:_t,renderSlot:vt,resolveComponent:O,resolveDirective:kd,resolveDynamicComponent:Ll,resolveFilter:Kb,resolveTransitionHooks:zs,setBlockTracking:fu,setDevtoolsHook:Wb,setTransitionHooks:io,shallowReactive:md,shallowReadonly:av,shallowRef:gd,ssrContextKey:W_,ssrUtils:Gb,stop:Hz,toDisplayString:y,toHandlerKey:ri,toHandlers:Nv,toRaw:Xe,toRef:_v,toRefs:i_,toValue:dv,transformVNodeArgs:Ab,triggerRef:uv,unref:Cn,useAttrs:Wv,useCssModule:b0,useCssVars:s0,useModel:gb,useSSRContext:q_,useSlots:Bv,useTransitionState:vd,vModelCheckbox:Mn,vModelDynamic:wg,vModelRadio:Id,vModelSelect:Ld,vModelText:_n,vShow:Si,version:dg,warn:Ub,watch:Dn,watchEffect:G_,watchPostEffect:K_,watchSyncEffect:Z_,withAsyncContext:Zv,withCtx:N,withDefaults:jv,withDirectives:ht,withKeys:dn,withMemo:Hb,withModifiers:gt,withScopeId:$v},Symbol.toStringTag,{value:"Module"}));var R0=!1;/*! * pinia v2.2.2 * (c) 2024 Eduardo San Martin Morote * @license MIT - */let xg;const Il=e=>xg=e,Eg=Symbol();function gu(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var ii;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(ii||(ii={}));function P0(){const e=zl(!0),t=e.run(()=>In({}));let n=[],r=[];const o=wl({install(s){Il(o),o._a=s,s.provide(Eg,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!O0?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const $g=()=>{};function Xm(e,t,n,r=$g){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&rd()&&Rh(o),o}function jo(e,...t){e.slice().forEach(n=>{n(...t)})}const I0=e=>e(),Jm=Symbol(),pc=Symbol();function yu(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];gu(o)&&gu(r)&&e.hasOwnProperty(n)&&!At(r)&&!Sr(r)?e[n]=yu(o,r):e[n]=r}return e}const L0=Symbol();function N0(e){return!gu(e)||!e.hasOwnProperty(L0)}const{assign:jr}=Object;function D0(e){return!!(At(e)&&e.effect)}function R0(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function u(){a||(n.state.value[e]=o?o():{});const m=e_(n.state.value[e]);return jr(m,s,Object.keys(i||{}).reduce((d,f)=>(d[f]=wl(Ht(()=>{Il(n);const p=n._s.get(e);return i[f].call(p,p)})),d),{}))}return l=Tg(e,u,t,n,r,!0),l}function Tg(e,t,n={},r,o,s){let i;const a=jr({actions:{}},n),l={deep:!0};let u,m,d=[],f=[],p;const h=r.state.value[e];!s&&!h&&(r.state.value[e]={}),In({});let g;function z(D){let $;u=m=!1,typeof D=="function"?(D(r.state.value[e]),$={type:ii.patchFunction,storeId:e,events:p}):(yu(r.state.value[e],D),$={type:ii.patchObject,payload:D,storeId:e,events:p});const F=g=Symbol();Fo().then(()=>{g===F&&(u=!0)}),m=!0,jo(d,$,r.state.value[e])}const k=s?function(){const{state:$}=n,F=$?$():{};this.$patch(q=>{jr(q,F)})}:$g;function w(){i.stop(),d=[],f=[],r._s.delete(e)}const _=(D,$="")=>{if(Jm in D)return D[pc]=$,D;const F=function(){Il(r);const q=Array.from(arguments),U=[],W=[];function ne(re){U.push(re)}function me(re){W.push(re)}jo(f,{args:q,name:F[pc],store:S,after:ne,onError:me});let K;try{K=D.apply(this&&this.$id===e?this:S,q)}catch(re){throw jo(W,re),re}return K instanceof Promise?K.then(re=>(jo(U,re),re)).catch(re=>(jo(W,re),Promise.reject(re))):(jo(U,K),K)};return F[Jm]=!0,F[pc]=$,F},v={_p:r,$id:e,$onAction:Xm.bind(null,f),$patch:z,$reset:k,$subscribe(D,$={}){const F=Xm(d,D,$.detached,()=>q()),q=i.run(()=>Nn(()=>r.state.value[e],U=>{($.flush==="sync"?m:u)&&D({storeId:e,type:ii.direct,events:p},U)},jr({},l,$)));return F},$dispose:w},S=xs(v);r._s.set(e,S);const L=(r._a&&r._a.runWithContext||I0)(()=>r._e.run(()=>(i=zl()).run(()=>t({action:_}))));for(const D in L){const $=L[D];if(At($)&&!D0($)||Sr($))s||(h&&N0($)&&(At($)?$.value=h[D]:yu($,h[D])),r.state.value[e][D]=$);else if(typeof $=="function"){const F=_($,D);L[D]=F,a.actions[D]=$}}return jr(S,L),jr(Xe(S),L),Object.defineProperty(S,"$state",{get:()=>r.state.value[e],set:D=>{z($=>{jr($,D)})}}),r._p.forEach(D=>{jr(S,i.run(()=>D({store:S,app:r._a,pinia:r,options:a})))}),h&&s&&n.hydrate&&n.hydrate(S.$state,h),u=!0,m=!0,S}function Un(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(a,l){const u=b_();return a=a||(u?Ln(Eg,null):null),a&&Il(a),a=xg,a._s.has(r)||(s?Tg(r,t,o,a):R0(r,o,a)),a._s.get(r)}return i.$id=r,i}const Ad=Un("RemotesStore",{state:()=>({pairing:{}})});function Ag(e,t){return function(){return e.apply(t,arguments)}}const{toString:M0}=Object.prototype,{getPrototypeOf:Od}=Object,Ll=(e=>t=>{const n=M0.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),nr=e=>(e=e.toLowerCase(),t=>Ll(t)===e),Nl=e=>t=>typeof t===e,{isArray:$s}=Array,wi=Nl("undefined");function F0(e){return e!==null&&!wi(e)&&e.constructor!==null&&!wi(e.constructor)&&kn(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Og=nr("ArrayBuffer");function V0(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Og(e.buffer),t}const H0=Nl("string"),kn=Nl("function"),Pg=Nl("number"),Dl=e=>e!==null&&typeof e=="object",U0=e=>e===!0||e===!1,Sa=e=>{if(Ll(e)!=="object")return!1;const t=Od(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},j0=nr("Date"),B0=nr("File"),W0=nr("Blob"),q0=nr("FileList"),G0=e=>Dl(e)&&kn(e.pipe),K0=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||kn(e.append)&&((t=Ll(e))==="formdata"||t==="object"&&kn(e.toString)&&e.toString()==="[object FormData]"))},Z0=nr("URLSearchParams"),[Y0,X0,J0,Q0]=["ReadableStream","Request","Response","Headers"].map(nr),eC=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ri(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),$s(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const wo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Lg=e=>!wi(e)&&e!==wo;function zu(){const{caseless:e}=Lg(this)&&this||{},t={},n=(r,o)=>{const s=e&&Ig(t,o)||o;Sa(t[s])&&Sa(r)?t[s]=zu(t[s],r):Sa(r)?t[s]=zu({},r):$s(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(Ri(t,(o,s)=>{n&&kn(o)?e[s]=Ag(o,n):e[s]=o},{allOwnKeys:r}),e),nC=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),rC=(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)},oC=(e,t,n,r)=>{let o,s,i;const a={};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))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&Od(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},sC=(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},iC=e=>{if(!e)return null;if($s(e))return e;let t=e.length;if(!Pg(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},aC=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Od(Uint8Array)),lC=(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])}},cC=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},uC=nr("HTMLFormElement"),dC=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),Qm=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),mC=nr("RegExp"),Ng=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Ri(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},fC=e=>{Ng(e,(t,n)=>{if(kn(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(kn(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+"'")})}})},pC=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return $s(e)?r(e):r(String(e).split(t)),n},hC=()=>{},_C=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,hc="abcdefghijklmnopqrstuvwxyz",ef="0123456789",Dg={DIGIT:ef,ALPHA:hc,ALPHA_DIGIT:hc+hc.toUpperCase()+ef},gC=(e=16,t=Dg.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function yC(e){return!!(e&&kn(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const zC=e=>{const t=new Array(10),n=(r,o)=>{if(Dl(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=$s(r)?[]:{};return Ri(r,(i,a)=>{const l=n(i,o+1);!wi(l)&&(s[a]=l)}),t[o]=void 0,s}}return r};return n(e,0)},vC=nr("AsyncFunction"),bC=e=>e&&(Dl(e)||kn(e))&&kn(e.then)&&kn(e.catch),Rg=((e,t)=>e?setImmediate:t?((n,r)=>(wo.addEventListener("message",({source:o,data:s})=>{o===wo&&s===n&&r.length&&r.shift()()},!1),o=>{r.push(o),wo.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",kn(wo.postMessage)),CC=typeof queueMicrotask<"u"?queueMicrotask.bind(wo):typeof process<"u"&&process.nextTick||Rg,J={isArray:$s,isArrayBuffer:Og,isBuffer:F0,isFormData:K0,isArrayBufferView:V0,isString:H0,isNumber:Pg,isBoolean:U0,isObject:Dl,isPlainObject:Sa,isReadableStream:Y0,isRequest:X0,isResponse:J0,isHeaders:Q0,isUndefined:wi,isDate:j0,isFile:B0,isBlob:W0,isRegExp:mC,isFunction:kn,isStream:G0,isURLSearchParams:Z0,isTypedArray:aC,isFileList:q0,forEach:Ri,merge:zu,extend:tC,trim:eC,stripBOM:nC,inherits:rC,toFlatObject:oC,kindOf:Ll,kindOfTest:nr,endsWith:sC,toArray:iC,forEachEntry:lC,matchAll:cC,isHTMLForm:uC,hasOwnProperty:Qm,hasOwnProp:Qm,reduceDescriptors:Ng,freezeMethods:fC,toObjectSet:pC,toCamelCase:dC,noop:hC,toFiniteNumber:_C,findKey:Ig,global:wo,isContextDefined:Lg,ALPHABET:Dg,generateString:gC,isSpecCompliantForm:yC,toJSONObject:zC,isAsyncFn:vC,isThenable:bC,setImmediate:Rg,asap:CC};function Be(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)}J.inherits(Be,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:J.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Mg=Be.prototype,Fg={};["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=>{Fg[e]={value:e}});Object.defineProperties(Be,Fg);Object.defineProperty(Mg,"isAxiosError",{value:!0});Be.from=(e,t,n,r,o,s)=>{const i=Object.create(Mg);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),Be.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const wC=null;function vu(e){return J.isPlainObject(e)||J.isArray(e)}function Vg(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function tf(e,t,n){return e?e.concat(t).map(function(o,s){return o=Vg(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function kC(e){return J.isArray(e)&&!e.some(vu)}const SC=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function Rl(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,z){return!J.isUndefined(z[g])});const r=n.metaTokens,o=n.visitor||m,s=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(o))throw new TypeError("visitor must be a function");function u(h){if(h===null)return"";if(J.isDate(h))return h.toISOString();if(!l&&J.isBlob(h))throw new Be("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(h)||J.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function m(h,g,z){let k=h;if(h&&!z&&typeof h=="object"){if(J.endsWith(g,"{}"))g=r?g:g.slice(0,-2),h=JSON.stringify(h);else if(J.isArray(h)&&kC(h)||(J.isFileList(h)||J.endsWith(g,"[]"))&&(k=J.toArray(h)))return g=Vg(g),k.forEach(function(_,v){!(J.isUndefined(_)||_===null)&&t.append(i===!0?tf([g],v,s):i===null?g:g+"[]",u(_))}),!1}return vu(h)?!0:(t.append(tf(z,g,s),u(h)),!1)}const d=[],f=Object.assign(SC,{defaultVisitor:m,convertValue:u,isVisitable:vu});function p(h,g){if(!J.isUndefined(h)){if(d.indexOf(h)!==-1)throw Error("Circular reference detected in "+g.join("."));d.push(h),J.forEach(h,function(k,w){(!(J.isUndefined(k)||k===null)&&o.call(t,k,J.isString(w)?w.trim():w,g,f))===!0&&p(k,g?g.concat(w):[w])}),d.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return p(e),t}function nf(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Pd(e,t){this._pairs=[],e&&Rl(e,this,t)}const Hg=Pd.prototype;Hg.append=function(t,n){this._pairs.push([t,n])};Hg.toString=function(t){const n=t?function(r){return t.call(this,r,nf)}:nf;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function xC(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Ug(e,t,n){if(!t)return e;const r=n&&n.encode||xC,o=n&&n.serialize;let s;if(o?s=o(t,n):s=J.isURLSearchParams(t)?t.toString():new Pd(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class rf{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){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const jg={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},EC=typeof URLSearchParams<"u"?URLSearchParams:Pd,$C=typeof FormData<"u"?FormData:null,TC=typeof Blob<"u"?Blob:null,AC={isBrowser:!0,classes:{URLSearchParams:EC,FormData:$C,Blob:TC},protocols:["http","https","file","blob","url","data"]},Id=typeof window<"u"&&typeof document<"u",OC=(e=>Id&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),PC=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",IC=Id&&window.location.href||"http://localhost",LC=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Id,hasStandardBrowserEnv:OC,hasStandardBrowserWebWorkerEnv:PC,origin:IC},Symbol.toStringTag,{value:"Module"})),Xn={...LC,...AC};function NC(e,t){return Rl(e,new Xn.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return Xn.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function DC(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function RC(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&J.isArray(o)?o.length:i,l?(J.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!a):((!o[i]||!J.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&J.isArray(o[i])&&(o[i]=RC(o[i])),!a)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,o)=>{t(DC(r),o,n,0)}),n}return null}function MC(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(0,JSON.stringify)(e)}const Mi={transitional:jg,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=J.isObject(t);if(s&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return o?JSON.stringify(Bg(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t)||J.isReadableStream(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return NC(t,this.formSerializer).toString();if((a=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Rl(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),MC(t)):t}],transformResponse:[function(t){const n=this.transitional||Mi.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(J.isResponse(t)||J.isReadableStream(t))return t;if(t&&J.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?Be.from(a,Be.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Xn.classes.FormData,Blob:Xn.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{Mi.headers[e]={}});const FC=J.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"]),VC=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]&&FC[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},of=Symbol("internals");function Rs(e){return e&&String(e).trim().toLowerCase()}function xa(e){return e===!1||e==null?e:J.isArray(e)?e.map(xa):String(e)}function HC(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 UC=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function _c(e,t,n,r,o){if(J.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!J.isString(t)){if(J.isString(r))return t.indexOf(r)!==-1;if(J.isRegExp(r))return r.test(t)}}function jC(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function BC(e,t){const n=J.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 fn{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(a,l,u){const m=Rs(l);if(!m)throw new Error("header name must be a non-empty string");const d=J.findKey(o,m);(!d||o[d]===void 0||u===!0||u===void 0&&o[d]!==!1)&&(o[d||l]=xa(a))}const i=(a,l)=>J.forEach(a,(u,m)=>s(u,m,l));if(J.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(J.isString(t)&&(t=t.trim())&&!UC(t))i(VC(t),n);else if(J.isHeaders(t))for(const[a,l]of t.entries())s(l,a,r);else t!=null&&s(n,t,r);return this}get(t,n){if(t=Rs(t),t){const r=J.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return HC(o);if(J.isFunction(n))return n.call(this,o,r);if(J.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Rs(t),t){const r=J.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||_c(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(i){if(i=Rs(i),i){const a=J.findKey(r,i);a&&(!n||_c(r,r[a],a,n))&&(delete r[a],o=!0)}}return J.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||_c(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return J.forEach(this,(o,s)=>{const i=J.findKey(r,s);if(i){n[i]=xa(o),delete n[s];return}const a=t?jC(s):String(s).trim();a!==s&&delete n[s],n[a]=xa(o),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return J.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&J.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[of]=this[of]={accessors:{}}).accessors,o=this.prototype;function s(i){const a=Rs(i);r[a]||(BC(o,i),r[a]=!0)}return J.isArray(t)?t.forEach(s):s(t),this}}fn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(fn.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(fn);function gc(e,t){const n=this||Mi,r=t||n,o=fn.from(r.headers);let s=r.data;return J.forEach(e,function(a){s=a.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function Wg(e){return!!(e&&e.__CANCEL__)}function Ts(e,t,n){Be.call(this,e??"canceled",Be.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(Ts,Be,{__CANCEL__:!0});function qg(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Be("Request failed with status code "+n.status,[Be.ERR_BAD_REQUEST,Be.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function WC(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function qC(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(l){const u=Date.now(),m=r[s];i||(i=u),n[o]=l,r[o]=u;let d=s,f=0;for(;d!==o;)f+=n[d++],d=d%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),u-i{n=m,o=null,s&&(clearTimeout(s),s=null),e.apply(null,u)};return[(...u)=>{const m=Date.now(),d=m-n;d>=r?i(u,m):(o=u,s||(s=setTimeout(()=>{s=null,i(o)},r-d)))},()=>o&&i(o)]}const Za=(e,t,n=3)=>{let r=0;const o=qC(50,250);return GC(s=>{const i=s.loaded,a=s.lengthComputable?s.total:void 0,l=i-r,u=o(l),m=i<=a;r=i;const d={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:u||void 0,estimated:u&&a&&m?(a-i)/u:void 0,event:s,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(d)},n)},sf=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},af=e=>(...t)=>J.asap(()=>e(...t)),KC=Xn.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 a=J.isString(i)?o(i):i;return a.protocol===r.protocol&&a.host===r.host}}():function(){return function(){return!0}}(),ZC=Xn.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.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 YC(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function XC(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function Gg(e,t){return e&&!YC(t)?XC(e,t):t}const lf=e=>e instanceof fn?{...e}:e;function No(e,t){t=t||{};const n={};function r(u,m,d){return J.isPlainObject(u)&&J.isPlainObject(m)?J.merge.call({caseless:d},u,m):J.isPlainObject(m)?J.merge({},m):J.isArray(m)?m.slice():m}function o(u,m,d){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u,d)}else return r(u,m,d)}function s(u,m){if(!J.isUndefined(m))return r(void 0,m)}function i(u,m){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u)}else return r(void 0,m)}function a(u,m,d){if(d in t)return r(u,m);if(d in e)return r(void 0,u)}const l={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:a,headers:(u,m)=>o(lf(u),lf(m),!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(m){const d=l[m]||o,f=d(e[m],t[m],m);J.isUndefined(f)&&d!==a||(n[m]=f)}),n}const Kg=e=>{const t=No({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=t;t.headers=i=fn.from(i),t.url=Ug(Gg(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(J.isFormData(n)){if(Xn.hasStandardBrowserEnv||Xn.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[u,...m]=l?l.split(";").map(d=>d.trim()).filter(Boolean):[];i.setContentType([u||"multipart/form-data",...m].join("; "))}}if(Xn.hasStandardBrowserEnv&&(r&&J.isFunction(r)&&(r=r(t)),r||r!==!1&&KC(t.url))){const u=o&&s&&ZC.read(s);u&&i.set(o,u)}return t},JC=typeof XMLHttpRequest<"u",QC=JC&&function(e){return new Promise(function(n,r){const o=Kg(e);let s=o.data;const i=fn.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:u}=o,m,d,f,p,h;function g(){p&&p(),h&&h(),o.cancelToken&&o.cancelToken.unsubscribe(m),o.signal&&o.signal.removeEventListener("abort",m)}let z=new XMLHttpRequest;z.open(o.method.toUpperCase(),o.url,!0),z.timeout=o.timeout;function k(){if(!z)return;const _=fn.from("getAllResponseHeaders"in z&&z.getAllResponseHeaders()),S={data:!a||a==="text"||a==="json"?z.responseText:z.response,status:z.status,statusText:z.statusText,headers:_,config:e,request:z};qg(function(L){n(L),g()},function(L){r(L),g()},S),z=null}"onloadend"in z?z.onloadend=k:z.onreadystatechange=function(){!z||z.readyState!==4||z.status===0&&!(z.responseURL&&z.responseURL.indexOf("file:")===0)||setTimeout(k)},z.onabort=function(){z&&(r(new Be("Request aborted",Be.ECONNABORTED,e,z)),z=null)},z.onerror=function(){r(new Be("Network Error",Be.ERR_NETWORK,e,z)),z=null},z.ontimeout=function(){let v=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const S=o.transitional||jg;o.timeoutErrorMessage&&(v=o.timeoutErrorMessage),r(new Be(v,S.clarifyTimeoutError?Be.ETIMEDOUT:Be.ECONNABORTED,e,z)),z=null},s===void 0&&i.setContentType(null),"setRequestHeader"in z&&J.forEach(i.toJSON(),function(v,S){z.setRequestHeader(S,v)}),J.isUndefined(o.withCredentials)||(z.withCredentials=!!o.withCredentials),a&&a!=="json"&&(z.responseType=o.responseType),u&&([f,h]=Za(u,!0),z.addEventListener("progress",f)),l&&z.upload&&([d,p]=Za(l),z.upload.addEventListener("progress",d),z.upload.addEventListener("loadend",p)),(o.cancelToken||o.signal)&&(m=_=>{z&&(r(!_||_.type?new Ts(null,e,z):_),z.abort(),z=null)},o.cancelToken&&o.cancelToken.subscribe(m),o.signal&&(o.signal.aborted?m():o.signal.addEventListener("abort",m)));const w=WC(o.url);if(w&&Xn.protocols.indexOf(w)===-1){r(new Be("Unsupported protocol "+w+":",Be.ERR_BAD_REQUEST,e));return}z.send(s||null)})},ew=(e,t)=>{let n=new AbortController,r;const o=function(l){if(!r){r=!0,i();const u=l instanceof Error?l:this.reason;n.abort(u instanceof Be?u:new Ts(u instanceof Error?u.message:u))}};let s=t&&setTimeout(()=>{o(new Be(`timeout ${t} of ms exceeded`,Be.ETIMEDOUT))},t);const i=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(l=>{l&&(l.removeEventListener?l.removeEventListener("abort",o):l.unsubscribe(o))}),e=null)};e.forEach(l=>l&&l.addEventListener&&l.addEventListener("abort",o));const{signal:a}=n;return a.unsubscribe=i,[a,()=>{s&&clearTimeout(s),s=null}]},tw=function*(e,t){let n=e.byteLength;if(n{const s=nw(e,t,o);let i=0,a,l=u=>{a||(a=!0,r&&r(u))};return new ReadableStream({async pull(u){try{const{done:m,value:d}=await s.next();if(m){l(),u.close();return}let f=d.byteLength;if(n){let p=i+=f;n(p)}u.enqueue(new Uint8Array(d))}catch(m){throw l(m),m}},cancel(u){return l(u),s.return()}},{highWaterMark:2})},Ml=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",Zg=Ml&&typeof ReadableStream=="function",bu=Ml&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),Yg=(e,...t)=>{try{return!!e(...t)}catch{return!1}},rw=Zg&&Yg(()=>{let e=!1;const t=new Request(Xn.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),uf=64*1024,Cu=Zg&&Yg(()=>J.isReadableStream(new Response("").body)),Ya={stream:Cu&&(e=>e.body)};Ml&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!Ya[t]&&(Ya[t]=J.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Be(`Response type '${t}' is not supported`,Be.ERR_NOT_SUPPORT,r)})})})(new Response);const ow=async e=>{if(e==null)return 0;if(J.isBlob(e))return e.size;if(J.isSpecCompliantForm(e))return(await new Request(e).arrayBuffer()).byteLength;if(J.isArrayBufferView(e)||J.isArrayBuffer(e))return e.byteLength;if(J.isURLSearchParams(e)&&(e=e+""),J.isString(e))return(await bu(e)).byteLength},sw=async(e,t)=>{const n=J.toFiniteNumber(e.getContentLength());return n??ow(t)},iw=Ml&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:m,withCredentials:d="same-origin",fetchOptions:f}=Kg(e);u=u?(u+"").toLowerCase():"text";let[p,h]=o||s||i?ew([o,s],i):[],g,z;const k=()=>{!g&&setTimeout(()=>{p&&p.unsubscribe()}),g=!0};let w;try{if(l&&rw&&n!=="get"&&n!=="head"&&(w=await sw(m,r))!==0){let C=new Request(t,{method:"POST",body:r,duplex:"half"}),L;if(J.isFormData(r)&&(L=C.headers.get("content-type"))&&m.setContentType(L),C.body){const[D,$]=sf(w,Za(af(l)));r=cf(C.body,uf,D,$,bu)}}J.isString(d)||(d=d?"include":"omit"),z=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:m.normalize().toJSON(),body:r,duplex:"half",credentials:d});let _=await fetch(z);const v=Cu&&(u==="stream"||u==="response");if(Cu&&(a||v)){const C={};["status","statusText","headers"].forEach(F=>{C[F]=_[F]});const L=J.toFiniteNumber(_.headers.get("content-length")),[D,$]=a&&sf(L,Za(af(a),!0))||[];_=new Response(cf(_.body,uf,D,()=>{$&&$(),v&&k()},bu),C)}u=u||"text";let S=await Ya[J.findKey(Ya,u)||"text"](_,e);return!v&&k(),h&&h(),await new Promise((C,L)=>{qg(C,L,{data:S,headers:fn.from(_.headers),status:_.status,statusText:_.statusText,config:e,request:z})})}catch(_){throw k(),_&&_.name==="TypeError"&&/fetch/i.test(_.message)?Object.assign(new Be("Network Error",Be.ERR_NETWORK,e,z),{cause:_.cause||_}):Be.from(_,_&&_.code,e,z)}}),wu={http:wC,xhr:QC,fetch:iw};J.forEach(wu,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const df=e=>`- ${e}`,aw=e=>J.isFunction(e)||e===null||e===!1,Xg={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : -`+s.map(df).join(` -`):" "+df(s[0]):"as no adapter specified";throw new Be("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:wu};function yc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ts(null,e)}function mf(e){return yc(e),e.headers=fn.from(e.headers),e.data=gc.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Xg.getAdapter(e.adapter||Mi.adapter)(e).then(function(r){return yc(e),r.data=gc.call(e,e.transformResponse,r),r.headers=fn.from(r.headers),r},function(r){return Wg(r)||(yc(e),r&&r.response&&(r.response.data=gc.call(e,e.transformResponse,r.response),r.response.headers=fn.from(r.response.headers))),Promise.reject(r)})}const Jg="1.7.4",Ld={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Ld[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const ff={};Ld.transitional=function(t,n,r){function o(s,i){return"[Axios v"+Jg+"] Transitional option '"+s+"'"+i+(r?". "+r:"")}return(s,i,a)=>{if(t===!1)throw new Be(o(i," has been removed"+(n?" in "+n:"")),Be.ERR_DEPRECATED);return n&&!ff[i]&&(ff[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,i,a):!0}};function lw(e,t,n){if(typeof e!="object")throw new Be("options must be an object",Be.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 a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new Be("option "+s+" must be "+l,Be.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Be("Unknown option "+s,Be.ERR_BAD_OPTION)}}const ku={assertOptions:lw,validators:Ld},Dr=ku.validators;class Ao{constructor(t){this.defaults=t,this.interceptors={request:new rf,response:new rf}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let o;Error.captureStackTrace?Error.captureStackTrace(o={}):o=new Error;const s=o.stack?o.stack.replace(/^.+\n/,""):"";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(r.stack+=` -`+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=No(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&ku.assertOptions(r,{silentJSONParsing:Dr.transitional(Dr.boolean),forcedJSONParsing:Dr.transitional(Dr.boolean),clarifyTimeoutError:Dr.transitional(Dr.boolean)},!1),o!=null&&(J.isFunction(o)?n.paramsSerializer={serialize:o}:ku.assertOptions(o,{encode:Dr.function,serialize:Dr.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=s&&J.merge(s.common,s[n.method]);s&&J.forEach(["delete","get","head","post","put","patch","common"],h=>{delete s[h]}),n.headers=fn.concat(i,s);const a=[];let l=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen=="function"&&g.runWhen(n)===!1||(l=l&&g.synchronous,a.unshift(g.fulfilled,g.rejected))});const u=[];this.interceptors.response.forEach(function(g){u.push(g.fulfilled,g.rejected)});let m,d=0,f;if(!l){const h=[mf.bind(this),void 0];for(h.unshift.apply(h,a),h.push.apply(h,u),f=h.length,m=Promise.resolve(n);d{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(a=>{r.subscribe(a),s=a}).then(o);return i.cancel=function(){r.unsubscribe(s)},i},t(function(s,i,a){r.reason||(r.reason=new Ts(s,i,a),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 Nd(function(o){t=o}),cancel:t}}}function cw(e){return function(n){return e.apply(null,n)}}function uw(e){return J.isObject(e)&&e.isAxiosError===!0}const Su={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(Su).forEach(([e,t])=>{Su[t]=e});function Qg(e){const t=new Ao(e),n=Ag(Ao.prototype.request,t);return J.extend(n,Ao.prototype,t,{allOwnKeys:!0}),J.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return Qg(No(e,o))},n}const ue=Qg(Mi);ue.Axios=Ao;ue.CanceledError=Ts;ue.CancelToken=Nd;ue.isCancel=Wg;ue.VERSION=Jg;ue.toFormData=Rl;ue.AxiosError=Be;ue.Cancel=ue.CanceledError;ue.all=function(t){return Promise.all(t)};ue.spread=cw;ue.isAxiosError=uw;ue.mergeConfig=No;ue.AxiosHeaders=fn;ue.formToJSON=e=>Bg(J.isHTMLForm(e)?new FormData(e):e);ue.getAdapter=Xg.getAdapter;ue.HttpStatusCode=Su;ue.default=ue;/*! - * shared v9.14.0 + */let Pg;const Rl=e=>Pg=e,Ig=Symbol();function Cu(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var ci;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(ci||(ci={}));function M0(){const e=wl(!0),t=e.run(()=>Ln({}));let n=[],r=[];const o=El({install(s){Rl(o),o._a=s,s.provide(Ig,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!R0?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const Lg=()=>{};function rf(e,t,n,r=Lg){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&ld()&&jh(o),o}function qo(e,...t){e.slice().forEach(n=>{n(...t)})}const F0=e=>e(),of=Symbol(),yc=Symbol();function wu(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];Cu(o)&&Cu(r)&&e.hasOwnProperty(n)&&!Ot(r)&&!Er(r)?e[n]=wu(o,r):e[n]=r}return e}const V0=Symbol();function H0(e){return!Cu(e)||!e.hasOwnProperty(V0)}const{assign:Wr}=Object;function U0(e){return!!(Ot(e)&&e.effect)}function j0(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function u(){a||(n.state.value[e]=o?o():{});const m=i_(n.state.value[e]);return Wr(m,s,Object.keys(i||{}).reduce((d,f)=>(d[f]=El(jt(()=>{Rl(n);const p=n._s.get(e);return i[f].call(p,p)})),d),{}))}return l=Ng(e,u,t,n,r,!0),l}function Ng(e,t,n={},r,o,s){let i;const a=Wr({actions:{}},n),l={deep:!0};let u,m,d=[],f=[],p;const h=r.state.value[e];!s&&!h&&(r.state.value[e]={}),Ln({});let g;function z(D){let $;u=m=!1,typeof D=="function"?(D(r.state.value[e]),$={type:ci.patchFunction,storeId:e,events:p}):(wu(r.state.value[e],D),$={type:ci.patchObject,payload:D,storeId:e,events:p});const F=g=Symbol();Uo().then(()=>{g===F&&(u=!0)}),m=!0,qo(d,$,r.state.value[e])}const k=s?function(){const{state:$}=n,F=$?$():{};this.$patch(q=>{Wr(q,F)})}:Lg;function w(){i.stop(),d=[],f=[],r._s.delete(e)}const _=(D,$="")=>{if(of in D)return D[yc]=$,D;const F=function(){Rl(r);const q=Array.from(arguments),U=[],W=[];function ne(re){U.push(re)}function me(re){W.push(re)}qo(f,{args:q,name:F[yc],store:S,after:ne,onError:me});let K;try{K=D.apply(this&&this.$id===e?this:S,q)}catch(re){throw qo(W,re),re}return K instanceof Promise?K.then(re=>(qo(U,re),re)).catch(re=>(qo(W,re),Promise.reject(re))):(qo(U,K),K)};return F[of]=!0,F[yc]=$,F},v={_p:r,$id:e,$onAction:rf.bind(null,f),$patch:z,$reset:k,$subscribe(D,$={}){const F=rf(d,D,$.detached,()=>q()),q=i.run(()=>Dn(()=>r.state.value[e],U=>{($.flush==="sync"?m:u)&&D({storeId:e,type:ci.direct,events:p},U)},Wr({},l,$)));return F},$dispose:w},S=Ts(v);r._s.set(e,S);const L=(r._a&&r._a.runWithContext||F0)(()=>r._e.run(()=>(i=wl()).run(()=>t({action:_}))));for(const D in L){const $=L[D];if(Ot($)&&!U0($)||Er($))s||(h&&H0($)&&(Ot($)?$.value=h[D]:wu($,h[D])),r.state.value[e][D]=$);else if(typeof $=="function"){const F=_($,D);L[D]=F,a.actions[D]=$}}return Wr(S,L),Wr(Xe(S),L),Object.defineProperty(S,"$state",{get:()=>r.state.value[e],set:D=>{z($=>{Wr($,D)})}}),r._p.forEach(D=>{Wr(S,i.run(()=>D({store:S,app:r._a,pinia:r,options:a})))}),h&&s&&n.hydrate&&n.hydrate(S.$state,h),u=!0,m=!0,S}function jn(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(a,l){const u=E_();return a=a||(u?Nn(Ig,null):null),a&&Rl(a),a=Pg,a._s.has(r)||(s?Ng(r,t,o,a):j0(r,o,a)),a._s.get(r)}return i.$id=r,i}const Nd=jn("RemotesStore",{state:()=>({pairing:{}})});function Dg(e,t){return function(){return e.apply(t,arguments)}}const{toString:B0}=Object.prototype,{getPrototypeOf:Dd}=Object,Ml=(e=>t=>{const n=B0.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),or=e=>(e=e.toLowerCase(),t=>Ml(t)===e),Fl=e=>t=>typeof t===e,{isArray:Os}=Array,xi=Fl("undefined");function W0(e){return e!==null&&!xi(e)&&e.constructor!==null&&!xi(e.constructor)&&Sn(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Rg=or("ArrayBuffer");function q0(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Rg(e.buffer),t}const G0=Fl("string"),Sn=Fl("function"),Mg=Fl("number"),Vl=e=>e!==null&&typeof e=="object",K0=e=>e===!0||e===!1,Aa=e=>{if(Ml(e)!=="object")return!1;const t=Dd(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},Z0=or("Date"),Y0=or("File"),X0=or("Blob"),J0=or("FileList"),Q0=e=>Vl(e)&&Sn(e.pipe),eC=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Sn(e.append)&&((t=Ml(e))==="formdata"||t==="object"&&Sn(e.toString)&&e.toString()==="[object FormData]"))},tC=or("URLSearchParams"),[nC,rC,oC,sC]=["ReadableStream","Request","Response","Headers"].map(or),iC=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Hi(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),Os(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const xo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Vg=e=>!xi(e)&&e!==xo;function ku(){const{caseless:e}=Vg(this)&&this||{},t={},n=(r,o)=>{const s=e&&Fg(t,o)||o;Aa(t[s])&&Aa(r)?t[s]=ku(t[s],r):Aa(r)?t[s]=ku({},r):Os(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(Hi(t,(o,s)=>{n&&Sn(o)?e[s]=Dg(o,n):e[s]=o},{allOwnKeys:r}),e),lC=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),cC=(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)},uC=(e,t,n,r)=>{let o,s,i;const a={};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))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&Dd(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},dC=(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},mC=e=>{if(!e)return null;if(Os(e))return e;let t=e.length;if(!Mg(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},fC=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Dd(Uint8Array)),pC=(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])}},hC=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},_C=or("HTMLFormElement"),gC=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),sf=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),yC=or("RegExp"),Hg=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Hi(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},zC=e=>{Hg(e,(t,n)=>{if(Sn(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(Sn(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+"'")})}})},vC=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return Os(e)?r(e):r(String(e).split(t)),n},bC=()=>{},CC=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,zc="abcdefghijklmnopqrstuvwxyz",af="0123456789",Ug={DIGIT:af,ALPHA:zc,ALPHA_DIGIT:zc+zc.toUpperCase()+af},wC=(e=16,t=Ug.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function kC(e){return!!(e&&Sn(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const SC=e=>{const t=new Array(10),n=(r,o)=>{if(Vl(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=Os(r)?[]:{};return Hi(r,(i,a)=>{const l=n(i,o+1);!xi(l)&&(s[a]=l)}),t[o]=void 0,s}}return r};return n(e,0)},xC=or("AsyncFunction"),EC=e=>e&&(Vl(e)||Sn(e))&&Sn(e.then)&&Sn(e.catch),jg=((e,t)=>e?setImmediate:t?((n,r)=>(xo.addEventListener("message",({source:o,data:s})=>{o===xo&&s===n&&r.length&&r.shift()()},!1),o=>{r.push(o),xo.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",Sn(xo.postMessage)),$C=typeof queueMicrotask<"u"?queueMicrotask.bind(xo):typeof process<"u"&&process.nextTick||jg,J={isArray:Os,isArrayBuffer:Rg,isBuffer:W0,isFormData:eC,isArrayBufferView:q0,isString:G0,isNumber:Mg,isBoolean:K0,isObject:Vl,isPlainObject:Aa,isReadableStream:nC,isRequest:rC,isResponse:oC,isHeaders:sC,isUndefined:xi,isDate:Z0,isFile:Y0,isBlob:X0,isRegExp:yC,isFunction:Sn,isStream:Q0,isURLSearchParams:tC,isTypedArray:fC,isFileList:J0,forEach:Hi,merge:ku,extend:aC,trim:iC,stripBOM:lC,inherits:cC,toFlatObject:uC,kindOf:Ml,kindOfTest:or,endsWith:dC,toArray:mC,forEachEntry:pC,matchAll:hC,isHTMLForm:_C,hasOwnProperty:sf,hasOwnProp:sf,reduceDescriptors:Hg,freezeMethods:zC,toObjectSet:vC,toCamelCase:gC,noop:bC,toFiniteNumber:CC,findKey:Fg,global:xo,isContextDefined:Vg,ALPHABET:Ug,generateString:wC,isSpecCompliantForm:kC,toJSONObject:SC,isAsyncFn:xC,isThenable:EC,setImmediate:jg,asap:$C};function Be(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)}J.inherits(Be,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:J.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Bg=Be.prototype,Wg={};["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=>{Wg[e]={value:e}});Object.defineProperties(Be,Wg);Object.defineProperty(Bg,"isAxiosError",{value:!0});Be.from=(e,t,n,r,o,s)=>{const i=Object.create(Bg);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),Be.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const TC=null;function Su(e){return J.isPlainObject(e)||J.isArray(e)}function qg(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function lf(e,t,n){return e?e.concat(t).map(function(o,s){return o=qg(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function AC(e){return J.isArray(e)&&!e.some(Su)}const OC=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function Hl(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,z){return!J.isUndefined(z[g])});const r=n.metaTokens,o=n.visitor||m,s=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(o))throw new TypeError("visitor must be a function");function u(h){if(h===null)return"";if(J.isDate(h))return h.toISOString();if(!l&&J.isBlob(h))throw new Be("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(h)||J.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function m(h,g,z){let k=h;if(h&&!z&&typeof h=="object"){if(J.endsWith(g,"{}"))g=r?g:g.slice(0,-2),h=JSON.stringify(h);else if(J.isArray(h)&&AC(h)||(J.isFileList(h)||J.endsWith(g,"[]"))&&(k=J.toArray(h)))return g=qg(g),k.forEach(function(_,v){!(J.isUndefined(_)||_===null)&&t.append(i===!0?lf([g],v,s):i===null?g:g+"[]",u(_))}),!1}return Su(h)?!0:(t.append(lf(z,g,s),u(h)),!1)}const d=[],f=Object.assign(OC,{defaultVisitor:m,convertValue:u,isVisitable:Su});function p(h,g){if(!J.isUndefined(h)){if(d.indexOf(h)!==-1)throw Error("Circular reference detected in "+g.join("."));d.push(h),J.forEach(h,function(k,w){(!(J.isUndefined(k)||k===null)&&o.call(t,k,J.isString(w)?w.trim():w,g,f))===!0&&p(k,g?g.concat(w):[w])}),d.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return p(e),t}function cf(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Rd(e,t){this._pairs=[],e&&Hl(e,this,t)}const Gg=Rd.prototype;Gg.append=function(t,n){this._pairs.push([t,n])};Gg.toString=function(t){const n=t?function(r){return t.call(this,r,cf)}:cf;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function PC(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Kg(e,t,n){if(!t)return e;const r=n&&n.encode||PC,o=n&&n.serialize;let s;if(o?s=o(t,n):s=J.isURLSearchParams(t)?t.toString():new Rd(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class uf{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){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const Zg={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},IC=typeof URLSearchParams<"u"?URLSearchParams:Rd,LC=typeof FormData<"u"?FormData:null,NC=typeof Blob<"u"?Blob:null,DC={isBrowser:!0,classes:{URLSearchParams:IC,FormData:LC,Blob:NC},protocols:["http","https","file","blob","url","data"]},Md=typeof window<"u"&&typeof document<"u",RC=(e=>Md&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),MC=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",FC=Md&&window.location.href||"http://localhost",VC=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Md,hasStandardBrowserEnv:RC,hasStandardBrowserWebWorkerEnv:MC,origin:FC},Symbol.toStringTag,{value:"Module"})),Qn={...VC,...DC};function HC(e,t){return Hl(e,new Qn.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return Qn.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function UC(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function jC(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&J.isArray(o)?o.length:i,l?(J.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!a):((!o[i]||!J.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&J.isArray(o[i])&&(o[i]=jC(o[i])),!a)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,o)=>{t(UC(r),o,n,0)}),n}return null}function BC(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(0,JSON.stringify)(e)}const Ui={transitional:Zg,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=J.isObject(t);if(s&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return o?JSON.stringify(Yg(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t)||J.isReadableStream(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return HC(t,this.formSerializer).toString();if((a=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Hl(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),BC(t)):t}],transformResponse:[function(t){const n=this.transitional||Ui.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(J.isResponse(t)||J.isReadableStream(t))return t;if(t&&J.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?Be.from(a,Be.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Qn.classes.FormData,Blob:Qn.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{Ui.headers[e]={}});const WC=J.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"]),qC=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]&&WC[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},df=Symbol("internals");function Vs(e){return e&&String(e).trim().toLowerCase()}function Oa(e){return e===!1||e==null?e:J.isArray(e)?e.map(Oa):String(e)}function GC(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 KC=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function vc(e,t,n,r,o){if(J.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!J.isString(t)){if(J.isString(r))return t.indexOf(r)!==-1;if(J.isRegExp(r))return r.test(t)}}function ZC(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function YC(e,t){const n=J.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 pn{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(a,l,u){const m=Vs(l);if(!m)throw new Error("header name must be a non-empty string");const d=J.findKey(o,m);(!d||o[d]===void 0||u===!0||u===void 0&&o[d]!==!1)&&(o[d||l]=Oa(a))}const i=(a,l)=>J.forEach(a,(u,m)=>s(u,m,l));if(J.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(J.isString(t)&&(t=t.trim())&&!KC(t))i(qC(t),n);else if(J.isHeaders(t))for(const[a,l]of t.entries())s(l,a,r);else t!=null&&s(n,t,r);return this}get(t,n){if(t=Vs(t),t){const r=J.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return GC(o);if(J.isFunction(n))return n.call(this,o,r);if(J.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Vs(t),t){const r=J.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||vc(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(i){if(i=Vs(i),i){const a=J.findKey(r,i);a&&(!n||vc(r,r[a],a,n))&&(delete r[a],o=!0)}}return J.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||vc(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return J.forEach(this,(o,s)=>{const i=J.findKey(r,s);if(i){n[i]=Oa(o),delete n[s];return}const a=t?ZC(s):String(s).trim();a!==s&&delete n[s],n[a]=Oa(o),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return J.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&J.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[df]=this[df]={accessors:{}}).accessors,o=this.prototype;function s(i){const a=Vs(i);r[a]||(YC(o,i),r[a]=!0)}return J.isArray(t)?t.forEach(s):s(t),this}}pn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(pn.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(pn);function bc(e,t){const n=this||Ui,r=t||n,o=pn.from(r.headers);let s=r.data;return J.forEach(e,function(a){s=a.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function Xg(e){return!!(e&&e.__CANCEL__)}function Ps(e,t,n){Be.call(this,e??"canceled",Be.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(Ps,Be,{__CANCEL__:!0});function Jg(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Be("Request failed with status code "+n.status,[Be.ERR_BAD_REQUEST,Be.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function XC(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function JC(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(l){const u=Date.now(),m=r[s];i||(i=u),n[o]=l,r[o]=u;let d=s,f=0;for(;d!==o;)f+=n[d++],d=d%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),u-i{n=m,o=null,s&&(clearTimeout(s),s=null),e.apply(null,u)};return[(...u)=>{const m=Date.now(),d=m-n;d>=r?i(u,m):(o=u,s||(s=setTimeout(()=>{s=null,i(o)},r-d)))},()=>o&&i(o)]}const el=(e,t,n=3)=>{let r=0;const o=JC(50,250);return QC(s=>{const i=s.loaded,a=s.lengthComputable?s.total:void 0,l=i-r,u=o(l),m=i<=a;r=i;const d={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:u||void 0,estimated:u&&a&&m?(a-i)/u:void 0,event:s,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(d)},n)},mf=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},ff=e=>(...t)=>J.asap(()=>e(...t)),ew=Qn.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 a=J.isString(i)?o(i):i;return a.protocol===r.protocol&&a.host===r.host}}():function(){return function(){return!0}}(),tw=Qn.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.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 nw(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function rw(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function Qg(e,t){return e&&!nw(t)?rw(e,t):t}const pf=e=>e instanceof pn?{...e}:e;function Mo(e,t){t=t||{};const n={};function r(u,m,d){return J.isPlainObject(u)&&J.isPlainObject(m)?J.merge.call({caseless:d},u,m):J.isPlainObject(m)?J.merge({},m):J.isArray(m)?m.slice():m}function o(u,m,d){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u,d)}else return r(u,m,d)}function s(u,m){if(!J.isUndefined(m))return r(void 0,m)}function i(u,m){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u)}else return r(void 0,m)}function a(u,m,d){if(d in t)return r(u,m);if(d in e)return r(void 0,u)}const l={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:a,headers:(u,m)=>o(pf(u),pf(m),!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(m){const d=l[m]||o,f=d(e[m],t[m],m);J.isUndefined(f)&&d!==a||(n[m]=f)}),n}const ey=e=>{const t=Mo({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=t;t.headers=i=pn.from(i),t.url=Kg(Qg(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(J.isFormData(n)){if(Qn.hasStandardBrowserEnv||Qn.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[u,...m]=l?l.split(";").map(d=>d.trim()).filter(Boolean):[];i.setContentType([u||"multipart/form-data",...m].join("; "))}}if(Qn.hasStandardBrowserEnv&&(r&&J.isFunction(r)&&(r=r(t)),r||r!==!1&&ew(t.url))){const u=o&&s&&tw.read(s);u&&i.set(o,u)}return t},ow=typeof XMLHttpRequest<"u",sw=ow&&function(e){return new Promise(function(n,r){const o=ey(e);let s=o.data;const i=pn.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:u}=o,m,d,f,p,h;function g(){p&&p(),h&&h(),o.cancelToken&&o.cancelToken.unsubscribe(m),o.signal&&o.signal.removeEventListener("abort",m)}let z=new XMLHttpRequest;z.open(o.method.toUpperCase(),o.url,!0),z.timeout=o.timeout;function k(){if(!z)return;const _=pn.from("getAllResponseHeaders"in z&&z.getAllResponseHeaders()),S={data:!a||a==="text"||a==="json"?z.responseText:z.response,status:z.status,statusText:z.statusText,headers:_,config:e,request:z};Jg(function(L){n(L),g()},function(L){r(L),g()},S),z=null}"onloadend"in z?z.onloadend=k:z.onreadystatechange=function(){!z||z.readyState!==4||z.status===0&&!(z.responseURL&&z.responseURL.indexOf("file:")===0)||setTimeout(k)},z.onabort=function(){z&&(r(new Be("Request aborted",Be.ECONNABORTED,e,z)),z=null)},z.onerror=function(){r(new Be("Network Error",Be.ERR_NETWORK,e,z)),z=null},z.ontimeout=function(){let v=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const S=o.transitional||Zg;o.timeoutErrorMessage&&(v=o.timeoutErrorMessage),r(new Be(v,S.clarifyTimeoutError?Be.ETIMEDOUT:Be.ECONNABORTED,e,z)),z=null},s===void 0&&i.setContentType(null),"setRequestHeader"in z&&J.forEach(i.toJSON(),function(v,S){z.setRequestHeader(S,v)}),J.isUndefined(o.withCredentials)||(z.withCredentials=!!o.withCredentials),a&&a!=="json"&&(z.responseType=o.responseType),u&&([f,h]=el(u,!0),z.addEventListener("progress",f)),l&&z.upload&&([d,p]=el(l),z.upload.addEventListener("progress",d),z.upload.addEventListener("loadend",p)),(o.cancelToken||o.signal)&&(m=_=>{z&&(r(!_||_.type?new Ps(null,e,z):_),z.abort(),z=null)},o.cancelToken&&o.cancelToken.subscribe(m),o.signal&&(o.signal.aborted?m():o.signal.addEventListener("abort",m)));const w=XC(o.url);if(w&&Qn.protocols.indexOf(w)===-1){r(new Be("Unsupported protocol "+w+":",Be.ERR_BAD_REQUEST,e));return}z.send(s||null)})},iw=(e,t)=>{let n=new AbortController,r;const o=function(l){if(!r){r=!0,i();const u=l instanceof Error?l:this.reason;n.abort(u instanceof Be?u:new Ps(u instanceof Error?u.message:u))}};let s=t&&setTimeout(()=>{o(new Be(`timeout ${t} of ms exceeded`,Be.ETIMEDOUT))},t);const i=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(l=>{l&&(l.removeEventListener?l.removeEventListener("abort",o):l.unsubscribe(o))}),e=null)};e.forEach(l=>l&&l.addEventListener&&l.addEventListener("abort",o));const{signal:a}=n;return a.unsubscribe=i,[a,()=>{s&&clearTimeout(s),s=null}]},aw=function*(e,t){let n=e.byteLength;if(n{const s=lw(e,t,o);let i=0,a,l=u=>{a||(a=!0,r&&r(u))};return new ReadableStream({async pull(u){try{const{done:m,value:d}=await s.next();if(m){l(),u.close();return}let f=d.byteLength;if(n){let p=i+=f;n(p)}u.enqueue(new Uint8Array(d))}catch(m){throw l(m),m}},cancel(u){return l(u),s.return()}},{highWaterMark:2})},Ul=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",ty=Ul&&typeof ReadableStream=="function",xu=Ul&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),ny=(e,...t)=>{try{return!!e(...t)}catch{return!1}},cw=ty&&ny(()=>{let e=!1;const t=new Request(Qn.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),_f=64*1024,Eu=ty&&ny(()=>J.isReadableStream(new Response("").body)),tl={stream:Eu&&(e=>e.body)};Ul&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!tl[t]&&(tl[t]=J.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Be(`Response type '${t}' is not supported`,Be.ERR_NOT_SUPPORT,r)})})})(new Response);const uw=async e=>{if(e==null)return 0;if(J.isBlob(e))return e.size;if(J.isSpecCompliantForm(e))return(await new Request(e).arrayBuffer()).byteLength;if(J.isArrayBufferView(e)||J.isArrayBuffer(e))return e.byteLength;if(J.isURLSearchParams(e)&&(e=e+""),J.isString(e))return(await xu(e)).byteLength},dw=async(e,t)=>{const n=J.toFiniteNumber(e.getContentLength());return n??uw(t)},mw=Ul&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:m,withCredentials:d="same-origin",fetchOptions:f}=ey(e);u=u?(u+"").toLowerCase():"text";let[p,h]=o||s||i?iw([o,s],i):[],g,z;const k=()=>{!g&&setTimeout(()=>{p&&p.unsubscribe()}),g=!0};let w;try{if(l&&cw&&n!=="get"&&n!=="head"&&(w=await dw(m,r))!==0){let C=new Request(t,{method:"POST",body:r,duplex:"half"}),L;if(J.isFormData(r)&&(L=C.headers.get("content-type"))&&m.setContentType(L),C.body){const[D,$]=mf(w,el(ff(l)));r=hf(C.body,_f,D,$,xu)}}J.isString(d)||(d=d?"include":"omit"),z=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:m.normalize().toJSON(),body:r,duplex:"half",credentials:d});let _=await fetch(z);const v=Eu&&(u==="stream"||u==="response");if(Eu&&(a||v)){const C={};["status","statusText","headers"].forEach(F=>{C[F]=_[F]});const L=J.toFiniteNumber(_.headers.get("content-length")),[D,$]=a&&mf(L,el(ff(a),!0))||[];_=new Response(hf(_.body,_f,D,()=>{$&&$(),v&&k()},xu),C)}u=u||"text";let S=await tl[J.findKey(tl,u)||"text"](_,e);return!v&&k(),h&&h(),await new Promise((C,L)=>{Jg(C,L,{data:S,headers:pn.from(_.headers),status:_.status,statusText:_.statusText,config:e,request:z})})}catch(_){throw k(),_&&_.name==="TypeError"&&/fetch/i.test(_.message)?Object.assign(new Be("Network Error",Be.ERR_NETWORK,e,z),{cause:_.cause||_}):Be.from(_,_&&_.code,e,z)}}),$u={http:TC,xhr:sw,fetch:mw};J.forEach($u,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const gf=e=>`- ${e}`,fw=e=>J.isFunction(e)||e===null||e===!1,ry={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : +`+s.map(gf).join(` +`):" "+gf(s[0]):"as no adapter specified";throw new Be("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:$u};function Cc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ps(null,e)}function yf(e){return Cc(e),e.headers=pn.from(e.headers),e.data=bc.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),ry.getAdapter(e.adapter||Ui.adapter)(e).then(function(r){return Cc(e),r.data=bc.call(e,e.transformResponse,r),r.headers=pn.from(r.headers),r},function(r){return Xg(r)||(Cc(e),r&&r.response&&(r.response.data=bc.call(e,e.transformResponse,r.response),r.response.headers=pn.from(r.response.headers))),Promise.reject(r)})}const oy="1.7.4",Fd={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Fd[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const zf={};Fd.transitional=function(t,n,r){function o(s,i){return"[Axios v"+oy+"] Transitional option '"+s+"'"+i+(r?". "+r:"")}return(s,i,a)=>{if(t===!1)throw new Be(o(i," has been removed"+(n?" in "+n:"")),Be.ERR_DEPRECATED);return n&&!zf[i]&&(zf[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,i,a):!0}};function pw(e,t,n){if(typeof e!="object")throw new Be("options must be an object",Be.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 a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new Be("option "+s+" must be "+l,Be.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Be("Unknown option "+s,Be.ERR_BAD_OPTION)}}const Tu={assertOptions:pw,validators:Fd},Mr=Tu.validators;class Io{constructor(t){this.defaults=t,this.interceptors={request:new uf,response:new uf}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let o;Error.captureStackTrace?Error.captureStackTrace(o={}):o=new Error;const s=o.stack?o.stack.replace(/^.+\n/,""):"";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(r.stack+=` +`+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Mo(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&Tu.assertOptions(r,{silentJSONParsing:Mr.transitional(Mr.boolean),forcedJSONParsing:Mr.transitional(Mr.boolean),clarifyTimeoutError:Mr.transitional(Mr.boolean)},!1),o!=null&&(J.isFunction(o)?n.paramsSerializer={serialize:o}:Tu.assertOptions(o,{encode:Mr.function,serialize:Mr.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=s&&J.merge(s.common,s[n.method]);s&&J.forEach(["delete","get","head","post","put","patch","common"],h=>{delete s[h]}),n.headers=pn.concat(i,s);const a=[];let l=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen=="function"&&g.runWhen(n)===!1||(l=l&&g.synchronous,a.unshift(g.fulfilled,g.rejected))});const u=[];this.interceptors.response.forEach(function(g){u.push(g.fulfilled,g.rejected)});let m,d=0,f;if(!l){const h=[yf.bind(this),void 0];for(h.unshift.apply(h,a),h.push.apply(h,u),f=h.length,m=Promise.resolve(n);d{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(a=>{r.subscribe(a),s=a}).then(o);return i.cancel=function(){r.unsubscribe(s)},i},t(function(s,i,a){r.reason||(r.reason=new Ps(s,i,a),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 Vd(function(o){t=o}),cancel:t}}}function hw(e){return function(n){return e.apply(null,n)}}function _w(e){return J.isObject(e)&&e.isAxiosError===!0}const Au={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(Au).forEach(([e,t])=>{Au[t]=e});function sy(e){const t=new Io(e),n=Dg(Io.prototype.request,t);return J.extend(n,Io.prototype,t,{allOwnKeys:!0}),J.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return sy(Mo(e,o))},n}const ue=sy(Ui);ue.Axios=Io;ue.CanceledError=Ps;ue.CancelToken=Vd;ue.isCancel=Xg;ue.VERSION=oy;ue.toFormData=Hl;ue.AxiosError=Be;ue.Cancel=ue.CanceledError;ue.all=function(t){return Promise.all(t)};ue.spread=hw;ue.isAxiosError=_w;ue.mergeConfig=Mo;ue.AxiosHeaders=pn;ue.formToJSON=e=>Yg(J.isHTMLForm(e)?new FormData(e):e);ue.getAdapter=ry.getAdapter;ue.HttpStatusCode=Au;ue.default=ue;/*! + * shared v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */const Xa=typeof window<"u",uo=(e,t=!1)=>t?Symbol.for(e):Symbol(e),dw=(e,t,n)=>mw({l:e,k:t,s:n}),mw=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Ut=e=>typeof e=="number"&&isFinite(e),fw=e=>ty(e)==="[object Date]",Ja=e=>ty(e)==="[object RegExp]",Fl=e=>Je(e)&&Object.keys(e).length===0,Xt=Object.assign;let pf;const Dd=()=>pf||(pf=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function hf(e){return e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const pw=Object.prototype.hasOwnProperty;function Qa(e,t){return pw.call(e,t)}const Ft=Array.isArray,Tt=e=>typeof e=="function",Ce=e=>typeof e=="string",Ct=e=>typeof e=="boolean",ct=e=>e!==null&&typeof e=="object",hw=e=>ct(e)&&Tt(e.then)&&Tt(e.catch),ey=Object.prototype.toString,ty=e=>ey.call(e),Je=e=>{if(!ct(e))return!1;const t=Object.getPrototypeOf(e);return t===null||t.constructor===Object},_w=e=>e==null?"":Ft(e)||Je(e)&&e.toString===ey?JSON.stringify(e,null,2):String(e);function gw(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}function Vl(e){let t=e;return()=>++t}function yw(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const sa=e=>!ct(e)||Ft(e);function Ea(e,t){if(sa(e)||sa(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:r,des:o}=n.pop();Object.keys(r).forEach(s=>{sa(r[s])||sa(o[s])?o[s]=r[s]:n.push({src:r[s],des:o[s]})})}}/*! - * message-compiler v9.14.0 + */const nl=typeof window<"u",fo=(e,t=!1)=>t?Symbol.for(e):Symbol(e),gw=(e,t,n)=>yw({l:e,k:t,s:n}),yw=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Nt=e=>typeof e=="number"&&isFinite(e),zw=e=>ay(e)==="[object Date]",rl=e=>ay(e)==="[object RegExp]",jl=e=>Je(e)&&Object.keys(e).length===0,Jt=Object.assign,vw=Object.create,mt=(e=null)=>vw(e);let vf;const Hd=()=>vf||(vf=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:mt());function bf(e){return e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const bw=Object.prototype.hasOwnProperty;function Xn(e,t){return bw.call(e,t)}const Ht=Array.isArray,At=e=>typeof e=="function",Ce=e=>typeof e=="string",wt=e=>typeof e=="boolean",rt=e=>e!==null&&typeof e=="object",Cw=e=>rt(e)&&At(e.then)&&At(e.catch),iy=Object.prototype.toString,ay=e=>iy.call(e),Je=e=>{if(!rt(e))return!1;const t=Object.getPrototypeOf(e);return t===null||t.constructor===Object},ww=e=>e==null?"":Ht(e)||Je(e)&&e.toString===iy?JSON.stringify(e,null,2):String(e);function kw(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}function Bl(e){let t=e;return()=>++t}function Sw(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const ca=e=>!rt(e)||Ht(e);function Pa(e,t){if(ca(e)||ca(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:r,des:o}=n.pop();Object.keys(r).forEach(s=>{s!=="__proto__"&&(rt(r[s])&&!rt(o[s])&&(o[s]=Array.isArray(r[s])?[]:mt()),ca(o[s])||ca(r[s])?o[s]=r[s]:n.push({src:r[s],des:o[s]}))})}}/*! + * message-compiler v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */function zw(e,t,n){return{line:e,column:t,offset:n}}function el(e,t,n){return{start:e,end:t}}const vw=/\{([0-9a-zA-Z]+)\}/g;function ny(e,...t){return t.length===1&&bw(t[0])&&(t=t[0]),(!t||!t.hasOwnProperty)&&(t={}),e.replace(vw,(n,r)=>t.hasOwnProperty(r)?t[r]:"")}const ry=Object.assign,_f=e=>typeof e=="string",bw=e=>e!==null&&typeof e=="object";function oy(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}const Rd={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},Cw={[Rd.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};function ww(e,t,...n){const r=ny(Cw[e],...n||[]),o={message:String(r),code:e};return t&&(o.location=t),o}const Le={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},kw={[Le.EXPECTED_TOKEN]:"Expected token: '{0}'",[Le.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[Le.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[Le.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[Le.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[Le.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[Le.EMPTY_PLACEHOLDER]:"Empty placeholder",[Le.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[Le.INVALID_LINKED_FORMAT]:"Invalid linked format",[Le.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[Le.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[Le.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[Le.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[Le.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[Le.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function As(e,t,n={}){const{domain:r,messages:o,args:s}=n,i=ny((o||kw)[e]||"",...s||[]),a=new SyntaxError(String(i));return a.code=e,t&&(a.location=t),a.domain=r,a}function Sw(e){throw e}const gr=" ",xw="\r",en=` -`,Ew="\u2028",$w="\u2029";function Tw(e){const t=e;let n=0,r=1,o=1,s=0;const i=L=>t[L]===xw&&t[L+1]===en,a=L=>t[L]===en,l=L=>t[L]===$w,u=L=>t[L]===Ew,m=L=>i(L)||a(L)||l(L)||u(L),d=()=>n,f=()=>r,p=()=>o,h=()=>s,g=L=>i(L)||l(L)||u(L)?en:t[L],z=()=>g(n),k=()=>g(n+s);function w(){return s=0,m(n)&&(r++,o=0),i(n)&&n++,n++,o++,t[n]}function _(){return i(n+s)&&s++,s++,t[n+s]}function v(){n=0,r=1,o=1,s=0}function S(L=0){s=L}function C(){const L=n+s;for(;L!==n;)w();s=0}return{index:d,line:f,column:p,peekOffset:h,charAt:g,currentChar:z,currentPeek:k,next:w,peek:_,reset:v,resetPeek:S,skipToPeek:C}}const Rr=void 0,Aw=".",gf="'",Ow="tokenizer";function Pw(e,t={}){const n=t.location!==!1,r=Tw(e),o=()=>r.index(),s=()=>zw(r.line(),r.column(),r.index()),i=s(),a=o(),l={currentType:14,offset:a,startLoc:i,endLoc:i,lastType:14,lastOffset:a,lastStartLoc:i,lastEndLoc:i,braceNest:0,inLinked:!1,text:""},u=()=>l,{onError:m}=t;function d(E,T,R,...Q){const de=u();if(T.column+=R,T.offset+=R,m){const se=n?el(de.startLoc,T):null,H=As(E,se,{domain:Ow,args:Q});m(H)}}function f(E,T,R){E.endLoc=s(),E.currentType=T;const Q={type:T};return n&&(Q.loc=el(E.startLoc,E.endLoc)),R!=null&&(Q.value=R),Q}const p=E=>f(E,14);function h(E,T){return E.currentChar()===T?(E.next(),T):(d(Le.EXPECTED_TOKEN,s(),0,T),"")}function g(E){let T="";for(;E.currentPeek()===gr||E.currentPeek()===en;)T+=E.currentPeek(),E.peek();return T}function z(E){const T=g(E);return E.skipToPeek(),T}function k(E){if(E===Rr)return!1;const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T===95}function w(E){if(E===Rr)return!1;const T=E.charCodeAt(0);return T>=48&&T<=57}function _(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=k(E.currentPeek());return E.resetPeek(),Q}function v(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=E.currentPeek()==="-"?E.peek():E.currentPeek(),de=w(Q);return E.resetPeek(),de}function S(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=E.currentPeek()===gf;return E.resetPeek(),Q}function C(E,T){const{currentType:R}=T;if(R!==8)return!1;g(E);const Q=E.currentPeek()===".";return E.resetPeek(),Q}function L(E,T){const{currentType:R}=T;if(R!==9)return!1;g(E);const Q=k(E.currentPeek());return E.resetPeek(),Q}function D(E,T){const{currentType:R}=T;if(!(R===8||R===12))return!1;g(E);const Q=E.currentPeek()===":";return E.resetPeek(),Q}function $(E,T){const{currentType:R}=T;if(R!==10)return!1;const Q=()=>{const se=E.currentPeek();return se==="{"?k(E.peek()):se==="@"||se==="%"||se==="|"||se===":"||se==="."||se===gr||!se?!1:se===en?(E.peek(),Q()):U(E,!1)},de=Q();return E.resetPeek(),de}function F(E){g(E);const T=E.currentPeek()==="|";return E.resetPeek(),T}function q(E){const T=g(E),R=E.currentPeek()==="%"&&E.peek()==="{";return E.resetPeek(),{isModulo:R,hasSpace:T.length>0}}function U(E,T=!0){const R=(de=!1,se="",H=!1)=>{const Z=E.currentPeek();return Z==="{"?se==="%"?!1:de:Z==="@"||!Z?se==="%"?!0:de:Z==="%"?(E.peek(),R(de,"%",!0)):Z==="|"?se==="%"||H?!0:!(se===gr||se===en):Z===gr?(E.peek(),R(!0,gr,H)):Z===en?(E.peek(),R(!0,en,H)):!0},Q=R();return T&&E.resetPeek(),Q}function W(E,T){const R=E.currentChar();return R===Rr?Rr:T(R)?(E.next(),R):null}function ne(E){const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===95||T===36}function me(E){return W(E,ne)}function K(E){const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===95||T===36||T===45}function re(E){return W(E,K)}function ce(E){const T=E.charCodeAt(0);return T>=48&&T<=57}function Ne(E){return W(E,ce)}function st(E){const T=E.charCodeAt(0);return T>=48&&T<=57||T>=65&&T<=70||T>=97&&T<=102}function Ve(E){return W(E,st)}function He(E){let T="",R="";for(;T=Ne(E);)R+=T;return R}function it(E){z(E);const T=E.currentChar();return T!=="%"&&d(Le.EXPECTED_TOKEN,s(),0,T),E.next(),"%"}function at(E){let T="";for(;;){const R=E.currentChar();if(R==="{"||R==="}"||R==="@"||R==="|"||!R)break;if(R==="%")if(U(E))T+=R,E.next();else break;else if(R===gr||R===en)if(U(E))T+=R,E.next();else{if(F(E))break;T+=R,E.next()}else T+=R,E.next()}return T}function ut(E){z(E);let T="",R="";for(;T=re(E);)R+=T;return E.currentChar()===Rr&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R}function We(E){z(E);let T="";return E.currentChar()==="-"?(E.next(),T+=`-${He(E)}`):T+=He(E),E.currentChar()===Rr&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),T}function Y(E){return E!==gf&&E!==en}function fe(E){z(E),h(E,"'");let T="",R="";for(;T=W(E,Y);)T==="\\"?R+=le(E):R+=T;const Q=E.currentChar();return Q===en||Q===Rr?(d(Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,s(),0),Q===en&&(E.next(),h(E,"'")),R):(h(E,"'"),R)}function le(E){const T=E.currentChar();switch(T){case"\\":case"'":return E.next(),`\\${T}`;case"u":return ge(E,T,4);case"U":return ge(E,T,6);default:return d(Le.UNKNOWN_ESCAPE_SEQUENCE,s(),0,T),""}}function ge(E,T,R){h(E,T);let Q="";for(let de=0;de{const Q=E.currentChar();return Q==="{"||Q==="%"||Q==="@"||Q==="|"||Q==="("||Q===")"||!Q||Q===gr?R:(R+=Q,E.next(),T(R))};return T("")}function j(E){z(E);const T=h(E,"|");return z(E),T}function te(E,T){let R=null;switch(E.currentChar()){case"{":return T.braceNest>=1&&d(Le.NOT_ALLOW_NEST_PLACEHOLDER,s(),0),E.next(),R=f(T,2,"{"),z(E),T.braceNest++,R;case"}":return T.braceNest>0&&T.currentType===2&&d(Le.EMPTY_PLACEHOLDER,s(),0),E.next(),R=f(T,3,"}"),T.braceNest--,T.braceNest>0&&z(E),T.inLinked&&T.braceNest===0&&(T.inLinked=!1),R;case"@":return T.braceNest>0&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=X(E,T)||p(T),T.braceNest=0,R;default:{let de=!0,se=!0,H=!0;if(F(E))return T.braceNest>0&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,R;if(T.braceNest>0&&(T.currentType===5||T.currentType===6||T.currentType===7))return d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),T.braceNest=0,ie(E,T);if(de=_(E,T))return R=f(T,5,ut(E)),z(E),R;if(se=v(E,T))return R=f(T,6,We(E)),z(E),R;if(H=S(E,T))return R=f(T,7,fe(E)),z(E),R;if(!de&&!se&&!H)return R=f(T,13,Ge(E)),d(Le.INVALID_TOKEN_IN_PLACEHOLDER,s(),0,R.value),z(E),R;break}}return R}function X(E,T){const{currentType:R}=T;let Q=null;const de=E.currentChar();switch((R===8||R===9||R===12||R===10)&&(de===en||de===gr)&&d(Le.INVALID_LINKED_FORMAT,s(),0),de){case"@":return E.next(),Q=f(T,8,"@"),T.inLinked=!0,Q;case".":return z(E),E.next(),f(T,9,".");case":":return z(E),E.next(),f(T,10,":");default:return F(E)?(Q=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,Q):C(E,T)||D(E,T)?(z(E),X(E,T)):L(E,T)?(z(E),f(T,12,A(E))):$(E,T)?(z(E),de==="{"?te(E,T)||Q:f(T,11,P(E))):(R===8&&d(Le.INVALID_LINKED_FORMAT,s(),0),T.braceNest=0,T.inLinked=!1,ie(E,T))}}function ie(E,T){let R={type:14};if(T.braceNest>0)return te(E,T)||p(T);if(T.inLinked)return X(E,T)||p(T);switch(E.currentChar()){case"{":return te(E,T)||p(T);case"}":return d(Le.UNBALANCED_CLOSING_BRACE,s(),0),E.next(),f(T,3,"}");case"@":return X(E,T)||p(T);default:{if(F(E))return R=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,R;const{isModulo:de,hasSpace:se}=q(E);if(de)return se?f(T,0,at(E)):f(T,4,it(E));if(U(E))return f(T,0,at(E));break}}return R}function pe(){const{currentType:E,offset:T,startLoc:R,endLoc:Q}=l;return l.lastType=E,l.lastOffset=T,l.lastStartLoc=R,l.lastEndLoc=Q,l.offset=o(),l.startLoc=s(),r.currentChar()===Rr?f(l,14):ie(r,l)}return{nextToken:pe,currentOffset:o,currentPosition:s,context:u}}const Iw="parser",Lw=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function Nw(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 Dw(e={}){const t=e.location!==!1,{onError:n,onWarn:r}=e;function o(_,v,S,C,...L){const D=_.currentPosition();if(D.offset+=C,D.column+=C,n){const $=t?el(S,D):null,F=As(v,$,{domain:Iw,args:L});n(F)}}function s(_,v,S,C,...L){const D=_.currentPosition();if(D.offset+=C,D.column+=C,r){const $=t?el(S,D):null;r(ww(v,$,L))}}function i(_,v,S){const C={type:_};return t&&(C.start=v,C.end=v,C.loc={start:S,end:S}),C}function a(_,v,S,C){t&&(_.end=v,_.loc&&(_.loc.end=S))}function l(_,v){const S=_.context(),C=i(3,S.offset,S.startLoc);return C.value=v,a(C,_.currentOffset(),_.currentPosition()),C}function u(_,v){const S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(5,C,L);return D.index=parseInt(v,10),_.nextToken(),a(D,_.currentOffset(),_.currentPosition()),D}function m(_,v,S){const C=_.context(),{lastOffset:L,lastStartLoc:D}=C,$=i(4,L,D);return $.key=v,S===!0&&($.modulo=!0),_.nextToken(),a($,_.currentOffset(),_.currentPosition()),$}function d(_,v){const S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(9,C,L);return D.value=v.replace(Lw,Nw),_.nextToken(),a(D,_.currentOffset(),_.currentPosition()),D}function f(_){const v=_.nextToken(),S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(8,C,L);return v.type!==12?(o(_,Le.UNEXPECTED_EMPTY_LINKED_MODIFIER,S.lastStartLoc,0),D.value="",a(D,C,L),{nextConsumeToken:v,node:D}):(v.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,jn(v)),D.value=v.value||"",a(D,_.currentOffset(),_.currentPosition()),{node:D})}function p(_,v){const S=_.context(),C=i(7,S.offset,S.startLoc);return C.value=v,a(C,_.currentOffset(),_.currentPosition()),C}function h(_){const v=_.context(),S=i(6,v.offset,v.startLoc);let C=_.nextToken();if(C.type===9){const L=f(_);S.modifier=L.node,C=L.nextConsumeToken||_.nextToken()}switch(C.type!==10&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,jn(C)),C=_.nextToken(),C.type===2&&(C=_.nextToken()),C.type){case 11:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,jn(C)),S.key=p(_,C.value||"");break;case 5:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,jn(C)),S.key=m(_,C.value||"");break;case 6:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,jn(C)),S.key=u(_,C.value||"");break;case 7:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,jn(C)),S.key=d(_,C.value||"");break;default:{o(_,Le.UNEXPECTED_EMPTY_LINKED_KEY,v.lastStartLoc,0);const L=_.context(),D=i(7,L.offset,L.startLoc);return D.value="",a(D,L.offset,L.startLoc),S.key=D,a(S,L.offset,L.startLoc),{nextConsumeToken:C,node:S}}}return a(S,_.currentOffset(),_.currentPosition()),{node:S}}function g(_){const v=_.context(),S=v.currentType===1?_.currentOffset():v.offset,C=v.currentType===1?v.endLoc:v.startLoc,L=i(2,S,C);L.items=[];let D=null,$=null;do{const U=D||_.nextToken();switch(D=null,U.type){case 0:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,jn(U)),L.items.push(l(_,U.value||""));break;case 6:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,jn(U)),L.items.push(u(_,U.value||""));break;case 4:$=!0;break;case 5:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,jn(U)),L.items.push(m(_,U.value||"",!!$)),$&&(s(_,Rd.USE_MODULO_SYNTAX,v.lastStartLoc,0,jn(U)),$=null);break;case 7:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,jn(U)),L.items.push(d(_,U.value||""));break;case 8:{const W=h(_);L.items.push(W.node),D=W.nextConsumeToken||null;break}}}while(v.currentType!==14&&v.currentType!==1);const F=v.currentType===1?v.lastOffset:_.currentOffset(),q=v.currentType===1?v.lastEndLoc:_.currentPosition();return a(L,F,q),L}function z(_,v,S,C){const L=_.context();let D=C.items.length===0;const $=i(1,v,S);$.cases=[],$.cases.push(C);do{const F=g(_);D||(D=F.items.length===0),$.cases.push(F)}while(L.currentType!==14);return D&&o(_,Le.MUST_HAVE_MESSAGES_IN_PLURAL,S,0),a($,_.currentOffset(),_.currentPosition()),$}function k(_){const v=_.context(),{offset:S,startLoc:C}=v,L=g(_);return v.currentType===14?L:z(_,S,C,L)}function w(_){const v=Pw(_,ry({},e)),S=v.context(),C=i(0,S.offset,S.startLoc);return t&&C.loc&&(C.loc.source=_),C.body=k(v),e.onCacheKey&&(C.cacheKey=e.onCacheKey(_)),S.currentType!==14&&o(v,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,_[S.offset]||""),a(C,v.currentOffset(),v.currentPosition()),C}return{parse:w}}function jn(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 Rw(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:s=>(n.helpers.add(s),s)}}function yf(e,t){for(let n=0;nzf(n)),e}function zf(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;na;function u(z,k){a.code+=z}function m(z,k=!0){const w=k?o:"";u(s?w+" ".repeat(z):w)}function d(z=!0){const k=++a.indentLevel;z&&m(k)}function f(z=!0){const k=--a.indentLevel;z&&m(k)}function p(){m(a.indentLevel)}return{context:l,push:u,indent:d,deindent:f,newline:p,helper:z=>`_${z}`,needIndent:()=>a.needIndent}}function jw(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),zs(e,t.key),t.modifier?(e.push(", "),zs(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function Bw(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=_f(t.mode)?t.mode:"normal",r=_f(t.filename)?t.filename:"message.intl",o=!!t.sourceMap,s=t.breakLineCode!=null?t.breakLineCode:n==="arrow"?";":` -`,i=t.needIndent?t.needIndent:n!=="arrow",a=e.helpers||[],l=Uw(e,{mode:n,filename:r,sourceMap:o,breakLineCode:s,needIndent:i});l.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(i),a.length>0&&(l.push(`const { ${oy(a.map(d=>`${d}: _${d}`),", ")} } = ctx`),l.newline()),l.push("return "),zs(l,e),l.deindent(i),l.push("}"),delete e.helpers;const{code:u,map:m}=l.context();return{ast:e,code:u,map:m?m.toJSON():void 0}};function Kw(e,t={}){const n=ry({},t),r=!!n.jit,o=!!n.minify,s=n.optimize==null?!0:n.optimize,a=Dw(n).parse(e);return r?(s&&Fw(a),o&&Jo(a),{ast:a,code:""}):(Mw(a,n),Gw(a,n))}/*! - * core-base v9.14.0 + */function xw(e,t,n){return{line:e,column:t,offset:n}}function ol(e,t,n){return{start:e,end:t}}const Ew=/\{([0-9a-zA-Z]+)\}/g;function ly(e,...t){return t.length===1&&$w(t[0])&&(t=t[0]),(!t||!t.hasOwnProperty)&&(t={}),e.replace(Ew,(n,r)=>t.hasOwnProperty(r)?t[r]:"")}const cy=Object.assign,Cf=e=>typeof e=="string",$w=e=>e!==null&&typeof e=="object";function uy(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}const Ud={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},Tw={[Ud.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};function Aw(e,t,...n){const r=ly(Tw[e],...n||[]),o={message:String(r),code:e};return t&&(o.location=t),o}const Le={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},Ow={[Le.EXPECTED_TOKEN]:"Expected token: '{0}'",[Le.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[Le.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[Le.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[Le.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[Le.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[Le.EMPTY_PLACEHOLDER]:"Empty placeholder",[Le.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[Le.INVALID_LINKED_FORMAT]:"Invalid linked format",[Le.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[Le.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[Le.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[Le.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[Le.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[Le.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function Is(e,t,n={}){const{domain:r,messages:o,args:s}=n,i=ly((o||Ow)[e]||"",...s||[]),a=new SyntaxError(String(i));return a.code=e,t&&(a.location=t),a.domain=r,a}function Pw(e){throw e}const zr=" ",Iw="\r",tn=` +`,Lw="\u2028",Nw="\u2029";function Dw(e){const t=e;let n=0,r=1,o=1,s=0;const i=L=>t[L]===Iw&&t[L+1]===tn,a=L=>t[L]===tn,l=L=>t[L]===Nw,u=L=>t[L]===Lw,m=L=>i(L)||a(L)||l(L)||u(L),d=()=>n,f=()=>r,p=()=>o,h=()=>s,g=L=>i(L)||l(L)||u(L)?tn:t[L],z=()=>g(n),k=()=>g(n+s);function w(){return s=0,m(n)&&(r++,o=0),i(n)&&n++,n++,o++,t[n]}function _(){return i(n+s)&&s++,s++,t[n+s]}function v(){n=0,r=1,o=1,s=0}function S(L=0){s=L}function C(){const L=n+s;for(;L!==n;)w();s=0}return{index:d,line:f,column:p,peekOffset:h,charAt:g,currentChar:z,currentPeek:k,next:w,peek:_,reset:v,resetPeek:S,skipToPeek:C}}const Fr=void 0,Rw=".",wf="'",Mw="tokenizer";function Fw(e,t={}){const n=t.location!==!1,r=Dw(e),o=()=>r.index(),s=()=>xw(r.line(),r.column(),r.index()),i=s(),a=o(),l={currentType:14,offset:a,startLoc:i,endLoc:i,lastType:14,lastOffset:a,lastStartLoc:i,lastEndLoc:i,braceNest:0,inLinked:!1,text:""},u=()=>l,{onError:m}=t;function d(E,T,R,...Q){const de=u();if(T.column+=R,T.offset+=R,m){const se=n?ol(de.startLoc,T):null,H=Is(E,se,{domain:Mw,args:Q});m(H)}}function f(E,T,R){E.endLoc=s(),E.currentType=T;const Q={type:T};return n&&(Q.loc=ol(E.startLoc,E.endLoc)),R!=null&&(Q.value=R),Q}const p=E=>f(E,14);function h(E,T){return E.currentChar()===T?(E.next(),T):(d(Le.EXPECTED_TOKEN,s(),0,T),"")}function g(E){let T="";for(;E.currentPeek()===zr||E.currentPeek()===tn;)T+=E.currentPeek(),E.peek();return T}function z(E){const T=g(E);return E.skipToPeek(),T}function k(E){if(E===Fr)return!1;const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T===95}function w(E){if(E===Fr)return!1;const T=E.charCodeAt(0);return T>=48&&T<=57}function _(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=k(E.currentPeek());return E.resetPeek(),Q}function v(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=E.currentPeek()==="-"?E.peek():E.currentPeek(),de=w(Q);return E.resetPeek(),de}function S(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=E.currentPeek()===wf;return E.resetPeek(),Q}function C(E,T){const{currentType:R}=T;if(R!==8)return!1;g(E);const Q=E.currentPeek()===".";return E.resetPeek(),Q}function L(E,T){const{currentType:R}=T;if(R!==9)return!1;g(E);const Q=k(E.currentPeek());return E.resetPeek(),Q}function D(E,T){const{currentType:R}=T;if(!(R===8||R===12))return!1;g(E);const Q=E.currentPeek()===":";return E.resetPeek(),Q}function $(E,T){const{currentType:R}=T;if(R!==10)return!1;const Q=()=>{const se=E.currentPeek();return se==="{"?k(E.peek()):se==="@"||se==="%"||se==="|"||se===":"||se==="."||se===zr||!se?!1:se===tn?(E.peek(),Q()):U(E,!1)},de=Q();return E.resetPeek(),de}function F(E){g(E);const T=E.currentPeek()==="|";return E.resetPeek(),T}function q(E){const T=g(E),R=E.currentPeek()==="%"&&E.peek()==="{";return E.resetPeek(),{isModulo:R,hasSpace:T.length>0}}function U(E,T=!0){const R=(de=!1,se="",H=!1)=>{const Z=E.currentPeek();return Z==="{"?se==="%"?!1:de:Z==="@"||!Z?se==="%"?!0:de:Z==="%"?(E.peek(),R(de,"%",!0)):Z==="|"?se==="%"||H?!0:!(se===zr||se===tn):Z===zr?(E.peek(),R(!0,zr,H)):Z===tn?(E.peek(),R(!0,tn,H)):!0},Q=R();return T&&E.resetPeek(),Q}function W(E,T){const R=E.currentChar();return R===Fr?Fr:T(R)?(E.next(),R):null}function ne(E){const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===95||T===36}function me(E){return W(E,ne)}function K(E){const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===95||T===36||T===45}function re(E){return W(E,K)}function ce(E){const T=E.charCodeAt(0);return T>=48&&T<=57}function Ne(E){return W(E,ce)}function it(E){const T=E.charCodeAt(0);return T>=48&&T<=57||T>=65&&T<=70||T>=97&&T<=102}function Ve(E){return W(E,it)}function He(E){let T="",R="";for(;T=Ne(E);)R+=T;return R}function at(E){z(E);const T=E.currentChar();return T!=="%"&&d(Le.EXPECTED_TOKEN,s(),0,T),E.next(),"%"}function lt(E){let T="";for(;;){const R=E.currentChar();if(R==="{"||R==="}"||R==="@"||R==="|"||!R)break;if(R==="%")if(U(E))T+=R,E.next();else break;else if(R===zr||R===tn)if(U(E))T+=R,E.next();else{if(F(E))break;T+=R,E.next()}else T+=R,E.next()}return T}function ut(E){z(E);let T="",R="";for(;T=re(E);)R+=T;return E.currentChar()===Fr&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R}function We(E){z(E);let T="";return E.currentChar()==="-"?(E.next(),T+=`-${He(E)}`):T+=He(E),E.currentChar()===Fr&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),T}function Y(E){return E!==wf&&E!==tn}function fe(E){z(E),h(E,"'");let T="",R="";for(;T=W(E,Y);)T==="\\"?R+=le(E):R+=T;const Q=E.currentChar();return Q===tn||Q===Fr?(d(Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,s(),0),Q===tn&&(E.next(),h(E,"'")),R):(h(E,"'"),R)}function le(E){const T=E.currentChar();switch(T){case"\\":case"'":return E.next(),`\\${T}`;case"u":return ge(E,T,4);case"U":return ge(E,T,6);default:return d(Le.UNKNOWN_ESCAPE_SEQUENCE,s(),0,T),""}}function ge(E,T,R){h(E,T);let Q="";for(let de=0;de{const Q=E.currentChar();return Q==="{"||Q==="%"||Q==="@"||Q==="|"||Q==="("||Q===")"||!Q||Q===zr?R:(R+=Q,E.next(),T(R))};return T("")}function j(E){z(E);const T=h(E,"|");return z(E),T}function te(E,T){let R=null;switch(E.currentChar()){case"{":return T.braceNest>=1&&d(Le.NOT_ALLOW_NEST_PLACEHOLDER,s(),0),E.next(),R=f(T,2,"{"),z(E),T.braceNest++,R;case"}":return T.braceNest>0&&T.currentType===2&&d(Le.EMPTY_PLACEHOLDER,s(),0),E.next(),R=f(T,3,"}"),T.braceNest--,T.braceNest>0&&z(E),T.inLinked&&T.braceNest===0&&(T.inLinked=!1),R;case"@":return T.braceNest>0&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=X(E,T)||p(T),T.braceNest=0,R;default:{let de=!0,se=!0,H=!0;if(F(E))return T.braceNest>0&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,R;if(T.braceNest>0&&(T.currentType===5||T.currentType===6||T.currentType===7))return d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),T.braceNest=0,ie(E,T);if(de=_(E,T))return R=f(T,5,ut(E)),z(E),R;if(se=v(E,T))return R=f(T,6,We(E)),z(E),R;if(H=S(E,T))return R=f(T,7,fe(E)),z(E),R;if(!de&&!se&&!H)return R=f(T,13,Ge(E)),d(Le.INVALID_TOKEN_IN_PLACEHOLDER,s(),0,R.value),z(E),R;break}}return R}function X(E,T){const{currentType:R}=T;let Q=null;const de=E.currentChar();switch((R===8||R===9||R===12||R===10)&&(de===tn||de===zr)&&d(Le.INVALID_LINKED_FORMAT,s(),0),de){case"@":return E.next(),Q=f(T,8,"@"),T.inLinked=!0,Q;case".":return z(E),E.next(),f(T,9,".");case":":return z(E),E.next(),f(T,10,":");default:return F(E)?(Q=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,Q):C(E,T)||D(E,T)?(z(E),X(E,T)):L(E,T)?(z(E),f(T,12,A(E))):$(E,T)?(z(E),de==="{"?te(E,T)||Q:f(T,11,P(E))):(R===8&&d(Le.INVALID_LINKED_FORMAT,s(),0),T.braceNest=0,T.inLinked=!1,ie(E,T))}}function ie(E,T){let R={type:14};if(T.braceNest>0)return te(E,T)||p(T);if(T.inLinked)return X(E,T)||p(T);switch(E.currentChar()){case"{":return te(E,T)||p(T);case"}":return d(Le.UNBALANCED_CLOSING_BRACE,s(),0),E.next(),f(T,3,"}");case"@":return X(E,T)||p(T);default:{if(F(E))return R=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,R;const{isModulo:de,hasSpace:se}=q(E);if(de)return se?f(T,0,lt(E)):f(T,4,at(E));if(U(E))return f(T,0,lt(E));break}}return R}function pe(){const{currentType:E,offset:T,startLoc:R,endLoc:Q}=l;return l.lastType=E,l.lastOffset=T,l.lastStartLoc=R,l.lastEndLoc=Q,l.offset=o(),l.startLoc=s(),r.currentChar()===Fr?f(l,14):ie(r,l)}return{nextToken:pe,currentOffset:o,currentPosition:s,context:u}}const Vw="parser",Hw=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function Uw(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 jw(e={}){const t=e.location!==!1,{onError:n,onWarn:r}=e;function o(_,v,S,C,...L){const D=_.currentPosition();if(D.offset+=C,D.column+=C,n){const $=t?ol(S,D):null,F=Is(v,$,{domain:Vw,args:L});n(F)}}function s(_,v,S,C,...L){const D=_.currentPosition();if(D.offset+=C,D.column+=C,r){const $=t?ol(S,D):null;r(Aw(v,$,L))}}function i(_,v,S){const C={type:_};return t&&(C.start=v,C.end=v,C.loc={start:S,end:S}),C}function a(_,v,S,C){t&&(_.end=v,_.loc&&(_.loc.end=S))}function l(_,v){const S=_.context(),C=i(3,S.offset,S.startLoc);return C.value=v,a(C,_.currentOffset(),_.currentPosition()),C}function u(_,v){const S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(5,C,L);return D.index=parseInt(v,10),_.nextToken(),a(D,_.currentOffset(),_.currentPosition()),D}function m(_,v,S){const C=_.context(),{lastOffset:L,lastStartLoc:D}=C,$=i(4,L,D);return $.key=v,S===!0&&($.modulo=!0),_.nextToken(),a($,_.currentOffset(),_.currentPosition()),$}function d(_,v){const S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(9,C,L);return D.value=v.replace(Hw,Uw),_.nextToken(),a(D,_.currentOffset(),_.currentPosition()),D}function f(_){const v=_.nextToken(),S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(8,C,L);return v.type!==12?(o(_,Le.UNEXPECTED_EMPTY_LINKED_MODIFIER,S.lastStartLoc,0),D.value="",a(D,C,L),{nextConsumeToken:v,node:D}):(v.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,Bn(v)),D.value=v.value||"",a(D,_.currentOffset(),_.currentPosition()),{node:D})}function p(_,v){const S=_.context(),C=i(7,S.offset,S.startLoc);return C.value=v,a(C,_.currentOffset(),_.currentPosition()),C}function h(_){const v=_.context(),S=i(6,v.offset,v.startLoc);let C=_.nextToken();if(C.type===9){const L=f(_);S.modifier=L.node,C=L.nextConsumeToken||_.nextToken()}switch(C.type!==10&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),C=_.nextToken(),C.type===2&&(C=_.nextToken()),C.type){case 11:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=p(_,C.value||"");break;case 5:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=m(_,C.value||"");break;case 6:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=u(_,C.value||"");break;case 7:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=d(_,C.value||"");break;default:{o(_,Le.UNEXPECTED_EMPTY_LINKED_KEY,v.lastStartLoc,0);const L=_.context(),D=i(7,L.offset,L.startLoc);return D.value="",a(D,L.offset,L.startLoc),S.key=D,a(S,L.offset,L.startLoc),{nextConsumeToken:C,node:S}}}return a(S,_.currentOffset(),_.currentPosition()),{node:S}}function g(_){const v=_.context(),S=v.currentType===1?_.currentOffset():v.offset,C=v.currentType===1?v.endLoc:v.startLoc,L=i(2,S,C);L.items=[];let D=null,$=null;do{const U=D||_.nextToken();switch(D=null,U.type){case 0:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(l(_,U.value||""));break;case 6:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(u(_,U.value||""));break;case 4:$=!0;break;case 5:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(m(_,U.value||"",!!$)),$&&(s(_,Ud.USE_MODULO_SYNTAX,v.lastStartLoc,0,Bn(U)),$=null);break;case 7:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(d(_,U.value||""));break;case 8:{const W=h(_);L.items.push(W.node),D=W.nextConsumeToken||null;break}}}while(v.currentType!==14&&v.currentType!==1);const F=v.currentType===1?v.lastOffset:_.currentOffset(),q=v.currentType===1?v.lastEndLoc:_.currentPosition();return a(L,F,q),L}function z(_,v,S,C){const L=_.context();let D=C.items.length===0;const $=i(1,v,S);$.cases=[],$.cases.push(C);do{const F=g(_);D||(D=F.items.length===0),$.cases.push(F)}while(L.currentType!==14);return D&&o(_,Le.MUST_HAVE_MESSAGES_IN_PLURAL,S,0),a($,_.currentOffset(),_.currentPosition()),$}function k(_){const v=_.context(),{offset:S,startLoc:C}=v,L=g(_);return v.currentType===14?L:z(_,S,C,L)}function w(_){const v=Fw(_,cy({},e)),S=v.context(),C=i(0,S.offset,S.startLoc);return t&&C.loc&&(C.loc.source=_),C.body=k(v),e.onCacheKey&&(C.cacheKey=e.onCacheKey(_)),S.currentType!==14&&o(v,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,_[S.offset]||""),a(C,v.currentOffset(),v.currentPosition()),C}return{parse:w}}function Bn(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 Bw(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:s=>(n.helpers.add(s),s)}}function kf(e,t){for(let n=0;nSf(n)),e}function Sf(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;na;function u(z,k){a.code+=z}function m(z,k=!0){const w=k?o:"";u(s?w+" ".repeat(z):w)}function d(z=!0){const k=++a.indentLevel;z&&m(k)}function f(z=!0){const k=--a.indentLevel;z&&m(k)}function p(){m(a.indentLevel)}return{context:l,push:u,indent:d,deindent:f,newline:p,helper:z=>`_${z}`,needIndent:()=>a.needIndent}}function Yw(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),Cs(e,t.key),t.modifier?(e.push(", "),Cs(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function Xw(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=Cf(t.mode)?t.mode:"normal",r=Cf(t.filename)?t.filename:"message.intl",o=!!t.sourceMap,s=t.breakLineCode!=null?t.breakLineCode:n==="arrow"?";":` +`,i=t.needIndent?t.needIndent:n!=="arrow",a=e.helpers||[],l=Zw(e,{mode:n,filename:r,sourceMap:o,breakLineCode:s,needIndent:i});l.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(i),a.length>0&&(l.push(`const { ${uy(a.map(d=>`${d}: _${d}`),", ")} } = ctx`),l.newline()),l.push("return "),Cs(l,e),l.deindent(i),l.push("}"),delete e.helpers;const{code:u,map:m}=l.context();return{ast:e,code:u,map:m?m.toJSON():void 0}};function tk(e,t={}){const n=cy({},t),r=!!n.jit,o=!!n.minify,s=n.optimize==null?!0:n.optimize,a=jw(n).parse(e);return r?(s&&qw(a),o&&ts(a),{ast:a,code:""}):(Ww(a,n),ek(a,n))}/*! + * core-base v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */function Zw(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Dd().__INTLIFY_PROD_DEVTOOLS__=!1)}const mo=[];mo[0]={w:[0],i:[3,0],"[":[4],o:[7]};mo[1]={w:[1],".":[2],"[":[4],o:[7]};mo[2]={w:[2],i:[3,0],0:[3,0]};mo[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};mo[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};mo[5]={"'":[4,0],o:8,l:[5,0]};mo[6]={'"':[4,0],o:8,l:[6,0]};const Yw=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function Xw(e){return Yw.test(e)}function Jw(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 Qw(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 ek(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:Xw(t)?Jw(t):"*"+t}function tk(e){const t=[];let n=-1,r=0,o=0,s,i,a,l,u,m,d;const f=[];f[0]=()=>{i===void 0?i=a:i+=a},f[1]=()=>{i!==void 0&&(t.push(i),i=void 0)},f[2]=()=>{f[0](),o++},f[3]=()=>{if(o>0)o--,r=4,f[0]();else{if(o=0,i===void 0||(i=ek(i),i===!1))return!1;f[1]()}};function p(){const h=e[n+1];if(r===5&&h==="'"||r===6&&h==='"')return n++,a="\\"+h,f[0](),!0}for(;r!==null;)if(n++,s=e[n],!(s==="\\"&&p())){if(l=Qw(s),d=mo[r],u=d[l]||d.l||8,u===8||(r=u[0],u[1]!==void 0&&(m=f[u[1]],m&&(a=s,m()===!1))))return;if(r===7)return t}}const vf=new Map;function nk(e,t){return ct(e)?e[t]:null}function rk(e,t){if(!ct(e))return null;let n=vf.get(t);if(n||(n=tk(t),n&&vf.set(t,n)),!n)return null;const r=n.length;let o=e,s=0;for(;se,sk=e=>"",ik="text",ak=e=>e.length===0?"":gw(e),lk=_w;function bf(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function ck(e){const t=Ut(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Ut(e.named.count)||Ut(e.named.n))?Ut(e.named.count)?e.named.count:Ut(e.named.n)?e.named.n:t:t}function uk(e,t){t.count||(t.count=e),t.n||(t.n=e)}function dk(e={}){const t=e.locale,n=ck(e),r=ct(e.pluralRules)&&Ce(t)&&Tt(e.pluralRules[t])?e.pluralRules[t]:bf,o=ct(e.pluralRules)&&Ce(t)&&Tt(e.pluralRules[t])?bf:void 0,s=k=>k[r(n,k.length,o)],i=e.list||[],a=k=>i[k],l=e.named||{};Ut(e.pluralIndex)&&uk(n,l);const u=k=>l[k];function m(k){const w=Tt(e.messages)?e.messages(k):ct(e.messages)?e.messages[k]:!1;return w||(e.parent?e.parent.message(k):sk)}const d=k=>e.modifiers?e.modifiers[k]:ok,f=Je(e.processor)&&Tt(e.processor.normalize)?e.processor.normalize:ak,p=Je(e.processor)&&Tt(e.processor.interpolate)?e.processor.interpolate:lk,h=Je(e.processor)&&Ce(e.processor.type)?e.processor.type:ik,z={list:a,named:u,plural:s,linked:(k,...w)=>{const[_,v]=w;let S="text",C="";w.length===1?ct(_)?(C=_.modifier||C,S=_.type||S):Ce(_)&&(C=_||C):w.length===2&&(Ce(_)&&(C=_||C),Ce(v)&&(S=v||S));const L=m(k)(z),D=S==="vnode"&&Ft(L)&&C?L[0]:L;return C?d(C)(D,S):D},message:m,type:h,interpolate:p,normalize:f,values:Xt({},i,l)};return z}let ki=null;function mk(e){ki=e}function fk(e,t,n){ki&&ki.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const pk=hk("function:translate");function hk(e){return t=>ki&&ki.emit(e,t)}const sy=Rd.__EXTEND_POINT__,ho=Vl(sy),_k={NOT_FOUND_KEY:sy,FALLBACK_TO_TRANSLATE:ho(),CANNOT_FORMAT_NUMBER:ho(),FALLBACK_TO_NUMBER_FORMAT:ho(),CANNOT_FORMAT_DATE:ho(),FALLBACK_TO_DATE_FORMAT:ho(),EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:ho(),__EXTEND_POINT__:ho()},iy=Le.__EXTEND_POINT__,_o=Vl(iy),dr={INVALID_ARGUMENT:iy,INVALID_DATE_ARGUMENT:_o(),INVALID_ISO_DATE_ARGUMENT:_o(),NOT_SUPPORT_NON_STRING_MESSAGE:_o(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:_o(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:_o(),NOT_SUPPORT_LOCALE_TYPE:_o(),__EXTEND_POINT__:_o()};function wr(e){return As(e,null,void 0)}function Fd(e,t){return t.locale!=null?Cf(t.locale):Cf(e.locale)}let zc;function Cf(e){if(Ce(e))return e;if(Tt(e)){if(e.resolvedOnce&&zc!=null)return zc;if(e.constructor.name==="Function"){const t=e();if(hw(t))throw wr(dr.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return zc=t}else throw wr(dr.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw wr(dr.NOT_SUPPORT_LOCALE_TYPE)}function gk(e,t,n){return[...new Set([n,...Ft(t)?t:ct(t)?Object.keys(t):Ce(t)?[t]:[n]])]}function ay(e,t,n){const r=Ce(n)?n:tl,o=e;o.__localeChainCache||(o.__localeChainCache=new Map);let s=o.__localeChainCache.get(r);if(!s){s=[];let i=[n];for(;Ft(i);)i=wf(s,i,t);const a=Ft(t)||!Je(t)?t:t.default?t.default:null;i=Ce(a)?[a]:a,Ft(i)&&wf(s,i,!1),o.__localeChainCache.set(r,s)}return s}function wf(e,t,n){let r=!0;for(let o=0;o`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function bk(){return{upper:(e,t)=>t==="text"&&Ce(e)?e.toUpperCase():t==="vnode"&&ct(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&Ce(e)?e.toLowerCase():t==="vnode"&&ct(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&Ce(e)?Sf(e):t==="vnode"&&ct(e)&&"__v_isVNode"in e?Sf(e.children):e}}let ly;function Ck(e){ly=e}let cy;function wk(e){cy=e}let uy;function kk(e){uy=e}let dy=null;const Sk=e=>{dy=e},xk=()=>dy;let my=null;const xf=e=>{my=e},Ek=()=>my;let Ef=0;function $k(e={}){const t=Tt(e.onWarn)?e.onWarn:yw,n=Ce(e.version)?e.version:vk,r=Ce(e.locale)||Tt(e.locale)?e.locale:tl,o=Tt(r)?tl:r,s=Ft(e.fallbackLocale)||Je(e.fallbackLocale)||Ce(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:o,i=Je(e.messages)?e.messages:{[o]:{}},a=Je(e.datetimeFormats)?e.datetimeFormats:{[o]:{}},l=Je(e.numberFormats)?e.numberFormats:{[o]:{}},u=Xt({},e.modifiers||{},bk()),m=e.pluralRules||{},d=Tt(e.missing)?e.missing:null,f=Ct(e.missingWarn)||Ja(e.missingWarn)?e.missingWarn:!0,p=Ct(e.fallbackWarn)||Ja(e.fallbackWarn)?e.fallbackWarn:!0,h=!!e.fallbackFormat,g=!!e.unresolving,z=Tt(e.postTranslation)?e.postTranslation:null,k=Je(e.processor)?e.processor:null,w=Ct(e.warnHtmlMessage)?e.warnHtmlMessage:!0,_=!!e.escapeParameter,v=Tt(e.messageCompiler)?e.messageCompiler:ly,S=Tt(e.messageResolver)?e.messageResolver:cy||nk,C=Tt(e.localeFallbacker)?e.localeFallbacker:uy||gk,L=ct(e.fallbackContext)?e.fallbackContext:void 0,D=e,$=ct(D.__datetimeFormatters)?D.__datetimeFormatters:new Map,F=ct(D.__numberFormatters)?D.__numberFormatters:new Map,q=ct(D.__meta)?D.__meta:{};Ef++;const U={version:n,cid:Ef,locale:r,fallbackLocale:s,messages:i,modifiers:u,pluralRules:m,missing:d,missingWarn:f,fallbackWarn:p,fallbackFormat:h,unresolving:g,postTranslation:z,processor:k,warnHtmlMessage:w,escapeParameter:_,messageCompiler:v,messageResolver:S,localeFallbacker:C,fallbackContext:L,onWarn:t,__meta:q};return U.datetimeFormats=a,U.numberFormats=l,U.__datetimeFormatters=$,U.__numberFormatters=F,__INTLIFY_PROD_DEVTOOLS__&&fk(U,n,q),U}function Vd(e,t,n,r,o){const{missing:s,onWarn:i}=e;if(s!==null){const a=s(e,n,t,o);return Ce(a)?a:t}else return t}function Ms(e,t,n){const r=e;r.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function Tk(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function Ak(e,t){const n=t.indexOf(e);if(n===-1)return!1;for(let r=n+1;rOk(n,e)}function Ok(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,$f(e,i)],[]))}else return $f(e,n)}function $f(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,xu(e,s)],[]);return e.normalize(r)}}function xu(e,t){const n=t.t||t.type;switch(n){case 3:{const r=t;return r.v||r.value}case 9:{const r=t;return r.v||r.value}case 4:{const r=t;return e.interpolate(e.named(r.k||r.key))}case 5:{const r=t;return e.interpolate(e.list(r.i!=null?r.i:r.index))}case 6:{const r=t,o=r.m||r.modifier;return e.linked(xu(e,r.k||r.key),o?xu(e,o):void 0,e.type)}case 7:{const r=t;return r.v||r.value}case 8:{const r=t;return r.v||r.value}default:throw new Error(`unhandled node type on format message part: ${n}`)}}const Pk=e=>e;let ia=Object.create(null);const vs=e=>ct(e)&&(e.t===0||e.type===0)&&("b"in e||"body"in e);function Ik(e,t={}){let n=!1;const r=t.onError||Sw;return t.onError=o=>{n=!0,r(o)},{...Kw(e,t),detectError:n}}function Lk(e,t){if(Ce(e)){Ct(t.warnHtmlMessage)&&t.warnHtmlMessage;const r=(t.onCacheKey||Pk)(e),o=ia[r];if(o)return o;const{ast:s,detectError:i}=Ik(e,{...t,location:!1,jit:!0}),a=vc(s);return i?a:ia[r]=a}else{const n=e.cacheKey;if(n){const r=ia[n];return r||(ia[n]=vc(e))}else return vc(e)}}const Tf=()=>"",An=e=>Tt(e);function Af(e,...t){const{fallbackFormat:n,postTranslation:r,unresolving:o,messageCompiler:s,fallbackLocale:i,messages:a}=e,[l,u]=Eu(...t),m=Ct(u.missingWarn)?u.missingWarn:e.missingWarn,d=Ct(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn,f=Ct(u.escapeParameter)?u.escapeParameter:e.escapeParameter,p=!!u.resolvedMessage,h=Ce(u.default)||Ct(u.default)?Ct(u.default)?s?l:()=>l:u.default:n?s?l:()=>l:"",g=n||h!=="",z=Fd(e,u);f&&Nk(u);let[k,w,_]=p?[l,z,a[z]||{}]:fy(e,l,z,i,d,m),v=k,S=l;if(!p&&!(Ce(v)||vs(v)||An(v))&&g&&(v=h,S=v),!p&&(!(Ce(v)||vs(v)||An(v))||!Ce(w)))return o?Hl:l;let C=!1;const L=()=>{C=!0},D=An(v)?v:py(e,l,w,v,S,L);if(C)return v;const $=Mk(e,w,_,u),F=dk($),q=Dk(e,D,F),U=r?r(q,l):q;if(__INTLIFY_PROD_DEVTOOLS__){const W={timestamp:Date.now(),key:Ce(l)?l:An(v)?v.key:"",locale:w||(An(v)?v.locale:""),format:Ce(v)?v:An(v)?v.source:"",message:U};W.meta=Xt({},e.__meta,xk()||{}),pk(W)}return U}function Nk(e){Ft(e.list)?e.list=e.list.map(t=>Ce(t)?hf(t):t):ct(e.named)&&Object.keys(e.named).forEach(t=>{Ce(e.named[t])&&(e.named[t]=hf(e.named[t]))})}function fy(e,t,n,r,o,s){const{messages:i,onWarn:a,messageResolver:l,localeFallbacker:u}=e,m=u(e,r,n);let d={},f,p=null;const h="translate";for(let g=0;gr;return u.locale=n,u.key=t,u}const l=i(r,Rk(e,n,o,r,a,s));return l.locale=n,l.key=t,l.source=r,l}function Dk(e,t,n){return t(n)}function Eu(...e){const[t,n,r]=e,o={};if(!Ce(t)&&!Ut(t)&&!An(t)&&!vs(t))throw wr(dr.INVALID_ARGUMENT);const s=Ut(t)?String(t):(An(t),t);return Ut(n)?o.plural=n:Ce(n)?o.default=n:Je(n)&&!Fl(n)?o.named=n:Ft(n)&&(o.list=n),Ut(r)?o.plural=r:Ce(r)?o.default=r:Je(r)&&Xt(o,r),[s,o]}function Rk(e,t,n,r,o,s){return{locale:t,key:n,warnHtmlMessage:o,onError:i=>{throw s&&s(i),i},onCacheKey:i=>dw(t,n,i)}}function Mk(e,t,n,r){const{modifiers:o,pluralRules:s,messageResolver:i,fallbackLocale:a,fallbackWarn:l,missingWarn:u,fallbackContext:m}=e,f={locale:t,modifiers:o,pluralRules:s,messages:p=>{let h=i(n,p);if(h==null&&m){const[,,g]=fy(m,p,t,a,l,u);h=i(g,p)}if(Ce(h)||vs(h)){let g=!1;const k=py(e,p,t,h,p,()=>{g=!0});return g?Tf:k}else return An(h)?h:Tf}};return e.processor&&(f.processor=e.processor),r.list&&(f.list=r.list),r.named&&(f.named=r.named),Ut(r.plural)&&(f.pluralIndex=r.plural),f}function Of(e,...t){const{datetimeFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__datetimeFormatters:a}=e,[l,u,m,d]=$u(...t),f=Ct(m.missingWarn)?m.missingWarn:e.missingWarn;Ct(m.fallbackWarn)?m.fallbackWarn:e.fallbackWarn;const p=!!m.part,h=Fd(e,m),g=i(e,o,h);if(!Ce(l)||l==="")return new Intl.DateTimeFormat(h,d).format(u);let z={},k,w=null;const _="datetime format";for(let C=0;C{hy.includes(l)?i[l]=n[l]:s[l]=n[l]}),Ce(r)?s.locale=r:Je(r)&&(i=r),Je(o)&&(i=o),[s.key||"",a,s,i]}function Pf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__datetimeFormatters.has(s)&&r.__datetimeFormatters.delete(s)}}function If(e,...t){const{numberFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__numberFormatters:a}=e,[l,u,m,d]=Tu(...t),f=Ct(m.missingWarn)?m.missingWarn:e.missingWarn;Ct(m.fallbackWarn)?m.fallbackWarn:e.fallbackWarn;const p=!!m.part,h=Fd(e,m),g=i(e,o,h);if(!Ce(l)||l==="")return new Intl.NumberFormat(h,d).format(u);let z={},k,w=null;const _="number format";for(let C=0;C{_y.includes(l)?i[l]=n[l]:s[l]=n[l]}),Ce(r)?s.locale=r:Je(r)&&(i=r),Je(o)&&(i=o),[s.key||"",a,s,i]}function Lf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__numberFormatters.has(s)&&r.__numberFormatters.delete(s)}}Zw();/*! - * vue-i18n v9.14.0 + */function nk(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Hd().__INTLIFY_PROD_DEVTOOLS__=!1)}const po=[];po[0]={w:[0],i:[3,0],"[":[4],o:[7]};po[1]={w:[1],".":[2],"[":[4],o:[7]};po[2]={w:[2],i:[3,0],0:[3,0]};po[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};po[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};po[5]={"'":[4,0],o:8,l:[5,0]};po[6]={'"':[4,0],o:8,l:[6,0]};const rk=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function ok(e){return rk.test(e)}function sk(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 ik(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 ak(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:ok(t)?sk(t):"*"+t}function lk(e){const t=[];let n=-1,r=0,o=0,s,i,a,l,u,m,d;const f=[];f[0]=()=>{i===void 0?i=a:i+=a},f[1]=()=>{i!==void 0&&(t.push(i),i=void 0)},f[2]=()=>{f[0](),o++},f[3]=()=>{if(o>0)o--,r=4,f[0]();else{if(o=0,i===void 0||(i=ak(i),i===!1))return!1;f[1]()}};function p(){const h=e[n+1];if(r===5&&h==="'"||r===6&&h==='"')return n++,a="\\"+h,f[0](),!0}for(;r!==null;)if(n++,s=e[n],!(s==="\\"&&p())){if(l=ik(s),d=po[r],u=d[l]||d.l||8,u===8||(r=u[0],u[1]!==void 0&&(m=f[u[1]],m&&(a=s,m()===!1))))return;if(r===7)return t}}const xf=new Map;function ck(e,t){return rt(e)?e[t]:null}function uk(e,t){if(!rt(e))return null;let n=xf.get(t);if(n||(n=lk(t),n&&xf.set(t,n)),!n)return null;const r=n.length;let o=e,s=0;for(;se,mk=e=>"",fk="text",pk=e=>e.length===0?"":kw(e),hk=ww;function Ef(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function _k(e){const t=Nt(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Nt(e.named.count)||Nt(e.named.n))?Nt(e.named.count)?e.named.count:Nt(e.named.n)?e.named.n:t:t}function gk(e,t){t.count||(t.count=e),t.n||(t.n=e)}function yk(e={}){const t=e.locale,n=_k(e),r=rt(e.pluralRules)&&Ce(t)&&At(e.pluralRules[t])?e.pluralRules[t]:Ef,o=rt(e.pluralRules)&&Ce(t)&&At(e.pluralRules[t])?Ef:void 0,s=k=>k[r(n,k.length,o)],i=e.list||[],a=k=>i[k],l=e.named||mt();Nt(e.pluralIndex)&&gk(n,l);const u=k=>l[k];function m(k){const w=At(e.messages)?e.messages(k):rt(e.messages)?e.messages[k]:!1;return w||(e.parent?e.parent.message(k):mk)}const d=k=>e.modifiers?e.modifiers[k]:dk,f=Je(e.processor)&&At(e.processor.normalize)?e.processor.normalize:pk,p=Je(e.processor)&&At(e.processor.interpolate)?e.processor.interpolate:hk,h=Je(e.processor)&&Ce(e.processor.type)?e.processor.type:fk,z={list:a,named:u,plural:s,linked:(k,...w)=>{const[_,v]=w;let S="text",C="";w.length===1?rt(_)?(C=_.modifier||C,S=_.type||S):Ce(_)&&(C=_||C):w.length===2&&(Ce(_)&&(C=_||C),Ce(v)&&(S=v||S));const L=m(k)(z),D=S==="vnode"&&Ht(L)&&C?L[0]:L;return C?d(C)(D,S):D},message:m,type:h,interpolate:p,normalize:f,values:Jt(mt(),i,l)};return z}let Ei=null;function zk(e){Ei=e}function vk(e,t,n){Ei&&Ei.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const bk=Ck("function:translate");function Ck(e){return t=>Ei&&Ei.emit(e,t)}const dy=Ud.__EXTEND_POINT__,yo=Bl(dy),wk={NOT_FOUND_KEY:dy,FALLBACK_TO_TRANSLATE:yo(),CANNOT_FORMAT_NUMBER:yo(),FALLBACK_TO_NUMBER_FORMAT:yo(),CANNOT_FORMAT_DATE:yo(),FALLBACK_TO_DATE_FORMAT:yo(),EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:yo(),__EXTEND_POINT__:yo()},my=Le.__EXTEND_POINT__,zo=Bl(my),fr={INVALID_ARGUMENT:my,INVALID_DATE_ARGUMENT:zo(),INVALID_ISO_DATE_ARGUMENT:zo(),NOT_SUPPORT_NON_STRING_MESSAGE:zo(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:zo(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:zo(),NOT_SUPPORT_LOCALE_TYPE:zo(),__EXTEND_POINT__:zo()};function Sr(e){return Is(e,null,void 0)}function Bd(e,t){return t.locale!=null?$f(t.locale):$f(e.locale)}let wc;function $f(e){if(Ce(e))return e;if(At(e)){if(e.resolvedOnce&&wc!=null)return wc;if(e.constructor.name==="Function"){const t=e();if(Cw(t))throw Sr(fr.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return wc=t}else throw Sr(fr.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw Sr(fr.NOT_SUPPORT_LOCALE_TYPE)}function kk(e,t,n){return[...new Set([n,...Ht(t)?t:rt(t)?Object.keys(t):Ce(t)?[t]:[n]])]}function fy(e,t,n){const r=Ce(n)?n:sl,o=e;o.__localeChainCache||(o.__localeChainCache=new Map);let s=o.__localeChainCache.get(r);if(!s){s=[];let i=[n];for(;Ht(i);)i=Tf(s,i,t);const a=Ht(t)||!Je(t)?t:t.default?t.default:null;i=Ce(a)?[a]:a,Ht(i)&&Tf(s,i,!1),o.__localeChainCache.set(r,s)}return s}function Tf(e,t,n){let r=!0;for(let o=0;o`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function $k(){return{upper:(e,t)=>t==="text"&&Ce(e)?e.toUpperCase():t==="vnode"&&rt(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&Ce(e)?e.toLowerCase():t==="vnode"&&rt(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&Ce(e)?Of(e):t==="vnode"&&rt(e)&&"__v_isVNode"in e?Of(e.children):e}}let py;function Tk(e){py=e}let hy;function Ak(e){hy=e}let _y;function Ok(e){_y=e}let gy=null;const Pk=e=>{gy=e},Ik=()=>gy;let yy=null;const Pf=e=>{yy=e},Lk=()=>yy;let If=0;function Nk(e={}){const t=At(e.onWarn)?e.onWarn:Sw,n=Ce(e.version)?e.version:Ek,r=Ce(e.locale)||At(e.locale)?e.locale:sl,o=At(r)?sl:r,s=Ht(e.fallbackLocale)||Je(e.fallbackLocale)||Ce(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:o,i=Je(e.messages)?e.messages:kc(o),a=Je(e.datetimeFormats)?e.datetimeFormats:kc(o),l=Je(e.numberFormats)?e.numberFormats:kc(o),u=Jt(mt(),e.modifiers,$k()),m=e.pluralRules||mt(),d=At(e.missing)?e.missing:null,f=wt(e.missingWarn)||rl(e.missingWarn)?e.missingWarn:!0,p=wt(e.fallbackWarn)||rl(e.fallbackWarn)?e.fallbackWarn:!0,h=!!e.fallbackFormat,g=!!e.unresolving,z=At(e.postTranslation)?e.postTranslation:null,k=Je(e.processor)?e.processor:null,w=wt(e.warnHtmlMessage)?e.warnHtmlMessage:!0,_=!!e.escapeParameter,v=At(e.messageCompiler)?e.messageCompiler:py,S=At(e.messageResolver)?e.messageResolver:hy||ck,C=At(e.localeFallbacker)?e.localeFallbacker:_y||kk,L=rt(e.fallbackContext)?e.fallbackContext:void 0,D=e,$=rt(D.__datetimeFormatters)?D.__datetimeFormatters:new Map,F=rt(D.__numberFormatters)?D.__numberFormatters:new Map,q=rt(D.__meta)?D.__meta:{};If++;const U={version:n,cid:If,locale:r,fallbackLocale:s,messages:i,modifiers:u,pluralRules:m,missing:d,missingWarn:f,fallbackWarn:p,fallbackFormat:h,unresolving:g,postTranslation:z,processor:k,warnHtmlMessage:w,escapeParameter:_,messageCompiler:v,messageResolver:S,localeFallbacker:C,fallbackContext:L,onWarn:t,__meta:q};return U.datetimeFormats=a,U.numberFormats=l,U.__datetimeFormatters=$,U.__numberFormatters=F,__INTLIFY_PROD_DEVTOOLS__&&vk(U,n,q),U}const kc=e=>({[e]:mt()});function Wd(e,t,n,r,o){const{missing:s,onWarn:i}=e;if(s!==null){const a=s(e,n,t,o);return Ce(a)?a:t}else return t}function Hs(e,t,n){const r=e;r.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function Dk(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function Rk(e,t){const n=t.indexOf(e);if(n===-1)return!1;for(let r=n+1;rMk(n,e)}function Mk(e,t){const n=Vk(t);if(n==null)throw $i(0);if(qd(n)===1){const s=Uk(n);return e.plural(s.reduce((i,a)=>[...i,Lf(e,a)],[]))}else return Lf(e,n)}const Fk=["b","body"];function Vk(e){return ho(e,Fk)}const Hk=["c","cases"];function Uk(e){return ho(e,Hk,[])}function Lf(e,t){const n=Bk(t);if(n!=null)return e.type==="text"?n:e.normalize([n]);{const r=qk(t).reduce((o,s)=>[...o,Ou(e,s)],[]);return e.normalize(r)}}const jk=["s","static"];function Bk(e){return ho(e,jk)}const Wk=["i","items"];function qk(e){return ho(e,Wk,[])}function Ou(e,t){const n=qd(t);switch(n){case 3:return ua(t,n);case 9:return ua(t,n);case 4:{const r=t;if(Xn(r,"k")&&r.k)return e.interpolate(e.named(r.k));if(Xn(r,"key")&&r.key)return e.interpolate(e.named(r.key));throw $i(n)}case 5:{const r=t;if(Xn(r,"i")&&Nt(r.i))return e.interpolate(e.list(r.i));if(Xn(r,"index")&&Nt(r.index))return e.interpolate(e.list(r.index));throw $i(n)}case 6:{const r=t,o=Yk(r),s=Jk(r);return e.linked(Ou(e,s),o?Ou(e,o):void 0,e.type)}case 7:return ua(t,n);case 8:return ua(t,n);default:throw new Error(`unhandled node on format message part: ${n}`)}}const Gk=["t","type"];function qd(e){return ho(e,Gk)}const Kk=["v","value"];function ua(e,t){const n=ho(e,Kk);if(n)return n;throw $i(t)}const Zk=["m","modifier"];function Yk(e){return ho(e,Zk)}const Xk=["k","key"];function Jk(e){const t=ho(e,Xk);if(t)return t;throw $i(6)}function ho(e,t,n){for(let r=0;re;let da=mt();function ws(e){return rt(e)&&qd(e)===0&&(Xn(e,"b")||Xn(e,"body"))}function eS(e,t={}){let n=!1;const r=t.onError||Pw;return t.onError=o=>{n=!0,r(o)},{...tk(e,t),detectError:n}}function tS(e,t){if(Ce(e)){wt(t.warnHtmlMessage)&&t.warnHtmlMessage;const r=(t.onCacheKey||Qk)(e),o=da[r];if(o)return o;const{ast:s,detectError:i}=eS(e,{...t,location:!1,jit:!0}),a=Sc(s);return i?a:da[r]=a}else{const n=e.cacheKey;if(n){const r=da[n];return r||(da[n]=Sc(e))}else return Sc(e)}}const Nf=()=>"",On=e=>At(e);function Df(e,...t){const{fallbackFormat:n,postTranslation:r,unresolving:o,messageCompiler:s,fallbackLocale:i,messages:a}=e,[l,u]=Pu(...t),m=wt(u.missingWarn)?u.missingWarn:e.missingWarn,d=wt(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn,f=wt(u.escapeParameter)?u.escapeParameter:e.escapeParameter,p=!!u.resolvedMessage,h=Ce(u.default)||wt(u.default)?wt(u.default)?s?l:()=>l:u.default:n?s?l:()=>l:"",g=n||h!=="",z=Bd(e,u);f&&nS(u);let[k,w,_]=p?[l,z,a[z]||mt()]:zy(e,l,z,i,d,m),v=k,S=l;if(!p&&!(Ce(v)||ws(v)||On(v))&&g&&(v=h,S=v),!p&&(!(Ce(v)||ws(v)||On(v))||!Ce(w)))return o?Wl:l;let C=!1;const L=()=>{C=!0},D=On(v)?v:vy(e,l,w,v,S,L);if(C)return v;const $=sS(e,w,_,u),F=yk($),q=rS(e,D,F),U=r?r(q,l):q;if(__INTLIFY_PROD_DEVTOOLS__){const W={timestamp:Date.now(),key:Ce(l)?l:On(v)?v.key:"",locale:w||(On(v)?v.locale:""),format:Ce(v)?v:On(v)?v.source:"",message:U};W.meta=Jt({},e.__meta,Ik()||{}),bk(W)}return U}function nS(e){Ht(e.list)?e.list=e.list.map(t=>Ce(t)?bf(t):t):rt(e.named)&&Object.keys(e.named).forEach(t=>{Ce(e.named[t])&&(e.named[t]=bf(e.named[t]))})}function zy(e,t,n,r,o,s){const{messages:i,onWarn:a,messageResolver:l,localeFallbacker:u}=e,m=u(e,r,n);let d=mt(),f,p=null;const h="translate";for(let g=0;gr;return u.locale=n,u.key=t,u}const l=i(r,oS(e,n,o,r,a,s));return l.locale=n,l.key=t,l.source=r,l}function rS(e,t,n){return t(n)}function Pu(...e){const[t,n,r]=e,o=mt();if(!Ce(t)&&!Nt(t)&&!On(t)&&!ws(t))throw Sr(fr.INVALID_ARGUMENT);const s=Nt(t)?String(t):(On(t),t);return Nt(n)?o.plural=n:Ce(n)?o.default=n:Je(n)&&!jl(n)?o.named=n:Ht(n)&&(o.list=n),Nt(r)?o.plural=r:Ce(r)?o.default=r:Je(r)&&Jt(o,r),[s,o]}function oS(e,t,n,r,o,s){return{locale:t,key:n,warnHtmlMessage:o,onError:i=>{throw s&&s(i),i},onCacheKey:i=>gw(t,n,i)}}function sS(e,t,n,r){const{modifiers:o,pluralRules:s,messageResolver:i,fallbackLocale:a,fallbackWarn:l,missingWarn:u,fallbackContext:m}=e,f={locale:t,modifiers:o,pluralRules:s,messages:p=>{let h=i(n,p);if(h==null&&m){const[,,g]=zy(m,p,t,a,l,u);h=i(g,p)}if(Ce(h)||ws(h)){let g=!1;const k=vy(e,p,t,h,p,()=>{g=!0});return g?Nf:k}else return On(h)?h:Nf}};return e.processor&&(f.processor=e.processor),r.list&&(f.list=r.list),r.named&&(f.named=r.named),Nt(r.plural)&&(f.pluralIndex=r.plural),f}function Rf(e,...t){const{datetimeFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__datetimeFormatters:a}=e,[l,u,m,d]=Iu(...t),f=wt(m.missingWarn)?m.missingWarn:e.missingWarn;wt(m.fallbackWarn)?m.fallbackWarn:e.fallbackWarn;const p=!!m.part,h=Bd(e,m),g=i(e,o,h);if(!Ce(l)||l==="")return new Intl.DateTimeFormat(h,d).format(u);let z={},k,w=null;const _="datetime format";for(let C=0;C{by.includes(l)?i[l]=n[l]:s[l]=n[l]}),Ce(r)?s.locale=r:Je(r)&&(i=r),Je(o)&&(i=o),[s.key||"",a,s,i]}function Mf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__datetimeFormatters.has(s)&&r.__datetimeFormatters.delete(s)}}function Ff(e,...t){const{numberFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__numberFormatters:a}=e,[l,u,m,d]=Lu(...t),f=wt(m.missingWarn)?m.missingWarn:e.missingWarn;wt(m.fallbackWarn)?m.fallbackWarn:e.fallbackWarn;const p=!!m.part,h=Bd(e,m),g=i(e,o,h);if(!Ce(l)||l==="")return new Intl.NumberFormat(h,d).format(u);let z={},k,w=null;const _="number format";for(let C=0;C{Cy.includes(l)?i[l]=n[l]:s[l]=n[l]}),Ce(r)?s.locale=r:Je(r)&&(i=r),Je(o)&&(i=o),[s.key||"",a,s,i]}function Vf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__numberFormatters.has(s)&&r.__numberFormatters.delete(s)}}nk();/*! + * vue-i18n v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */const Fk="9.14.0";function Vk(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Dd().__INTLIFY_PROD_DEVTOOLS__=!1)}const gy=_k.__EXTEND_POINT__,yr=Vl(gy);yr(),yr(),yr(),yr(),yr(),yr(),yr(),yr(),yr();const yy=dr.__EXTEND_POINT__,on=Vl(yy),Mn={UNEXPECTED_RETURN_TYPE:yy,INVALID_ARGUMENT:on(),MUST_BE_CALL_SETUP_TOP:on(),NOT_INSTALLED:on(),NOT_AVAILABLE_IN_LEGACY_MODE:on(),REQUIRED_VALUE:on(),INVALID_VALUE:on(),CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN:on(),NOT_INSTALLED_WITH_PROVIDE:on(),UNEXPECTED_ERROR:on(),NOT_COMPATIBLE_LEGACY_VUE_I18N:on(),BRIDGE_SUPPORT_VUE_2_ONLY:on(),MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION:on(),NOT_AVAILABLE_COMPOSITION_IN_LEGACY:on(),__EXTEND_POINT__:on()};function Jn(e,...t){return As(e,null,void 0)}const Au=uo("__translateVNode"),Ou=uo("__datetimeParts"),Pu=uo("__numberParts"),Hk=uo("__setPluralRules"),Uk=uo("__injectWithOption"),Iu=uo("__dispose");function Si(e){if(!ct(e))return e;for(const t in e)if(Qa(e,t))if(!t.includes("."))ct(e[t])&&Si(e[t]);else{const n=t.split("."),r=n.length-1;let o=e,s=!1;for(let i=0;i{if("locale"in a&&"resource"in a){const{locale:l,resource:u}=a;l?(i[l]=i[l]||{},Ea(u,i[l])):Ea(u,i)}else Ce(a)&&Ea(JSON.parse(a),i)}),o==null&&s)for(const a in i)Qa(i,a)&&Si(i[a]);return i}function vy(e){return e.type}function jk(e,t,n){let r=ct(t.messages)?t.messages:{};"__i18nGlobal"in n&&(r=zy(e.locale.value,{messages:r,__i18n:n.__i18nGlobal}));const o=Object.keys(r);o.length&&o.forEach(s=>{e.mergeLocaleMessage(s,r[s])});{if(ct(t.datetimeFormats)){const s=Object.keys(t.datetimeFormats);s.length&&s.forEach(i=>{e.mergeDateTimeFormat(i,t.datetimeFormats[i])})}if(ct(t.numberFormats)){const s=Object.keys(t.numberFormats);s.length&&s.forEach(i=>{e.mergeNumberFormat(i,t.numberFormats[i])})}}}function Nf(e){return b(Er,null,e,0)}const Df="__INTLIFY_META__",Rf=()=>[],Bk=()=>!1;let Mf=0;function Ff(e){return(t,n,r,o)=>e(n,r,Hn()||void 0,o)}const Wk=()=>{const e=Hn();let t=null;return e&&(t=vy(e)[Df])?{[Df]:t}:null};function by(e={},t){const{__root:n,__injectWithOption:r}=e,o=n===void 0,s=e.flatJson,i=Xa?In:md,a=!!e.translateExistCompatible;let l=Ct(e.inheritLocale)?e.inheritLocale:!0;const u=i(n&&l?n.locale.value:Ce(e.locale)?e.locale:tl),m=i(n&&l?n.fallbackLocale.value:Ce(e.fallbackLocale)||Ft(e.fallbackLocale)||Je(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:u.value),d=i(zy(u.value,e)),f=i(Je(e.datetimeFormats)?e.datetimeFormats:{[u.value]:{}}),p=i(Je(e.numberFormats)?e.numberFormats:{[u.value]:{}});let h=n?n.missingWarn:Ct(e.missingWarn)||Ja(e.missingWarn)?e.missingWarn:!0,g=n?n.fallbackWarn:Ct(e.fallbackWarn)||Ja(e.fallbackWarn)?e.fallbackWarn:!0,z=n?n.fallbackRoot:Ct(e.fallbackRoot)?e.fallbackRoot:!0,k=!!e.fallbackFormat,w=Tt(e.missing)?e.missing:null,_=Tt(e.missing)?Ff(e.missing):null,v=Tt(e.postTranslation)?e.postTranslation:null,S=n?n.warnHtmlMessage:Ct(e.warnHtmlMessage)?e.warnHtmlMessage:!0,C=!!e.escapeParameter;const L=n?n.modifiers:Je(e.modifiers)?e.modifiers:{};let D=e.pluralRules||n&&n.pluralRules,$;$=(()=>{o&&xf(null);const H={version:Fk,locale:u.value,fallbackLocale:m.value,messages:d.value,modifiers:L,pluralRules:D,missing:_===null?void 0:_,missingWarn:h,fallbackWarn:g,fallbackFormat:k,unresolving:!0,postTranslation:v===null?void 0:v,warnHtmlMessage:S,escapeParameter:C,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};H.datetimeFormats=f.value,H.numberFormats=p.value,H.__datetimeFormatters=Je($)?$.__datetimeFormatters:void 0,H.__numberFormatters=Je($)?$.__numberFormatters:void 0;const Z=$k(H);return o&&xf(Z),Z})(),Ms($,u.value,m.value);function q(){return[u.value,m.value,d.value,f.value,p.value]}const U=Ht({get:()=>u.value,set:H=>{u.value=H,$.locale=u.value}}),W=Ht({get:()=>m.value,set:H=>{m.value=H,$.fallbackLocale=m.value,Ms($,u.value,H)}}),ne=Ht(()=>d.value),me=Ht(()=>f.value),K=Ht(()=>p.value);function re(){return Tt(v)?v:null}function ce(H){v=H,$.postTranslation=H}function Ne(){return w}function st(H){H!==null&&(_=Ff(H)),w=H,$.missing=_}const Ve=(H,Z,Se,M,V,G)=>{q();let oe;try{__INTLIFY_PROD_DEVTOOLS__,o||($.fallbackContext=n?Ek():void 0),oe=H($)}finally{__INTLIFY_PROD_DEVTOOLS__,o||($.fallbackContext=void 0)}if(Se!=="translate exists"&&Ut(oe)&&oe===Hl||Se==="translate exists"&&!oe){const[ye,$e]=Z();return n&&z?M(n):V(ye)}else{if(G(oe))return oe;throw Jn(Mn.UNEXPECTED_RETURN_TYPE)}};function He(...H){return Ve(Z=>Reflect.apply(Af,null,[Z,...H]),()=>Eu(...H),"translate",Z=>Reflect.apply(Z.t,Z,[...H]),Z=>Z,Z=>Ce(Z))}function it(...H){const[Z,Se,M]=H;if(M&&!ct(M))throw Jn(Mn.INVALID_ARGUMENT);return He(Z,Se,Xt({resolvedMessage:!0},M||{}))}function at(...H){return Ve(Z=>Reflect.apply(Of,null,[Z,...H]),()=>$u(...H),"datetime format",Z=>Reflect.apply(Z.d,Z,[...H]),()=>kf,Z=>Ce(Z))}function ut(...H){return Ve(Z=>Reflect.apply(If,null,[Z,...H]),()=>Tu(...H),"number format",Z=>Reflect.apply(Z.n,Z,[...H]),()=>kf,Z=>Ce(Z))}function We(H){return H.map(Z=>Ce(Z)||Ut(Z)||Ct(Z)?Nf(String(Z)):Z)}const fe={normalize:We,interpolate:H=>H,type:"vnode"};function le(...H){return Ve(Z=>{let Se;const M=Z;try{M.processor=fe,Se=Reflect.apply(Af,null,[M,...H])}finally{M.processor=null}return Se},()=>Eu(...H),"translate",Z=>Z[Au](...H),Z=>[Nf(Z)],Z=>Ft(Z))}function ge(...H){return Ve(Z=>Reflect.apply(If,null,[Z,...H]),()=>Tu(...H),"number format",Z=>Z[Pu](...H),Rf,Z=>Ce(Z)||Ft(Z))}function Ue(...H){return Ve(Z=>Reflect.apply(Of,null,[Z,...H]),()=>$u(...H),"datetime format",Z=>Z[Ou](...H),Rf,Z=>Ce(Z)||Ft(Z))}function Ge(H){D=H,$.pluralRules=D}function A(H,Z){return Ve(()=>{if(!H)return!1;const Se=Ce(Z)?Z:u.value,M=te(Se),V=$.messageResolver(M,H);return a?V!=null:vs(V)||An(V)||Ce(V)},()=>[H],"translate exists",Se=>Reflect.apply(Se.te,Se,[H,Z]),Bk,Se=>Ct(Se))}function P(H){let Z=null;const Se=ay($,m.value,u.value);for(let M=0;M{l&&(u.value=H,$.locale=H,Ms($,u.value,m.value))}),Nn(n.fallbackLocale,H=>{l&&(m.value=H,$.fallbackLocale=H,Ms($,u.value,m.value))}));const se={id:Mf,locale:U,fallbackLocale:W,get inheritLocale(){return l},set inheritLocale(H){l=H,H&&n&&(u.value=n.locale.value,m.value=n.fallbackLocale.value,Ms($,u.value,m.value))},get availableLocales(){return Object.keys(d.value).sort()},messages:ne,get modifiers(){return L},get pluralRules(){return D||{}},get isGlobal(){return o},get missingWarn(){return h},set missingWarn(H){h=H,$.missingWarn=h},get fallbackWarn(){return g},set fallbackWarn(H){g=H,$.fallbackWarn=g},get fallbackRoot(){return z},set fallbackRoot(H){z=H},get fallbackFormat(){return k},set fallbackFormat(H){k=H,$.fallbackFormat=k},get warnHtmlMessage(){return S},set warnHtmlMessage(H){S=H,$.warnHtmlMessage=H},get escapeParameter(){return C},set escapeParameter(H){C=H,$.escapeParameter=H},t:He,getLocaleMessage:te,setLocaleMessage:X,mergeLocaleMessage:ie,getPostTranslationHandler:re,setPostTranslationHandler:ce,getMissingHandler:Ne,setMissingHandler:st,[Hk]:Ge};return se.datetimeFormats=me,se.numberFormats=K,se.rt=it,se.te=A,se.tm=j,se.d=at,se.n=ut,se.getDateTimeFormat=pe,se.setDateTimeFormat=E,se.mergeDateTimeFormat=T,se.getNumberFormat=R,se.setNumberFormat=Q,se.mergeNumberFormat=de,se[Uk]=r,se[Au]=le,se[Ou]=Ue,se[Pu]=ge,se}const Hd={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e==="parent"||e==="global",default:"parent"},i18n:{type:Object}};function qk({slots:e},t){return t.length===1&&t[0]==="default"?(e.default?e.default():[]).reduce((r,o)=>[...r,...o.type===ve?o.children:[o]],[]):t.reduce((n,r)=>{const o=e[r];return o&&(n[r]=o()),n},{})}function Cy(e){return ve}const Gk=Ar({name:"i18n-t",props:Xt({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>Ut(e)||!isNaN(e)}},Hd),setup(e,t){const{slots:n,attrs:r}=t,o=e.i18n||Ud({useScope:e.scope,__useComponent:!0});return()=>{const s=Object.keys(n).filter(d=>d!=="_"),i={};e.locale&&(i.locale=e.locale),e.plural!==void 0&&(i.plural=Ce(e.plural)?+e.plural:e.plural);const a=qk(t,s),l=o[Au](e.keypath,a,i),u=Xt({},r),m=Ce(e.tag)||ct(e.tag)?e.tag:Cy();return ur(m,u,l)}}}),Vf=Gk;function Kk(e){return Ft(e)&&!Ce(e[0])}function wy(e,t,n,r){const{slots:o,attrs:s}=t;return()=>{const i={part:!0};let a={};e.locale&&(i.locale=e.locale),Ce(e.format)?i.key=e.format:ct(e.format)&&(Ce(e.format.key)&&(i.key=e.format.key),a=Object.keys(e.format).reduce((f,p)=>n.includes(p)?Xt({},f,{[p]:e.format[p]}):f,{}));const l=r(e.value,i,a);let u=[i.key];Ft(l)?u=l.map((f,p)=>{const h=o[f.type],g=h?h({[f.type]:f.value,index:p,parts:l}):[f.value];return Kk(g)&&(g[0].key=`${f.type}-${p}`),g}):Ce(l)&&(u=[l]);const m=Xt({},s),d=Ce(e.tag)||ct(e.tag)?e.tag:Cy();return ur(d,m,u)}}const Zk=Ar({name:"i18n-n",props:Xt({value:{type:Number,required:!0},format:{type:[String,Object]}},Hd),setup(e,t){const n=e.i18n||Ud({useScope:e.scope,__useComponent:!0});return wy(e,t,_y,(...r)=>n[Pu](...r))}}),Hf=Zk,Yk=Ar({name:"i18n-d",props:Xt({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},Hd),setup(e,t){const n=e.i18n||Ud({useScope:e.scope,__useComponent:!0});return wy(e,t,hy,(...r)=>n[Ou](...r))}}),Uf=Yk;function Xk(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 Jk(e){const t=i=>{const{instance:a,modifiers:l,value:u}=i;if(!a||!a.$)throw Jn(Mn.UNEXPECTED_ERROR);const m=Xk(e,a.$),d=jf(u);return[Reflect.apply(m.t,m,[...Bf(d)]),m]};return{created:(i,a)=>{const[l,u]=t(a);Xa&&e.global===u&&(i.__i18nWatcher=Nn(u.locale,()=>{a.instance&&a.instance.$forceUpdate()})),i.__composer=u,i.textContent=l},unmounted:i=>{Xa&&i.__i18nWatcher&&(i.__i18nWatcher(),i.__i18nWatcher=void 0,delete i.__i18nWatcher),i.__composer&&(i.__composer=void 0,delete i.__composer)},beforeUpdate:(i,{value:a})=>{if(i.__composer){const l=i.__composer,u=jf(a);i.textContent=Reflect.apply(l.t,l,[...Bf(u)])}},getSSRProps:i=>{const[a]=t(i);return{textContent:a}}}}function jf(e){if(Ce(e))return{path:e};if(Je(e)){if(!("path"in e))throw Jn(Mn.REQUIRED_VALUE,"path");return e}else throw Jn(Mn.INVALID_VALUE)}function Bf(e){const{path:t,locale:n,args:r,choice:o,plural:s}=e,i={},a=r||{};return Ce(n)&&(i.locale=n),Ut(o)&&(i.plural=o),Ut(s)&&(i.plural=s),[t,a,i]}function Qk(e,t,...n){const r=Je(n[0])?n[0]:{},o=!!r.useI18nComponentName;(Ct(r.globalInstall)?r.globalInstall:!0)&&([o?"i18n":Vf.name,"I18nT"].forEach(i=>e.component(i,Vf)),[Hf.name,"I18nN"].forEach(i=>e.component(i,Hf)),[Uf.name,"I18nD"].forEach(i=>e.component(i,Uf))),e.directive("t",Jk(t))}const eS=uo("global-vue-i18n");function tS(e={},t){const n=Ct(e.globalInjection)?e.globalInjection:!0,r=!0,o=new Map,[s,i]=nS(e),a=uo("");function l(d){return o.get(d)||null}function u(d,f){o.set(d,f)}function m(d){o.delete(d)}{const d={get mode(){return"composition"},get allowComposition(){return r},async install(f,...p){if(f.__VUE_I18N_SYMBOL__=a,f.provide(f.__VUE_I18N_SYMBOL__,d),Je(p[0])){const z=p[0];d.__composerExtend=z.__composerExtend,d.__vueI18nExtend=z.__vueI18nExtend}let h=null;n&&(h=uS(f,d.global)),Qk(f,d,...p);const g=f.unmount;f.unmount=()=>{h&&h(),d.dispose(),g()}},get global(){return i},dispose(){s.stop()},__instances:o,__getInstance:l,__setInstance:u,__deleteInstance:m};return d}}function Ud(e={}){const t=Hn();if(t==null)throw Jn(Mn.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw Jn(Mn.NOT_INSTALLED);const n=rS(t),r=sS(n),o=vy(t),s=oS(e,o);if(s==="global")return jk(r,e,o),r;if(s==="parent"){let l=iS(n,t,e.__useComponent);return l==null&&(l=r),l}const i=n;let a=i.__getInstance(t);if(a==null){const l=Xt({},e);"__i18n"in o&&(l.__i18n=o.__i18n),r&&(l.__root=r),a=by(l),i.__composerExtend&&(a[Iu]=i.__composerExtend(a)),lS(i,t,a),i.__setInstance(t,a)}return a}function nS(e,t,n){const r=zl();{const o=r.run(()=>by(e));if(o==null)throw Jn(Mn.UNEXPECTED_ERROR);return[r,o]}}function rS(e){{const t=Ln(e.isCE?eS:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw Jn(e.isCE?Mn.NOT_INSTALLED_WITH_PROVIDE:Mn.UNEXPECTED_ERROR);return t}}function oS(e,t){return Fl(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function sS(e){return e.mode==="composition"?e.global:e.global.__composer}function iS(e,t,n=!1){let r=null;const o=t.root;let s=aS(t,n);for(;s!=null;){const i=e;if(e.mode==="composition"&&(r=i.__getInstance(s)),r!=null||o===s)break;s=s.parent}return r}function aS(e,t=!1){return e==null?null:t&&e.vnode.ctx||e.parent}function lS(e,t,n){Es(()=>{},t),Ii(()=>{const r=n;e.__deleteInstance(t);const o=r[Iu];o&&(o(),delete r[Iu])},t)}const cS=["locale","fallbackLocale","availableLocales"],Wf=["t","rt","d","n","tm","te"];function uS(e,t){const n=Object.create(null);return cS.forEach(o=>{const s=Object.getOwnPropertyDescriptor(t,o);if(!s)throw Jn(Mn.UNEXPECTED_ERROR);const i=At(s.value)?{get(){return s.value.value},set(a){s.value.value=a}}:{get(){return s.get&&s.get()}};Object.defineProperty(n,o,i)}),e.config.globalProperties.$i18n=n,Wf.forEach(o=>{const s=Object.getOwnPropertyDescriptor(t,o);if(!s||!s.value)throw Jn(Mn.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${o}`,s)}),()=>{delete e.config.globalProperties.$i18n,Wf.forEach(o=>{delete e.config.globalProperties[`$${o}`]})}}Vk();Ck(Lk);wk(rk);kk(ay);if(__INTLIFY_PROD_DEVTOOLS__){const e=Dd();e.__INTLIFY__=!0,mk(e.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}const bc=e=>e&&typeof e=="object"&&!Array.isArray(e),Lu=(e,...t)=>{if(!t.length)return e;const n=t.shift();if(bc(e)&&bc(n))for(const r in n)bc(n[r])?(e[r]||Object.assign(e,{[r]:{}}),Lu(e[r],n[r])):Object.assign(e,{[r]:n[r]});return Lu(e,...t)},dS=Lu({},{de:{data:{kind:{file:e=>{const{normalize:t}=e;return t(["Datei"])},url:e=>{const{normalize:t}=e;return t(["URL"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["Stream"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},help:e=>{const{normalize:t}=e;return t(["Hinzufügen eines Podcasts führt zur Anlage einer RSS-Playlist, so kann OwnTone das Podcast-Abo verwalten."])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["Verarbeite…"])},title:e=>{const{normalize:t}=e;return t(["Podcast hinzufügen"])}},stream:{add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},loading:e=>{const{normalize:t}=e;return t(["Lade…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},title:e=>{const{normalize:t}=e;return t(["Stream hinzufügen"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"added-on":e=>{const{normalize:t}=e;return t(["Hinzugefügt am"])},artist:e=>{const{normalize:t}=e;return t(["Album Künstler"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Markiere als gespielt"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Entferne podcast"])},tracks:e=>{const{normalize:t}=e;return t(["Track Nummer"])},type:e=>{const{normalize:t}=e;return t(["Art"])},year:e=>{const{normalize:t}=e;return t(["Jahr"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"added-on":e=>{const{normalize:t}=e;return t(["Hinzugefügt am"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Art"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Art"])},save:{cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},"playlist-name":e=>{const{normalize:t}=e;return t(["Playlistname"])},save:e=>{const{normalize:t}=e;return t(["Speichern"])},saving:e=>{const{normalize:t}=e;return t(["Speichere…"])},title:e=>{const{normalize:t}=e;return t(["Warteschlange als Playlist speichern"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["Komponist"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Qualität"])},remove:e=>{const{normalize:t}=e;return t(["Entfernen"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["Album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["Künstler"])},type:e=>{const{normalize:t}=e;return t(["Art"])},year:e=>{const{normalize:t}=e;return t(["Jahr"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},pair:e=>{const{normalize:t}=e;return t(["Remote paaren"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing-Code"])},title:e=>{const{normalize:t}=e;return t(["Remote-Paarungs-Anfrage"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])},type:e=>{const{normalize:t}=e;return t(["Art"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},popularity:e=>{const{normalize:t}=e;return t(["Popularität / Followers"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},owner:e=>{const{normalize:t}=e;return t(["Besitzer"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},album:e=>{const{normalize:t}=e;return t(["Album"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"added-on":e=>{const{normalize:t}=e;return t(["Hinzugefügt am"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Kb/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["Kommentar"])},composer:e=>{const{normalize:t}=e;return t(["Komponist"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["Markiere als neu"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Markiere als gespielt"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Qualität"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["Album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["Künstler"])},type:e=>{const{normalize:t}=e;return t(["Art"])},year:e=>{const{normalize:t}=e;return t(["Jahr"])}},update:{all:e=>{const{normalize:t}=e;return t(["Alles neu einlesen"])},cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},feeds:e=>{const{normalize:t}=e;return t(["Nur RSS-Feeds neu einlesen"])},info:e=>{const{normalize:t}=e;return t(["Suche nach neuen, gelöschten und veränderten Dateien"])},local:e=>{const{normalize:t}=e;return t(["Nur lokale Bibliothek neu einlesen"])},progress:e=>{const{normalize:t}=e;return t(["Bibliothek wird neu eingelesen…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["Metadata von unveränderten Dateien neu einlesen"])},rescan:e=>{const{normalize:t}=e;return t(["Neu einlesen"])},spotify:e=>{const{normalize:t}=e;return t(["Nur Spotify neu einlesen"])},title:e=>{const{normalize:t}=e;return t(["Bibliothek neu einlesen"])}}},language:{de:e=>{const{normalize:t}=e;return t(["Deutsch"])},en:e=>{const{normalize:t}=e;return t(["Englisch (English)"])},fr:e=>{const{normalize:t}=e;return t(["Französisch (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["Vereinfachtes Chinesisch (簡體中文)"])},"zh-TW":e=>{const{normalize:t}=e;return t(["Traditionelles Chinesisch (繁體中文)"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["Diesen Podcast dauerhaft aus der Bibliothek löschen?"])},"info-2":e=>{const{normalize:t}=e;return t(["Dies wir auch RSS-Playlisten löschen "])},remove:e=>{const{normalize:t}=e;return t(["Entfernen"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Entferne podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["Track kann nicht gespielt werden"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([", Beschränkungsgrund: ",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["Album"])},audiobook:e=>{const{normalize:t}=e;return t(["Hörbuch"])},music:e=>{const{normalize:t}=e;return t(["Musik"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["Über"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP-stream-Fehler: Stream kann nicht geladen werden oder wurde wg. Netzwerkfehler gestopt"])},stream:e=>{const{normalize:t}=e;return t(["HTTP-stream"])},volume:e=>{const{normalize:t}=e;return t(["Lautstärke"])},files:e=>{const{normalize:t}=e;return t(["Dateien"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},music:e=>{const{normalize:t}=e;return t(["Musik"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},search:e=>{const{normalize:t}=e;return t(["Suche"])},settings:e=>{const{normalize:t}=e;return t(["Einstellungen"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["Bibliothek neu einlesen"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Oberfläche erstellt mit ",n(r("bulma")),", ",n(r("mdi")),", ",n(r("vuejs")),", ",n(r("axios"))," und ",n(r("others")),"."])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Compiliert mit Unterstützung von ",n(r("options")),"."])},library:e=>{const{normalize:t}=e;return t(["Bibliothek"])},more:e=>{const{normalize:t}=e;return t(["mehr"])},"total-playtime":e=>{const{normalize:t}=e;return t(["Gesamte Spielzeit"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},update:e=>{const{normalize:t}=e;return t(["Neu einlesen"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["vor ",n(r("time"))])},updated:e=>{const{normalize:t}=e;return t(["Neu eingelesen"])},uptime:e=>{const{normalize:t}=e;return t(["Laufzeit"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Version ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles und Alben angezeigt, die nur in Playlisten enthalten sind."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles angezeigt"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Alben angezeigt, die nur in der Spotify-Bibliothek enthalten sind."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Verbirgt Spotify-Alben"])},title:e=>{const{normalize:t}=e;return t(["Alben"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["Künstler › Name"])},"artist-date":e=>{const{normalize:t}=e;return t(["Künstler › Erscheinungsdatum"])},title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},"recently-added":e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt"])},"recently-released":e=>{const{normalize:t}=e;return t(["Kürzlich erschienen"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung wird kein Inhalt angezeigt, der nur in der Spotify-Bibliothek enthalten ist."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Verbirgt Spotify-Inhalt"])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("count"))," Künstler"])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Namen"])},"recently-added":e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles und Alben angezeigt, die nur in Playlisten enthalten sind."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles angezeigt"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Alben angezeigt, die nur in der Spotify-Bibliothek enthalten sind."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Verbirgt Künstler auf Spotify"])},title:e=>{const{normalize:t}=e;return t(["Künstler"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["Spielen"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Hörbuch"]),t([n(r("count"))," Hörbuch"]),t([n(r("count"))," Hörbücher"])])},title:e=>{const{normalize:t}=e;return t(["Hörbücher"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},play:e=>{const{normalize:t}=e;return t(["Spielen"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Autor"]),t([n(r("count"))," Autor"]),t([n(r("count"))," Autoren"])])},title:e=>{const{normalize:t}=e;return t(["Autoren"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["Autoren"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Komponist"]),t([n(r("count"))," Komponist"]),t([n(r("count"))," Komponisten"])])},title:e=>{const{normalize:t}=e;return t(["Komponisten"])}},files:{play:e=>{const{normalize:t}=e;return t(["Spielen"])},title:e=>{const{normalize:t}=e;return t(["Dateien"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Genre"]),t([n(r("count"))," Genre"]),t([n(r("count"))," Genres"])])},title:e=>{const{normalize:t}=e;return t(["Genres"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["Zeige mehr"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["Kürzlich gespielt"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},composers:e=>{const{normalize:t}=e;return t(["Komponisten"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},history:e=>{const{normalize:t}=e;return t(["Verlauf"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["Tracks durch Auswählen aus der Bibliothek anfügen"])},live:e=>{const{normalize:t}=e;return t(["Live"])},title:e=>{const{normalize:t}=e;return t(["Deine Playliste ist leer."])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," Tracks"])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["Playlisten"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Playlist"]),t([n(r("count"))," Playlisten"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},remove:e=>{const{normalize:t}=e;return t(["Entfernen"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["Diesen Podcast wirklich dauerhaft aus der Bibliothek löschen?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["Damit wird auch die RSS-Playliste gelöscht. "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Entferne podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Podcast"]),t([n(r("count"))," Podcasts"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["Alle abgespielten markieren"])},"new-episodes":e=>{const{normalize:t}=e;return t(["Neue Episoden"])},title:e=>{const{normalize:t}=e;return t(["Podcasts"])},update:e=>{const{normalize:t}=e;return t(["Neu einlesen"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["Stream hinzufügen"])},clear:e=>{const{normalize:t}=e;return t(["Alle entfernen"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},edit:e=>{const{normalize:t}=e;return t(["Bearbeiten"])},"hide-previous":e=>{const{normalize:t}=e;return t(["Vorherige verbergen"])},title:e=>{const{normalize:t}=e;return t(["Warteschlange"])},save:e=>{const{normalize:t}=e;return t(["Speichern"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Station"]),t([n(r("count"))," Station"]),t([n(r("count"))," Stationen"])])},title:e=>{const{normalize:t}=e;return t(["Radio"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},composers:e=>{const{normalize:t}=e;return t(["Komponisten"])},expression:e=>{const{normalize:t}=e;return t(["Ausdrücken"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Tip: Du kannst mit einer Smart-Playlist-Abfrage-Sprache nach ",n(r("help"))," suchen wenn Du dem Ausdruck ein ",n(r("query"))," voranstellst."])},"no-results":e=>{const{normalize:t}=e;return t(["Keine Ergebnisse gefunden"])},placeholder:e=>{const{normalize:t}=e;return t(["Suche"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige das Album"]),t(["Zeige alle ",n(r("count"))," Alben"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Künstler"]),t(["Zeige alle ",n(r("count"))," Künstler"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige das Buch"]),t(["Zeige alle ",n(r("count"))," Hörbücher"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Komponist"]),t(["Zeige alle ",n(r("count"))," Komponisten"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige die Playlist"]),t(["Zeige alle ",n(r("count"))," Playlisten"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Podcast"]),t(["Zeige alle ",n(r("count"))," Podcasts"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Track"]),t(["Zeige alle ",n(r("count"))," Tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},tabs:{library:e=>{const{normalize:t}=e;return t(["Bibliothek"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{artwork:e=>{const{normalize:t}=e;return t(["Artwork"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone verarbeitet PNG- und JPEG-Artwork, welches in einer eigenen Datei in der Bibliothek, in die Dateien eingebettet oder online von Radiostationen bereitgestellt werden kann."])},"explanation-2":e=>{const{normalize:t}=e;return t(["Zusätzlich kann auf folgende Artwork-Anbieter zugegriffen werden:"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["Keine aktive Pairing-Anfrage"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing-Code"])},"pairing-request":e=>{const{normalize:t}=e;return t(["Remote-Pairing-Anfrage von "])},pairing:e=>{const{normalize:t}=e;return t(["Pairing Remote"])},send:e=>{const{normalize:t}=e;return t(["Senden"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["Wenn der Laufsprecher PIN-basiertes Pairing verlangt, aktiviere ihn hier und gib dann den hier PIN an, der am Lautsprecher angezeigt wird."])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["Lautsprecher-Pairing und Geräteverifikation"])},"verification-code":e=>{const{normalize:t}=e;return t(["Verifikationscode"])},verify:e=>{const{normalize:t}=e;return t(["Verifizieren"])}},general:{"album-lists":e=>{const{normalize:t}=e;return t(["Album-Listen"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},files:e=>{const{normalize:t}=e;return t(["Dateien"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},language:e=>{const{normalize:t}=e;return t(["Sprache"])},music:e=>{const{normalize:t}=e;return t(["Musik"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["Wenn mehr Dateien ausgewählt werden, als der Bildschirm anzeigen kann, verschwindet das Burger-Menü."])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["Wähle hier die Einträge des oberen Navigationsmenüs "])},"navigation-items":e=>{const{normalize:t}=e;return t(["Navigationsmenüs"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["Aktuell läuft-Seite"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(['Beschränkte die Zahl der Alben auf der "kürzlich hinzugefügt"-Seite'])},"recently-added-page":e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt-Seite"])},search:e=>{const{normalize:t}=e;return t(["Suche"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(['Komma-separierte Liste der Genres, wo der Komponist auf der "Aktuell läuft"-Seite angezeigt werden soll'])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["Leer lassen, um ihn immer anzuzeigen."])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(['Der Genre-Tag des aktuellen Tracks wird abgeglichen als Teil-String des Genre-Tags. Z.B. "classical, soundtrack" wird den Komponisten beim Genre-Tag "Contemporary Classical" anzeigen'])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["Zeige den Komponisten für die aufgelisteten Genres an"])},"show-composer-info":e=>{const{normalize:t}=e;return t(['Wenn aktiviert, wird der Komponist auf der "Aktuell läuft"-Seite angezeigt.'])},"show-composer":e=>{const{normalize:t}=e;return t(["Komponisten anzeigen"])},"show-coverart":e=>{const{normalize:t}=e;return t(["Zeige Cover-Artwork in der Albumliste"])},"show-path":e=>{const{normalize:t}=e;return t(['Dateipfad auf der "Aktuell läuft"-Seite anzeigen'])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["Melde Dich mit Deinem Last.fm-Benutzernamen und Passwort an, um Scrobbeln zu aktivieren"])},info:e=>{const{normalize:t}=e;return t(["OwnTone wird den Benutzernamen und das Passwort von last.fm nicht speichern, nur den Sitzungs-Schlüssel. Dieser läuft nicht ab."])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone wurde ohne Unterstützung für Last.fm erstellt."])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone wurde entweder ohne Unterstützung für Spotify erstellt oder libspotify ist nicht installiert."])},"logged-as":e=>{const{normalize:t}=e;return t(["Angemeldet als "])},requirements:e=>{const{normalize:t}=e;return t(["Spotify Premium Abo erforderlich."])},scopes:e=>{const{normalize:t}=e;return t(["Zugriff auf die Spotify Web-Api ermöglicht scannen der Spotify-Blibliothek. Erforderliche scopes sind: "])},user:e=>{const{normalize:t}=e;return t(["Zugriff gestattet für "])},authorize:e=>{const{normalize:t}=e;return t(["Authorisiere Web-API-Zugriff"])},"grant-access":e=>{const{normalize:t}=e;return t(["Zugriff auf die Spotify Web-API gestatten"])},reauthorize:e=>{const{normalize:t}=e;return t(["Bitte den Zugriff der Web-API durch setzen folgender Zugriffsrechte für OwnTone: "])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["Einloggen"])},logout:e=>{const{normalize:t}=e;return t(["Ausloggen"])},password:e=>{const{normalize:t}=e;return t(["Passwort"])},username:e=>{const{normalize:t}=e;return t(["Benutzername"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["Artwork"])},general:e=>{const{normalize:t}=e;return t(["Allgemein"])},"online-services":e=>{const{normalize:t}=e;return t(["Online-Services"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["Fernbedienungen und Ausgänge"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["Ausgezeichnete Playlisten"])},"new-releases":e=>{const{normalize:t}=e;return t(["Neuvorstellung"])},"show-more":e=>{const{normalize:t}=e;return t(["Zeige mehr"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},"no-results":e=>{const{normalize:t}=e;return t(["Keine Ergebnisse gefunden"])},placeholder:e=>{const{normalize:t}=e;return t(["Suche"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige das Album"]),t(["Zeige alle ",n(r("count"))," Alben"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Künstler"]),t(["Zeige alle ",n(r("count"))," Künstler"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige die Playlist"]),t(["Zeige alle ",n(r("count"))," Playlisten"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Track"]),t(["Zeige alle ",n(r("count"))," Tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["Ordner"])},plain:e=>{const{normalize:t}=e;return t(["Einfache"])},smart:e=>{const{normalize:t}=e;return t(["Intelligente"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["Verlauf löschen"])},pause:e=>{const{normalize:t}=e;return t(["Wiedergabe anhalten"])},play:e=>{const{normalize:t}=e;return t(["Wiedergeben"])},repeat:e=>{const{normalize:t}=e;return t(["Alle Tracks wiederholen"])},"repeat-off":e=>{const{normalize:t}=e;return t(["Tracks einmal lesen"])},"repeat-once":e=>{const{normalize:t}=e;return t(["Aktuellen Track wiederholen"])},"seek-backward":e=>{const{normalize:t}=e;return t(["Rückwärts im Track suchen"])},"seek-forward":e=>{const{normalize:t}=e;return t(["Vorwärts im Track suchen"])},shuffle:e=>{const{normalize:t}=e;return t(["Tracks zufällig wiedergeben"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["Tracks in Reihenfolge wiedergeben"])},"skip-backward":e=>{const{normalize:t}=e;return t(["Zum vorherigen Track springen"])},"skip-forward":e=>{const{normalize:t}=e;return t(["Zum nächsten Track springen"])},stop:e=>{const{normalize:t}=e;return t(["Wiedergabe stoppen"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["Liedtexte anzeigen/verbergen"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (Fehler beim Speichern der Einstellungen)"])},saved:e=>{const{normalize:t}=e;return t([" (Einstellungen gesichert)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["Fehler bei Verbindung zum OwnTone-Server"])},"missing-port":e=>{const{normalize:t}=e;return t(["Fehlender Websocket-Port"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Anfrage gescheitert (Status: ",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Warteschlange zu Playlist ",n(r("name"))," gesichert"])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track an die Abspielliste angehängt"]),t([n(r("count"))," Tracks an die Abspielliste angehängt"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["Warteschlange ist leer"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["Heute"])},"last-week":e=>{const{normalize:t}=e;return t(["Letzte Woche"])},"last-month":e=>{const{normalize:t}=e;return t(["Letzer Monat"])},undefined:e=>{const{normalize:t}=e;return t(["Unbestimmt"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["Mono"])},stereo:e=>{const{normalize:t}=e;return t(["Stereo"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Kanal"]),t([n(r("count"))," Kanäle"])])}}}},{en:{data:{kind:{file:e=>{const{normalize:t}=e;return t(["File"])},url:e=>{const{normalize:t}=e;return t(["URL"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["Stream"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["Add"])},cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},help:e=>{const{normalize:t}=e;return t(["Adding a podcast includes creating an RSS playlist, that will allow OwnTone to manage the podcast subscription."])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["Processing…"])},title:e=>{const{normalize:t}=e;return t(["Add podcast"])}},stream:{add:e=>{const{normalize:t}=e;return t(["Add"])},cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},loading:e=>{const{normalize:t}=e;return t(["Loading…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["Play"])},title:e=>{const{normalize:t}=e;return t(["Add stream"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"added-on":e=>{const{normalize:t}=e;return t(["Added on"])},artist:e=>{const{normalize:t}=e;return t(["Album artist"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Mark as played"])},play:e=>{const{normalize:t}=e;return t(["Play"])},"release-date":e=>{const{normalize:t}=e;return t(["Release date"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Remove podcast"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Year"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"added-on":e=>{const{normalize:t}=e;return t(["Added On"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},play:e=>{const{normalize:t}=e;return t(["Play"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},play:e=>{const{normalize:t}=e;return t(["Play"])},path:e=>{const{normalize:t}=e;return t(["Path"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Type"])},save:{cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},"playlist-name":e=>{const{normalize:t}=e;return t(["Playlist name"])},save:e=>{const{normalize:t}=e;return t(["Save"])},saving:e=>{const{normalize:t}=e;return t(["Saving…"])},title:e=>{const{normalize:t}=e;return t(["Save queue to playlist"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["Composer"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Quality"])},remove:e=>{const{normalize:t}=e;return t(["Remove"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artist"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Year"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},pair:e=>{const{normalize:t}=e;return t(["Pair Remote"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing code"])},title:e=>{const{normalize:t}=e;return t(["Remote pairing request"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},play:e=>{const{normalize:t}=e;return t(["Play"])},"release-date":e=>{const{normalize:t}=e;return t(["Release Date"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},play:e=>{const{normalize:t}=e;return t(["Play"])},popularity:e=>{const{normalize:t}=e;return t(["Popularity / Followers"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},owner:e=>{const{normalize:t}=e;return t(["Owner"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},album:e=>{const{normalize:t}=e;return t(["Album"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},"release-date":e=>{const{normalize:t}=e;return t(["Release Date"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"added-on":e=>{const{normalize:t}=e;return t(["Added On"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["Comment"])},composer:e=>{const{normalize:t}=e;return t(["Composer"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["Mark as new"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Mark as played"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Quality"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])},"release-date":e=>{const{normalize:t}=e;return t(["Release Date"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artist"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Year"])}},update:{all:e=>{const{normalize:t}=e;return t(["Update everything"])},cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},feeds:e=>{const{normalize:t}=e;return t(["Only update RSS feeds"])},info:e=>{const{normalize:t}=e;return t(["Scan for new, deleted and modified files"])},local:e=>{const{normalize:t}=e;return t(["Only update local library"])},progress:e=>{const{normalize:t}=e;return t(["Library update in progress…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["Rescan metadata of unmodified files"])},rescan:e=>{const{normalize:t}=e;return t(["Rescan"])},spotify:e=>{const{normalize:t}=e;return t(["Only update Spotify"])},title:e=>{const{normalize:t}=e;return t(["Update library"])}}},language:{de:e=>{const{normalize:t}=e;return t(["German (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["English"])},fr:e=>{const{normalize:t}=e;return t(["French (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["Simplified Chinese (簡體中文)"])},"zh-TW":e=>{const{normalize:t}=e;return t(["Traditional Chinese (繁體中文)"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["Permanently remove this podcast from your library?"])},"info-2":e=>{const{normalize:t}=e;return t(["This will also remove the RSS playlist "])},remove:e=>{const{normalize:t}=e;return t(["Remove"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Remove podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["Track is not playable"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([", restriction reason: ",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["Album"])},audiobook:e=>{const{normalize:t}=e;return t(["Audiobook"])},music:e=>{const{normalize:t}=e;return t(["Music"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["About"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP stream error: failed to load stream or stopped loading due to network problem"])},stream:e=>{const{normalize:t}=e;return t(["HTTP stream"])},volume:e=>{const{normalize:t}=e;return t(["Volume"])},files:e=>{const{normalize:t}=e;return t(["Files"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},music:e=>{const{normalize:t}=e;return t(["Music"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},search:e=>{const{normalize:t}=e;return t(["Search"])},settings:e=>{const{normalize:t}=e;return t(["Settings"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["Update Library"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Web interface built with ",n(r("bulma")),", ",n(r("mdi")),", ",n(r("vuejs")),", ",n(r("axios"))," and ",n(r("others")),"."])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Compiled with support for ",n(r("options")),"."])},library:e=>{const{normalize:t}=e;return t(["Library"])},more:e=>{const{normalize:t}=e;return t(["more"])},"total-playtime":e=>{const{normalize:t}=e;return t(["Total playtime"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},update:e=>{const{normalize:t}=e;return t(["Update"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("time"))," ago"])},updated:e=>{const{normalize:t}=e;return t(["Updated"])},uptime:e=>{const{normalize:t}=e;return t(["Uptime"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Version ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["If active, hides singles and albums with tracks that only appear in playlists."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Hide singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["If active, hides albums that only appear in your Spotify library."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Hide albums from Spotify"])},title:e=>{const{normalize:t}=e;return t(["Albums"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["Artist › Name"])},"artist-date":e=>{const{normalize:t}=e;return t(["Artist › Release date"])},title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},"recently-added":e=>{const{normalize:t}=e;return t(["Recently added"])},"recently-released":e=>{const{normalize:t}=e;return t(["Recently released"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["If active, hides the content only appearing in your Spotify library."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Hide the content from Spotify"])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])},"release-date":e=>{const{normalize:t}=e;return t(["Release date"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," artist"]),t([n(r("count"))," artist"]),t([n(r("count"))," artists"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},"recently-added":e=>{const{normalize:t}=e;return t(["Recently added"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["If active, hides artists that only appear on singles or playlists."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Hide singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["If active, hides artists that only appear in your Spotify library."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Hide artists from Spotify"])},title:e=>{const{normalize:t}=e;return t(["Artists"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["Play"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," audiobook"]),t([n(r("count"))," audiobook"]),t([n(r("count"))," audiobooks"])])},title:e=>{const{normalize:t}=e;return t(["Audiobooks"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},play:e=>{const{normalize:t}=e;return t(["Play"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," author"]),t([n(r("count"))," author"]),t([n(r("count"))," authors"])])},title:e=>{const{normalize:t}=e;return t(["Authors"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["Authors"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," composer"]),t([n(r("count"))," composer"]),t([n(r("count"))," composers"])])},title:e=>{const{normalize:t}=e;return t(["Composers"])}},files:{play:e=>{const{normalize:t}=e;return t(["Play"])},title:e=>{const{normalize:t}=e;return t(["Files"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," genre"]),t([n(r("count"))," genre"]),t([n(r("count"))," genres"])])},title:e=>{const{normalize:t}=e;return t(["Genres"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["Show more"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["Recently added"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["Recently played"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},composers:e=>{const{normalize:t}=e;return t(["Composers"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},history:e=>{const{normalize:t}=e;return t(["History"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["Add some tracks by browsing your library"])},live:e=>{const{normalize:t}=e;return t(["Live"])},title:e=>{const{normalize:t}=e;return t(["Your play queue is empty"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," tracks"])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["Playlists"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," playlist"]),t([n(r("count"))," playlist"]),t([n(r("count"))," playlists"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},play:e=>{const{normalize:t}=e;return t(["Play"])},remove:e=>{const{normalize:t}=e;return t(["Remove"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["Permanently remove this podcast from your library?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["This will also remove the RSS playlist "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Remove podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["Add"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," podcast"]),t([n(r("count"))," podcast"]),t([n(r("count"))," podcasts"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["Mark All Played"])},"new-episodes":e=>{const{normalize:t}=e;return t(["New Episodes"])},title:e=>{const{normalize:t}=e;return t(["Podcasts"])},update:e=>{const{normalize:t}=e;return t(["Update"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["Add stream"])},clear:e=>{const{normalize:t}=e;return t(["Clear"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},edit:e=>{const{normalize:t}=e;return t(["Edit"])},"hide-previous":e=>{const{normalize:t}=e;return t(["Hide previous"])},title:e=>{const{normalize:t}=e;return t(["Queue"])},save:e=>{const{normalize:t}=e;return t(["Save"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," station"]),t([n(r("count"))," station"]),t([n(r("count"))," stations"])])},title:e=>{const{normalize:t}=e;return t(["Radio"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},composers:e=>{const{normalize:t}=e;return t(["Composers"])},expression:e=>{const{normalize:t}=e;return t(["expression"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Tip: you can search by a smart playlist query language ",n(r("help"))," if you prefix it with ",n(r("query")),"."])},"no-results":e=>{const{normalize:t}=e;return t(["No results found"])},placeholder:e=>{const{normalize:t}=e;return t(["Search"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the album"]),t(["Show all ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the artist"]),t(["Show all ",n(r("count"))," artists"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the audiobook"]),t(["Show all ",n(r("count"))," audiobooks"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the composer"]),t(["Show all ",n(r("count"))," composers"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the playlist"]),t(["Show all ",n(r("count"))," playlists"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the podcast"]),t(["Show all ",n(r("count"))," podcasts"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the track"]),t(["Show all ",n(r("count"))," tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},tabs:{library:e=>{const{normalize:t}=e;return t(["Library"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{artwork:e=>{const{normalize:t}=e;return t(["Artwork"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone supports PNG and JPEG artwork which is either placed as separate image files in the library, embedded in the media files or made available online by radio stations."])},"explanation-2":e=>{const{normalize:t}=e;return t(["In addition to that, you can enable fetching artwork from the following artwork providers:"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["No active pairing request."])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing code"])},"pairing-request":e=>{const{normalize:t}=e;return t(["Remote pairing request from "])},pairing:e=>{const{normalize:t}=e;return t(["Remote Pairing"])},send:e=>{const{normalize:t}=e;return t(["Send"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["If your speaker requires pairing then activate it below and enter the PIN that it displays."])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["Speaker pairing and device verification"])},"verification-code":e=>{const{normalize:t}=e;return t(["Verification code"])},verify:e=>{const{normalize:t}=e;return t(["Verify"])}},general:{"album-lists":e=>{const{normalize:t}=e;return t(["Album Lists"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},files:e=>{const{normalize:t}=e;return t(["Files"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},language:e=>{const{normalize:t}=e;return t(["Language"])},music:e=>{const{normalize:t}=e;return t(["Music"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["If you select more items than can be shown on your screen then the burger menu will disappear."])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["Select the top navigation bar menu items"])},"navigation-items":e=>{const{normalize:t}=e;return t(["Navigation Bar"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["Now playing page"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(['Limit the number of albums shown on the "Recently Added" page'])},"recently-added-page":e=>{const{normalize:t}=e;return t(["Recently added page"])},search:e=>{const{normalize:t}=e;return t(["Search"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(['Comma separated list of genres the composer should be displayed on the "Now playing page"'])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["Leave empty to always show the composer."])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(['The genre tag of the current track is matched by checking, if one of the defined genres are included. For example setting to "classical, soundtrack" will show the composer for tracks with a genre tag of "Contemporary Classical"'])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["Show composer only for listed genres"])},"show-composer-info":e=>{const{normalize:t}=e;return t(['If enabled the composer of the current playing track is shown on the "Now playing page"'])},"show-composer":e=>{const{normalize:t}=e;return t(["Show composer"])},"show-coverart":e=>{const{normalize:t}=e;return t(["Show cover artwork in album list"])},"show-path":e=>{const{normalize:t}=e;return t(['Show filepath on the "Now playing" page'])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["Login with your Last.fm username and password to enable scrobbling"])},info:e=>{const{normalize:t}=e;return t(["OwnTone will not store your Last.fm username/password, only the session key. The session key does not expire."])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone was built without support for Last.fm."])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone was either built without support for Spotify or libspotify is not installed."])},"logged-as":e=>{const{normalize:t}=e;return t(["Logged in as "])},requirements:e=>{const{normalize:t}=e;return t(["You must have a Spotify premium account."])},scopes:e=>{const{normalize:t}=e;return t(["Access to the Spotify Web API enables scanning of your Spotify library. Required scopes are: "])},user:e=>{const{normalize:t}=e;return t(["Access granted for "])},authorize:e=>{const{normalize:t}=e;return t(["Authorize Web API access"])},"grant-access":e=>{const{normalize:t}=e;return t(["Grant access to the Spotify Web API"])},reauthorize:e=>{const{normalize:t}=e;return t(["Please reauthorize Web API access to grant OwnTone the following additional access rights: "])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["Login"])},logout:e=>{const{normalize:t}=e;return t(["Logout"])},password:e=>{const{normalize:t}=e;return t(["Password"])},username:e=>{const{normalize:t}=e;return t(["Username"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["Artwork"])},general:e=>{const{normalize:t}=e;return t(["General"])},"online-services":e=>{const{normalize:t}=e;return t(["Online Services"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["Remotes and Outputs"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["Featured Playlists"])},"new-releases":e=>{const{normalize:t}=e;return t(["New Releases"])},"show-more":e=>{const{normalize:t}=e;return t(["Show More"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},"no-results":e=>{const{normalize:t}=e;return t(["No results found"])},placeholder:e=>{const{normalize:t}=e;return t(["Search"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the album"]),t(["Show all ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the artist"]),t(["Show all ",n(r("count"))," artists"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the playlist"]),t(["Show all ",n(r("count"))," playlists"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the track"]),t(["Show all ",n(r("count"))," tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["Folder"])},plain:e=>{const{normalize:t}=e;return t(["Plain"])},smart:e=>{const{normalize:t}=e;return t(["Smart"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["Clear history"])},pause:e=>{const{normalize:t}=e;return t(["Pause"])},play:e=>{const{normalize:t}=e;return t(["Play"])},repeat:e=>{const{normalize:t}=e;return t(["Repeat all tracks"])},"repeat-off":e=>{const{normalize:t}=e;return t(["Read tracks once"])},"repeat-once":e=>{const{normalize:t}=e;return t(["Repeat current track"])},"seek-backward":e=>{const{normalize:t}=e;return t(["Seek backward in the track"])},"seek-forward":e=>{const{normalize:t}=e;return t(["Seek forward in the track"])},shuffle:e=>{const{normalize:t}=e;return t(["Play tracks randomly"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["Play tracks in order"])},"skip-backward":e=>{const{normalize:t}=e;return t(["Skip to previous track"])},"skip-forward":e=>{const{normalize:t}=e;return t(["Skip to next track"])},stop:e=>{const{normalize:t}=e;return t(["Stop"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["Toggle lyrics"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (error saving setting)"])},saved:e=>{const{normalize:t}=e;return t([" (setting saved)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["Failed to connect to OwnTone server"])},"missing-port":e=>{const{normalize:t}=e;return t(["Missing websocket port"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Request failed (status: ",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Queue saved to playlist ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track appended to the queue"]),t([n(r("count"))," tracks appended to the queue"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["Queue is empty"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["Today"])},"last-week":e=>{const{normalize:t}=e;return t(["Last week"])},"last-month":e=>{const{normalize:t}=e;return t(["Last month"])},undefined:e=>{const{normalize:t}=e;return t(["Undefined"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["mono"])},stereo:e=>{const{normalize:t}=e;return t(["stereo"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," channel"]),t([n(r("count"))," channels"])])}}}},{fr:{data:{kind:{file:e=>{const{normalize:t}=e;return t(["Fichier"])},url:e=>{const{normalize:t}=e;return t(["URL"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["Flux"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["Ajouter"])},cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},help:e=>{const{normalize:t}=e;return t(["L’ajout d’un podcast inclut la création d’une liste de lecture RSS, qui permettra à OwnTone de gérer l’abonnement au podcast."])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-du-flux-rss"])},processing:e=>{const{normalize:t}=e;return t(["Traitement en cours…"])},title:e=>{const{normalize:t}=e;return t(["Ajouter un podcast"])}},stream:{add:e=>{const{normalize:t}=e;return t(["Ajouter"])},cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},loading:e=>{const{normalize:t}=e;return t(["Chargement…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-du-flux"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},title:e=>{const{normalize:t}=e;return t(["Ajouter un flux"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"added-on":e=>{const{normalize:t}=e;return t(["Ajouté le"])},artist:e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Marquer comme lu"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Supprimer le podcast"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Année"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"added-on":e=>{const{normalize:t}=e;return t(["Ajouté le"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},play:e=>{const{normalize:t}=e;return t(["Lire"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},type:e=>{const{normalize:t}=e;return t(["Type"])},save:{cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},"playlist-name":e=>{const{normalize:t}=e;return t(["Nom de la liste de lecture"])},save:e=>{const{normalize:t}=e;return t(["Enregistrer"])},saving:e=>{const{normalize:t}=e;return t(["Enregistrement en cours…"])},title:e=>{const{normalize:t}=e;return t(["Enregistrer la file d’attente dans une liste de lecture"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["Compositeur"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},position:e=>{const{normalize:t}=e;return t(["Disque / Piste"])},quality:e=>{const{normalize:t}=e;return t(["Qualité"])},remove:e=>{const{normalize:t}=e;return t(["Supprimer"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artiste"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Année"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},pair:e=>{const{normalize:t}=e;return t(["Jumeler la télécommande"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Code de jumelage"])},title:e=>{const{normalize:t}=e;return t(["Demande de jumelage de télécommande"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},popularity:e=>{const{normalize:t}=e;return t(["Popularité / Abonnements"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},owner:e=>{const{normalize:t}=e;return t(["Propriétaire"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},album:e=>{const{normalize:t}=e;return t(["Album"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},position:e=>{const{normalize:t}=e;return t(["Disque / Piste"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"added-on":e=>{const{normalize:t}=e;return t(["Ajouté le"])},"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["Commentaire"])},composer:e=>{const{normalize:t}=e;return t(["Compositeur"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["Marquer comme nouveau"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Marquer comme lu"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},position:e=>{const{normalize:t}=e;return t(["Disque / Piste"])},quality:e=>{const{normalize:t}=e;return t(["Qualité"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artiste"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Année"])}},update:{all:e=>{const{normalize:t}=e;return t(["Tout actualiser"])},cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},feeds:e=>{const{normalize:t}=e;return t(["Actualiser uniquement les flux RSS"])},info:e=>{const{normalize:t}=e;return t(["Recherche les fichiers ajoutés, supprimés et modifiés"])},local:e=>{const{normalize:t}=e;return t(["Actualiser uniquement la bibliothèque locale"])},progress:e=>{const{normalize:t}=e;return t(["Actualisation de la bibliothèque en cours…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["Analyser les métadonnées des fichiers non modifiés"])},rescan:e=>{const{normalize:t}=e;return t(["Analyser"])},spotify:e=>{const{normalize:t}=e;return t(["Actualiser uniquement Spotify"])},title:e=>{const{normalize:t}=e;return t(["Actualiser la bibliothèque"])}}},language:{de:e=>{const{normalize:t}=e;return t(["Allemand (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["Anglais (English)"])},fr:e=>{const{normalize:t}=e;return t(["Français"])},"zh-CN":e=>{const{normalize:t}=e;return t(["Chinois simplifié (簡體中文)"])},"zh-TW":e=>{const{normalize:t}=e;return t(["Chinois traditionnel (繁體中文)"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["Supprimer définitivement ce podcast de votre bibliothèque ?"])},"info-2":e=>{const{normalize:t}=e;return t(["Cela supprimera également la liste de lecture RSS "])},remove:e=>{const{normalize:t}=e;return t(["Supprimer"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Supprimer le podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["La piste ne peut pas être lue"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([", raison de la restriction : ",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["Album"])},audiobook:e=>{const{normalize:t}=e;return t(["Livre audio"])},music:e=>{const{normalize:t}=e;return t(["Musique"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["À propos"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["Erreur du flux HTTP : échec du chargement du flux ou arrêt du chargement en raison d’un problème réseau"])},stream:e=>{const{normalize:t}=e;return t(["Flux HTTP"])},volume:e=>{const{normalize:t}=e;return t(["Volume"])},files:e=>{const{normalize:t}=e;return t(["Fichiers"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},music:e=>{const{normalize:t}=e;return t(["Musique"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},search:e=>{const{normalize:t}=e;return t(["Recherche"])},settings:e=>{const{normalize:t}=e;return t(["Réglages"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["Actualiser la bibliothèque"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Interface utilisateur construite avec ",n(r("bulma")),", ",n(r("mdi")),", ",n(r("vuejs")),", ",n(r("axios"))," et ",n(r("others")),"."])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Compilé avec les options ",n(r("options")),"."])},library:e=>{const{normalize:t}=e;return t(["Bibliothèque"])},more:e=>{const{normalize:t}=e;return t(["plus"])},"total-playtime":e=>{const{normalize:t}=e;return t(["Durée totale de lecture"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},update:e=>{const{normalize:t}=e;return t(["Actualiser"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["il y a ",n(r("time"))])},updated:e=>{const{normalize:t}=e;return t(["Mis à jour"])},uptime:e=>{const{normalize:t}=e;return t(["Temps de fonctionnement"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Version ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filtrer"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les singles et les albums dont les pistes n’apparaissent que dans les listes de lecture."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Masquer les singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les albums qui n’apparaissent que dans votre bibliothèque Spotify."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Masquer les albums de Spotify"])},title:e=>{const{normalize:t}=e;return t(["Albums"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["Artiste › Nom"])},"artist-date":e=>{const{normalize:t}=e;return t(["Artiste › Date de sortie"])},title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},"recently-added":e=>{const{normalize:t}=e;return t(["Ajouts récents"])},"recently-released":e=>{const{normalize:t}=e;return t(["Sorties récentes"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filtrer"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Si actif, masque le contenu qui n’apparaît que dans votre bibliothèque Spotify."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Masquer le contenu de Spotify"])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," artiste"]),t([n(r("count"))," artiste"]),t([n(r("count"))," artistes"])])},filter:e=>{const{normalize:t}=e;return t(["Filtrer"])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},"recently-added":e=>{const{normalize:t}=e;return t(["Ajouts récents"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les artistes qui n’apparaissent que dans des singles ou des listes de lecture."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Masquer les singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les artistes qui n’apparaissent que dans votre bibliothèque Spotify."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Masquer les artistes de Spotify"])},title:e=>{const{normalize:t}=e;return t(["Artistes"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["Lire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," livre audio"]),t([n(r("count"))," livre audio"]),t([n(r("count"))," livres audio"])])},title:e=>{const{normalize:t}=e;return t(["Livres audio"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},play:e=>{const{normalize:t}=e;return t(["Lire"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," auteur"]),t([n(r("count"))," auteur"]),t([n(r("count"))," auteurs"])])},title:e=>{const{normalize:t}=e;return t(["Auteurs"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["Auteurs"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," compositeur"]),t([n(r("count"))," compositeur"]),t([n(r("count"))," compositeurs"])])},title:e=>{const{normalize:t}=e;return t(["Compositeurs"])}},files:{play:e=>{const{normalize:t}=e;return t(["Lire"])},title:e=>{const{normalize:t}=e;return t(["Fichiers"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," genre"]),t([n(r("count"))," genre"]),t([n(r("count"))," genres"])])},title:e=>{const{normalize:t}=e;return t(["Genres"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["Afficher plus"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["Ajouts récents"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["Lectures récentes"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},composers:e=>{const{normalize:t}=e;return t(["Compositeurs"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},history:e=>{const{normalize:t}=e;return t(["Historique"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["Ajoutez des pistes en parcourant votre bibliothèque"])},live:e=>{const{normalize:t}=e;return t(["En direct"])},title:e=>{const{normalize:t}=e;return t(["La file d’attente est vide"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," pistes"])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," liste de lecture"]),t([n(r("count"))," liste de lecture"]),t([n(r("count"))," listes de lecture"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},remove:e=>{const{normalize:t}=e;return t(["Supprimer"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["Supprimer ce podcast de manière permanente de la bibliothèque ?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["Cela supprimera également la liste de lecture RSS "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Supprimer le podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["Ajouter"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," podcast"]),t([n(r("count"))," podcast"]),t([n(r("count"))," podcasts"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["Marquer comme lus"])},"new-episodes":e=>{const{normalize:t}=e;return t(["Nouveaux épisodes"])},title:e=>{const{normalize:t}=e;return t(["Podcasts"])},update:e=>{const{normalize:t}=e;return t(["Actualiser"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["Ajouter un flux"])},clear:e=>{const{normalize:t}=e;return t(["Effacer"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},edit:e=>{const{normalize:t}=e;return t(["Éditer"])},"hide-previous":e=>{const{normalize:t}=e;return t(["Masquer l’historique"])},queue:e=>{const{normalize:t}=e;return t(["File d’attente"])},save:e=>{const{normalize:t}=e;return t(["Enregistrer"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," station"]),t([n(r("count"))," station"]),t([n(r("count"))," stations"])])},title:e=>{const{normalize:t}=e;return t(["Radio"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},composers:e=>{const{normalize:t}=e;return t(["Compositeurs"])},expression:e=>{const{normalize:t}=e;return t(["expression"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Astuce : vous pouvez effectuer une recherche avec une ",n(r("help"))," du langage de requête de liste de lecture intelligente en préfixant votre requête avec ",n(r("query"))])},"no-results":e=>{const{normalize:t}=e;return t(["Aucun résultat trouvé"])},placeholder:e=>{const{normalize:t}=e;return t(["Recherche"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’album"]),t(["Afficher les ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’artiste"]),t(["Afficher les ",n(r("count"))," artistes"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher le livre audio"]),t(["Afficher les ",n(r("count"))," livres audio"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher le compositeur"]),t(["Afficher les ",n(r("count"))," compositeurs"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la liste de lecture"]),t(["Afficher les ",n(r("count"))," listes de lecture"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher le podcast"]),t(["Afficher les ",n(r("count"))," podcasts"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la piste"]),t(["Afficher les ",n(r("n"))," pistes"])])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},tabs:{library:e=>{const{normalize:t}=e;return t(["Bibliothèque"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{artwork:e=>{const{normalize:t}=e;return t(["Illustrations"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["Prend en charge les illustrations au format PNG et JPEG qui sont soit placées dans la bibliothèque en tant que fichiers image séparés, soit intégrées dans les fichiers média, soit mises à disposition en ligne par les stations de radio."])},"explanation-2":e=>{const{normalize:t}=e;return t(["En outre, vous pouvez activer la récupération des illustrations à partir des fournisseurs d’illustrations suivants :"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["Aucune demande de jumelage active."])},"pairing-code":e=>{const{normalize:t}=e;return t(["Code de jumelage"])},"pairing-request":e=>{const{normalize:t}=e;return t(["Demande de jumelage de télécommande "])},pairing:e=>{const{normalize:t}=e;return t(["Jumelage de télécommande"])},send:e=>{const{normalize:t}=e;return t(["Envoyer"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["Si votre enceinte nécessite un jumelage, activez-la ci-dessous et entrez le code PIN qu’elle affiche."])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["Jumelage d’enceinte et vérification d’appareil"])},"verification-code":e=>{const{normalize:t}=e;return t(["Code de vérification"])},verify:e=>{const{normalize:t}=e;return t(["Vérifier"])}},general:{"album-lists":e=>{const{normalize:t}=e;return t(["Listes d’albums"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},files:e=>{const{normalize:t}=e;return t(["Fichiers"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},language:e=>{const{normalize:t}=e;return t(["Langue"])},music:e=>{const{normalize:t}=e;return t(["Musique"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["Si vous sélectionnez plus d’éléments que ce qui peut être affiché sur votre écran, le menu disparaîtra."])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["Sélectionnez les éléments de la barre de navigation supérieure"])},"navigation-items":e=>{const{normalize:t}=e;return t(["Barre de navigation"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["Page « En cours de lecture »"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(["Limiter le nombre d’albums affichés dans la section « Ajouts récents »"])},"recently-added-page":e=>{const{normalize:t}=e;return t(["Page « Ajouts récents »"])},search:e=>{const{normalize:t}=e;return t(["Recherche"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(["Liste des genres, séparés par des virgules, que le compositeur doit afficher sur la page « En cours de lecture »."])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["Laissez vide pour toujours afficher le compositeur."])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(['L’étiquette de genre de la piste actuelle est comparée en vérifiant si l’un des genres définis est inclus. Par exemple, en choisissant "classique, bande sonore", le compositeur pour les pistes dont l’étiquette de genre est "classique contemporain" sera affiché.'])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["Afficher le compositeur uniquement pour les genres listés"])},"show-composer-info":e=>{const{normalize:t}=e;return t(["Si actif, le compositeur de la piste en cours de lecture est affiché sur la page « En cours de lecture »"])},"show-composer":e=>{const{normalize:t}=e;return t(["Afficher le compositeur"])},"show-coverart":e=>{const{normalize:t}=e;return t(["Afficher les illustrations dans la liste d’albums"])},"show-path":e=>{const{normalize:t}=e;return t(["Afficher le chemin du fichier sur la page « En cours de lecture »"])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["Connectez-vous avec votre nom d’utilisateur et votre mot de passe Last.fm pour activer le scrobbling."])},info:e=>{const{normalize:t}=e;return t(["Le nom d’utilisateur et le mot de passe Last.fm ne sont pas enregistrés, uniquement la clé de session. La clé de session n’expire pas."])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["L’option Last.fm n’est pas présente."])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["L’option Spotify n’est pas présente."])},"logged-as":e=>{const{normalize:t}=e;return t(["Connecté en tant que "])},requirements:e=>{const{normalize:t}=e;return t(["Vous devez posséder un compte Spotify Premium."])},scopes:e=>{const{normalize:t}=e;return t(["L’accès à l’API de Spotify permet l’analyse de votre bibliothèque Spotify. Les champs d’application requis sont les suivants :"])},user:e=>{const{normalize:t}=e;return t(["Accès autorisé pour "])},authorize:e=>{const{normalize:t}=e;return t(["Autoriser l’accès à l’API"])},"grant-access":e=>{const{normalize:t}=e;return t(["Accordez l’accès à l’API de Spotify"])},reauthorize:e=>{const{normalize:t}=e;return t(["Veuillez autoriser à nouveau l’accès à l’API pour accorder à OwnTone les droits d’accès supplémentaires suivants :"])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["Se connecter"])},logout:e=>{const{normalize:t}=e;return t(["Se déconnecter"])},password:e=>{const{normalize:t}=e;return t(["Mot de passe"])},username:e=>{const{normalize:t}=e;return t(["Nom d’utilisateur"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["Illustrations"])},general:e=>{const{normalize:t}=e;return t(["Général"])},"online-services":e=>{const{normalize:t}=e;return t(["Services en ligne"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["Télécommandes et sorties"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["Listes de lecture en vedette"])},"new-releases":e=>{const{normalize:t}=e;return t(["Nouvelle sorties"])},"show-more":e=>{const{normalize:t}=e;return t(["Afficher plus"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},"no-results":e=>{const{normalize:t}=e;return t(["Aucun résultat trouvé"])},placeholder:e=>{const{normalize:t}=e;return t(["Recherche"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’album"]),t(["Afficher les ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’artiste"]),t(["Afficher les ",n(r("count"))," artistes"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la liste de lecture"]),t(["Afficher les ",n(r("count"))," listes de lecture"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la piste"]),t(["Afficher les ",n(r("count"))," pistes"])])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["Dossier"])},plain:e=>{const{normalize:t}=e;return t(["Simple"])},smart:e=>{const{normalize:t}=e;return t(["Intelligente"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["Effacer l’historique"])},pause:e=>{const{normalize:t}=e;return t(["Mettre la lecture en pause"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},repeat:e=>{const{normalize:t}=e;return t(["Répéter toutes les pistes"])},"repeat-off":e=>{const{normalize:t}=e;return t(["Lire les pistes une fois"])},"repeat-once":e=>{const{normalize:t}=e;return t(["Répéter la piste en cours"])},"seek-backward":e=>{const{normalize:t}=e;return t(["Reculer dans la piste"])},"seek-forward":e=>{const{normalize:t}=e;return t(["Avancer dans la piste"])},shuffle:e=>{const{normalize:t}=e;return t(["Lire les pistes aléatoirement"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["Lire les pistes dans l’ordre"])},"skip-backward":e=>{const{normalize:t}=e;return t(["Reculer à la piste précédente"])},"skip-forward":e=>{const{normalize:t}=e;return t(["Avancer à la piste suivante"])},stop:e=>{const{normalize:t}=e;return t(["Arrêter la lecture"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["Voir/Cacher les paroles"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (erreur à l’enregistrement du réglage)"])},saved:e=>{const{normalize:t}=e;return t([" (réglage enregistré)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["Échec de connexion au serveur"])},"missing-port":e=>{const{normalize:t}=e;return t(["Port websocket manquant"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["La requête a échoué (status: ",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["La file d’attente enregistrée dans la liste de lecture ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste ajoutée à la file d’attente"]),t([n(r("count"))," pistes ajoutées à la file d’attente"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["La file d’attente est vide"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["Aujourd’hui"])},"last-week":e=>{const{normalize:t}=e;return t(["La semaine dernière"])},"last-month":e=>{const{normalize:t}=e;return t(["Le mois dernier"])},undefined:e=>{const{normalize:t}=e;return t(["Indéfini"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["mono"])},stereo:e=>{const{normalize:t}=e;return t(["stéréo"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," canal"]),t([n(r("count"))," canaux"])])}}}},{"zh-CN":{data:{kind:{file:e=>{const{normalize:t}=e;return t(["文件"])},url:e=>{const{normalize:t}=e;return t(["链接"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["流"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["添加"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},help:e=>{const{normalize:t}=e;return t(["添加一个可生成播放列表的播客RSS链接,这将允许OwnTone管理订阅"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["处理中…"])},title:e=>{const{normalize:t}=e;return t(["添加播客"])}},stream:{add:e=>{const{normalize:t}=e;return t(["添加"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},loading:e=>{const{normalize:t}=e;return t(["加载中…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["添加流"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"added-on":e=>{const{normalize:t}=e;return t(["添加时间"])},artist:e=>{const{normalize:t}=e;return t(["专辑艺人"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["标记为已播"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除播客"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])},type:e=>{const{normalize:t}=e;return t(["类型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"added-on":e=>{const{normalize:t}=e;return t(["添加时间"])},albums:e=>{const{normalize:t}=e;return t(["张专辑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])},type:e=>{const{normalize:t}=e;return t(["类型"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},albums:e=>{const{normalize:t}=e;return t(["张专辑"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},play:e=>{const{normalize:t}=e;return t(["播放"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},albums:e=>{const{normalize:t}=e;return t(["张专辑"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},play:e=>{const{normalize:t}=e;return t(["播放"])},path:e=>{const{normalize:t}=e;return t(["路径"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])},type:e=>{const{normalize:t}=e;return t(["类型"])},save:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},"playlist-name":e=>{const{normalize:t}=e;return t(["播放列表名称"])},save:e=>{const{normalize:t}=e;return t(["保存"])},saving:e=>{const{normalize:t}=e;return t(["保存中…"])},title:e=>{const{normalize:t}=e;return t(["保存播放清单到列表"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},album:e=>{const{normalize:t}=e;return t(["专辑"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["作曲家"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},genre:e=>{const{normalize:t}=e;return t(["流派"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盘符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["质量"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["专辑"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["艺人"])},type:e=>{const{normalize:t}=e;return t(["类型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["取消"])},pair:e=>{const{normalize:t}=e;return t(["遥控配对"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配对码"])},title:e=>{const{normalize:t}=e;return t(["请求遥控配对"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])},type:e=>{const{normalize:t}=e;return t(["类型"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},play:e=>{const{normalize:t}=e;return t(["播放"])},popularity:e=>{const{normalize:t}=e;return t(["流行度 / 粉丝数"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},owner:e=>{const{normalize:t}=e;return t(["所有者"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},album:e=>{const{normalize:t}=e;return t(["专辑"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盘符 / 曲目"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"added-on":e=>{const{normalize:t}=e;return t(["添加时间"])},"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},album:e=>{const{normalize:t}=e;return t(["专辑"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["评论"])},composer:e=>{const{normalize:t}=e;return t(["作曲家"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},genre:e=>{const{normalize:t}=e;return t(["流派"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["标记为最新"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["标记为已播放"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盘符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["质量"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["评级"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["专辑"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["艺人"])},type:e=>{const{normalize:t}=e;return t(["类型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},update:{all:e=>{const{normalize:t}=e;return t(["更新所有内容"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},feeds:e=>{const{normalize:t}=e;return t(["仅更新RSS订阅内容"])},info:e=>{const{normalize:t}=e;return t(["扫描新的、删除的和修改的文件"])},local:e=>{const{normalize:t}=e;return t(["仅更新本地资料库"])},progress:e=>{const{normalize:t}=e;return t(["正在更新本地资料库…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["重新扫描未修改文件的元数据"])},rescan:e=>{const{normalize:t}=e;return t(["重新扫描"])},spotify:e=>{const{normalize:t}=e;return t(["仅更新Spotify"])},title:e=>{const{normalize:t}=e;return t(["更新资料库"])}}},language:{de:e=>{const{normalize:t}=e;return t(["德语 (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["英语 (English)"])},fr:e=>{const{normalize:t}=e;return t(["法语 (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["簡體中文"])},"zh-TW":e=>{const{normalize:t}=e;return t(["繁體中文"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["从资料库中永久移除该播客吗?"])},"info-2":e=>{const{normalize:t}=e;return t(["这也将移除RSS播放列表 "])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除播客"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["曲目无法播放"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([",被限制原因:",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["专辑"])},audiobook:e=>{const{normalize:t}=e;return t(["有声读物"])},music:e=>{const{normalize:t}=e;return t(["音乐"])},podcast:e=>{const{normalize:t}=e;return t(["播客"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["关于"])},albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP流错误:流载入失败或者由于网络原因无法载入"])},stream:e=>{const{normalize:t}=e;return t(["HTTP流"])},volume:e=>{const{normalize:t}=e;return t(["音量"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},music:e=>{const{normalize:t}=e;return t(["音乐"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["播客"])},radio:e=>{const{normalize:t}=e;return t(["广播电台"])},search:e=>{const{normalize:t}=e;return t(["搜索"])},settings:e=>{const{normalize:t}=e;return t(["设置"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["更新资料库"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["界面贡献者包括 ",n(r("bulma")),",",n(r("mdi")),",",n(r("vuejs")),",",n(r("axios"))," 和 ",n(r("others"))])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["编译支持来自于 ",n(r("options"))])},library:e=>{const{normalize:t}=e;return t(["资料库"])},more:e=>{const{normalize:t}=e;return t(["更多"])},"total-playtime":e=>{const{normalize:t}=e;return t(["总播放时长"])},tracks:e=>{const{normalize:t}=e;return t(["曲目总数"])},update:e=>{const{normalize:t}=e;return t(["更新"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("time"))," 前"])},updated:e=>{const{normalize:t}=e;return t(["更新于"])},uptime:e=>{const{normalize:t}=e;return t(["运行时长"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["版本 ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},filter:e=>{const{normalize:t}=e;return t(["筛选"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在播放列表出现的单曲和专辑"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隐藏单曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在Spotify资料库出现的专辑"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隐藏来自Spotify的专辑"])},title:e=>{const{normalize:t}=e;return t(["专辑"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["艺人 › 名称"])},"artist-date":e=>{const{normalize:t}=e;return t(["艺人 › 发行日期"])},title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近添加"])},"recently-released":e=>{const{normalize:t}=e;return t(["最近发行"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},filter:e=>{const{normalize:t}=e;return t(["筛选"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏只出现在Spotify库中的内容"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隐藏来自Spotify的内容"])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},rating:e=>{const{normalize:t}=e;return t(["评级"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位艺人"]),t([n(r("count"))," 位艺人"])])},filter:e=>{const{normalize:t}=e;return t(["筛选"])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近添加"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在播放列表出现的单曲和专辑"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隐藏单曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在Spotify资料库出现的专辑"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隐藏来自Spotify的艺人"])},title:e=>{const{normalize:t}=e;return t(["艺人"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个有声读物"]),t([n(r("count"))," 个有声读物"])])},title:e=>{const{normalize:t}=e;return t(["有声读物"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},play:e=>{const{normalize:t}=e;return t(["播放"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作者"]),t([n(r("count"))," 位作者"])])},title:e=>{const{normalize:t}=e;return t(["作者"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["作者"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},genres:e=>{const{normalize:t}=e;return t(["流派"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},rating:e=>{const{normalize:t}=e;return t(["评级"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作曲家"]),t([n(r("count"))," 位作曲家"])])},title:e=>{const{normalize:t}=e;return t(["作曲家"])}},files:{play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["文件"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},rating:e=>{const{normalize:t}=e;return t(["评级"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个流派"]),t([n(r("count"))," 个流派"])])},title:e=>{const{normalize:t}=e;return t(["流派"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["显示更多"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["最近添加"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["最近播放"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},history:e=>{const{normalize:t}=e;return t(["历史"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["浏览资料库添加曲目"])},live:e=>{const{normalize:t}=e;return t(["直播"])},title:e=>{const{normalize:t}=e;return t(["播放清单是空的"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," 曲目"])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["播放列表"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个播放列表"]),t([n(r("count"))," 个播放列表"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},play:e=>{const{normalize:t}=e;return t(["播放"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["从资料库中永久移除该播客?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["这也将移除该播客RSS列表 "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除播客"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["添加"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个播客"]),t([n(r("count"))," 个播客"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["全部标记为已播放"])},"new-episodes":e=>{const{normalize:t}=e;return t(["最新单集"])},title:e=>{const{normalize:t}=e;return t(["播客"])},update:e=>{const{normalize:t}=e;return t(["更新"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["添加流"])},clear:e=>{const{normalize:t}=e;return t(["清除"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},edit:e=>{const{normalize:t}=e;return t(["编辑"])},"hide-previous":e=>{const{normalize:t}=e;return t(["隐藏历史"])},title:e=>{const{normalize:t}=e;return t(["清单"])},save:e=>{const{normalize:t}=e;return t(["保存"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个电台"]),t([n(r("count"))," 个电台"])])},title:e=>{const{normalize:t}=e;return t(["广播电台"])}},search:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},expression:e=>{const{normalize:t}=e;return t(["表达式"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["提示:如果您使用 ",n(r("query"))," 前缀,则可以通过智能播放列表查询语言 ",n(r("help"))," 进行搜索"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到结果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜索"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["播客"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示专辑"]),t(["显示所有 ",n(r("count"))," 个专辑"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示艺人"]),t(["显示所有 ",n(r("count"))," 位艺人"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示有声书"]),t(["显示所有 ",n(r("count"))," 本有声书"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示作曲家"]),t(["显示所有 ",n(r("count"))," 位作曲家"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示播放列表"]),t(["显示所有 ",n(r("count"))," 个播放列表"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示播客"]),t(["显示所有 ",n(r("count"))," 个播客"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示曲目"]),t(["显示所有 ",n(r("count"))," 只曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])},tabs:{library:e=>{const{normalize:t}=e;return t(["资料库"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{artwork:e=>{const{normalize:t}=e;return t(["封面"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone支持PNG和 JPEG封面,这些封面可以作为单独的图像文件放置在库中或嵌入到媒体文件中,也可以通过广播电台在线提供"])},"explanation-2":e=>{const{normalize:t}=e;return t(["除此之外,您还可以从以下素材提供者获取封面:"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["没有活跃的配对请求"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配对代码"])},"pairing-request":e=>{const{normalize:t}=e;return t(["远程配对请求来自于 "])},pairing:e=>{const{normalize:t}=e;return t(["遥控配对"])},send:e=>{const{normalize:t}=e;return t(["发送"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["如果您的扬声器需要配对,请在下面输入它显示的 PIN以激活"])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["扬声器配对和设备验证"])},"verification-code":e=>{const{normalize:t}=e;return t(["验证码"])},verify:e=>{const{normalize:t}=e;return t(["验证"])}},general:{"album-lists":e=>{const{normalize:t}=e;return t(["专辑列表"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},language:e=>{const{normalize:t}=e;return t(["语言"])},music:e=>{const{normalize:t}=e;return t(["音乐"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["如果您选择的项目多于屏幕上可以显示的项目,则侧边栏菜单将会消失"])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["选择顶部导航栏菜单项"])},"navigation-items":e=>{const{normalize:t}=e;return t(["导航条"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["“正在播放”页面"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["播客"])},radio:e=>{const{normalize:t}=e;return t(["广播电台"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(["限制“最近添加”页面上显示的专辑数量"])},"recently-added-page":e=>{const{normalize:t}=e;return t(["“最近添加”页面"])},search:e=>{const{normalize:t}=e;return t(["搜索"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(["以逗号分隔流派,作曲家会在“正在播放的页面”上显示"])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["留空以始终显示作曲家"])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(["通过检查是否包含定义的流派之一来匹配当前曲目的流派标签。例如,设置为“古典、原声带”将显示流派标签为“当代古典”的曲目的作曲家"])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["仅显示列出的流派的作曲家"])},"show-composer-info":e=>{const{normalize:t}=e;return t(["如果启用,当前播放曲目的作曲家将显示在“正在播放页面”上"])},"show-composer":e=>{const{normalize:t}=e;return t(["显示作曲家"])},"show-coverart":e=>{const{normalize:t}=e;return t(["在专辑列表中显示封面艺术作品"])},"show-path":e=>{const{normalize:t}=e;return t(["在“正在播放”页面显示文件路径"])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["使用您的 Last.fm 用户名和密码登录以启用记录功能"])},info:e=>{const{normalize:t}=e;return t(["OwnTone不会存储您的 Last.fm 用户名/密码,仅存储会话密钥。会话密钥不会过期"])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone的构建没有来自Last.fm的官方支持"])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone的构建没有来自 Spotify 官方的支持,也未安装 libspotify"])},"logged-as":e=>{const{normalize:t}=e;return t(["登录为 "])},requirements:e=>{const{normalize:t}=e;return t(["您必须拥有 Spotify付费帐户"])},scopes:e=>{const{normalize:t}=e;return t(["访问 Spotify Web API 可以扫描您的 Spotify库。所需范围是:"])},user:e=>{const{normalize:t}=e;return t(["授予访问权限"])},authorize:e=>{const{normalize:t}=e;return t(["授权 Web API 访问"])},"grant-access":e=>{const{normalize:t}=e;return t(["授予对 Spotify Web API 的访问权限"])},reauthorize:e=>{const{normalize:t}=e;return t(["请重新授权 Web API 访问权限,以授予 OwnTone 以下附加访问权限:"])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["登入"])},logout:e=>{const{normalize:t}=e;return t(["退出"])},password:e=>{const{normalize:t}=e;return t(["密码"])},username:e=>{const{normalize:t}=e;return t(["用户名"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["封面"])},general:e=>{const{normalize:t}=e;return t(["概览"])},"online-services":e=>{const{normalize:t}=e;return t(["在线服务"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["遥控和输出"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["特色列表"])},"new-releases":e=>{const{normalize:t}=e;return t(["最新发行"])},"show-more":e=>{const{normalize:t}=e;return t(["显示更多"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])}},search:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到结果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜索"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示专辑"]),t(["显示所有 ",n(r("count"))," 个专辑"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示艺人"]),t(["显示所有 ",n(r("count"))," 位艺人"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示播放列表"]),t(["显示所有 ",n(r("count"))," 个播放列表"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示曲目"]),t(["显示所有 ",n(r("count"))," 只曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["文件夹"])},plain:e=>{const{normalize:t}=e;return t(["简单"])},smart:e=>{const{normalize:t}=e;return t(["智能"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["清除历史"])},pause:e=>{const{normalize:t}=e;return t(["暂停"])},play:e=>{const{normalize:t}=e;return t(["播放"])},repeat:e=>{const{normalize:t}=e;return t(["重复播放所有曲目"])},"repeat-off":e=>{const{normalize:t}=e;return t(["所有曲目仅播放一遍"])},"repeat-once":e=>{const{normalize:t}=e;return t(["重复当前曲目"])},"seek-backward":e=>{const{normalize:t}=e;return t(["在当前曲目后退"])},"seek-forward":e=>{const{normalize:t}=e;return t(["在当前曲目前进"])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放曲目"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["按顺序播放曲目"])},"skip-backward":e=>{const{normalize:t}=e;return t(["播放上一首"])},"skip-forward":e=>{const{normalize:t}=e;return t(["播放下一首"])},stop:e=>{const{normalize:t}=e;return t(["停止"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["显示/隐藏歌词"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (设置保存错误)"])},saved:e=>{const{normalize:t}=e;return t([" (设置已保存)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["无法连接到 OwnTone 服务器"])},"missing-port":e=>{const{normalize:t}=e;return t(["缺少 websocket 端口"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["请求失败 (状态:",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["清单以添加到播放列表 ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["已附加到队列的 ",n(r("count"))," 只曲目"]),t(["已附加到队列的 ",n(r("count"))," 只曲目"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["清单是空的"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["今日"])},"last-week":e=>{const{normalize:t}=e;return t(["上周"])},"last-month":e=>{const{normalize:t}=e;return t(["上月"])},undefined:e=>{const{normalize:t}=e;return t(["未定义"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["单声道"])},stereo:e=>{const{normalize:t}=e;return t(["立体声"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 信道"]),t([n(r("count"))," 信道"])])}}}},{"zh-TW":{data:{kind:{file:e=>{const{normalize:t}=e;return t(["文件"])},url:e=>{const{normalize:t}=e;return t(["鏈接"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["串流"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["新增"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},help:e=>{const{normalize:t}=e;return t(["新增一個可生成播放列表的Podcast RSS鏈接,這將允許OwnTone管理訂閱"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["處理中…"])},title:e=>{const{normalize:t}=e;return t(["新增Podcast"])}},stream:{add:e=>{const{normalize:t}=e;return t(["新增"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},loading:e=>{const{normalize:t}=e;return t(["載入中…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["新增串流"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"added-on":e=>{const{normalize:t}=e;return t(["新增時間"])},artist:e=>{const{normalize:t}=e;return t(["專輯藝人"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["標記為已播"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除Podcast"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])},type:e=>{const{normalize:t}=e;return t(["類型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"added-on":e=>{const{normalize:t}=e;return t(["新增時間"])},albums:e=>{const{normalize:t}=e;return t(["張專輯"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])},type:e=>{const{normalize:t}=e;return t(["類型"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},albums:e=>{const{normalize:t}=e;return t(["張專輯"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},play:e=>{const{normalize:t}=e;return t(["播放"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},albums:e=>{const{normalize:t}=e;return t(["張專輯"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},play:e=>{const{normalize:t}=e;return t(["播放"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])},type:e=>{const{normalize:t}=e;return t(["類型"])},save:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},"playlist-name":e=>{const{normalize:t}=e;return t(["播放列表名稱"])},save:e=>{const{normalize:t}=e;return t(["儲存"])},saving:e=>{const{normalize:t}=e;return t(["儲存中…"])},title:e=>{const{normalize:t}=e;return t(["儲存播放清單到列表"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},album:e=>{const{normalize:t}=e;return t(["專輯"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["作曲"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},genre:e=>{const{normalize:t}=e;return t(["音樂類型"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盤符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["品質"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["專輯"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["藝人"])},type:e=>{const{normalize:t}=e;return t(["類型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["取消"])},pair:e=>{const{normalize:t}=e;return t(["遙控配對"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配對碼"])},title:e=>{const{normalize:t}=e;return t(["請求遙控配對"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])},type:e=>{const{normalize:t}=e;return t(["類型"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},play:e=>{const{normalize:t}=e;return t(["播放"])},popularity:e=>{const{normalize:t}=e;return t(["流行度 / 粉絲數"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},owner:e=>{const{normalize:t}=e;return t(["所有者"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},album:e=>{const{normalize:t}=e;return t(["專輯"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盤符 / 曲目"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"added-on":e=>{const{normalize:t}=e;return t(["新增時間"])},"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},album:e=>{const{normalize:t}=e;return t(["專輯"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["評論"])},composer:e=>{const{normalize:t}=e;return t(["作曲家"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},genre:e=>{const{normalize:t}=e;return t(["音樂類型"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["標記為最新"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["標記為已播放"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盤符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["品質"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["評級"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["專輯"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["藝人"])},type:e=>{const{normalize:t}=e;return t(["類型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},update:{all:e=>{const{normalize:t}=e;return t(["更新所有內容"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},feeds:e=>{const{normalize:t}=e;return t(["僅更新RSS訂閱內容"])},info:e=>{const{normalize:t}=e;return t(["掃描新的、刪除的和修改的文件"])},local:e=>{const{normalize:t}=e;return t(["僅更新本地資料庫"])},progress:e=>{const{normalize:t}=e;return t(["正在更新本地資料庫…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["重新掃描未修改文件的中繼資料"])},rescan:e=>{const{normalize:t}=e;return t(["重新掃描"])},spotify:e=>{const{normalize:t}=e;return t(["僅更新Spotify"])},title:e=>{const{normalize:t}=e;return t(["更新資料庫"])}}},language:{de:e=>{const{normalize:t}=e;return t(["德語 (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["英語 (English)"])},fr:e=>{const{normalize:t}=e;return t(["法語 (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["簡體中文"])},"zh-TW":e=>{const{normalize:t}=e;return t(["繁體中文"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["從資料庫中永久移除該Podcast嗎?"])},"info-2":e=>{const{normalize:t}=e;return t(["這也將移除RSS播放列表 "])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除Podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["曲目無法播放"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([",被限制原因:",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["專輯"])},audiobook:e=>{const{normalize:t}=e;return t(["有聲書"])},music:e=>{const{normalize:t}=e;return t(["音樂"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["關於"])},albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP串流錯誤:串流載入失敗或者由於網絡原因無法載入"])},stream:e=>{const{normalize:t}=e;return t(["HTTP串流"])},volume:e=>{const{normalize:t}=e;return t(["音量"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},music:e=>{const{normalize:t}=e;return t(["音樂"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcast"])},radio:e=>{const{normalize:t}=e;return t(["電台"])},search:e=>{const{normalize:t}=e;return t(["搜尋"])},settings:e=>{const{normalize:t}=e;return t(["設定"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["更新資料庫"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["界面貢獻者包括 ",n(r("bulma")),",",n(r("mdi")),",",n(r("vuejs")),",",n(r("axios"))," 和 ",n(r("others"))])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["編譯支持來自於 ",n(r("options"))])},library:e=>{const{normalize:t}=e;return t(["資料庫"])},more:e=>{const{normalize:t}=e;return t(["更多"])},"total-playtime":e=>{const{normalize:t}=e;return t(["總播放時長"])},tracks:e=>{const{normalize:t}=e;return t(["曲目總數"])},update:e=>{const{normalize:t}=e;return t(["更新"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("time"))," 前"])},updated:e=>{const{normalize:t}=e;return t(["更新於"])},uptime:e=>{const{normalize:t}=e;return t(["運行時長"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["版本 ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},filter:e=>{const{normalize:t}=e;return t(["篩選"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在播放列表出現的單曲和專輯"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隱藏單曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在Spotify資料庫出現的專輯"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隱藏來自Spotify的專輯"])},title:e=>{const{normalize:t}=e;return t(["專輯"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["藝人 › 名稱"])},"artist-date":e=>{const{normalize:t}=e;return t(["藝人 › 發行日期"])},title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近新增"])},"recently-released":e=>{const{normalize:t}=e;return t(["最近發行"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},filter:e=>{const{normalize:t}=e;return t(["篩選"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏只出現在Spotify庫中的內容"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隱藏來自Spotify的內容"])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},rating:e=>{const{normalize:t}=e;return t(["評級"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位藝人"]),t([n(r("count"))," 位藝人"])])},filter:e=>{const{normalize:t}=e;return t(["篩選"])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近新增"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在播放列表出現的單曲和專輯"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隱藏單曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在Spotify資料庫出現的專輯"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隱藏來自Spotify的藝人"])},title:e=>{const{normalize:t}=e;return t(["藝人"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個有聲書"]),t([n(r("count"))," 個有聲書"])])},title:e=>{const{normalize:t}=e;return t(["有聲書"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},play:e=>{const{normalize:t}=e;return t(["播放"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作者"]),t([n(r("count"))," 位作者"])])},title:e=>{const{normalize:t}=e;return t(["作者"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["作者"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},rating:e=>{const{normalize:t}=e;return t(["評級"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作曲家"]),t([n(r("count"))," 位作曲家"])])},title:e=>{const{normalize:t}=e;return t(["作曲家"])}},files:{play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["文件"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},rating:e=>{const{normalize:t}=e;return t(["評級"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個音樂類型"]),t([n(r("count"))," 個音樂類型"])])},title:e=>{const{normalize:t}=e;return t(["音樂類型"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["顯示更多"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["最近新增"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["最近播放"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},history:e=>{const{normalize:t}=e;return t(["歷史"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["瀏覽資料庫新增曲目"])},live:e=>{const{normalize:t}=e;return t(["直播"])},title:e=>{const{normalize:t}=e;return t(["播放清單是空的"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," 曲目"])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["播放列表"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個播放列表"]),t([n(r("count"))," 個播放列表"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},play:e=>{const{normalize:t}=e;return t(["播放"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["從資料庫中永久移除該Podcast?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["這也將移除該PodcastRSS列表 "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除Podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["新增"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個Podcast"]),t([n(r("count"))," 個Podcast"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["全部標記為已播放"])},"new-episodes":e=>{const{normalize:t}=e;return t(["最新單集"])},title:e=>{const{normalize:t}=e;return t(["Podcast"])},update:e=>{const{normalize:t}=e;return t(["更新"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["新增串流"])},clear:e=>{const{normalize:t}=e;return t(["清除"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},edit:e=>{const{normalize:t}=e;return t(["編輯"])},"hide-previous":e=>{const{normalize:t}=e;return t(["隱藏歷史"])},title:e=>{const{normalize:t}=e;return t(["清單"])},save:e=>{const{normalize:t}=e;return t(["儲存"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個電台"]),t([n(r("count"))," 個電台"])])},title:e=>{const{normalize:t}=e;return t(["電台"])}},search:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},expression:e=>{const{normalize:t}=e;return t(["表達式"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["提示:如果您使用 ",n(r("query"))," 前綴,則可以通過智能播放列表查詢語言 ",n(r("help"))," 進行搜尋"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到結果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜尋"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcast"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示專輯"]),t(["顯示所有 ",n(r("count"))," 個專輯"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示藝人"]),t(["顯示所有 ",n(r("count"))," 位藝人"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示有聲書"]),t(["顯示所有 ",n(r("count"))," 本有聲書"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示作曲家"]),t(["顯示所有 ",n(r("count"))," 位作曲家"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示播放列表"]),t(["顯示所有 ",n(r("count"))," 個播放列表"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示Podcast"]),t(["顯示所有 ",n(r("count"))," 個Podcast"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示曲目"]),t(["顯示所有 ",n(r("count"))," 首曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])},tabs:{library:e=>{const{normalize:t}=e;return t(["資料庫"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{artwork:e=>{const{normalize:t}=e;return t(["封面"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone支持PNG和 JPEG封面,這些封面可以作為單獨的圖像文件放置在庫中或嵌入到媒體文件中,也可以通過電台在線提供"])},"explanation-2":e=>{const{normalize:t}=e;return t(["除此之外,您還可以從以下素材提供者獲取封面:"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["沒有活躍的配對請求"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配對代碼"])},"pairing-request":e=>{const{normalize:t}=e;return t(["遠程配對請求來自於 "])},pairing:e=>{const{normalize:t}=e;return t(["遙控配對"])},send:e=>{const{normalize:t}=e;return t(["發送"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["如果您的揚聲器需要配對,請在下面輸入它顯示的 PIN以啓用"])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["揚聲器配對和設備驗證"])},"verification-code":e=>{const{normalize:t}=e;return t(["驗證碼"])},verify:e=>{const{normalize:t}=e;return t(["驗證"])}},general:{"album-lists":e=>{const{normalize:t}=e;return t(["專輯列表"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},language:e=>{const{normalize:t}=e;return t(["語言"])},music:e=>{const{normalize:t}=e;return t(["音樂"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["如果您選擇的項目多於屏幕上可以顯示的項目,則側邊欄菜單將會消失"])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["選擇頂部導航欄菜單項"])},"navigation-items":e=>{const{normalize:t}=e;return t(["導航條"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["“正在播放”頁面"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcast"])},radio:e=>{const{normalize:t}=e;return t(["電台"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(["限制“最近新增”頁面上顯示的專輯數量"])},"recently-added-page":e=>{const{normalize:t}=e;return t(["“最近新增”頁面"])},search:e=>{const{normalize:t}=e;return t(["搜尋"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(["以逗號分隔音樂類型,作曲家會在“正在播放的頁面”上顯示"])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["留空以始終顯示作曲家"])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(["通過檢查是否包含定義的音樂類型之一來匹配當前曲目的音樂類型標籤。例如,設定為“古典、原聲帶”將顯示音樂類型標籤為“當代古典”的曲目的作曲家"])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["僅顯示列出的音樂類型的作曲家"])},"show-composer-info":e=>{const{normalize:t}=e;return t(["如果啓用,當前播放曲目的作曲家將顯示在“正在播放頁面”上"])},"show-composer":e=>{const{normalize:t}=e;return t(["顯示作曲家"])},"show-coverart":e=>{const{normalize:t}=e;return t(["在專輯列表中顯示封面藝術作品"])},"show-path":e=>{const{normalize:t}=e;return t(["在“正在播放”頁面顯示文件路徑"])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["使用您的 Last.fm 用戶名和密碼登入以啓用記錄功能"])},info:e=>{const{normalize:t}=e;return t(["OwnTone不會存儲您的 Last.fm 用戶名/密碼,僅存儲會話密鑰。會話密鑰不會過期"])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone並無Last.fm的官方支持"])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone並無 Spotify 官方的支持,也未安裝 libspotify"])},"logged-as":e=>{const{normalize:t}=e;return t(["登入為 "])},requirements:e=>{const{normalize:t}=e;return t(["您必須擁有 Spotify付費帳戶"])},scopes:e=>{const{normalize:t}=e;return t(["訪問 Spotify Web API 可以掃描您的 Spotify庫。所需範圍是:"])},user:e=>{const{normalize:t}=e;return t(["授予訪問權限"])},authorize:e=>{const{normalize:t}=e;return t(["授權 Web API 訪問"])},"grant-access":e=>{const{normalize:t}=e;return t(["授予對 Spotify Web API 的訪問權限"])},reauthorize:e=>{const{normalize:t}=e;return t(["請重新授權 Web API 訪問權限,以授予 OwnTone 以下附加訪問權限:"])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["登入"])},logout:e=>{const{normalize:t}=e;return t(["退出"])},password:e=>{const{normalize:t}=e;return t(["密碼"])},username:e=>{const{normalize:t}=e;return t(["用戶名"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["封面"])},general:e=>{const{normalize:t}=e;return t(["概覽"])},"online-services":e=>{const{normalize:t}=e;return t(["在線服務"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["遙控和輸出"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["特色列表"])},"new-releases":e=>{const{normalize:t}=e;return t(["最新發行"])},"show-more":e=>{const{normalize:t}=e;return t(["顯示更多"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])}},search:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到結果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜尋"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示專輯"]),t(["顯示所有 ",n(r("count"))," 個專輯"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示藝人"]),t(["顯示所有 ",n(r("count"))," 位藝人"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示播放列表"]),t(["顯示所有 ",n(r("count"))," 個播放列表"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示曲目"]),t(["顯示所有 ",n(r("count"))," 首曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["檔案夾"])},plain:e=>{const{normalize:t}=e;return t(["簡單"])},smart:e=>{const{normalize:t}=e;return t(["智能"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["清除歷史"])},pause:e=>{const{normalize:t}=e;return t(["暫停"])},play:e=>{const{normalize:t}=e;return t(["播放"])},repeat:e=>{const{normalize:t}=e;return t(["重復播放所有曲目"])},"repeat-off":e=>{const{normalize:t}=e;return t(["所有曲目僅播放一遍"])},"repeat-once":e=>{const{normalize:t}=e;return t(["重復當前曲目"])},"seek-backward":e=>{const{normalize:t}=e;return t(["在當前曲目後退"])},"seek-forward":e=>{const{normalize:t}=e;return t(["在當前曲目前進"])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放曲目"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["按順序播放曲目"])},"skip-backward":e=>{const{normalize:t}=e;return t(["播放上一首"])},"skip-forward":e=>{const{normalize:t}=e;return t(["播放下一首"])},stop:e=>{const{normalize:t}=e;return t(["停止"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["顯示/隱藏歌詞"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (設定儲存錯誤)"])},saved:e=>{const{normalize:t}=e;return t([" (設定已儲存)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["無法連接到 OwnTone 伺服器"])},"missing-port":e=>{const{normalize:t}=e;return t(["缺少 websocket 端口"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["請求失敗 (狀態:",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["清單以新增到播放列表 ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["已附加到隊列的 ",n(r("count"))," 首曲目"]),t(["已附加到隊列的 ",n(r("count"))," 首曲目"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["清單是空的"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["今日"])},"last-week":e=>{const{normalize:t}=e;return t(["上周"])},"last-month":e=>{const{normalize:t}=e;return t(["上月"])},undefined:e=>{const{normalize:t}=e;return t(["未定義"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["單聲道"])},stereo:e=>{const{normalize:t}=e;return t(["立體聲"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 信道"]),t([n(r("count"))," 信道"])])}}}}),Ul=tS({availableLocales:"zh-TW",fallbackLocale:"en",fallbackWarn:!1,legacy:!1,locale:navigator.language,messages:dS,missingWarn:!1}),cr=Un("NotificationsStore",{state:()=>({list:[],next_id:1}),actions:{add(e){const t={id:this.next_id++,text:e.text,timeout:e.timeout,topic:e.topic,type:e.type};if(t.topic){const n=this.list.findIndex(r=>r.topic===t.topic);if(n>=0){this.list.splice(n,1,t);return}}this.list.push(t),e.timeout>0&&setTimeout(()=>{this.remove(t)},e.timeout)},remove(e){const t=this.list.indexOf(e);t!==-1&&this.list.splice(t,1)}}}),xn=Un("PlayerStore",{state:()=>({consume:!1,item_id:0,item_length_ms:0,item_progress_ms:0,repeat:"off",shuffle:!1,state:"stop",volume:0})}),Qn=Un("QueueStore",{state:()=>({count:0,items:[],version:0}),getters:{current(e){const t=xn();return e.items.find(n=>n.id===t.item_id)??{}}}}),{t:Qo}=Ul.global;ue.interceptors.response.use(e=>e,e=>(e.request.status&&e.request.responseURL&&cr().add({text:Qo("server.request-failed",{cause:e.request.statusText,status:e.request.status,url:e.request.responseURL}),type:"danger"}),Promise.reject(e)));const B={config(){return ue.get("./api/config")},lastfm(){return ue.get("./api/lastfm")},lastfm_login(e){return ue.post("./api/lastfm-login",e)},lastfm_logout(){return ue.get("./api/lastfm-logout")},library_add(e){return ue.post("./api/library/add",null,{params:{url:e}})},library_album(e){return ue.get(`./api/library/albums/${e}`)},library_album_track_update(e,t){return ue.put(`./api/library/albums/${e}/tracks`,null,{params:t})},library_album_tracks(e,t={limit:-1,offset:0}){return ue.get(`./api/library/albums/${e}/tracks`,{params:t})},library_albums(e){return ue.get("./api/library/albums",{params:{media_kind:e}})},library_artist(e){return ue.get(`./api/library/artists/${e}`)},library_artist_albums(e){return ue.get(`./api/library/artists/${e}/albums`)},library_artist_tracks(e){const t={expression:`songartistid is "${e}"`,type:"tracks"};return ue.get("./api/search",{params:t})},library_artists(e){return ue.get("./api/library/artists",{params:{media_kind:e}})},library_composer(e){return ue.get(`./api/library/composers/${encodeURIComponent(e)}`)},library_composer_albums(e){const t={expression:`composer is "${e}" and media_kind is music`,type:"albums"};return ue.get("./api/search",{params:t})},library_composer_tracks(e){const t={expression:`composer is "${e}" and media_kind is music`,type:"tracks"};return ue.get("./api/search",{params:t})},library_composers(e){return ue.get("./api/library/composers",{params:{media_kind:e}})},library_count(e){return ue.get(`./api/library/count?expression=${e}`)},library_files(e){return ue.get("./api/library/files",{params:{directory:e}})},library_genre(e,t){const n={expression:`genre is "${e}" and media_kind is ${t}`,type:"genres"};return ue.get("./api/search",{params:n})},library_genre_albums(e,t){const n={expression:`genre is "${e}" and media_kind is ${t}`,type:"albums"};return ue.get("./api/search",{params:n})},library_genre_tracks(e,t){const n={expression:`genre is "${e}" and media_kind is ${t}`,type:"tracks"};return ue.get("./api/search",{params:n})},library_genres(e){const t={expression:`media_kind is ${e}`,type:"genres"};return ue.get("./api/search",{params:t})},library_playlist(e){return ue.get(`./api/library/playlists/${e}`)},library_playlist_delete(e){return ue.delete(`./api/library/playlists/${e}`,null)},library_playlist_folder(e=0){return ue.get(`./api/library/playlists/${e}/playlists`)},library_playlist_tracks(e){return ue.get(`./api/library/playlists/${e}/tracks`)},library_podcast_episodes(e){const t={expression:`media_kind is podcast and songalbumid is "${e}" ORDER BY date_released DESC`,type:"tracks"};return ue.get("./api/search",{params:t})},library_podcasts_new_episodes(){const e={expression:"media_kind is podcast and play_count = 0 ORDER BY time_added DESC",type:"tracks"};return ue.get("./api/search",{params:e})},library_radio_streams(){const e={expression:"data_kind is url and song_length = 0",media_kind:"music",type:"tracks"};return ue.get("./api/search",{params:e})},library_rescan(e){return ue.put("./api/rescan",null,{params:{scan_kind:e}})},library_stats(){return ue.get("./api/library")},library_track(e){return ue.get(`./api/library/tracks/${e}`)},library_track_playlists(e){return ue.get(`./api/library/tracks/${e}/playlists`)},library_track_update(e,t={}){return ue.put(`./api/library/tracks/${e}`,null,{params:t})},library_update(e){return ue.put("./api/update",null,{params:{scan_kind:e}})},output_toggle(e){return ue.put(`./api/outputs/${e}/toggle`)},output_update(e,t){return ue.put(`./api/outputs/${e}`,t)},outputs(){return ue.get("./api/outputs")},pairing(){return ue.get("./api/pairing")},pairing_kickoff(e){return ue.post("./api/pairing",e)},player_consume(e){return ue.put(`./api/player/consume?state=${e}`)},player_next(){return ue.put("./api/player/next")},player_output_volume(e,t){return ue.put(`./api/player/volume?volume=${t}&output_id=${e}`)},player_pause(){return ue.put("./api/player/pause")},player_play(e={}){return ue.put("./api/player/play",null,{params:e})},player_play_expression(e,t,n){const r={clear:"true",expression:e,playback:"start",playback_from_position:n,shuffle:t};return ue.post("./api/queue/items/add",null,{params:r})},player_play_uri(e,t,n){const r={clear:"true",playback:"start",playback_from_position:n,shuffle:t,uris:e};return ue.post("./api/queue/items/add",null,{params:r})},player_previous(){return ue.put("./api/player/previous")},player_repeat(e){return ue.put(`./api/player/repeat?state=${e}`)},player_seek(e){return ue.put(`./api/player/seek?seek_ms=${e}`)},player_seek_to_pos(e){return ue.put(`./api/player/seek?position_ms=${e}`)},player_shuffle(e){return ue.put(`./api/player/shuffle?state=${e}`)},player_status(){return ue.get("./api/player")},player_stop(){return ue.put("./api/player/stop")},player_volume(e){return ue.put(`./api/player/volume?volume=${e}`)},queue(){return ue.get("./api/queue")},queue_add(e){return ue.post(`./api/queue/items/add?uris=${e}`).then(t=>(cr().add({text:Qo("server.appended-tracks",{count:t.data.count}),timeout:2e3,type:"info"}),Promise.resolve(t)))},queue_add_next(e){let t=0;const{current:n}=Qn();return n!=null&&n.id&&(t=n.position+1),ue.post(`./api/queue/items/add?uris=${e}&position=${t}`).then(r=>(cr().add({text:Qo("server.appended-tracks",{count:r.data.count}),timeout:2e3,type:"info"}),Promise.resolve(r)))},queue_clear(){return ue.put("./api/queue/clear")},queue_expression_add(e){return ue.post("./api/queue/items/add",null,{params:{expression:e}}).then(t=>(cr().add({text:Qo("server.appended-tracks",{count:t.data.count}),timeout:2e3,type:"info"}),Promise.resolve(t)))},queue_expression_add_next(e){const t={};t.expression=e,t.position=0;const{current:n}=Qn();return n!=null&&n.id&&(t.position=n.position+1),ue.post("./api/queue/items/add",null,{params:t}).then(r=>(cr().add({text:Qo("server.appended-tracks",{count:r.data.count}),timeout:2e3,type:"info"}),Promise.resolve(r)))},queue_move(e,t){return ue.put(`./api/queue/items/${e}?new_position=${t}`)},queue_remove(e){return ue.delete(`./api/queue/items/${e}`)},queue_save_playlist(e){return ue.post("./api/queue/save",null,{params:{name:e}}).then(t=>(cr().add({text:Qo("server.queue-saved",{name:e}),timeout:2e3,type:"info"}),Promise.resolve(t)))},search(e){return ue.get("./api/search",{params:e})},settings(){return ue.get("./api/settings")},settings_update(e,t){return ue.put(`./api/settings/${e}/${t.name}`,t)},spotify(){return ue.get("./api/spotify")},spotify_logout(){return ue.get("./api/spotify-logout")}},ae=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},mS={name:"ModalDialogRemotePairing",props:{show:Boolean},emits:["close"],setup(){return{remoteStore:Ad()}},data(){return{pairing_req:{pin:""}}},computed:{pairing(){return this.remoteStore.pairing}},watch:{show(){this.show&&(this.loading=!1,setTimeout(()=>{this.$refs.pin_field.focus()},10))}},methods:{kickoff_pairing(){B.pairing_kickoff(this.pairing_req).then(()=>{this.pairing_req.pin=""})}}},fS={key:0,class:"modal is-active"},pS={class:"modal-content"},hS={class:"card"},_S={class:"card-content"},gS=["textContent"],yS=["textContent"],zS={class:"field"},vS={class:"control"},bS=["placeholder"],CS={class:"card-footer is-clipped"},wS=["textContent"],kS=["textContent"];function SS(e,t,n,r,o,s){const i=O("mdicon");return x(),we(Nt,{name:"fade"},{default:N(()=>[n.show?(x(),I("div",fS,[c("div",{class:"modal-background",onClick:t[0]||(t[0]=a=>e.$emit("close"))}),c("div",pS,[c("div",hS,[c("div",_S,[c("p",{class:"title is-4",textContent:y(e.$t("dialog.remote-pairing.title"))},null,8,gS),c("form",{onSubmit:t[2]||(t[2]=_t((...a)=>s.kickoff_pairing&&s.kickoff_pairing(...a),["prevent"]))},[c("label",{class:"label",textContent:y(s.pairing.remote)},null,8,yS),c("div",zS,[c("div",vS,[pt(c("input",{ref:"pin_field","onUpdate:modelValue":t[1]||(t[1]=a=>o.pairing_req.pin=a),class:"input",inputmode:"numeric",pattern:"[\\d]{4}",placeholder:e.$t("dialog.remote-pairing.pairing-code")},null,8,bS),[[hn,o.pairing_req.pin]])])])],32)]),c("footer",CS,[c("a",{class:"card-footer-item has-text-danger",onClick:t[3]||(t[3]=a=>e.$emit("close"))},[b(i,{class:"icon",name:"cancel",size:"16"}),c("span",{class:"is-size-7",textContent:y(e.$t("dialog.remote-pairing.cancel"))},null,8,wS)]),c("a",{class:"card-footer-item has-background-info has-text-white has-text-weight-bold",onClick:t[4]||(t[4]=(...a)=>s.kickoff_pairing&&s.kickoff_pairing(...a))},[b(i,{class:"icon",name:"cellphone",size:"16"}),c("span",{class:"is-size-7",textContent:y(e.$t("dialog.remote-pairing.pair"))},null,8,kS)])])])]),c("button",{class:"modal-close is-large","aria-label":"close",onClick:t[5]||(t[5]=a=>e.$emit("close"))})])):ee("",!0)]),_:1})}const xS=ae(mS,[["render",SS]]),ES={name:"ModalDialog",props:{close_action:{default:"",type:String},delete_action:{default:"",type:String},ok_action:{default:"",type:String},show:Boolean,title:{required:!0,type:String}},emits:["delete","close","ok"]},$S={key:0,class:"modal is-active"},TS={class:"modal-content"},AS={class:"card"},OS={class:"card-content"},PS=["textContent"],IS={class:"card-footer is-clipped"},LS=["textContent"],NS=["textContent"],DS=["textContent"];function RS(e,t,n,r,o,s){const i=O("mdicon");return x(),we(Nt,{name:"fade"},{default:N(()=>[n.show?(x(),I("div",$S,[c("div",{class:"modal-background",onClick:t[0]||(t[0]=a=>e.$emit("close"))}),c("div",TS,[c("div",AS,[c("div",OS,[n.title?(x(),I("p",{key:0,class:"title is-4",textContent:y(n.title)},null,8,PS)):ee("",!0),zt(e.$slots,"modal-content")]),c("footer",IS,[c("a",{class:"card-footer-item has-text-dark",onClick:t[1]||(t[1]=a=>e.$emit("close"))},[b(i,{class:"icon",name:"cancel",size:"16"}),c("span",{class:"is-size-7",textContent:y(n.close_action)},null,8,LS)]),n.delete_action?(x(),I("a",{key:0,class:"card-footer-item has-background-danger has-text-white has-text-weight-bold",onClick:t[2]||(t[2]=a=>e.$emit("delete"))},[b(i,{class:"icon",name:"delete",size:"16"}),c("span",{class:"is-size-7",textContent:y(n.delete_action)},null,8,NS)])):ee("",!0),n.ok_action?(x(),I("a",{key:1,class:"card-footer-item has-background-info has-text-white has-text-weight-bold",onClick:t[3]||(t[3]=a=>e.$emit("ok"))},[b(i,{class:"icon",name:"check",size:"16"}),c("span",{class:"is-size-7",textContent:y(n.ok_action)},null,8,DS)])):ee("",!0)])])]),c("button",{class:"modal-close is-large","aria-label":"close",onClick:t[4]||(t[4]=a=>e.$emit("close"))})])):ee("",!0)]),_:3})}const jd=ae(ES,[["render",RS]]),jl=Un("LibraryStore",{state:()=>({albums:0,artists:0,db_playtime:0,songs:0,rss:{},started_at:"01",updated_at:"01",update_dialog_scan_kind:"",updating:!1})}),Ot=Un("ServicesStore",{state:()=>({lastfm:{},spotify:{}})}),MS={name:"ModalDialogUpdate",components:{ModalDialog:jd},props:{show:Boolean},emits:["close"],setup(){return{libraryStore:jl(),servicesStore:Ot()}},data(){return{rescan_metadata:!1}},computed:{library(){return this.libraryStore.$state},rss(){return this.libraryStore.rss},spotify_enabled(){return this.servicesStore.spotify.webapi_token_valid},update_dialog_scan_kind:{get(){return this.library.update_dialog_scan_kind},set(e){this.library.update_dialog_scan_kind=e}}},methods:{close(){this.update_dialog_scan_kind="",this.$emit("close")},update_library(){this.rescan_metadata?B.library_rescan(this.update_dialog_scan_kind):B.library_update(this.update_dialog_scan_kind)}}},FS={key:0},VS=["textContent"],HS={key:0,class:"field"},US={class:"control"},jS={class:"select is-small"},BS=["textContent"],WS=["textContent"],qS=["textContent"],GS=["textContent"],KS={class:"field"},ZS=["textContent"],YS={key:1},XS=["textContent"];function JS(e,t,n,r,o,s){const i=O("modal-dialog");return x(),we(i,{show:n.show,title:e.$t("dialog.update.title"),ok_action:s.library.updating?"":e.$t("dialog.update.rescan"),close_action:e.$t("dialog.update.cancel"),onOk:s.update_library,onClose:t[2]||(t[2]=a=>s.close())},{"modal-content":N(()=>[s.library.updating?(x(),I("div",YS,[c("p",{class:"mb-3",textContent:y(e.$t("dialog.update.progress"))},null,8,XS)])):(x(),I("div",FS,[c("p",{class:"mb-3",textContent:y(e.$t("dialog.update.info"))},null,8,VS),s.spotify_enabled||s.rss.tracks>0?(x(),I("div",HS,[c("div",US,[c("div",jS,[pt(c("select",{"onUpdate:modelValue":t[0]||(t[0]=a=>s.update_dialog_scan_kind=a)},[c("option",{value:"",textContent:y(e.$t("dialog.update.all"))},null,8,BS),c("option",{value:"files",textContent:y(e.$t("dialog.update.local"))},null,8,WS),s.spotify_enabled?(x(),I("option",{key:0,value:"spotify",textContent:y(e.$t("dialog.update.spotify"))},null,8,qS)):ee("",!0),s.rss.tracks>0?(x(),I("option",{key:1,value:"rss",textContent:y(e.$t("dialog.update.feeds"))},null,8,GS)):ee("",!0)],512),[[Td,s.update_dialog_scan_kind]])])])])):ee("",!0),c("div",KS,[pt(c("input",{id:"rescan","onUpdate:modelValue":t[1]||(t[1]=a=>o.rescan_metadata=a),type:"checkbox",class:"switch is-rounded is-small"},null,512),[[Rn,o.rescan_metadata]]),c("label",{for:"rescan",textContent:y(e.$t("dialog.update.rescan-metadata"))},null,8,ZS)])]))]),_:1},8,["show","title","ok_action","close_action","onOk"])}const QS=ae(MS,[["render",JS]]),ex={name:"ControlSlider",props:{cursor:{default:"",type:String},disabled:Boolean,max:{required:!0,type:Number},value:{required:!0,type:Number}},emits:["update:value"],computed:{ratio(){return this.value/this.max}}},tx=["value","disabled","max"];function nx(e,t,n,r,o,s){return x(),I("input",{value:n.value,disabled:n.disabled,class:ke(["slider",{"is-inactive":n.disabled}]),max:n.max,type:"range",style:ao({"--ratio":s.ratio,"--cursor":e.$filters.cursor(n.cursor)}),onInput:t[0]||(t[0]=i=>e.$emit("update:value",i.target.valueAsNumber))},null,46,tx)}const Bd=ae(ex,[["render",nx]]),gn=Un("UIStore",{state:()=>({albums_sort:1,artist_albums_sort:1,artist_tracks_sort:1,artists_sort:1,composer_tracks_sort:1,genre_tracks_sort:1,hide_singles:!1,hide_spotify:!1,show_burger_menu:!1,show_only_next_items:!1,show_player_menu:!1,show_update_dialog:!1})}),rx={name:"NavbarItemLink",props:{to:{required:!0,type:Object}},setup(){return{uiStore:gn()}},computed:{href(){return this.$router.resolve(this.to).href}},methods:{open(){this.uiStore.show_burger_menu&&(this.uiStore.show_burger_menu=!1),this.uiStore.show_player_menu&&(this.uiStore.show_player_menu=!1),this.$router.push(this.to)}}},ox=["href"];function sx(e,t,n,r,o,s){return x(),I("a",{class:"navbar-item",href:s.href,onClick:t[0]||(t[0]=_t((...i)=>s.open&&s.open(...i),["stop","prevent"]))},[zt(e.$slots,"default")],8,ox)}const ky=ae(rx,[["render",sx]]);var ix="M11,14C12,14 13.05,14.16 14.2,14.44C13.39,15.31 13,16.33 13,17.5C13,18.39 13.25,19.23 13.78,20H3V18C3,16.81 3.91,15.85 5.74,15.12C7.57,14.38 9.33,14 11,14M11,12C9.92,12 9,11.61 8.18,10.83C7.38,10.05 7,9.11 7,8C7,6.92 7.38,6 8.18,5.18C9,4.38 9.92,4 11,4C12.11,4 13.05,4.38 13.83,5.18C14.61,6 15,6.92 15,8C15,9.11 14.61,10.05 13.83,10.83C13.05,11.61 12.11,12 11,12M18.5,10H20L22,10V12H20V17.5A2.5,2.5 0 0,1 17.5,20A2.5,2.5 0 0,1 15,17.5A2.5,2.5 0 0,1 17.5,15C17.86,15 18.19,15.07 18.5,15.21V10Z",ax="M12,11A1,1 0 0,0 11,12A1,1 0 0,0 12,13A1,1 0 0,0 13,12A1,1 0 0,0 12,11M12,16.5C9.5,16.5 7.5,14.5 7.5,12C7.5,9.5 9.5,7.5 12,7.5C14.5,7.5 16.5,9.5 16.5,12C16.5,14.5 14.5,16.5 12,16.5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",lx="M13 14H11V9H13M13 18H11V16H13M1 21H23L12 2L1 21Z",cx="M19.92,12.08L12,20L4.08,12.08L5.5,10.67L11,16.17V2H13V16.17L18.5,10.66L19.92,12.08M12,20H2V22H22V20H12Z",ux="M19 2L14 6.5V17.5L19 13V2M6.5 5C4.55 5 2.45 5.4 1 6.5V21.16C1 21.41 1.25 21.66 1.5 21.66C1.6 21.66 1.65 21.59 1.75 21.59C3.1 20.94 5.05 20.5 6.5 20.5C8.45 20.5 10.55 20.9 12 22C13.35 21.15 15.8 20.5 17.5 20.5C19.15 20.5 20.85 20.81 22.25 21.56C22.35 21.61 22.4 21.59 22.5 21.59C22.75 21.59 23 21.34 23 21.09V6.5C22.4 6.05 21.75 5.75 21 5.5V19C19.9 18.65 18.7 18.5 17.5 18.5C15.8 18.5 13.35 19.15 12 20V6.5C10.55 5.4 8.45 5 6.5 5Z",dx="M12 21.5C10.65 20.65 8.2 20 6.5 20C4.85 20 3.15 20.3 1.75 21.05C1.65 21.1 1.6 21.1 1.5 21.1C1.25 21.1 1 20.85 1 20.6V6C1.6 5.55 2.25 5.25 3 5C4.11 4.65 5.33 4.5 6.5 4.5C8.45 4.5 10.55 4.9 12 6C13.45 4.9 15.55 4.5 17.5 4.5C18.67 4.5 19.89 4.65 21 5C21.75 5.25 22.4 5.55 23 6V20.6C23 20.85 22.75 21.1 22.5 21.1C22.4 21.1 22.35 21.1 22.25 21.05C20.85 20.3 19.15 20 17.5 20C15.8 20 13.35 20.65 12 21.5M12 8V19.5C13.35 18.65 15.8 18 17.5 18C18.7 18 19.9 18.15 21 18.5V7C19.9 6.65 18.7 6.5 17.5 6.5C15.8 6.5 13.35 7.15 12 8M13 11.5C14.11 10.82 15.6 10.5 17.5 10.5C18.41 10.5 19.26 10.59 20 10.78V9.23C19.13 9.08 18.29 9 17.5 9C15.73 9 14.23 9.28 13 9.84V11.5M17.5 11.67C15.79 11.67 14.29 11.93 13 12.46V14.15C14.11 13.5 15.6 13.16 17.5 13.16C18.54 13.16 19.38 13.24 20 13.4V11.9C19.13 11.74 18.29 11.67 17.5 11.67M20 14.57C19.13 14.41 18.29 14.33 17.5 14.33C15.67 14.33 14.17 14.6 13 15.13V16.82C14.11 16.16 15.6 15.83 17.5 15.83C18.54 15.83 19.38 15.91 20 16.07V14.57Z",mx="M9 3V18H12V3H9M12 5L16 18L19 17L15 4L12 5M5 5V18H8V5H5M3 19V21H21V19H3Z",fx="M12 10C10.9 10 10 10.9 10 12S10.9 14 12 14 14 13.1 14 12 13.1 10 12 10M18 12C18 8.7 15.3 6 12 6S6 8.7 6 12C6 14.2 7.2 16.1 9 17.2L10 15.5C8.8 14.8 8 13.5 8 12.1C8 9.9 9.8 8.1 12 8.1S16 9.9 16 12.1C16 13.6 15.2 14.9 14 15.5L15 17.2C16.8 16.2 18 14.2 18 12M12 2C6.5 2 2 6.5 2 12C2 15.7 4 18.9 7 20.6L8 18.9C5.6 17.5 4 14.9 4 12C4 7.6 7.6 4 12 4S20 7.6 20 12C20 15 18.4 17.5 16 18.9L17 20.6C20 18.9 22 15.7 22 12C22 6.5 17.5 2 12 2Z",Bl="M12 2C17.5 2 22 6.5 22 12S17.5 22 12 22 2 17.5 2 12 6.5 2 12 2M12 4C10.1 4 8.4 4.6 7.1 5.7L18.3 16.9C19.3 15.5 20 13.8 20 12C20 7.6 16.4 4 12 4M16.9 18.3L5.7 7.1C4.6 8.4 4 10.1 4 12C4 16.4 7.6 20 12 20C13.9 20 15.6 19.4 16.9 18.3Z",px="M1,10V12A9,9 0 0,1 10,21H12C12,14.92 7.07,10 1,10M1,14V16A5,5 0 0,1 6,21H8A7,7 0 0,0 1,14M1,18V21H4A3,3 0 0,0 1,18M21,3H3C1.89,3 1,3.89 1,5V8H3V5H21V19H14V21H21A2,2 0 0,0 23,19V5C23,3.89 22.1,3 21,3Z",hx="M6,22H18L12,16M21,3H3A2,2 0 0,0 1,5V17A2,2 0 0,0 3,19H7V17H3V5H21V17H17V19H21A2,2 0 0,0 23,17V5A2,2 0 0,0 21,3Z",_x="M17,19H7V5H17M17,1H7C5.89,1 5,1.89 5,3V21A2,2 0 0,0 7,23H17A2,2 0 0,0 19,21V3C19,1.89 18.1,1 17,1Z",gx="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z",yx="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z",zx="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z",vx="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z",bx="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z",Cx="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z",wx="M20.37,8.91L19.37,10.64L7.24,3.64L8.24,1.91L11.28,3.66L12.64,3.29L16.97,5.79L17.34,7.16L20.37,8.91M6,19V7H11.07L18,11V19A2,2 0 0,1 16,21H8A2,2 0 0,1 6,19Z",kx="M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z",Sx="M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z",xx="M3,15V13H5V15H3M3,11V9H5V11H3M7,15V13H9V15H7M7,11V9H9V11H7M11,15V13H13V15H11M11,11V9H13V11H11M15,15V13H17V15H15M15,11V9H17V11H15M19,15V13H21V15H19M19,11V9H21V11H19Z",Ex="M11.5,3C6.85,3 2.92,6.03 1.53,10.22L3.9,11C4.95,7.81 7.96,5.5 11.5,5.5C13.46,5.5 15.23,6.22 16.62,7.38L14,10H21V3L18.4,5.6C16.55,4 14.15,3 11.5,3M19,14V20C19,21.11 18.11,22 17,22H15A2,2 0 0,1 13,20V14A2,2 0 0,1 15,12H17C18.11,12 19,12.9 19,14M15,14V20H17V14H15M11,20C11,21.11 10.1,22 9,22H5V20H9V18H7V16H9V14H5V12H9A2,2 0 0,1 11,14V15.5A1.5,1.5 0 0,1 9.5,17A1.5,1.5 0 0,1 11,18.5V20Z",$x="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M13,13H11V18A2,2 0 0,1 9,20A2,2 0 0,1 7,18A2,2 0 0,1 9,16C9.4,16 9.7,16.1 10,16.3V11H13V13M13,9V3.5L18.5,9H13Z",Tx="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z",Ax="M17.66 11.2C17.43 10.9 17.15 10.64 16.89 10.38C16.22 9.78 15.46 9.35 14.82 8.72C13.33 7.26 13 4.85 13.95 3C13 3.23 12.17 3.75 11.46 4.32C8.87 6.4 7.85 10.07 9.07 13.22C9.11 13.32 9.15 13.42 9.15 13.55C9.15 13.77 9 13.97 8.8 14.05C8.57 14.15 8.33 14.09 8.14 13.93C8.08 13.88 8.04 13.83 8 13.76C6.87 12.33 6.69 10.28 7.45 8.64C5.78 10 4.87 12.3 5 14.47C5.06 14.97 5.12 15.47 5.29 15.97C5.43 16.57 5.7 17.17 6 17.7C7.08 19.43 8.95 20.67 10.96 20.92C13.1 21.19 15.39 20.8 17.03 19.32C18.86 17.66 19.5 15 18.56 12.72L18.43 12.46C18.22 12 17.66 11.2 17.66 11.2M14.5 17.5C14.22 17.74 13.76 18 13.4 18.1C12.28 18.5 11.16 17.94 10.5 17.28C11.69 17 12.4 16.12 12.61 15.23C12.78 14.43 12.46 13.77 12.33 13C12.21 12.26 12.23 11.63 12.5 10.94C12.69 11.32 12.89 11.7 13.13 12C13.9 13 15.11 13.44 15.37 14.8C15.41 14.94 15.43 15.08 15.43 15.23C15.46 16.05 15.1 16.95 14.5 17.5H14.5Z",Ox="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z",Px="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z",Ix="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3",Lx="M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z",Nx="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z",Dx="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z",Rx="M12,2A3,3 0 0,1 15,5V11A3,3 0 0,1 12,14A3,3 0 0,1 9,11V5A3,3 0 0,1 12,2M19,11C19,14.53 16.39,17.44 13,17.93V21H11V17.93C7.61,17.44 5,14.53 5,11H7A5,5 0 0,0 12,16A5,5 0 0,0 17,11H19Z",Mx="M21,3V15.5A3.5,3.5 0 0,1 17.5,19A3.5,3.5 0 0,1 14,15.5A3.5,3.5 0 0,1 17.5,12C18.04,12 18.55,12.12 19,12.34V6.47L9,8.6V17.5A3.5,3.5 0 0,1 5.5,21A3.5,3.5 0 0,1 2,17.5A3.5,3.5 0 0,1 5.5,14C6.04,14 6.55,14.12 7,14.34V6L21,3Z",Fx="M4,6H2V20A2,2 0 0,0 4,22H18V20H4M18,7H15V12.5A2.5,2.5 0 0,1 12.5,15A2.5,2.5 0 0,1 10,12.5A2.5,2.5 0 0,1 12.5,10C13.07,10 13.58,10.19 14,10.5V5H18M20,2H8A2,2 0 0,0 6,4V16A2,2 0 0,0 8,18H20A2,2 0 0,0 22,16V4A2,2 0 0,0 20,2Z",Vx="M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z",Hx="M14,19H18V5H14M6,19H10V5H6V19Z",Ux="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z",jx="M22,14H20V16H14V13H16V11H14V6A2,2 0 0,0 12,4H4V2H2V10H4V8H10V11H8V13H10V18A2,2 0 0,0 12,20H20V22H22",Bx="M8,5.14V19.14L19,12.14L8,5.14Z",Wx="M3 10H14V12H3V10M3 6H14V8H3V6M3 14H10V16H3V14M16 13V21L22 17L16 13Z",qx="M3 16H10V14H3M18 14V10H16V14H12V16H16V20H18V16H22V14M14 6H3V8H14M14 10H3V12H14V10Z",Gx="M20,6A2,2 0 0,1 22,8V20A2,2 0 0,1 20,22H4A2,2 0 0,1 2,20V8C2,7.15 2.53,6.42 3.28,6.13L15.71,1L16.47,2.83L8.83,6H20M20,8H4V12H16V10H18V12H20V8M7,14A3,3 0 0,0 4,17A3,3 0 0,0 7,20A3,3 0 0,0 10,17A3,3 0 0,0 7,14Z",Kx="M12,10A2,2 0 0,1 14,12C14,12.5 13.82,12.94 13.53,13.29L16.7,22H14.57L12,14.93L9.43,22H7.3L10.47,13.29C10.18,12.94 10,12.5 10,12A2,2 0 0,1 12,10M12,8A4,4 0 0,0 8,12C8,12.5 8.1,13 8.28,13.46L7.4,15.86C6.53,14.81 6,13.47 6,12A6,6 0 0,1 12,6A6,6 0 0,1 18,12C18,13.47 17.47,14.81 16.6,15.86L15.72,13.46C15.9,13 16,12.5 16,12A4,4 0 0,0 12,8M12,4A8,8 0 0,0 4,12C4,14.36 5,16.5 6.64,17.94L5.92,19.94C3.54,18.11 2,15.23 2,12A10,10 0 0,1 12,2A10,10 0 0,1 22,12C22,15.23 20.46,18.11 18.08,19.94L17.36,17.94C19,16.5 20,14.36 20,12A8,8 0 0,0 12,4Z",Zx="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z",Yx="M17,17H7V14L3,18L7,22V19H19V13H17M7,7H17V10L21,6L17,2V5H5V11H7V7Z",Xx="M2,5.27L3.28,4L20,20.72L18.73,22L15.73,19H7V22L3,18L7,14V17H13.73L7,10.27V11H5V8.27L2,5.27M17,13H19V17.18L17,15.18V13M17,5V2L21,6L17,10V7H8.82L6.82,5H17Z",Jx="M13,15V9H12L10,10V11H11.5V15M17,17H7V14L3,18L7,22V19H19V13H17M7,7H17V10L21,6L17,2V5H5V11H7V7Z",Qx="M12.5,3C17.15,3 21.08,6.03 22.47,10.22L20.1,11C19.05,7.81 16.04,5.5 12.5,5.5C10.54,5.5 8.77,6.22 7.38,7.38L10,10H3V3L5.6,5.6C7.45,4 9.85,3 12.5,3M10,12V22H8V14H6V12H10M18,14V20C18,21.11 17.11,22 16,22H14A2,2 0 0,1 12,20V14A2,2 0 0,1 14,12H16C17.11,12 18,12.9 18,14M14,14V20H16V14H14Z",eE="M6.18,15.64A2.18,2.18 0 0,1 8.36,17.82C8.36,19 7.38,20 6.18,20C5,20 4,19 4,17.82A2.18,2.18 0 0,1 6.18,15.64M4,4.44A15.56,15.56 0 0,1 19.56,20H16.73A12.73,12.73 0 0,0 4,7.27V4.44M4,10.1A9.9,9.9 0 0,1 13.9,20H11.07A7.07,7.07 0 0,0 4,12.93V10.1Z",tE="M15,20A1,1 0 0,0 16,19V4H8A1,1 0 0,0 7,5V16H5V5A3,3 0 0,1 8,2H19A3,3 0 0,1 22,5V6H20V5A1,1 0 0,0 19,4A1,1 0 0,0 18,5V9L18,19A3,3 0 0,1 15,22H5A3,3 0 0,1 2,19V18H13A2,2 0 0,0 15,20M9,6H14V8H9V6M9,10H14V12H9V10M9,14H14V16H9V14Z",nE="M13.8 22H5C3.3 22 2 20.7 2 19V18H13.1C13 18.3 13 18.7 13 19C13 20.1 13.3 21.1 13.8 22M13.8 16H5V5C5 3.3 6.3 2 8 2H19C20.7 2 22 3.3 22 5V6H20V5C20 4.4 19.6 4 19 4S18 4.4 18 5V13.1C16.2 13.4 14.7 14.5 13.8 16M8 8H15V6H8V8M8 12H14V10H8V12M17 16V22L22 19L17 16Z",rE="M4,1H20A1,1 0 0,1 21,2V6A1,1 0 0,1 20,7H4A1,1 0 0,1 3,6V2A1,1 0 0,1 4,1M4,9H20A1,1 0 0,1 21,10V14A1,1 0 0,1 20,15H4A1,1 0 0,1 3,14V10A1,1 0 0,1 4,9M4,17H20A1,1 0 0,1 21,18V22A1,1 0 0,1 20,23H4A1,1 0 0,1 3,22V18A1,1 0 0,1 4,17M9,5H10V3H9V5M9,13H10V11H9V13M9,21H10V19H9V21M5,3V5H7V3H5M5,11V13H7V11H5M5,19V21H7V19H5Z",oE="M14.83,13.41L13.42,14.82L16.55,17.95L14.5,20H20V14.5L17.96,16.54L14.83,13.41M14.5,4L16.54,6.04L4,18.59L5.41,20L17.96,7.46L20,9.5V4M10.59,9.17L5.41,4L4,5.41L9.17,10.58L10.59,9.17Z",sE="M16,4.5V7H5V9H16V11.5L19.5,8M16,12.5V15H5V17H16V19.5L19.5,16",iE="M20,5V19L13,12M6,5V19H4V5M13,5V19L6,12",aE="M4,5V19L11,12M18,5V19H20V5M11,5V19L18,12",lE="M12,12A3,3 0 0,0 9,15A3,3 0 0,0 12,18A3,3 0 0,0 15,15A3,3 0 0,0 12,12M12,20A5,5 0 0,1 7,15A5,5 0 0,1 12,10A5,5 0 0,1 17,15A5,5 0 0,1 12,20M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8C10.89,8 10,7.1 10,6C10,4.89 10.89,4 12,4M17,2H7C5.89,2 5,2.89 5,4V20A2,2 0 0,0 7,22H17A2,2 0 0,0 19,20V4C19,2.89 18.1,2 17,2Z",cE="M17.9,10.9C14.7,9 9.35,8.8 6.3,9.75C5.8,9.9 5.3,9.6 5.15,9.15C5,8.65 5.3,8.15 5.75,8C9.3,6.95 15.15,7.15 18.85,9.35C19.3,9.6 19.45,10.2 19.2,10.65C18.95,11 18.35,11.15 17.9,10.9M17.8,13.7C17.55,14.05 17.1,14.2 16.75,13.95C14.05,12.3 9.95,11.8 6.8,12.8C6.4,12.9 5.95,12.7 5.85,12.3C5.75,11.9 5.95,11.45 6.35,11.35C10,10.25 14.5,10.8 17.6,12.7C17.9,12.85 18.05,13.35 17.8,13.7M16.6,16.45C16.4,16.75 16.05,16.85 15.75,16.65C13.4,15.2 10.45,14.9 6.95,15.7C6.6,15.8 6.3,15.55 6.2,15.25C6.1,14.9 6.35,14.6 6.65,14.5C10.45,13.65 13.75,14 16.35,15.6C16.7,15.75 16.75,16.15 16.6,16.45M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",uE="M18,18H6V6H18V18Z",dE="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z",mE="M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z",fE="M16.36,14C16.44,13.34 16.5,12.68 16.5,12C16.5,11.32 16.44,10.66 16.36,10H19.74C19.9,10.64 20,11.31 20,12C20,12.69 19.9,13.36 19.74,14M14.59,19.56C15.19,18.45 15.65,17.25 15.97,16H18.92C17.96,17.65 16.43,18.93 14.59,19.56M14.34,14H9.66C9.56,13.34 9.5,12.68 9.5,12C9.5,11.32 9.56,10.65 9.66,10H14.34C14.43,10.65 14.5,11.32 14.5,12C14.5,12.68 14.43,13.34 14.34,14M12,19.96C11.17,18.76 10.5,17.43 10.09,16H13.91C13.5,17.43 12.83,18.76 12,19.96M8,8H5.08C6.03,6.34 7.57,5.06 9.4,4.44C8.8,5.55 8.35,6.75 8,8M5.08,16H8C8.35,17.25 8.8,18.45 9.4,19.56C7.57,18.93 6.03,17.65 5.08,16M4.26,14C4.1,13.36 4,12.69 4,12C4,11.31 4.1,10.64 4.26,10H7.64C7.56,10.66 7.5,11.32 7.5,12C7.5,12.68 7.56,13.34 7.64,14M12,4.03C12.83,5.23 13.5,6.57 13.91,8H10.09C10.5,6.57 11.17,5.23 12,4.03M18.92,8H15.97C15.65,6.75 15.19,5.55 14.59,4.44C16.43,5.07 17.96,6.34 18.92,8M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z";const pE={name:"NavbarItemOutput",components:{ControlSlider:Bd},props:{output:{required:!0,type:Object}},data(){return{cursor:Bl,volume:this.output.selected?this.output.volume:0}},computed:{type_class(){return this.output.type.startsWith("AirPlay")?"cast-variant":this.output.type==="Chromecast"?"cast":this.output.type==="fifo"?"pipe":"server"}},watch:{output(){this.volume=this.output.volume}},methods:{change_volume(){B.player_output_volume(this.output.id,this.volume)},set_enabled(){const e={selected:!this.output.selected};B.output_update(this.output.id,e)}}},hE={class:"navbar-item"},_E={class:"level is-mobile"},gE={class:"level-left is-flex-grow-1"},yE={class:"level-item is-flex-grow-0"},zE={class:"level-item"},vE={class:"is-flex-grow-1"},bE=["textContent"];function CE(e,t,n,r,o,s){const i=O("mdicon"),a=O("control-slider");return x(),I("div",hE,[c("div",_E,[c("div",gE,[c("div",yE,[c("a",{class:ke(["button is-white is-small",{"has-text-grey-light":!n.output.selected}]),onClick:t[0]||(t[0]=(...l)=>s.set_enabled&&s.set_enabled(...l))},[b(i,{class:"icon",name:s.type_class,size:"18",title:n.output.type},null,8,["name","title"])],2)]),c("div",zE,[c("div",vE,[c("p",{class:ke(["heading",{"has-text-grey-light":!n.output.selected}]),textContent:y(n.output.name)},null,10,bE),b(a,{value:o.volume,"onUpdate:value":t[1]||(t[1]=l=>o.volume=l),disabled:!n.output.selected,max:100,cursor:o.cursor,onChange:s.change_volume},null,8,["value","disabled","cursor","onChange"])])])])])])}const wE=ae(pE,[["render",CE]]),kE={name:"PlayerButtonConsume",props:{icon_size:{default:16,type:Number}},setup(){return{playerStore:xn()}},computed:{is_consume(){return this.playerStore.consume}},methods:{toggle_consume_mode(){B.player_consume(!this.is_consume)}}};function SE(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:ke({"is-info":s.is_consume}),onClick:t[0]||(t[0]=(...a)=>s.toggle_consume_mode&&s.toggle_consume_mode(...a))},[b(i,{class:"icon",name:"fire",size:n.icon_size,title:e.$t("player.button.consume")},null,8,["size","title"])],2)}const xE=ae(kE,[["render",SE]]),Wl=Un("LyricsStore",{state:()=>({content:[],pane:!1})}),EE={name:"PlayerButtonLyrics",props:{icon_size:{default:16,type:Number}},setup(){return{lyricsStore:Wl()}},computed:{icon_name(){return this.is_active?"script-text-play":"script-text-outline"},is_active(){return this.lyricsStore.pane}},methods:{toggle_lyrics(){this.lyricsStore.pane=!this.lyricsStore.pane}}};function $E(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:ke({"is-info":s.is_active}),onClick:t[0]||(t[0]=(...a)=>s.toggle_lyrics&&s.toggle_lyrics(...a))},[b(i,{class:"icon",name:s.icon_name,size:n.icon_size,title:e.$t("player.button.toggle-lyrics")},null,8,["name","size","title"])],2)}const TE=ae(EE,[["render",$E]]),AE={name:"PlayerButtonNext",props:{icon_size:{default:16,type:Number}},computed:{disabled(){var e;return((e=Qn())==null?void 0:e.count)<=0}},methods:{play_next(){this.disabled||B.player_next()}}},OE=["disabled"];function PE(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.play_next&&s.play_next(...a))},[b(i,{name:"skip-forward",size:n.icon_size,title:e.$t("player.button.skip-forward")},null,8,["size","title"])],8,OE)}const IE=ae(AE,[["render",PE]]),LE={name:"PlayerButtonPlayPause",props:{icon_size:{default:16,type:Number},show_disabled_message:Boolean},setup(){return{notificationsStore:cr(),playerStore:xn(),queueStore:Qn()}},computed:{disabled(){var e;return((e=this.queueStore)==null?void 0:e.count)<=0},icon_name(){if(this.is_playing){if(this.is_pause_allowed)return"pause"}else return"play";return"stop"},is_pause_allowed(){const{current:e}=this.queueStore;return e&&e.data_kind!=="pipe"},is_playing(){return this.playerStore.state==="play"}},methods:{toggle_play_pause(){if(this.disabled){this.show_disabled_message&&this.notificationsStore.add({text:this.$t("server.empty-queue"),timeout:2e3,topic:"connection",type:"info"});return}this.is_playing&&this.is_pause_allowed?B.player_pause():this.is_playing&&!this.is_pause_allowed?B.player_stop():B.player_play()}}},NE=["disabled"];function DE(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.toggle_play_pause&&s.toggle_play_pause(...a))},[b(i,{name:s.icon_name,size:n.icon_size,title:e.$t(`player.button.${s.icon_name}`)},null,8,["name","size","title"])],8,NE)}const RE=ae(LE,[["render",DE]]),ME={name:"PlayerButtonPrevious",props:{icon_size:{default:16,type:Number}},setup(){return{queueStore:Qn()}},computed:{disabled(){return this.queueStore.count<=0}},methods:{play_previous(){this.disabled||B.player_previous()}}},FE=["disabled"];function VE(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.play_previous&&s.play_previous(...a))},[b(i,{name:"skip-backward",size:n.icon_size,title:e.$t("player.button.skip-backward")},null,8,["size","title"])],8,FE)}const HE=ae(ME,[["render",VE]]),UE={name:"PlayerButtonRepeat",props:{icon_size:{default:16,type:Number}},setup(){return{playerStore:xn()}},computed:{icon_name(){return this.is_repeat_all?"repeat":this.is_repeat_single?"repeat-once":"repeat-off"},is_repeat_all(){return this.playerStore.repeat==="all"},is_repeat_off(){return!this.is_repeat_all&&!this.is_repeat_single},is_repeat_single(){return this.playerStore.repeat==="single"}},methods:{toggle_repeat_mode(){this.is_repeat_all?B.player_repeat("single"):this.is_repeat_single?B.player_repeat("off"):B.player_repeat("all")}}};function jE(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:ke({"is-info":!s.is_repeat_off}),onClick:t[0]||(t[0]=(...a)=>s.toggle_repeat_mode&&s.toggle_repeat_mode(...a))},[b(i,{class:"icon",name:s.icon_name,size:n.icon_size,title:e.$t(`player.button.${s.icon_name}`)},null,8,["name","size","title"])],2)}const BE=ae(UE,[["render",jE]]),WE={name:"PlayerButtonSeekBack",props:{icon_size:{default:16,type:Number},seek_ms:{required:!0,type:Number}},setup(){return{playerStore:xn(),queueStore:Qn()}},computed:{disabled(){var e;return((e=this.queueStore)==null?void 0:e.count)<=0||this.is_stopped||this.current.data_kind==="pipe"},is_stopped(){return this.player.state==="stop"},current(){return this.queueStore.current},player(){return this.playerStore},visible(){return["podcast","audiobook"].includes(this.current.media_kind)}},methods:{seek(){this.disabled||B.player_seek(this.seek_ms*-1)}}},qE=["disabled"];function GE(e,t,n,r,o,s){const i=O("mdicon");return s.visible?(x(),I("a",{key:0,disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.seek&&s.seek(...a))},[b(i,{name:"rewind-10",size:n.icon_size,title:e.$t("player.button.seek-backward")},null,8,["size","title"])],8,qE)):ee("",!0)}const KE=ae(WE,[["render",GE]]),ZE={name:"PlayerButtonSeekForward",props:{icon_size:{default:16,type:Number},seek_ms:{required:!0,type:Number}},setup(){return{playerStore:xn(),queueStore:Qn()}},computed:{disabled(){var e;return((e=this.queueStore)==null?void 0:e.count)<=0||this.is_stopped||this.current.data_kind==="pipe"},is_stopped(){return this.player.state==="stop"},current(){return this.queueStore.current},player(){return this.playerStore},visible(){return["podcast","audiobook"].includes(this.current.media_kind)}},methods:{seek(){this.disabled||B.player_seek(this.seek_ms)}}},YE=["disabled"];function XE(e,t,n,r,o,s){const i=O("mdicon");return s.visible?(x(),I("a",{key:0,disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.seek&&s.seek(...a))},[b(i,{name:"fast-forward-30",size:n.icon_size,title:e.$t("player.button.seek-forward")},null,8,["size","title"])],8,YE)):ee("",!0)}const JE=ae(ZE,[["render",XE]]),QE={name:"PlayerButtonShuffle",props:{icon_size:{default:16,type:Number}},setup(){return{playerStore:xn()}},computed:{icon_name(){return this.is_shuffle?"shuffle":"shuffle-disabled"},is_shuffle(){return this.playerStore.shuffle}},methods:{toggle_shuffle_mode(){B.player_shuffle(!this.is_shuffle)}}};function e2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:ke({"is-info":s.is_shuffle}),onClick:t[0]||(t[0]=(...a)=>s.toggle_shuffle_mode&&s.toggle_shuffle_mode(...a))},[b(i,{class:"icon",name:s.icon_name,size:n.icon_size,title:e.$t(`player.button.${s.icon_name}`)},null,8,["name","size","title"])],2)}const t2=ae(QE,[["render",e2]]),Fs={audio:new Audio,context:null,play(e){this.stop(),this.context.resume().then(()=>{this.audio.src=`${String(e||"")}?x=${Date.now()}`,this.audio.crossOrigin="anonymous",this.audio.load()})},setVolume(e){this.audio&&(this.audio.volume=Math.min(1,Math.max(0,parseFloat(e)||0)))},setup(){return this.context=new(window.AudioContext||window.webkitAudioContext),this.context.createMediaElementSource(this.audio).connect(this.context.destination),this.audio.addEventListener("canplaythrough",()=>{this.audio.play()}),this.audio.addEventListener("canplay",()=>{this.audio.play()}),this.audio},stop(){try{this.audio.pause()}catch{}try{this.audio.stop()}catch{}try{this.audio.close()}catch{}}},Wd=Un("OutputsStore",{state:()=>({outputs:[]})}),n2={name:"NavbarBottom",components:{ControlSlider:Bd,NavbarItemLink:ky,NavbarItemOutput:wE,PlayerButtonConsume:xE,PlayerButtonLyrics:TE,PlayerButtonNext:IE,PlayerButtonPlayPause:RE,PlayerButtonPrevious:HE,PlayerButtonRepeat:BE,PlayerButtonSeekBack:KE,PlayerButtonSeekForward:JE,PlayerButtonShuffle:t2},setup(){return{notificationsStore:cr(),outputsStore:Wd(),playerStore:xn(),queueStore:Qn(),uiStore:gn()}},data(){return{cursor:Bl,loading:!1,old_volume:0,playing:!1,show_desktop_outputs_menu:!1,show_outputs_menu:!1,stream_volume:10}},computed:{is_now_playing_page(){return this.$route.name==="now-playing"},current(){return this.queueStore.current},outputs(){return this.outputsStore.outputs},player(){return this.playerStore},show_player_menu:{get(){return this.uiStore.show_player_menu},set(e){this.uiStore.show_player_menu=e}}},watch:{"playerStore.volume"(){this.player.volume>0&&(this.old_volume=this.player.volume)}},mounted(){this.setupAudio()},unmounted(){this.closeAudio()},methods:{change_stream_volume(){Fs.setVolume(this.stream_volume/100)},change_volume(){B.player_volume(this.player.volume)},closeAudio(){Fs.stop(),this.playing=!1},on_click_outside_outputs(){this.show_outputs_menu=!1},playChannel(){this.playing||(this.loading=!0,Fs.play("/stream.mp3"),Fs.setVolume(this.stream_volume/100))},setupAudio(){const e=Fs.setup();e.addEventListener("waiting",()=>{this.playing=!1,this.loading=!0}),e.addEventListener("playing",()=>{this.playing=!0,this.loading=!1}),e.addEventListener("ended",()=>{this.playing=!1,this.loading=!1}),e.addEventListener("error",()=>{this.closeAudio(),this.notificationsStore.add({text:this.$t("navigation.stream-error"),type:"danger"}),this.playing=!1,this.loading=!1})},togglePlay(){this.loading||(this.playing&&this.closeAudio(),this.playChannel())},toggle_mute_volume(){this.player.volume=this.player.volume>0?0:this.old_volume,this.change_volume()}}},r2={class:"navbar-dropdown is-right fd-width-auto"},o2={class:"navbar-item"},s2={class:"level is-mobile"},i2={class:"level-left is-flex-grow-1"},a2={class:"level-item is-flex-grow-0"},l2={class:"level-item"},c2=["textContent"],u2=c("hr",{class:"my-3"},null,-1),d2=c("hr",{class:"my-3"},null,-1),m2={class:"navbar-item"},f2={class:"level is-mobile"},p2={class:"level-left is-flex-grow-1"},h2={class:"level-item is-flex-grow-0"},_2={class:"level-item"},g2={class:"is-flex-grow-1"},y2=["textContent"],z2={href:"stream.mp3",class:"heading ml-2",target:"_blank"},v2=c("hr",{class:"my-3"},null,-1),b2={class:"navbar-item is-justify-content-center"},C2={class:"buttons has-addons"},w2={class:"navbar-brand is-flex-grow-1"},k2={class:"fd-is-text-clipped"},S2=["textContent"],x2=c("br",null,null,-1),E2=["textContent"],$2=["textContent"],T2={class:"navbar-item"},A2={class:"buttons has-addons is-centered"},O2=c("hr",{class:"my-3"},null,-1),P2={class:"navbar-item"},I2={class:"level is-mobile"},L2={class:"level-left is-flex-grow-1"},N2={class:"level-item is-flex-grow-0"},D2={class:"level-item"},R2={class:"is-flex-grow-1"},M2=["textContent"],F2=c("hr",{class:"my-3"},null,-1),V2=c("hr",{class:"my-3"},null,-1),H2={class:"navbar-item mb-5"},U2={class:"level is-mobile"},j2={class:"level-left is-flex-grow-1"},B2={class:"level-item is-flex-grow-0"},W2={class:"level-item"},q2={class:"is-flex-grow-1"},G2=["textContent"],K2={href:"stream.mp3",class:"heading ml-2",target:"_blank"};function Z2(e,t,n,r,o,s){const i=O("mdicon"),a=O("control-slider"),l=O("navbar-item-output"),u=O("player-button-repeat"),m=O("player-button-shuffle"),d=O("player-button-consume"),f=O("player-button-lyrics"),p=O("navbar-item-link"),h=O("player-button-previous"),g=O("player-button-seek-back"),z=O("player-button-play-pause"),k=O("player-button-seek-forward"),w=O("player-button-next");return x(),I("nav",{class:ke(["navbar is-block is-white is-fixed-bottom fd-bottom-navbar",{"is-transparent":s.is_now_playing_page,"is-dark":!s.is_now_playing_page}]),role:"navigation","aria-label":"player controls"},[c("div",{class:ke(["navbar-item has-dropdown has-dropdown-up is-hidden-touch",{"is-active":s.show_player_menu}])},[c("div",r2,[c("div",o2,[c("div",s2,[c("div",i2,[c("div",a2,[c("a",{class:"button is-white is-small",onClick:t[0]||(t[0]=(..._)=>s.toggle_mute_volume&&s.toggle_mute_volume(..._))},[b(i,{class:"icon",name:s.player.volume>0?"volume-high":"volume-off",size:"18"},null,8,["name"])])]),c("div",l2,[c("div",null,[c("p",{class:"heading",textContent:y(e.$t("navigation.volume"))},null,8,c2),b(a,{value:s.player.volume,"onUpdate:value":t[1]||(t[1]=_=>s.player.volume=_),max:100,onChange:s.change_volume},null,8,["value","onChange"])])])])])]),u2,(x(!0),I(ve,null,ht(s.outputs,_=>(x(),we(l,{key:_.id,output:_},null,8,["output"]))),128)),d2,c("div",m2,[c("div",f2,[c("div",p2,[c("div",h2,[c("a",{class:ke(["button is-white is-small",{"has-text-grey-light":!o.playing&&!o.loading,"is-loading":o.loading}]),onClick:t[2]||(t[2]=(..._)=>s.togglePlay&&s.togglePlay(..._))},[b(i,{class:"icon",name:"broadcast",size:"18"})],2)]),c("div",_2,[c("div",g2,[c("div",{class:ke(["is-flex is-align-content-center",{"has-text-grey-light":!o.playing}])},[c("p",{class:"heading",textContent:y(e.$t("navigation.stream"))},null,8,y2),c("a",z2,[b(i,{class:"icon is-small",name:"open-in-new",size:"16"})])],2),b(a,{value:o.stream_volume,"onUpdate:value":t[3]||(t[3]=_=>o.stream_volume=_),disabled:!o.playing,max:100,cursor:o.cursor,onChange:s.change_stream_volume},null,8,["value","disabled","cursor","onChange"])])])])])]),v2,c("div",b2,[c("div",C2,[b(u,{class:"button"}),b(m,{class:"button"}),b(d,{class:"button"}),b(f,{class:"button"})])])])],2),c("div",w2,[b(p,{to:{name:"queue"},class:"mr-auto"},{default:N(()=>[b(i,{class:"icon",name:"playlist-play",size:"24"})]),_:1}),s.is_now_playing_page?ee("",!0):(x(),we(p,{key:0,to:{name:"now-playing"},exact:"",class:"is-expanded is-clipped is-size-7"},{default:N(()=>[c("div",k2,[c("strong",{textContent:y(s.current.title)},null,8,S2),x2,c("span",{textContent:y(s.current.artist)},null,8,E2),s.current.album?(x(),I("span",{key:0,textContent:y(e.$t("navigation.now-playing",{album:s.current.album}))},null,8,$2)):ee("",!0)])]),_:1})),s.is_now_playing_page?(x(),we(h,{key:1,class:"navbar-item px-2",icon_size:24})):ee("",!0),s.is_now_playing_page?(x(),we(g,{key:2,seek_ms:1e4,class:"navbar-item px-2",icon_size:24})):ee("",!0),b(z,{class:"navbar-item px-2",icon_size:36,show_disabled_message:""}),s.is_now_playing_page?(x(),we(k,{key:3,seek_ms:3e4,class:"navbar-item px-2",icon_size:24})):ee("",!0),s.is_now_playing_page?(x(),we(w,{key:4,class:"navbar-item px-2",icon_size:24})):ee("",!0),c("a",{class:"navbar-item ml-auto",onClick:t[4]||(t[4]=_=>s.show_player_menu=!s.show_player_menu)},[b(i,{class:"icon",name:s.show_player_menu?"chevron-down":"chevron-up"},null,8,["name"])])]),c("div",{class:ke(["navbar-menu is-hidden-desktop",{"is-active":s.show_player_menu}])},[c("div",T2,[c("div",A2,[b(u,{class:"button"}),b(m,{class:"button"}),b(d,{class:"button"}),b(f,{class:"button"})])]),O2,c("div",P2,[c("div",I2,[c("div",L2,[c("div",N2,[c("a",{class:"button is-white is-small",onClick:t[5]||(t[5]=(..._)=>s.toggle_mute_volume&&s.toggle_mute_volume(..._))},[b(i,{class:"icon",name:s.player.volume>0?"volume-high":"volume-off",size:"18"},null,8,["name"])])]),c("div",D2,[c("div",R2,[c("p",{class:"heading",textContent:y(e.$t("navigation.volume"))},null,8,M2),b(a,{value:s.player.volume,"onUpdate:value":t[6]||(t[6]=_=>s.player.volume=_),max:100,onChange:s.change_volume},null,8,["value","onChange"])])])])])]),F2,(x(!0),I(ve,null,ht(s.outputs,_=>(x(),we(l,{key:_.id,output:_},null,8,["output"]))),128)),V2,c("div",H2,[c("div",U2,[c("div",j2,[c("div",B2,[c("a",{class:ke(["button is-white is-small",{"has-text-grey-light":!o.playing&&!o.loading,"is-loading":o.loading}]),onClick:t[7]||(t[7]=(..._)=>s.togglePlay&&s.togglePlay(..._))},[b(i,{class:"icon",name:"radio-tower",size:"16"})],2)]),c("div",W2,[c("div",q2,[c("div",{class:ke(["is-flex is-align-content-center",{"has-text-grey-light":!o.playing}])},[c("p",{class:"heading",textContent:y(e.$t("navigation.stream"))},null,8,G2),c("a",K2,[b(i,{class:"icon is-small",name:"open-in-new",size:"16"})])],2),b(a,{value:o.stream_volume,"onUpdate:value":t[8]||(t[8]=_=>o.stream_volume=_),disabled:!o.playing,max:100,cursor:o.cursor,onChange:s.change_stream_volume},null,8,["value","disabled","cursor","onChange"])])])])])])],2)],2)}const Y2=ae(n2,[["render",Z2]]),qd=Un("SearchStore",{state:()=>({recent_searches:[],search_query:"",search_source:"search-library"}),actions:{add(e){const t=this.recent_searches.indexOf(e);t!==-1&&this.recent_searches.splice(t,1),this.recent_searches.unshift(e),this.recent_searches.length>5&&this.recent_searches.pop()},remove(e){const t=this.recent_searches.indexOf(e);t!==-1&&this.recent_searches.splice(t,1)}}}),rr=Un("SettingsStore",{state:()=>({categories:[]}),getters:{recently_added_limit:e=>{var t;return((t=e.setting("webinterface","recently_added_limit"))==null?void 0:t.value)??100},show_composer_for_genre:e=>{var t;return((t=e.setting("webinterface","show_composer_for_genre"))==null?void 0:t.value)??null},show_composer_now_playing:e=>{var t;return((t=e.setting("webinterface","show_composer_now_playing"))==null?void 0:t.value)??!1},show_cover_artwork_in_album_lists:e=>{var t;return((t=e.setting("webinterface","show_cover_artwork_in_album_lists"))==null?void 0:t.value)??!1},show_filepath_now_playing:e=>{var t;return((t=e.setting("webinterface","show_filepath_now_playing"))==null?void 0:t.value)??!1},show_menu_item_audiobooks:e=>{var t;return((t=e.setting("webinterface","show_menu_item_audiobooks"))==null?void 0:t.value)??!1},show_menu_item_files:e=>{var t;return((t=e.setting("webinterface","show_menu_item_files"))==null?void 0:t.value)??!1},show_menu_item_music:e=>{var t;return((t=e.setting("webinterface","show_menu_item_music"))==null?void 0:t.value)??!1},show_menu_item_playlists:e=>{var t;return((t=e.setting("webinterface","show_menu_item_playlists"))==null?void 0:t.value)??!1},show_menu_item_podcasts:e=>{var t;return((t=e.setting("webinterface","show_menu_item_podcasts"))==null?void 0:t.value)??!1},show_menu_item_radio:e=>{var t;return((t=e.setting("webinterface","show_menu_item_radio"))==null?void 0:t.value)??!1},show_menu_item_search:e=>{var t;return((t=e.setting("webinterface","show_menu_item_search"))==null?void 0:t.value)??!1}},actions:{update(e){const t=this.categories.find(r=>r.name===e.category);if(!t)return;const n=t.options.find(r=>r.name===e.name);n&&(n.value=e.value)},setting(e,t){var n;return((n=this.categories.find(r=>r.name===e))==null?void 0:n.options.find(r=>r.name===t))??{}}}}),X2={name:"NavbarTop",components:{NavbarItemLink:ky},setup(){return{searchStore:qd(),servicesStore:Ot(),settingsStore:rr(),uiStore:gn()}},data(){return{show_settings_menu:!1}},computed:{show_burger_menu:{get(){return this.uiStore.show_burger_menu},set(e){this.uiStore.show_burger_menu=e}},show_update_dialog:{get(){return this.uiStore.show_update_dialog},set(e){this.uiStore.show_update_dialog=e}},spotify_enabled(){return this.servicesStore.spotify.webapi_token_valid},zindex(){return this.uiStore.show_player_menu?"z-index: 21":""}},watch:{$route(e,t){this.show_settings_menu=!1}},methods:{on_click_outside_settings(){this.show_settings_menu=!this.show_settings_menu},open_update_dialog(){this.show_update_dialog=!0,this.show_settings_menu=!1,this.show_burger_menu=!1}}},J2={class:"navbar-brand"},Q2=c("span",null,null,-1),e$=c("span",null,null,-1),t$=c("span",null,null,-1),n$=[Q2,e$,t$],r$=c("div",{class:"navbar-start"},null,-1),o$={class:"navbar-end"},s$={class:"navbar-item is-arrowless is-hidden-touch"},i$={class:"navbar-dropdown is-right"},a$=["textContent"],l$=["textContent"],c$=["textContent"],u$=["textContent"],d$=["textContent"],m$=["textContent"],f$=["textContent"],p$=["textContent"],h$=["textContent"],_$=["textContent"],g$=["textContent"],y$=c("hr",{class:"my-3"},null,-1),z$=["textContent"];function v$(e,t,n,r,o,s){const i=O("mdicon"),a=O("navbar-item-link");return x(),I("nav",{class:"navbar is-light is-fixed-top",style:ao(s.zindex),role:"navigation","aria-label":"main navigation"},[c("div",J2,[r.settingsStore.show_menu_item_playlists?(x(),we(a,{key:0,to:{name:"playlists"}},{default:N(()=>[b(i,{class:"icon",name:"music-box-multiple",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_music?(x(),we(a,{key:1,to:{name:"music"}},{default:N(()=>[b(i,{class:"icon",name:"music",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_podcasts?(x(),we(a,{key:2,to:{name:"podcasts"}},{default:N(()=>[b(i,{class:"icon",name:"microphone",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_audiobooks?(x(),we(a,{key:3,to:{name:"audiobooks"}},{default:N(()=>[b(i,{class:"icon",name:"book-open-variant",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_radio?(x(),we(a,{key:4,to:{name:"radio"}},{default:N(()=>[b(i,{class:"icon",name:"radio",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_files?(x(),we(a,{key:5,to:{name:"files"}},{default:N(()=>[b(i,{class:"icon",name:"folder-open",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_search?(x(),we(a,{key:6,to:{name:r.searchStore.search_source}},{default:N(()=>[b(i,{class:"icon",name:"magnify",size:"16"})]),_:1},8,["to"])):ee("",!0),c("div",{class:ke(["navbar-burger",{"is-active":s.show_burger_menu}]),onClick:t[0]||(t[0]=l=>s.show_burger_menu=!s.show_burger_menu)},n$,2)]),c("div",{class:ke(["navbar-menu",{"is-active":s.show_burger_menu}])},[r$,c("div",o$,[c("div",{class:ke(["navbar-item has-dropdown is-hoverable",{"is-active":o.show_settings_menu}]),onClick:t[2]||(t[2]=(...l)=>s.on_click_outside_settings&&s.on_click_outside_settings(...l))},[c("a",s$,[b(i,{class:"icon",name:"menu",size:"24"})]),c("div",i$,[b(a,{to:{name:"playlists"}},{default:N(()=>[b(i,{class:"icon",name:"music-box-multiple",size:"16"}),c("b",{textContent:y(e.$t("navigation.playlists"))},null,8,a$)]),_:1}),b(a,{to:{name:"music"}},{default:N(()=>[b(i,{class:"icon",name:"music",size:"16"}),c("b",{textContent:y(e.$t("navigation.music"))},null,8,l$)]),_:1}),b(a,{to:{name:"music-artists"}},{default:N(()=>[c("span",{class:"pl-5",textContent:y(e.$t("navigation.artists"))},null,8,c$)]),_:1}),b(a,{to:{name:"music-albums"}},{default:N(()=>[c("span",{class:"pl-5",textContent:y(e.$t("navigation.albums"))},null,8,u$)]),_:1}),b(a,{to:{name:"music-genres"}},{default:N(()=>[c("span",{class:"pl-5",textContent:y(e.$t("navigation.genres"))},null,8,d$)]),_:1}),s.spotify_enabled?(x(),we(a,{key:0,to:{name:"music-spotify"}},{default:N(()=>[c("span",{class:"pl-5",textContent:y(e.$t("navigation.spotify"))},null,8,m$)]),_:1})):ee("",!0),b(a,{to:{name:"podcasts"}},{default:N(()=>[b(i,{class:"icon",name:"microphone",size:"16"}),c("b",{textContent:y(e.$t("navigation.podcasts"))},null,8,f$)]),_:1}),b(a,{to:{name:"audiobooks"}},{default:N(()=>[b(i,{class:"icon",name:"book-open-variant",size:"16"}),c("b",{textContent:y(e.$t("navigation.audiobooks"))},null,8,p$)]),_:1}),b(a,{to:{name:"radio"}},{default:N(()=>[b(i,{class:"icon",name:"radio",size:"16"}),c("b",{textContent:y(e.$t("navigation.radio"))},null,8,h$)]),_:1}),b(a,{to:{name:"files"}},{default:N(()=>[b(i,{class:"icon",name:"folder-open",size:"16"}),c("b",{textContent:y(e.$t("navigation.files"))},null,8,_$)]),_:1}),b(a,{to:{name:r.searchStore.search_source}},{default:N(()=>[b(i,{class:"icon",name:"magnify",size:"16"}),c("b",{textContent:y(e.$t("navigation.search"))},null,8,g$)]),_:1},8,["to"]),y$,b(a,{to:{name:"settings-webinterface"}},{default:N(()=>[Lt(y(e.$t("navigation.settings")),1)]),_:1}),c("a",{class:"navbar-item",onClick:t[1]||(t[1]=_t(l=>s.open_update_dialog(),["stop","prevent"])),textContent:y(e.$t("navigation.update-library"))},null,8,z$),b(a,{to:{name:"about"}},{default:N(()=>[Lt(y(e.$t("navigation.about")),1)]),_:1})])],2)])],2),pt(c("div",{class:"is-overlay",onClick:t[3]||(t[3]=l=>o.show_settings_menu=!1)},null,512),[[Ci,o.show_settings_menu]])],4)}const b$=ae(X2,[["render",v$]]),C$={name:"NotificationList",setup(){return{notificationsStore:cr()}},computed:{notifications(){return this.notificationsStore.list}},methods:{remove(e){this.notificationsStore.remove(e)}}},w$={key:0,class:"notifications"},k$={class:"columns is-centered"},S$={class:"column is-half"},x$=["onClick"],E$=["textContent"];function $$(e,t,n,r,o,s){return s.notifications.length>0?(x(),I("section",w$,[c("div",k$,[c("div",S$,[(x(!0),I(ve,null,ht(s.notifications,i=>(x(),I("div",{key:i.id,class:ke(["notification",i.type?`is-${i.type}`:""])},[c("button",{class:"delete",onClick:a=>s.remove(i)},null,8,x$),c("div",{class:"text",textContent:y(i.text)},null,8,E$)],2))),128))])])])):ee("",!0)}const T$=ae(C$,[["render",$$],["__scopeId","data-v-a896a8d3"]]);var Sy=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ql(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function xy(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function r(){return this instanceof r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,o.get?o:{enumerable:!0,get:function(){return e[r]}})}),n}var Ey={exports:{}};(function(e){(function(t,n){e.exports?e.exports=n():t.ReconnectingWebSocket=n()})(Sy,function(){if(!("WebSocket"in window))return;function t(n,r,o){var s={debug:!1,automaticOpen:!0,reconnectInterval:1e3,maxReconnectInterval:3e4,reconnectDecay:1.5,timeoutInterval:2e3,maxReconnectAttempts:null};o||(o={});for(var i in s)typeof o[i]<"u"?this[i]=o[i]:this[i]=s[i];this.url=n,this.reconnectAttempts=0,this.readyState=WebSocket.CONNECTING,this.protocol=null;var a=this,l,u=!1,m=!1,d=document.createElement("div");d.addEventListener("open",function(p){a.onopen(p)}),d.addEventListener("close",function(p){a.onclose(p)}),d.addEventListener("connecting",function(p){a.onconnecting(p)}),d.addEventListener("message",function(p){a.onmessage(p)}),d.addEventListener("error",function(p){a.onerror(p)}),this.addEventListener=d.addEventListener.bind(d),this.removeEventListener=d.removeEventListener.bind(d),this.dispatchEvent=d.dispatchEvent.bind(d);function f(p,h){var g=document.createEvent("CustomEvent");return g.initCustomEvent(p,!1,!1,h),g}this.open=function(p){if(l=new WebSocket(a.url,r||[]),p){if(this.maxReconnectAttempts&&this.reconnectAttempts>this.maxReconnectAttempts)return}else d.dispatchEvent(f("connecting")),this.reconnectAttempts=0;(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","attempt-connect",a.url);var h=l,g=setTimeout(function(){(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","connection-timeout",a.url),m=!0,h.close(),m=!1},a.timeoutInterval);l.onopen=function(z){clearTimeout(g),(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onopen",a.url),a.protocol=l.protocol,a.readyState=WebSocket.OPEN,a.reconnectAttempts=0;var k=f("open");k.isReconnect=p,p=!1,d.dispatchEvent(k)},l.onclose=function(z){if(clearTimeout(w),l=null,u)a.readyState=WebSocket.CLOSED,d.dispatchEvent(f("close"));else{a.readyState=WebSocket.CONNECTING;var k=f("connecting");k.code=z.code,k.reason=z.reason,k.wasClean=z.wasClean,d.dispatchEvent(k),!p&&!m&&((a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onclose",a.url),d.dispatchEvent(f("close")));var w=a.reconnectInterval*Math.pow(a.reconnectDecay,a.reconnectAttempts);setTimeout(function(){a.reconnectAttempts++,a.open(!0)},w>a.maxReconnectInterval?a.maxReconnectInterval:w)}},l.onmessage=function(z){(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onmessage",a.url,z.data);var k=f("message");k.data=z.data,d.dispatchEvent(k)},l.onerror=function(z){(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onerror",a.url,z),d.dispatchEvent(f("error"))}},this.automaticOpen==!0&&this.open(!1),this.send=function(p){if(l)return(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","send",a.url,p),l.send(p);throw"INVALID_STATE_ERR : Pausing to reconnect websocket"},this.close=function(p,h){typeof p>"u"&&(p=1e3),u=!0,l&&l.close(p,h)},this.refresh=function(){l&&l.close()}}return t.prototype.onopen=function(n){},t.prototype.onclose=function(n){},t.prototype.onconnecting=function(n){},t.prototype.onmessage=function(n){},t.prototype.onerror=function(n){},t.debugAll=!1,t.CONNECTING=WebSocket.CONNECTING,t.OPEN=WebSocket.OPEN,t.CLOSING=WebSocket.CLOSING,t.CLOSED=WebSocket.CLOSED,t})})(Ey);var A$=Ey.exports;const O$=ql(A$),Do=Un("ConfigurationStore",{state:()=>({buildoptions:[],version:"",websocket_port:0})}),P$={name:"App",components:{ModalDialogRemotePairing:xS,ModalDialogUpdate:QS,NavbarBottom:Y2,NavbarTop:b$,NotificationList:T$},setup(){return{configurationStore:Do(),libraryStore:jl(),lyricsStore:Wl(),notificationsStore:cr(),outputsStore:Wd(),playerStore:xn(),queueStore:Qn(),remotesStore:Ad(),servicesStore:Ot(),settingsStore:rr(),uiStore:gn()}},data(){return{pairing_active:!1,reconnect_attempts:0,token_timer_id:0}},computed:{show_burger_menu:{get(){return this.uiStore.show_burger_menu},set(e){this.uiStore.show_burger_menu=e}},show_player_menu:{get(){return this.uiStore.show_player_menu},set(e){this.uiStore.show_player_menu=e}},show_update_dialog:{get(){return this.uiStore.show_update_dialog},set(e){this.uiStore.show_update_dialog=e}}},watch:{show_burger_menu(){this.update_is_clipped()},show_player_menu(){this.update_is_clipped()}},created(){this.connect(),this.$Progress.start(),this.$router.beforeEach((e,t,n)=>{e.meta.show_progress&&!(e.path===t.path&&e.hash)&&(e.meta.progress&&this.$Progress.parseMeta(e.meta.progress),this.$Progress.start()),n()}),this.$router.afterEach((e,t)=>{e.meta.show_progress&&this.$Progress.finish()})},methods:{connect(){B.config().then(({data:e})=>{this.configurationStore.$state=e,this.uiStore.hide_singles=e.hide_singles,document.title=e.library_name,this.open_ws(),this.$Progress.finish()}).catch(()=>{this.notificationsStore.add({text:this.$t("server.connection-failed"),topic:"connection",type:"danger"})})},open_ws(){if(this.configurationStore.websocket_port<=0){this.notificationsStore.add({text:this.$t("server.missing-port"),type:"danger"});return}let e="ws://";window.location.protocol==="https:"&&(e="wss://");let t=`${e}${window.location.hostname}:${this.configurationStore.websocket_port}`;const n=new O$(t,"notify",{maxReconnectInterval:2e3,reconnectInterval:1e3}),r=this;n.onopen=()=>{r.reconnect_attempts=0,n.send(JSON.stringify({notify:["update","database","player","options","outputs","volume","queue","spotify","lastfm","pairing"]})),r.update_outputs(),r.update_player_status(),r.update_library_stats(),r.update_settings(),r.update_queue(),r.update_spotify(),r.update_lastfm(),r.update_pairing()};let o=!1;const s=()=>{o||(r.update_outputs(),r.update_player_status(),r.update_library_stats(),r.update_settings(),r.update_queue(),r.update_spotify(),r.update_lastfm(),r.update_pairing(),o=!0,setTimeout(()=>{o=!1},500))};window.addEventListener("focus",s),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&s()}),n.onmessage=i=>{const a=JSON.parse(i.data);(a.notify.includes("update")||a.notify.includes("database"))&&r.update_library_stats(),(a.notify.includes("player")||a.notify.includes("options")||a.notify.includes("volume"))&&r.update_player_status(),(a.notify.includes("outputs")||a.notify.includes("volume"))&&r.update_outputs(),a.notify.includes("queue")&&r.update_queue(),a.notify.includes("spotify")&&r.update_spotify(),a.notify.includes("lastfm")&&r.update_lastfm(),a.notify.includes("pairing")&&r.update_pairing()}},update_is_clipped(){this.show_burger_menu||this.show_player_menu?document.querySelector("html").classList.add("is-clipped"):document.querySelector("html").classList.remove("is-clipped")},update_lastfm(){B.lastfm().then(({data:e})=>{this.servicesStore.lastfm=e})},update_library_stats(){B.library_stats().then(({data:e})=>{this.libraryStore.$state=e}),B.library_count("scan_kind is rss").then(({data:e})=>{this.libraryStore.rss=e})},update_lyrics(){const e=this.queueStore.current;e!=null&&e.track_id?B.library_track(e.track_id).then(({data:t})=>{this.lyricsStore.lyrics=t.lyrics}):this.lyricsStore.$reset()},update_outputs(){B.outputs().then(({data:e})=>{this.outputsStore.outputs=e.outputs})},update_pairing(){B.pairing().then(({data:e})=>{this.remotesStore.$state=e,this.pairing_active=e.active})},update_player_status(){B.player_status().then(({data:e})=>{this.playerStore.$state=e,this.update_lyrics()})},update_queue(){B.queue().then(({data:e})=>{this.queueStore.$state=e,this.update_lyrics()})},update_settings(){B.settings().then(({data:e})=>{this.settingsStore.$state=e})},update_spotify(){B.spotify().then(({data:e})=>{this.servicesStore.spotify=e,this.token_timer_id>0&&(window.clearTimeout(this.token_timer_id),this.token_timer_id=0),e.webapi_token_expires_in>0&&e.webapi_token&&(this.token_timer_id=window.setTimeout(this.update_spotify,1e3*e.webapi_token_expires_in))})}},template:""},I$={id:"app"};function L$(e,t,n,r,o,s){const i=O("navbar-top"),a=O("vue-progress-bar"),l=O("router-view"),u=O("modal-dialog-remote-pairing"),m=O("modal-dialog-update"),d=O("notification-list"),f=O("navbar-bottom");return x(),I("div",I$,[b(i),b(a,{class:"has-background-info"}),b(l,null,{default:N(({Component:p})=>[(x(),we(Al(p)))]),_:1}),b(u,{show:o.pairing_active,onClose:t[0]||(t[0]=p=>o.pairing_active=!1)},null,8,["show"]),b(m,{show:s.show_update_dialog,onClose:t[1]||(t[1]=p=>s.show_update_dialog=!1)},null,8,["show"]),pt(b(d,null,null,512),[[Ci,!s.show_burger_menu]]),b(f),pt(c("div",{class:"fd-overlay-fullscreen",onClick:t[2]||(t[2]=p=>s.show_burger_menu=s.show_player_menu=!1)},null,512),[[Ci,s.show_burger_menu||s.show_player_menu]])])}const N$=ae(P$,[["render",L$]]),$y=function(){return document.ontouchstart!==null?"click":"touchstart"},nl="__vue_click_away__",Ty=function(e,t,n){Ay(e);let r=n.context,o=t.value,s=!1;setTimeout(function(){s=!0},0),e[nl]=function(i){if((!e||!e.contains(i.target))&&o&&s&&typeof o=="function")return o.call(r,i)},document.addEventListener($y(),e[nl],!1)},Ay=function(e){document.removeEventListener($y(),e[nl],!1),delete e[nl]},D$=function(e,t,n){t.value!==t.oldValue&&Ty(e,t,n)},R$={install:function(e){e.directive("click-away",M$)}},M$={mounted:Ty,updated:D$,unmounted:Ay};var ir=(e=>(e.LOADING="loading",e.LOADED="loaded",e.ERROR="error",e))(ir||{});const F$=typeof window<"u"&&window!==null,V$=B$(),H$=Object.prototype.propertyIsEnumerable,qf=Object.getOwnPropertySymbols;function ai(e){return typeof e=="function"||toString.call(e)==="[object Object]"}function U$(e){return typeof e=="object"?e===null:typeof e!="function"}function j$(e){return e!=="__proto__"&&e!=="constructor"&&e!=="prototype"}function B$(){return F$&&"IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype?("isIntersecting"in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,"isIntersecting",{get(){return this.intersectionRatio>0}}),!0):!1}function W$(e,...t){if(!ai(e))throw new TypeError("expected the first argument to be an object");if(t.length===0||typeof Symbol!="function"||typeof qf!="function")return e;for(const n of t){const r=qf(n);for(const o of r)H$.call(n,o)&&(e[o]=n[o])}return e}function Oy(e,...t){let n=0;for(U$(e)&&(e=t[n++]),e||(e={});n{this._logger("Not support IntersectionObserver!")})),this._initIntersectionObserver(t,r,s,i,a)}update(t,n){var a;if(!t)return;(a=this._realObserver(t))==null||a.unobserve(t);const{src:r,error:o,lifecycle:s,delay:i}=this._valueFormatter(typeof n=="string"?n:n.value);this._initIntersectionObserver(t,r,o,s,i)}unmount(t){var n;t&&((n=this._realObserver(t))==null||n.unobserve(t),this._images.delete(t))}loadImages(t,n,r,o){this._setImageSrc(t,n,r,o)}_setImageSrc(t,n,r,o){t.tagName.toLowerCase()==="img"?(n&&t.getAttribute("src")!==n&&t.setAttribute("src",n),this._listenImageStatus(t,()=>{this._lifecycle(ir.LOADED,o,t)},()=>{var s;t.onload=null,this._lifecycle(ir.ERROR,o,t),(s=this._realObserver(t))==null||s.disconnect(),r&&t.getAttribute("src")!==r&&t.setAttribute("src",r),this._log(()=>{this._logger(`Image failed to load!And failed src was: ${n} `)})})):t.style.backgroundImage=`url('${n}')`}_initIntersectionObserver(t,n,r,o,s){var a;const i=this.options.observerOptions;this._images.set(t,new IntersectionObserver(l=>{Array.prototype.forEach.call(l,u=>{s&&s>0?this._delayedIntersectionCallback(t,u,s,n,r,o):this._intersectionCallback(t,u,n,r,o)})},i)),(a=this._realObserver(t))==null||a.observe(t)}_intersectionCallback(t,n,r,o,s){var i;n.isIntersecting&&((i=this._realObserver(t))==null||i.unobserve(n.target),this._setImageSrc(t,r,o,s))}_delayedIntersectionCallback(t,n,r,o,s,i){if(n.isIntersecting){if(n.target.hasAttribute(Bo))return;const a=setTimeout(()=>{this._intersectionCallback(t,n,o,s,i),n.target.removeAttribute(Bo)},r);n.target.setAttribute(Bo,String(a))}else n.target.hasAttribute(Bo)&&(clearTimeout(Number(n.target.getAttribute(Bo))),n.target.removeAttribute(Bo))}_listenImageStatus(t,n,r){t.onload=n,t.onerror=r}_valueFormatter(t){let n=t,r=this.options.loading,o=this.options.error,s=this.options.lifecycle,i=this.options.delay;return ai(t)&&(n=t.src,r=t.loading||this.options.loading,o=t.error||this.options.error,s=t.lifecycle||this.options.lifecycle,i=t.delay||this.options.delay),{src:n,loading:r,error:o,lifecycle:s,delay:i}}_log(t){this.options.log&&t()}_lifecycle(t,n,r){switch(t){case ir.LOADING:r==null||r.setAttribute("lazy",ir.LOADING),n!=null&&n.loading&&n.loading(r);break;case ir.LOADED:r==null||r.setAttribute("lazy",ir.LOADED),n!=null&&n.loaded&&n.loaded(r);break;case ir.ERROR:r==null||r.setAttribute("lazy",ir.ERROR),n!=null&&n.error&&n.error(r);break}}_realObserver(t){return this._images.get(t)}_logger(t,...n){let r=console.error;switch(this.options.logLevel){case"error":r=console.error;break;case"warn":r=console.warn;break;case"info":r=console.info;break;case"debug":r=console.debug;break}r(t,n)}}const Z$={install(e,t){const n=new K$(t);e.config.globalProperties.$Lazyload=n,e.provide("Lazyload",n),e.directive("lazy",{mounted:n.mount.bind(n),updated:n.update.bind(n),unmounted:n.unmount.bind(n)})}};var Py={exports:{}};const Iy=xy(A0);(function(e){e.exports=function(t){var n={};function r(o){if(n[o])return n[o].exports;var s=n[o]={i:o,l:!1,exports:{}};return t[o].call(s.exports,s,s.exports,r),s.l=!0,s.exports}return r.m=t,r.c=n,r.d=function(o,s,i){r.o(o,s)||Object.defineProperty(o,s,{enumerable:!0,get:i})},r.r=function(o){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},r.t=function(o,s){if(s&1&&(o=r(o)),s&8||s&4&&typeof o=="object"&&o&&o.__esModule)return o;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:o}),s&2&&typeof o!="string")for(var a in o)r.d(i,a,(function(l){return o[l]}).bind(null,a));return i},r.n=function(o){var s=o&&o.__esModule?function(){return o.default}:function(){return o};return r.d(s,"a",s),s},r.o=function(o,s){return Object.prototype.hasOwnProperty.call(o,s)},r.p="",r(r.s="fb15")}({8875:function(t,n,r){var o,s,i;(function(a,l){s=[],o=l,i=typeof o=="function"?o.apply(n,s):o,i!==void 0&&(t.exports=i)})(typeof self<"u"?self:this,function(){function a(){var l=Object.getOwnPropertyDescriptor(document,"currentScript");if(!l&&"currentScript"in document&&document.currentScript||l&&l.get!==a&&document.currentScript)return document.currentScript;try{throw new Error}catch(v){var u=/.*at [^(]*\((.*):(.+):(.+)\)$/ig,m=/@([^@]*):(\d+):(\d+)\s*$/ig,d=u.exec(v.stack)||m.exec(v.stack),f=d&&d[1]||!1,p=d&&d[2]||!1,h=document.location.href.replace(document.location.hash,""),g,z,k,w=document.getElementsByTagName("script");f===h&&(g=document.documentElement.outerHTML,z=new RegExp("(?:[^\\n]+?\\n){0,"+(p-2)+"}[^<]* - - diff --git a/web-src/src/i18n/de.json b/web-src/src/i18n/de.json index c01c9564..256cee17 100644 --- a/web-src/src/i18n/de.json +++ b/web-src/src/i18n/de.json @@ -578,7 +578,6 @@ }, "server": { "connection-failed": "Fehler bei Verbindung zum OwnTone-Server", - "missing-port": "Fehlender Websocket-Port", "request-failed": "Anfrage gescheitert (Status: {status} {cause} {url})", "queue-saved": "Warteschlange zu Playlist {name} gesichert", "appended-tracks": "{count} Track an die Abspielliste angehängt|{count} Tracks an die Abspielliste angehängt", diff --git a/web-src/src/i18n/en.json b/web-src/src/i18n/en.json index e68914ba..77c8ac47 100644 --- a/web-src/src/i18n/en.json +++ b/web-src/src/i18n/en.json @@ -577,7 +577,6 @@ }, "server": { "connection-failed": "Failed to connect to OwnTone server", - "missing-port": "Missing websocket port", "request-failed": "Request failed (status: {status} {cause} {url})", "queue-saved": "Queue saved to playlist {name}", "appended-tracks": "{count} track appended to the queue|{count} tracks appended to the queue", diff --git a/web-src/src/i18n/fr.json b/web-src/src/i18n/fr.json index 01db1c42..a36aadd1 100644 --- a/web-src/src/i18n/fr.json +++ b/web-src/src/i18n/fr.json @@ -577,7 +577,6 @@ }, "server": { "connection-failed": "Échec de connexion au serveur", - "missing-port": "Port websocket manquant", "request-failed": "La requête a échoué (status: {status} {cause} {url})", "queue-saved": "La file d’attente enregistrée dans la liste de lecture {name}", "appended-tracks": "{count} piste ajoutée à la file d’attente|{count} pistes ajoutées à la file d’attente", diff --git a/web-src/src/i18n/zh-CN.json b/web-src/src/i18n/zh-CN.json index 25d5925d..fb8f0fae 100644 --- a/web-src/src/i18n/zh-CN.json +++ b/web-src/src/i18n/zh-CN.json @@ -577,7 +577,6 @@ }, "server": { "connection-failed": "无法连接到 OwnTone 服务器", - "missing-port": "缺少 websocket 端口", "request-failed": "请求失败 (状态:{status} {cause} {url})", "queue-saved": "清单以添加到播放列表 {name}", "appended-tracks": "已附加到队列的 {count} 只曲目|已附加到队列的 {count} 只曲目", diff --git a/web-src/src/i18n/zh-TW.json b/web-src/src/i18n/zh-TW.json index b8af040d..89be5902 100644 --- a/web-src/src/i18n/zh-TW.json +++ b/web-src/src/i18n/zh-TW.json @@ -577,7 +577,6 @@ }, "server": { "connection-failed": "無法連接到 OwnTone 伺服器", - "missing-port": "缺少 websocket 端口", "request-failed": "請求失敗 (狀態:{status} {cause} {url})", "queue-saved": "清單以新增到播放列表 {name}", "appended-tracks": "已附加到隊列的 {count} 首曲目|已附加到隊列的 {count} 首曲目", diff --git a/web-src/src/pages/PageNowPlaying.vue b/web-src/src/pages/PageNowPlaying.vue index b03293d4..3186a718 100644 --- a/web-src/src/pages/PageNowPlaying.vue +++ b/web-src/src/pages/PageNowPlaying.vue @@ -153,7 +153,7 @@ export default { if (newState === 'play') { this.interval_id = window.setInterval(this.tick, INTERVAL) } - }, + } }, created() { From 14766e63cbcb58250f6f1ef00ed7382571f295e6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 18 Jan 2025 15:54:32 +0000 Subject: [PATCH 61/65] [web] Rebuild web interface --- htdocs/assets/index.js | 46 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/htdocs/assets/index.js b/htdocs/assets/index.js index 88e41ea6..5cc3dfcb 100644 --- a/htdocs/assets/index.js +++ b/htdocs/assets/index.js @@ -2,54 +2,54 @@ * @vue/shared v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function vl(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const st={},cs=[],fn=()=>{},Sz=()=>!1,Li=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),rd=e=>e.startsWith("onUpdate:"),kt=Object.assign,od=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},xz=Object.prototype.hasOwnProperty,tt=(e,t)=>xz.call(e,t),ze=Array.isArray,us=e=>$s(e)==="[object Map]",Vo=e=>$s(e)==="[object Set]",gm=e=>$s(e)==="[object Date]",Ez=e=>$s(e)==="[object RegExp]",Oe=e=>typeof e=="function",bt=e=>typeof e=="string",hr=e=>typeof e=="symbol",ft=e=>e!==null&&typeof e=="object",sd=e=>(ft(e)||Oe(e))&&Oe(e.then)&&Oe(e.catch),Dh=Object.prototype.toString,$s=e=>Dh.call(e),$z=e=>$s(e).slice(8,-1),Rh=e=>$s(e)==="[object Object]",id=e=>bt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ds=vl(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),bl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Tz=/-(\w)/g,Xt=bl(e=>e.replace(Tz,(t,n)=>n?n.toUpperCase():"")),Az=/\B([A-Z])/g,mn=bl(e=>e.replace(Az,"-$1").toLowerCase()),Ni=bl(e=>e.charAt(0).toUpperCase()+e.slice(1)),ri=bl(e=>e?`on${Ni(e)}`:""),nn=(e,t)=>!Object.is(e,t),ms=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Ua=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ja=e=>{const t=bt(e)?Number(e):NaN;return isNaN(t)?e:t};let ym;const Fh=()=>ym||(ym=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),Oz="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error",Pz=vl(Oz);function co(e){if(ze(e)){const t={};for(let n=0;n{if(n){const r=n.split(Lz);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function ke(e){let t="";if(bt(e))t=e;else if(ze(e))for(let n=0;noo(n,t))}const Hh=e=>!!(e&&e.__v_isRef===!0),y=e=>bt(e)?e:e==null?"":ze(e)||ft(e)&&(e.toString===Dh||!Oe(e.toString))?Hh(e)?y(e.value):JSON.stringify(e,Uh,2):String(e),Uh=(e,t)=>Hh(t)?Uh(e,t.value):us(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[cc(r,s)+" =>"]=o,n),{})}:Vo(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>cc(n))}:hr(t)?cc(t):ft(t)&&!ze(t)&&!Rh(t)?String(t):t,cc=(e,t="")=>{var n;return hr(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +**//*! #__NO_SIDE_EFFECTS__ */function vl(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const st={},cs=[],fn=()=>{},kz=()=>!1,Li=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),rd=e=>e.startsWith("onUpdate:"),kt=Object.assign,od=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Sz=Object.prototype.hasOwnProperty,tt=(e,t)=>Sz.call(e,t),ze=Array.isArray,us=e=>$s(e)==="[object Map]",Vo=e=>$s(e)==="[object Set]",gm=e=>$s(e)==="[object Date]",xz=e=>$s(e)==="[object RegExp]",Oe=e=>typeof e=="function",bt=e=>typeof e=="string",hr=e=>typeof e=="symbol",ft=e=>e!==null&&typeof e=="object",sd=e=>(ft(e)||Oe(e))&&Oe(e.then)&&Oe(e.catch),Nh=Object.prototype.toString,$s=e=>Nh.call(e),Ez=e=>$s(e).slice(8,-1),Dh=e=>$s(e)==="[object Object]",id=e=>bt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ds=vl(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),bl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$z=/-(\w)/g,Xt=bl(e=>e.replace($z,(t,n)=>n?n.toUpperCase():"")),Tz=/\B([A-Z])/g,mn=bl(e=>e.replace(Tz,"-$1").toLowerCase()),Ni=bl(e=>e.charAt(0).toUpperCase()+e.slice(1)),ri=bl(e=>e?`on${Ni(e)}`:""),nn=(e,t)=>!Object.is(e,t),ms=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Ua=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ja=e=>{const t=bt(e)?Number(e):NaN;return isNaN(t)?e:t};let ym;const Mh=()=>ym||(ym=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),Az="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error",Oz=vl(Az);function co(e){if(ze(e)){const t={};for(let n=0;n{if(n){const r=n.split(Iz);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function ke(e){let t="";if(bt(e))t=e;else if(ze(e))for(let n=0;noo(n,t))}const Vh=e=>!!(e&&e.__v_isRef===!0),y=e=>bt(e)?e:e==null?"":ze(e)||ft(e)&&(e.toString===Nh||!Oe(e.toString))?Vh(e)?y(e.value):JSON.stringify(e,Hh,2):String(e),Hh=(e,t)=>Vh(t)?Hh(e,t.value):us(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[cc(r,s)+" =>"]=o,n),{})}:Vo(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>cc(n))}:hr(t)?cc(t):ft(t)&&!ze(t)&&!Dh(t)?String(t):t,cc=(e,t="")=>{var n;return hr(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** * @vue/reactivity v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let bn;class ad{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=bn,!t&&bn&&(this.index=(bn.scopes||(bn.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=bn;try{return bn=this,t()}finally{bn=n}}}on(){bn=this}off(){bn=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),mo()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=no,n=$o;try{return no=!0,$o=this,this._runnings++,zm(this),this.fn()}finally{vm(this),this._runnings--,$o=n,no=t}}stop(){this.active&&(zm(this),vm(this),this.onStop&&this.onStop(),this.active=!1)}}function Vz(e){return e.value}function zm(e){e._trackId++,e._depsLength=0}function vm(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{n.dirty&&n.run()});t&&(kt(n,t),t.scope&&jh(n,t.scope)),(!t||!t.lazy)&&n.run();const r=n.run.bind(n);return r.effect=n,r}function Uz(e){e.effect.stop()}let no=!0,tu=0;const qh=[];function uo(){qh.push(no),no=!1}function mo(){const e=qh.pop();no=e===void 0?!0:e}function cd(){tu++}function ud(){for(tu--;!tu&&nu.length;)nu.shift()()}function Gh(e,t,n){if(t.get(e)!==e._trackId){t.set(e,e._trackId);const r=e.deps[e._depsLength];r!==t?(r&&Wh(r,e),e.deps[e._depsLength++]=t):e._depsLength++}}const nu=[];function Kh(e,t,n){cd();for(const r of e.keys()){let o;r._dirtyLevel{const n=new Map;return n.cleanup=e,n.computed=t,n},Ba=new WeakMap,To=Symbol(""),ru=Symbol("");function hn(e,t,n){if(no&&$o){let r=Ba.get(e);r||Ba.set(e,r=new Map);let o=r.get(n);o||r.set(n,o=Zh(()=>r.delete(n))),Gh($o,o)}}function xr(e,t,n,r,o,s){const i=Ba.get(e);if(!i)return;let a=[];if(t==="clear")a=[...i.values()];else if(n==="length"&&ze(e)){const l=Number(r);i.forEach((u,m)=>{(m==="length"||!hr(m)&&m>=l)&&a.push(u)})}else switch(n!==void 0&&a.push(i.get(n)),t){case"add":ze(e)?id(n)&&a.push(i.get("length")):(a.push(i.get(To)),us(e)&&a.push(i.get(ru)));break;case"delete":ze(e)||(a.push(i.get(To)),us(e)&&a.push(i.get(ru)));break;case"set":us(e)&&a.push(i.get(To));break}cd();for(const l of a)l&&Kh(l,4);ud()}function jz(e,t){const n=Ba.get(e);return n&&n.get(t)}const Bz=vl("__proto__,__v_isRef,__isVue"),Yh=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(hr)),bm=Wz();function Wz(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Xe(this);for(let s=0,i=this.length;s{e[t]=function(...n){uo(),cd();const r=Xe(this)[t].apply(this,n);return ud(),mo(),r}}),e}function qz(e){hr(e)||(e=String(e));const t=Xe(this);return hn(t,"has",e),t.hasOwnProperty(e)}class Xh{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?r_:n_:s?t_:e_).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=ze(t);if(!o){if(i&&tt(bm,n))return Reflect.get(bm,n,r);if(n==="hasOwnProperty")return qz}const a=Reflect.get(t,n,r);return(hr(n)?Yh.has(n):Bz(n))||(o||hn(t,"get",n),s)?a:Ot(a)?i&&id(n)?a:a.value:ft(a)?o?fd(a):Ts(a):a}}class Jh extends Xh{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const l=so(s);if(!No(r)&&!so(r)&&(s=Xe(s),r=Xe(r)),!ze(t)&&Ot(s)&&!Ot(r))return l?!1:(s.value=r,!0)}const i=ze(t)&&id(n)?Number(n)e,kl=e=>Reflect.getPrototypeOf(e);function Yi(e,t,n=!1,r=!1){e=e.__v_raw;const o=Xe(e),s=Xe(t);n||(nn(t,s)&&hn(o,"get",t),hn(o,"get",s));const{has:i}=kl(o),a=r?dd:n?hd:zi;if(i.call(o,t))return a(e.get(t));if(i.call(o,s))return a(e.get(s));e!==o&&e.get(t)}function Xi(e,t=!1){const n=this.__v_raw,r=Xe(n),o=Xe(e);return t||(nn(e,o)&&hn(r,"has",e),hn(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Ji(e,t=!1){return e=e.__v_raw,!t&&hn(Xe(e),"iterate",To),Reflect.get(e,"size",e)}function Cm(e,t=!1){!t&&!No(e)&&!so(e)&&(e=Xe(e));const n=Xe(this);return kl(n).has.call(n,e)||(n.add(e),xr(n,"add",e,e)),this}function wm(e,t,n=!1){!n&&!No(t)&&!so(t)&&(t=Xe(t));const r=Xe(this),{has:o,get:s}=kl(r);let i=o.call(r,e);i||(e=Xe(e),i=o.call(r,e));const a=s.call(r,e);return r.set(e,t),i?nn(t,a)&&xr(r,"set",e,t):xr(r,"add",e,t),this}function km(e){const t=Xe(this),{has:n,get:r}=kl(t);let o=n.call(t,e);o||(e=Xe(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&xr(t,"delete",e,void 0),s}function Sm(){const e=Xe(this),t=e.size!==0,n=e.clear();return t&&xr(e,"clear",void 0,void 0),n}function Qi(e,t){return function(r,o){const s=this,i=s.__v_raw,a=Xe(i),l=t?dd:e?hd:zi;return!e&&hn(a,"iterate",To),i.forEach((u,m)=>r.call(o,l(u),l(m),s))}}function ea(e,t,n){return function(...r){const o=this.__v_raw,s=Xe(o),i=us(s),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,u=o[e](...r),m=n?dd:t?hd:zi;return!t&&hn(s,"iterate",l?ru:To),{next(){const{value:d,done:f}=u.next();return f?{value:d,done:f}:{value:a?[m(d[0]),m(d[1])]:m(d),done:f}},[Symbol.iterator](){return this}}}}function Dr(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Xz(){const e={get(s){return Yi(this,s)},get size(){return Ji(this)},has:Xi,add:Cm,set:wm,delete:km,clear:Sm,forEach:Qi(!1,!1)},t={get(s){return Yi(this,s,!1,!0)},get size(){return Ji(this)},has:Xi,add(s){return Cm.call(this,s,!0)},set(s,i){return wm.call(this,s,i,!0)},delete:km,clear:Sm,forEach:Qi(!1,!0)},n={get(s){return Yi(this,s,!0)},get size(){return Ji(this,!0)},has(s){return Xi.call(this,s,!0)},add:Dr("add"),set:Dr("set"),delete:Dr("delete"),clear:Dr("clear"),forEach:Qi(!0,!1)},r={get(s){return Yi(this,s,!0,!0)},get size(){return Ji(this,!0)},has(s){return Xi.call(this,s,!0)},add:Dr("add"),set:Dr("set"),delete:Dr("delete"),clear:Dr("clear"),forEach:Qi(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=ea(s,!1,!1),n[s]=ea(s,!0,!1),t[s]=ea(s,!1,!0),r[s]=ea(s,!0,!0)}),[e,n,t,r]}const[Jz,Qz,ev,tv]=Xz();function Sl(e,t){const n=t?e?tv:ev:e?Qz:Jz;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(tt(n,o)&&o in r?n:r,o,s)}const nv={get:Sl(!1,!1)},rv={get:Sl(!1,!0)},ov={get:Sl(!0,!1)},sv={get:Sl(!0,!0)},e_=new WeakMap,t_=new WeakMap,n_=new WeakMap,r_=new WeakMap;function iv(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function av(e){return e.__v_skip||!Object.isExtensible(e)?0:iv($z(e))}function Ts(e){return so(e)?e:xl(e,!1,Gz,nv,e_)}function md(e){return xl(e,!1,Zz,rv,t_)}function fd(e){return xl(e,!0,Kz,ov,n_)}function lv(e){return xl(e,!0,Yz,sv,r_)}function xl(e,t,n,r,o){if(!ft(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=av(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return o.set(e,a),a}function Er(e){return so(e)?Er(e.__v_raw):!!(e&&e.__v_isReactive)}function so(e){return!!(e&&e.__v_isReadonly)}function No(e){return!!(e&&e.__v_isShallow)}function pd(e){return e?!!e.__v_raw:!1}function Xe(e){const t=e&&e.__v_raw;return t?Xe(t):e}function El(e){return Object.isExtensible(e)&&Mh(e,"__v_skip",!0),e}const zi=e=>ft(e)?Ts(e):e,hd=e=>ft(e)?fd(e):e;class o_{constructor(t,n,r,o){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new ys(()=>t(this._value),()=>fs(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=Xe(this);return(!t._cacheable||t.effect.dirty)&&nn(t._value,t._value=t.effect.run())&&fs(t,4),_d(t),t.effect._dirtyLevel>=2&&fs(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function cv(e,t,n=!1){let r,o;const s=Oe(e);return s?(r=e,o=fn):(r=e.get,o=e.set),new o_(r,o,s||!o,n)}function _d(e){var t;no&&$o&&(e=Xe(e),Gh($o,(t=e.dep)!=null?t:e.dep=Zh(()=>e.dep=void 0,e instanceof o_?e:void 0)))}function fs(e,t=4,n,r){e=Xe(e);const o=e.dep;o&&Kh(o,t)}function Ot(e){return!!(e&&e.__v_isRef===!0)}function Ln(e){return s_(e,!1)}function gd(e){return s_(e,!0)}function s_(e,t){return Ot(e)?e:new uv(e,t)}class uv{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Xe(t),this._value=n?t:zi(t)}get value(){return _d(this),this._value}set value(t){const n=this.__v_isShallow||No(t)||so(t);t=n?t:Xe(t),nn(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:zi(t),fs(this,4))}}function dv(e){fs(e,4)}function Cn(e){return Ot(e)?e.value:e}function mv(e){return Oe(e)?e():Cn(e)}const fv={get:(e,t,n)=>Cn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Ot(o)&&!Ot(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function yd(e){return Er(e)?e:new Proxy(e,fv)}class pv{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>_d(this),()=>fs(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function i_(e){return new pv(e)}function a_(e){const t=ze(e)?new Array(e.length):{};for(const n in e)t[n]=l_(e,n);return t}class hv{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 jz(Xe(this._object),this._key)}}class _v{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function gv(e,t,n){return Ot(e)?e:Oe(e)?new _v(e):ft(e)&&arguments.length>1?l_(e,t,n):Ln(e)}function l_(e,t,n){const r=e[t];return Ot(r)?r:new hv(e,t,n)}const yv={GET:"get",HAS:"has",ITERATE:"iterate"},zv={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"};/** +**/let bn;class ad{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=bn,!t&&bn&&(this.index=(bn.scopes||(bn.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=bn;try{return bn=this,t()}finally{bn=n}}}on(){bn=this}off(){bn=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),mo()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=no,n=$o;try{return no=!0,$o=this,this._runnings++,zm(this),this.fn()}finally{vm(this),this._runnings--,$o=n,no=t}}stop(){this.active&&(zm(this),vm(this),this.onStop&&this.onStop(),this.active=!1)}}function Fz(e){return e.value}function zm(e){e._trackId++,e._depsLength=0}function vm(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{n.dirty&&n.run()});t&&(kt(n,t),t.scope&&Uh(n,t.scope)),(!t||!t.lazy)&&n.run();const r=n.run.bind(n);return r.effect=n,r}function Hz(e){e.effect.stop()}let no=!0,tu=0;const Wh=[];function uo(){Wh.push(no),no=!1}function mo(){const e=Wh.pop();no=e===void 0?!0:e}function cd(){tu++}function ud(){for(tu--;!tu&&nu.length;)nu.shift()()}function qh(e,t,n){if(t.get(e)!==e._trackId){t.set(e,e._trackId);const r=e.deps[e._depsLength];r!==t?(r&&Bh(r,e),e.deps[e._depsLength++]=t):e._depsLength++}}const nu=[];function Gh(e,t,n){cd();for(const r of e.keys()){let o;r._dirtyLevel{const n=new Map;return n.cleanup=e,n.computed=t,n},Ba=new WeakMap,To=Symbol(""),ru=Symbol("");function hn(e,t,n){if(no&&$o){let r=Ba.get(e);r||Ba.set(e,r=new Map);let o=r.get(n);o||r.set(n,o=Kh(()=>r.delete(n))),qh($o,o)}}function xr(e,t,n,r,o,s){const i=Ba.get(e);if(!i)return;let a=[];if(t==="clear")a=[...i.values()];else if(n==="length"&&ze(e)){const l=Number(r);i.forEach((u,m)=>{(m==="length"||!hr(m)&&m>=l)&&a.push(u)})}else switch(n!==void 0&&a.push(i.get(n)),t){case"add":ze(e)?id(n)&&a.push(i.get("length")):(a.push(i.get(To)),us(e)&&a.push(i.get(ru)));break;case"delete":ze(e)||(a.push(i.get(To)),us(e)&&a.push(i.get(ru)));break;case"set":us(e)&&a.push(i.get(To));break}cd();for(const l of a)l&&Gh(l,4);ud()}function Uz(e,t){const n=Ba.get(e);return n&&n.get(t)}const jz=vl("__proto__,__v_isRef,__isVue"),Zh=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(hr)),bm=Bz();function Bz(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Xe(this);for(let s=0,i=this.length;s{e[t]=function(...n){uo(),cd();const r=Xe(this)[t].apply(this,n);return ud(),mo(),r}}),e}function Wz(e){hr(e)||(e=String(e));const t=Xe(this);return hn(t,"has",e),t.hasOwnProperty(e)}class Yh{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?n_:t_:s?e_:Qh).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=ze(t);if(!o){if(i&&tt(bm,n))return Reflect.get(bm,n,r);if(n==="hasOwnProperty")return Wz}const a=Reflect.get(t,n,r);return(hr(n)?Zh.has(n):jz(n))||(o||hn(t,"get",n),s)?a:Ot(a)?i&&id(n)?a:a.value:ft(a)?o?fd(a):Ts(a):a}}class Xh extends Yh{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const l=so(s);if(!No(r)&&!so(r)&&(s=Xe(s),r=Xe(r)),!ze(t)&&Ot(s)&&!Ot(r))return l?!1:(s.value=r,!0)}const i=ze(t)&&id(n)?Number(n)e,kl=e=>Reflect.getPrototypeOf(e);function Yi(e,t,n=!1,r=!1){e=e.__v_raw;const o=Xe(e),s=Xe(t);n||(nn(t,s)&&hn(o,"get",t),hn(o,"get",s));const{has:i}=kl(o),a=r?dd:n?hd:zi;if(i.call(o,t))return a(e.get(t));if(i.call(o,s))return a(e.get(s));e!==o&&e.get(t)}function Xi(e,t=!1){const n=this.__v_raw,r=Xe(n),o=Xe(e);return t||(nn(e,o)&&hn(r,"has",e),hn(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Ji(e,t=!1){return e=e.__v_raw,!t&&hn(Xe(e),"iterate",To),Reflect.get(e,"size",e)}function Cm(e,t=!1){!t&&!No(e)&&!so(e)&&(e=Xe(e));const n=Xe(this);return kl(n).has.call(n,e)||(n.add(e),xr(n,"add",e,e)),this}function wm(e,t,n=!1){!n&&!No(t)&&!so(t)&&(t=Xe(t));const r=Xe(this),{has:o,get:s}=kl(r);let i=o.call(r,e);i||(e=Xe(e),i=o.call(r,e));const a=s.call(r,e);return r.set(e,t),i?nn(t,a)&&xr(r,"set",e,t):xr(r,"add",e,t),this}function km(e){const t=Xe(this),{has:n,get:r}=kl(t);let o=n.call(t,e);o||(e=Xe(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&xr(t,"delete",e,void 0),s}function Sm(){const e=Xe(this),t=e.size!==0,n=e.clear();return t&&xr(e,"clear",void 0,void 0),n}function Qi(e,t){return function(r,o){const s=this,i=s.__v_raw,a=Xe(i),l=t?dd:e?hd:zi;return!e&&hn(a,"iterate",To),i.forEach((u,m)=>r.call(o,l(u),l(m),s))}}function ea(e,t,n){return function(...r){const o=this.__v_raw,s=Xe(o),i=us(s),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,u=o[e](...r),m=n?dd:t?hd:zi;return!t&&hn(s,"iterate",l?ru:To),{next(){const{value:d,done:f}=u.next();return f?{value:d,done:f}:{value:a?[m(d[0]),m(d[1])]:m(d),done:f}},[Symbol.iterator](){return this}}}}function Dr(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Yz(){const e={get(s){return Yi(this,s)},get size(){return Ji(this)},has:Xi,add:Cm,set:wm,delete:km,clear:Sm,forEach:Qi(!1,!1)},t={get(s){return Yi(this,s,!1,!0)},get size(){return Ji(this)},has:Xi,add(s){return Cm.call(this,s,!0)},set(s,i){return wm.call(this,s,i,!0)},delete:km,clear:Sm,forEach:Qi(!1,!0)},n={get(s){return Yi(this,s,!0)},get size(){return Ji(this,!0)},has(s){return Xi.call(this,s,!0)},add:Dr("add"),set:Dr("set"),delete:Dr("delete"),clear:Dr("clear"),forEach:Qi(!0,!1)},r={get(s){return Yi(this,s,!0,!0)},get size(){return Ji(this,!0)},has(s){return Xi.call(this,s,!0)},add:Dr("add"),set:Dr("set"),delete:Dr("delete"),clear:Dr("clear"),forEach:Qi(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=ea(s,!1,!1),n[s]=ea(s,!0,!1),t[s]=ea(s,!1,!0),r[s]=ea(s,!0,!0)}),[e,n,t,r]}const[Xz,Jz,Qz,ev]=Yz();function Sl(e,t){const n=t?e?ev:Qz:e?Jz:Xz;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(tt(n,o)&&o in r?n:r,o,s)}const tv={get:Sl(!1,!1)},nv={get:Sl(!1,!0)},rv={get:Sl(!0,!1)},ov={get:Sl(!0,!0)},Qh=new WeakMap,e_=new WeakMap,t_=new WeakMap,n_=new WeakMap;function sv(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function iv(e){return e.__v_skip||!Object.isExtensible(e)?0:sv(Ez(e))}function Ts(e){return so(e)?e:xl(e,!1,qz,tv,Qh)}function md(e){return xl(e,!1,Kz,nv,e_)}function fd(e){return xl(e,!0,Gz,rv,t_)}function av(e){return xl(e,!0,Zz,ov,n_)}function xl(e,t,n,r,o){if(!ft(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=iv(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return o.set(e,a),a}function Er(e){return so(e)?Er(e.__v_raw):!!(e&&e.__v_isReactive)}function so(e){return!!(e&&e.__v_isReadonly)}function No(e){return!!(e&&e.__v_isShallow)}function pd(e){return e?!!e.__v_raw:!1}function Xe(e){const t=e&&e.__v_raw;return t?Xe(t):e}function El(e){return Object.isExtensible(e)&&Rh(e,"__v_skip",!0),e}const zi=e=>ft(e)?Ts(e):e,hd=e=>ft(e)?fd(e):e;class r_{constructor(t,n,r,o){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new ys(()=>t(this._value),()=>fs(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=Xe(this);return(!t._cacheable||t.effect.dirty)&&nn(t._value,t._value=t.effect.run())&&fs(t,4),_d(t),t.effect._dirtyLevel>=2&&fs(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function lv(e,t,n=!1){let r,o;const s=Oe(e);return s?(r=e,o=fn):(r=e.get,o=e.set),new r_(r,o,s||!o,n)}function _d(e){var t;no&&$o&&(e=Xe(e),qh($o,(t=e.dep)!=null?t:e.dep=Kh(()=>e.dep=void 0,e instanceof r_?e:void 0)))}function fs(e,t=4,n,r){e=Xe(e);const o=e.dep;o&&Gh(o,t)}function Ot(e){return!!(e&&e.__v_isRef===!0)}function Ln(e){return o_(e,!1)}function gd(e){return o_(e,!0)}function o_(e,t){return Ot(e)?e:new cv(e,t)}class cv{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Xe(t),this._value=n?t:zi(t)}get value(){return _d(this),this._value}set value(t){const n=this.__v_isShallow||No(t)||so(t);t=n?t:Xe(t),nn(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:zi(t),fs(this,4))}}function uv(e){fs(e,4)}function Cn(e){return Ot(e)?e.value:e}function dv(e){return Oe(e)?e():Cn(e)}const mv={get:(e,t,n)=>Cn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Ot(o)&&!Ot(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function yd(e){return Er(e)?e:new Proxy(e,mv)}class fv{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>_d(this),()=>fs(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function s_(e){return new fv(e)}function i_(e){const t=ze(e)?new Array(e.length):{};for(const n in e)t[n]=a_(e,n);return t}class pv{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 Uz(Xe(this._object),this._key)}}class hv{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function _v(e,t,n){return Ot(e)?e:Oe(e)?new hv(e):ft(e)&&arguments.length>1?a_(e,t,n):Ln(e)}function a_(e,t,n){const r=e[t];return Ot(r)?r:new pv(e,t,n)}const gv={GET:"get",HAS:"has",ITERATE:"iterate"},yv={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"};/** * @vue/runtime-core v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/function vv(e,t){}const bv={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",WATCH_GETTER:2,2:"WATCH_GETTER",WATCH_CALLBACK:3,3:"WATCH_CALLBACK",WATCH_CLEANUP:4,4:"WATCH_CLEANUP",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE"},Cv={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update"};function $r(e,t,n,r){try{return r?e(...r):e()}catch(o){Ho(o,t,n)}}function kn(e,t,n,r){if(Oe(e)){const o=$r(e,t,n,r);return o&&sd(o)&&o.catch(s=>{Ho(s,t,n)}),o}if(ze(e)){const o=[];for(let s=0;s>>1,o=Gt[r],s=bi(o);sur&&Gt.splice(t,1)}function Wa(e){ze(e)?ps.push(...e):(!qr||!qr.includes(e,e.allowRecurse?So+1:So))&&ps.push(e),u_()}function xm(e,t,n=vi?ur+1:0){for(;nbi(n)-bi(r));if(ps.length=0,qr){qr.push(...t);return}for(qr=t,So=0;Soe.id==null?1/0:e.id,xv=(e,t)=>{const n=bi(e)-bi(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function d_(e){ou=!1,vi=!0,Gt.sort(xv);try{for(ur=0;ures.emit(o,...s)),ta=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{m_(s,t)}),setTimeout(()=>{es||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,ta=[])},3e3)):ta=[]}let Vt=null,Tl=null;function Ci(e){const t=Vt;return Vt=e,Tl=e&&e.type.__scopeId||null,t}function Ev(e){Tl=e}function $v(){Tl=null}const Tv=e=>N;function N(e,t=Vt,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&fu(-1);const s=Ci(t);let i;try{i=e(...o)}finally{Ci(s),r._d&&fu(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function ht(e,t){if(Vt===null)return e;const n=Vi(Vt),r=e.dirs||(e.dirs=[]);for(let o=0;o{e.isMounted=!0}),Il(()=>{e.isUnmounting=!0}),e}const $n=[Function,Array],bd={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$n,onEnter:$n,onAfterEnter:$n,onEnterCancelled:$n,onBeforeLeave:$n,onLeave:$n,onAfterLeave:$n,onLeaveCancelled:$n,onBeforeAppear:$n,onAppear:$n,onAfterAppear:$n,onAppearCancelled:$n},f_=e=>{const t=e.subTree;return t.component?f_(t.component):t},Av={name:"BaseTransition",props:bd,setup(e,{slots:t}){const n=Un(),r=vd();return()=>{const o=t.default&&Al(t.default(),!0);if(!o||!o.length)return;let s=o[0];if(o.length>1){for(const f of o)if(f.type!==Mt){s=f;break}}const i=Xe(e),{mode:a}=i;if(r.isLeaving)return uc(s);const l=Em(s);if(!l)return uc(s);let u=zs(l,i,r,n,f=>u=f);io(l,u);const m=n.subTree,d=m&&Em(m);if(d&&d.type!==Mt&&!Yn(l,d)&&f_(n).type!==Mt){const f=zs(d,i,r,n);if(io(d,f),a==="out-in"&&l.type!==Mt)return r.isLeaving=!0,f.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},uc(s);a==="in-out"&&l.type!==Mt&&(f.delayLeave=(p,h,g)=>{const z=h_(r,d);z[String(d.key)]=d,p[Gr]=()=>{h(),p[Gr]=void 0,delete u.delayedLeave},u.delayedLeave=g})}return s}}},p_=Av;function h_(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function zs(e,t,n,r,o){const{appear:s,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:m,onEnterCancelled:d,onBeforeLeave:f,onLeave:p,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:z,onAppear:k,onAfterAppear:w,onAppearCancelled:_}=t,v=String(e.key),S=h_(n,e),C=($,F)=>{$&&kn($,r,9,F)},L=($,F)=>{const q=F[1];C($,F),ze($)?$.every(U=>U.length<=1)&&q():$.length<=1&&q()},D={mode:i,persisted:a,beforeEnter($){let F=l;if(!n.isMounted)if(s)F=z||l;else return;$[Gr]&&$[Gr](!0);const q=S[v];q&&Yn(e,q)&&q.el[Gr]&&q.el[Gr](),C(F,[$])},enter($){let F=u,q=m,U=d;if(!n.isMounted)if(s)F=k||u,q=w||m,U=_||d;else return;let W=!1;const ne=$[na]=me=>{W||(W=!0,me?C(U,[$]):C(q,[$]),D.delayedLeave&&D.delayedLeave(),$[na]=void 0)};F?L(F,[$,ne]):ne()},leave($,F){const q=String(e.key);if($[na]&&$[na](!0),n.isUnmounting)return F();C(f,[$]);let U=!1;const W=$[Gr]=ne=>{U||(U=!0,F(),ne?C(g,[$]):C(h,[$]),$[Gr]=void 0,S[q]===e&&delete S[q])};S[q]=e,p?L(p,[$,W]):W()},clone($){const F=zs($,t,n,r,o);return o&&o(F),F}};return D}function uc(e){if(Di(e))return e=_r(e),e.children=null,e}function Em(e){if(!Di(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Oe(n.default))return n.default()}}function io(e,t){e.shapeFlag&6&&e.component?io(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Al(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Ov(e){Oe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:i=!0,onError:a}=e;let l=null,u,m=0;const d=()=>(m++,l=null,f()),f=()=>{let p;return l||(p=l=t().catch(h=>{if(h=h instanceof Error?h:new Error(String(h)),a)return new Promise((g,z)=>{a(h,()=>g(d()),()=>z(h),m+1)});throw h}).then(h=>p!==l&&l?l:(h&&(h.__esModule||h[Symbol.toStringTag]==="Module")&&(h=h.default),u=h,h)))};return Pr({name:"AsyncComponentWrapper",__asyncLoader:f,get __asyncResolved(){return u},setup(){const p=Ft;if(u)return()=>dc(u,p);const h=w=>{l=null,Ho(w,p,13,!r)};if(i&&p.suspense||Fi)return f().then(w=>()=>dc(w,p)).catch(w=>(h(w),()=>r?b(r,{error:w}):null));const g=Ln(!1),z=Ln(),k=Ln(!!o);return o&&setTimeout(()=>{k.value=!1},o),s!=null&&setTimeout(()=>{if(!g.value&&!z.value){const w=new Error(`Async component timed out after ${s}ms.`);h(w),z.value=w}},s),f().then(()=>{g.value=!0,p.parent&&Di(p.parent.vnode)&&(p.parent.effect.dirty=!0,$l(p.parent.update))}).catch(w=>{h(w),z.value=w}),()=>{if(g.value&&u)return dc(u,p);if(z.value&&r)return b(r,{error:z.value});if(n&&!k.value)return b(n)}}})}function dc(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=b(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const Di=e=>e.type.__isKeepAlive,Pv={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Un(),r=n.ctx;if(!r.renderer)return()=>{const w=t.default&&t.default();return w&&w.length===1?w[0]:w};const o=new Map,s=new Set;let i=null;const a=n.suspense,{renderer:{p:l,m:u,um:m,o:{createElement:d}}}=r,f=d("div");r.activate=(w,_,v,S,C)=>{const L=w.component;u(w,_,v,0,a),l(L.vnode,w,_,v,L,a,S,w.slotScopeIds,C),Ut(()=>{L.isDeactivated=!1,L.a&&ms(L.a);const D=w.props&&w.props.onVnodeMounted;D&&cn(D,L.parent,w)},a)},r.deactivate=w=>{const _=w.component;Za(_.m),Za(_.a),u(w,f,null,1,a),Ut(()=>{_.da&&ms(_.da);const v=w.props&&w.props.onVnodeUnmounted;v&&cn(v,_.parent,w),_.isDeactivated=!0},a)};function p(w){mc(w),m(w,n,a,!0)}function h(w){o.forEach((_,v)=>{const S=yu(_.type);S&&(!w||!w(S))&&g(v)})}function g(w){const _=o.get(w);_&&(!i||!Yn(_,i))?p(_):i&&mc(i),o.delete(w),s.delete(w)}Dn(()=>[e.include,e.exclude],([w,_])=>{w&&h(v=>Zs(w,v)),_&&h(v=>!Zs(_,v))},{flush:"post",deep:!0});let z=null;const k=()=>{z!=null&&(du(n.subTree.type)?Ut(()=>{o.set(z,ra(n.subTree))},n.subTree.suspense):o.set(z,ra(n.subTree)))};return As(k),Pl(k),Il(()=>{o.forEach(w=>{const{subTree:_,suspense:v}=n,S=ra(_);if(w.type===S.type&&w.key===S.key){mc(S);const C=S.component.da;C&&Ut(C,v);return}p(w)})}),()=>{if(z=null,!t.default)return null;const w=t.default(),_=w[0];if(w.length>1)return i=null,w;if(!ao(_)||!(_.shapeFlag&4)&&!(_.shapeFlag&128))return i=null,_;let v=ra(_);if(v.type===Mt)return i=null,v;const S=v.type,C=yu(Ao(v)?v.type.__asyncResolved||{}:S),{include:L,exclude:D,max:$}=e;if(L&&(!C||!Zs(L,C))||D&&C&&Zs(D,C))return i=v,_;const F=v.key==null?S:v.key,q=o.get(F);return v.el&&(v=_r(v),_.shapeFlag&128&&(_.ssContent=v)),z=F,q?(v.el=q.el,v.component=q.component,v.transition&&io(v,v.transition),v.shapeFlag|=512,s.delete(F),s.add(F)):(s.add(F),$&&s.size>parseInt($,10)&&g(s.values().next().value)),v.shapeFlag|=256,i=v,du(_.type)?_:v}}},Iv=Pv;function Zs(e,t){return ze(e)?e.some(n=>Zs(n,t)):bt(e)?e.split(",").includes(t):Ez(e)?e.test(t):!1}function __(e,t){y_(e,"a",t)}function g_(e,t){y_(e,"da",t)}function y_(e,t,n=Ft){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ol(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Di(o.parent.vnode)&&Lv(r,t,n,o),o=o.parent}}function Lv(e,t,n,r){const o=Ol(t,e,r,!0);Ri(()=>{od(r[t],o)},n)}function mc(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ra(e){return e.shapeFlag&128?e.ssContent:e}function Ol(e,t,n=Ft,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{uo();const a=Ro(n),l=kn(t,n,e,i);return a(),mo(),l});return r?o.unshift(s):o.push(s),s}}const Ir=e=>(t,n=Ft)=>{(!Fi||e==="sp")&&Ol(e,(...r)=>t(...r),n)},Cd=Ir("bm"),As=Ir("m"),z_=Ir("bu"),Pl=Ir("u"),Il=Ir("bum"),Ri=Ir("um"),v_=Ir("sp"),b_=Ir("rtg"),C_=Ir("rtc");function w_(e,t=Ft){Ol("ec",e,t)}const wd="components",Nv="directives";function O(e,t){return Sd(wd,e,!0,t)||e}const k_=Symbol.for("v-ndc");function Ll(e){return bt(e)?Sd(wd,e,!1)||e:e||k_}function kd(e){return Sd(Nv,e)}function Sd(e,t,n=!0,r=!1){const o=Vt||Ft;if(o){const s=o.type;if(e===wd){const a=yu(s,!1);if(a&&(a===t||a===Xt(t)||a===Ni(Xt(t))))return s}const i=$m(o[e]||s[e],t)||$m(o.appContext[e],t);return!i&&r?s:i}}function $m(e,t){return e&&(e[t]||e[Xt(t)]||e[Ni(Xt(t))])}function _t(e,t,n,r){let o;const s=n&&n[r];if(ze(e)||bt(e)){o=new Array(e.length);for(let i=0,a=e.length;it(i,a,void 0,s&&s[a]));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,l=i.length;a{const s=r.fn(...o);return s&&(s.key=r.key),s}:r.fn)}return e}function vt(e,t,n={},r,o){if(Vt.isCE||Vt.parent&&Ao(Vt.parent)&&Vt.parent.isCE)return t!=="default"&&(n.name=t),b("slot",n,r&&r());let s=e[t];s&&s._c&&(s._d=!1),x();const i=s&&Ed(s(n)),a=we(ve,{key:(n.key||i&&i.key||`_${t}`)+(!i&&r?"_fb":"")},i||(r?r():[]),i&&e._===1?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),s&&s._c&&(s._d=!0),a}function Ed(e){return e.some(t=>ao(t)?!(t.type===Mt||t.type===ve&&!Ed(t.children)):!0)?e:null}function Dv(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:ri(r)]=e[r];return n}const su=e=>e?ag(e)?Vi(e):su(e.parent):null,oi=kt(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=>su(e.parent),$root:e=>su(e.root),$emit:e=>e.emit,$options:e=>$d(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,$l(e.update)}),$nextTick:e=>e.n||(e.n=Uo.bind(e.proxy)),$watch:e=>gb.bind(e)}),fc=(e,t)=>e!==st&&!e.__isScriptSetup&&tt(e,t),iu={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let u;if(t[0]!=="$"){const p=i[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(fc(r,t))return i[t]=1,r[t];if(o!==st&&tt(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&tt(u,t))return i[t]=3,s[t];if(n!==st&&tt(n,t))return i[t]=4,n[t];au&&(i[t]=0)}}const m=oi[t];let d,f;if(m)return t==="$attrs"&&hn(e.attrs,"get",""),m(e);if((d=a.__cssModules)&&(d=d[t]))return d;if(n!==st&&tt(n,t))return i[t]=4,n[t];if(f=l.config.globalProperties,tt(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return fc(o,t)?(o[t]=n,!0):r!==st&&tt(r,t)?(r[t]=n,!0):tt(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 a;return!!n[i]||e!==st&&tt(e,i)||fc(t,i)||(a=s[0])&&tt(a,i)||tt(r,i)||tt(oi,i)||tt(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:tt(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},Rv=kt({},iu,{get(e,t){if(t!==Symbol.unscopables)return iu.get(e,t,e)},has(e,t){return t[0]!=="_"&&!Pz(t)}});function Mv(){return null}function Fv(){return null}function Vv(e){}function Hv(e){}function Uv(){return null}function jv(){}function Bv(e,t){return null}function Wv(){return S_().slots}function qv(){return S_().attrs}function S_(){const e=Un();return e.setupContext||(e.setupContext=ug(e))}function wi(e){return ze(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function Gv(e,t){const n=wi(e);for(const r in t){if(r.startsWith("__skip"))continue;let o=n[r];o?ze(o)||Oe(o)?o=n[r]={type:o,default:t[r]}:o.default=t[r]:o===null&&(o=n[r]={default:t[r]}),o&&t[`__skip_${r}`]&&(o.skipFactory=!0)}return n}function Kv(e,t){return!e||!t?e||t:ze(e)&&ze(t)?e.concat(t):kt({},wi(e),wi(t))}function Zv(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function Yv(e){const t=Un();let n=e();return hu(),sd(n)&&(n=n.catch(r=>{throw Ro(t),r})),[n,()=>Ro(t)]}let au=!0;function Xv(e){const t=$d(e),n=e.proxy,r=e.ctx;au=!1,t.beforeCreate&&Tm(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:u,created:m,beforeMount:d,mounted:f,beforeUpdate:p,updated:h,activated:g,deactivated:z,beforeDestroy:k,beforeUnmount:w,destroyed:_,unmounted:v,render:S,renderTracked:C,renderTriggered:L,errorCaptured:D,serverPrefetch:$,expose:F,inheritAttrs:q,components:U,directives:W,filters:ne}=t;if(u&&Jv(u,r,null),i)for(const re in i){const ce=i[re];Oe(ce)&&(r[re]=ce.bind(n))}if(o){const re=o.call(n,n);ft(re)&&(e.data=Ts(re))}if(au=!0,s)for(const re in s){const ce=s[re],Ne=Oe(ce)?ce.bind(n,n):Oe(ce.get)?ce.get.bind(n,n):fn,it=!Oe(ce)&&Oe(ce.set)?ce.set.bind(n):fn,Ve=jt({get:Ne,set:it});Object.defineProperty(r,re,{enumerable:!0,configurable:!0,get:()=>Ve.value,set:He=>Ve.value=He})}if(a)for(const re in a)x_(a[re],r,n,re);if(l){const re=Oe(l)?l.call(n):l;Reflect.ownKeys(re).forEach(ce=>{si(ce,re[ce])})}m&&Tm(m,e,"c");function K(re,ce){ze(ce)?ce.forEach(Ne=>re(Ne.bind(n))):ce&&re(ce.bind(n))}if(K(Cd,d),K(As,f),K(z_,p),K(Pl,h),K(__,g),K(g_,z),K(w_,D),K(C_,C),K(b_,L),K(Il,w),K(Ri,v),K(v_,$),ze(F))if(F.length){const re=e.exposed||(e.exposed={});F.forEach(ce=>{Object.defineProperty(re,ce,{get:()=>n[ce],set:Ne=>n[ce]=Ne})})}else e.exposed||(e.exposed={});S&&e.render===fn&&(e.render=S),q!=null&&(e.inheritAttrs=q),U&&(e.components=U),W&&(e.directives=W)}function Jv(e,t,n=fn){ze(e)&&(e=lu(e));for(const r in e){const o=e[r];let s;ft(o)?"default"in o?s=Nn(o.from||r,o.default,!0):s=Nn(o.from||r):s=Nn(o),Ot(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function Tm(e,t,n){kn(ze(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function x_(e,t,n,r){const o=r.includes(".")?X_(n,r):()=>n[r];if(bt(e)){const s=t[e];Oe(s)&&Dn(o,s)}else if(Oe(e))Dn(o,e.bind(n));else if(ft(e))if(ze(e))e.forEach(s=>x_(s,t,n,r));else{const s=Oe(e.handler)?e.handler.bind(n):t[e.handler];Oe(s)&&Dn(o,s,e)}}function $d(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(u=>Ga(l,u,i,!0)),Ga(l,t,i)),ft(t)&&s.set(t,l),l}function Ga(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&Ga(e,s,n,!0),o&&o.forEach(i=>Ga(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const a=Qv[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const Qv={data:Am,props:Om,emits:Om,methods:Ys,computed:Ys,beforeCreate:Qt,created:Qt,beforeMount:Qt,mounted:Qt,beforeUpdate:Qt,updated:Qt,beforeDestroy:Qt,beforeUnmount:Qt,destroyed:Qt,unmounted:Qt,activated:Qt,deactivated:Qt,errorCaptured:Qt,serverPrefetch:Qt,components:Ys,directives:Ys,watch:tb,provide:Am,inject:eb};function Am(e,t){return t?e?function(){return kt(Oe(e)?e.call(this,this):e,Oe(t)?t.call(this,this):t)}:t:e}function eb(e,t){return Ys(lu(e),lu(t))}function lu(e){if(ze(e)){const t={};for(let n=0;n1)return n&&Oe(t)?t.call(r&&r.proxy):t}}function $_(){return!!(Ft||Vt||Oo)}const T_={},A_=()=>Object.create(T_),O_=e=>Object.getPrototypeOf(e)===T_;function ob(e,t,n,r=!1){const o={},s=A_();e.propsDefaults=Object.create(null),P_(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:md(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function sb(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=Xe(o),[l]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const m=e.vnode.dynamicProps;for(let d=0;d{l=!0;const[f,p]=I_(d,t,!0);kt(i,f),p&&a.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(m),e.extends&&m(e.extends),e.mixins&&e.mixins.forEach(m)}if(!s&&!l)return ft(e)&&r.set(e,cs),cs;if(ze(s))for(let m=0;me[0]==="_"||e==="$stable",Td=e=>ze(e)?e.map(un):[un(e)],ab=(e,t,n)=>{if(t._n)return t;const r=N((...o)=>Td(t(...o)),n);return r._c=!1,r},N_=(e,t,n)=>{const r=e._ctx;for(const o in e){if(L_(o))continue;const s=e[o];if(Oe(s))t[o]=ab(o,s,r);else if(s!=null){const i=Td(s);t[o]=()=>i}}},D_=(e,t)=>{const n=Td(t);e.slots.default=()=>n},R_=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},lb=(e,t,n)=>{const r=e.slots=A_();if(e.vnode.shapeFlag&32){const o=t._;o?(R_(r,t,n),n&&Mh(r,"_",o,!0)):N_(t,r)}else t&&D_(e,t)},cb=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=st;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:R_(o,t,n):(s=!t.$stable,N_(t,o)),i=t}else t&&(D_(e,t),i={default:1});if(s)for(const a in o)!L_(a)&&i[a]==null&&delete o[a]};function Ka(e,t,n,r,o=!1){if(ze(e)){e.forEach((f,p)=>Ka(f,t&&(ze(t)?t[p]:t),n,r,o));return}if(Ao(r)&&!o)return;const s=r.shapeFlag&4?Vi(r.component):r.el,i=o?null:s,{i:a,r:l}=e,u=t&&t.r,m=a.refs===st?a.refs={}:a.refs,d=a.setupState;if(u!=null&&u!==l&&(bt(u)?(m[u]=null,tt(d,u)&&(d[u]=null)):Ot(u)&&(u.value=null)),Oe(l))$r(l,a,12,[i,m]);else{const f=bt(l),p=Ot(l);if(f||p){const h=()=>{if(e.f){const g=f?tt(d,l)?d[l]:m[l]:l.value;o?ze(g)&&od(g,s):ze(g)?g.includes(s)||g.push(s):f?(m[l]=[s],tt(d,l)&&(d[l]=m[l])):(l.value=[s],e.k&&(m[e.k]=l.value))}else f?(m[l]=i,tt(d,l)&&(d[l]=i)):p&&(l.value=i,e.k&&(m[e.k]=i))};i?(h.id=-1,Ut(h,n)):h()}}}const M_=Symbol("_vte"),ub=e=>e.__isTeleport,ii=e=>e&&(e.disabled||e.disabled===""),Im=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Lm=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,uu=(e,t)=>{const n=e&&e.to;return bt(n)?t?t(n):null:n},db={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,i,a,l,u){const{mc:m,pc:d,pbc:f,o:{insert:p,querySelector:h,createText:g,createComment:z}}=u,k=ii(t.props);let{shapeFlag:w,children:_,dynamicChildren:v}=t;if(e==null){const S=t.el=g(""),C=t.anchor=g("");p(S,n,r),p(C,n,r);const L=t.target=uu(t.props,h),D=V_(L,t,g,p);L&&(i==="svg"||Im(L)?i="svg":(i==="mathml"||Lm(L))&&(i="mathml"));const $=(F,q)=>{w&16&&m(_,F,q,o,s,i,a,l)};k?$(n,C):L&&$(L,D)}else{t.el=e.el,t.targetStart=e.targetStart;const S=t.anchor=e.anchor,C=t.target=e.target,L=t.targetAnchor=e.targetAnchor,D=ii(e.props),$=D?n:C,F=D?S:L;if(i==="svg"||Im(C)?i="svg":(i==="mathml"||Lm(C))&&(i="mathml"),v?(f(e.dynamicChildren,v,$,o,s,i,a),Ad(e,t,!0)):l||d(e,t,$,F,o,s,i,a,!1),k)D?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):oa(t,n,S,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const q=t.target=uu(t.props,h);q&&oa(t,q,null,u,0)}else D&&oa(t,C,L,u,1)}F_(t)},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:i,children:a,anchor:l,targetStart:u,targetAnchor:m,target:d,props:f}=e;if(d&&(o(u),o(m)),s&&o(l),i&16){const p=s||!ii(f);for(let h=0;h{Nm||(console.error("Hydration completed but contains mismatches."),Nm=!0)},fb=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",pb=e=>e.namespaceURI.includes("MathML"),sa=e=>{if(fb(e))return"svg";if(pb(e))return"mathml"},ia=e=>e.nodeType===8;function hb(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:a,insert:l,createComment:u}}=e,m=(_,v)=>{if(!v.hasChildNodes()){n(null,_,v),qa(),v._vnode=_;return}d(v.firstChild,_,null,null,null),qa(),v._vnode=_},d=(_,v,S,C,L,D=!1)=>{D=D||!!v.dynamicChildren;const $=ia(_)&&_.data==="[",F=()=>g(_,v,S,C,L,$),{type:q,ref:U,shapeFlag:W,patchFlag:ne}=v;let me=_.nodeType;v.el=_,ne===-2&&(D=!1,v.dynamicChildren=null);let K=null;switch(q){case Tr:me!==3?v.children===""?(l(v.el=o(""),i(_),_),K=_):K=F():(_.data!==v.children&&(Wo(),_.data=v.children),K=s(_));break;case Mt:w(_)?(K=s(_),k(v.el=_.content.firstChild,_,S)):me!==8||$?K=F():K=s(_);break;case Po:if($&&(_=s(_),me=_.nodeType),me===1||me===3){K=_;const re=!v.children.length;for(let ce=0;ce{D=D||!!v.dynamicChildren;const{type:$,props:F,patchFlag:q,shapeFlag:U,dirs:W,transition:ne}=v,me=$==="input"||$==="option";if(me||q!==-1){W&&cr(v,null,S,"created");let K=!1;if(w(_)){K=B_(C,ne)&&S&&S.vnode.props&&S.vnode.props.appear;const ce=_.content.firstChild;K&&ne.beforeEnter(ce),k(ce,_,S),v.el=_=ce}if(U&16&&!(F&&(F.innerHTML||F.textContent))){let ce=p(_.firstChild,v,_,S,C,L,D);for(;ce;){Wo();const Ne=ce;ce=ce.nextSibling,a(Ne)}}else U&8&&_.textContent!==v.children&&(Wo(),_.textContent=v.children);if(F){if(me||!D||q&48){const ce=_.tagName.includes("-");for(const Ne in F)(me&&(Ne.endsWith("value")||Ne==="indeterminate")||Li(Ne)&&!ds(Ne)||Ne[0]==="."||ce)&&r(_,Ne,null,F[Ne],void 0,S)}else if(F.onClick)r(_,"onClick",null,F.onClick,void 0,S);else if(q&4&&Er(F.style))for(const ce in F.style)F.style[ce]}let re;(re=F&&F.onVnodeBeforeMount)&&cn(re,S,v),W&&cr(v,null,S,"beforeMount"),((re=F&&F.onVnodeMounted)||W||K)&&tg(()=>{re&&cn(re,S,v),K&&ne.enter(_),W&&cr(v,null,S,"mounted")},C)}return _.nextSibling},p=(_,v,S,C,L,D,$)=>{$=$||!!v.dynamicChildren;const F=v.children,q=F.length;for(let U=0;U{const{slotScopeIds:$}=v;$&&(L=L?L.concat($):$);const F=i(_),q=p(s(_),v,F,S,C,L,D);return q&&ia(q)&&q.data==="]"?s(v.anchor=q):(Wo(),l(v.anchor=u("]"),F,q),q)},g=(_,v,S,C,L,D)=>{if(Wo(),v.el=null,D){const q=z(_);for(;;){const U=s(_);if(U&&U!==q)a(U);else break}}const $=s(_),F=i(_);return a(_),n(null,v,F,$,S,C,sa(F),L),$},z=(_,v="[",S="]")=>{let C=0;for(;_;)if(_=s(_),_&&ia(_)&&(_.data===v&&C++,_.data===S)){if(C===0)return s(_);C--}return _},k=(_,v,S)=>{const C=v.parentNode;C&&C.replaceChild(_,v);let L=S;for(;L;)L.vnode.el===v&&(L.vnode.el=L.subTree.el=_),L=L.parent},w=_=>_.nodeType===1&&_.tagName.toLowerCase()==="template";return[m,d]}const Ut=tg;function H_(e){return j_(e)}function U_(e){return j_(e,hb)}function j_(e,t){const n=Fh();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:u,setElementText:m,parentNode:d,nextSibling:f,setScopeId:p=fn,insertStaticContent:h}=e,g=(A,P,j,te=null,X=null,ie=null,pe=void 0,E=null,T=!!P.dynamicChildren)=>{if(A===P)return;A&&!Yn(A,P)&&(te=Y(A),He(A,X,ie,!0),A=null),P.patchFlag===-2&&(T=!1,P.dynamicChildren=null);const{type:R,ref:Q,shapeFlag:de}=P;switch(R){case Tr:z(A,P,j,te);break;case Mt:k(A,P,j,te);break;case Po:A==null&&w(P,j,te,pe);break;case ve:U(A,P,j,te,X,ie,pe,E,T);break;default:de&1?S(A,P,j,te,X,ie,pe,E,T):de&6?W(A,P,j,te,X,ie,pe,E,T):(de&64||de&128)&&R.process(A,P,j,te,X,ie,pe,E,T,ge)}Q!=null&&X&&Ka(Q,A&&A.ref,ie,P||A,!P)},z=(A,P,j,te)=>{if(A==null)r(P.el=a(P.children),j,te);else{const X=P.el=A.el;P.children!==A.children&&u(X,P.children)}},k=(A,P,j,te)=>{A==null?r(P.el=l(P.children||""),j,te):P.el=A.el},w=(A,P,j,te)=>{[A.el,A.anchor]=h(A.children,P,j,te,A.el,A.anchor)},_=({el:A,anchor:P},j,te)=>{let X;for(;A&&A!==P;)X=f(A),r(A,j,te),A=X;r(P,j,te)},v=({el:A,anchor:P})=>{let j;for(;A&&A!==P;)j=f(A),o(A),A=j;o(P)},S=(A,P,j,te,X,ie,pe,E,T)=>{P.type==="svg"?pe="svg":P.type==="math"&&(pe="mathml"),A==null?C(P,j,te,X,ie,pe,E,T):$(A,P,X,ie,pe,E,T)},C=(A,P,j,te,X,ie,pe,E)=>{let T,R;const{props:Q,shapeFlag:de,transition:se,dirs:H}=A;if(T=A.el=i(A.type,ie,Q&&Q.is,Q),de&8?m(T,A.children):de&16&&D(A.children,T,null,te,X,pc(A,ie),pe,E),H&&cr(A,null,te,"created"),L(T,A,A.scopeId,pe,te),Q){for(const Se in Q)Se!=="value"&&!ds(Se)&&s(T,Se,null,Q[Se],ie,te);"value"in Q&&s(T,"value",null,Q.value,ie),(R=Q.onVnodeBeforeMount)&&cn(R,te,A)}H&&cr(A,null,te,"beforeMount");const Z=B_(X,se);Z&&se.beforeEnter(T),r(T,P,j),((R=Q&&Q.onVnodeMounted)||Z||H)&&Ut(()=>{R&&cn(R,te,A),Z&&se.enter(T),H&&cr(A,null,te,"mounted")},X)},L=(A,P,j,te,X)=>{if(j&&p(A,j),te)for(let ie=0;ie{for(let R=T;R{const E=P.el=A.el;let{patchFlag:T,dynamicChildren:R,dirs:Q}=P;T|=A.patchFlag&16;const de=A.props||st,se=P.props||st;let H;if(j&&_o(j,!1),(H=se.onVnodeBeforeUpdate)&&cn(H,j,P,A),Q&&cr(P,A,j,"beforeUpdate"),j&&_o(j,!0),(de.innerHTML&&se.innerHTML==null||de.textContent&&se.textContent==null)&&m(E,""),R?F(A.dynamicChildren,R,E,j,te,pc(P,X),ie):pe||ce(A,P,E,null,j,te,pc(P,X),ie,!1),T>0){if(T&16)q(E,de,se,j,X);else if(T&2&&de.class!==se.class&&s(E,"class",null,se.class,X),T&4&&s(E,"style",de.style,se.style,X),T&8){const Z=P.dynamicProps;for(let Se=0;Se{H&&cn(H,j,P,A),Q&&cr(P,A,j,"updated")},te)},F=(A,P,j,te,X,ie,pe)=>{for(let E=0;E{if(P!==j){if(P!==st)for(const ie in P)!ds(ie)&&!(ie in j)&&s(A,ie,P[ie],null,X,te);for(const ie in j){if(ds(ie))continue;const pe=j[ie],E=P[ie];pe!==E&&ie!=="value"&&s(A,ie,E,pe,X,te)}"value"in j&&s(A,"value",P.value,j.value,X)}},U=(A,P,j,te,X,ie,pe,E,T)=>{const R=P.el=A?A.el:a(""),Q=P.anchor=A?A.anchor:a("");let{patchFlag:de,dynamicChildren:se,slotScopeIds:H}=P;H&&(E=E?E.concat(H):H),A==null?(r(R,j,te),r(Q,j,te),D(P.children||[],j,Q,X,ie,pe,E,T)):de>0&&de&64&&se&&A.dynamicChildren?(F(A.dynamicChildren,se,j,X,ie,pe,E),(P.key!=null||X&&P===X.subTree)&&Ad(A,P,!0)):ce(A,P,j,Q,X,ie,pe,E,T)},W=(A,P,j,te,X,ie,pe,E,T)=>{P.slotScopeIds=E,A==null?P.shapeFlag&512?X.ctx.activate(P,j,te,pe,T):ne(P,j,te,X,ie,pe,T):me(A,P,T)},ne=(A,P,j,te,X,ie,pe)=>{const E=A.component=ig(A,te,X);if(Di(A)&&(E.ctx.renderer=ge),lg(E,!1,pe),E.asyncDep){if(X&&X.registerDep(E,K,pe),!A.el){const T=E.subTree=b(Mt);k(null,T,P,j)}}else K(E,A,P,j,X,ie,pe)},me=(A,P,j)=>{const te=P.component=A.component;if(wb(A,P,j))if(te.asyncDep&&!te.asyncResolved){re(te,P,j);return}else te.next=P,Sv(te.update),te.effect.dirty=!0,te.update();else P.el=A.el,te.vnode=P},K=(A,P,j,te,X,ie,pe)=>{const E=()=>{if(A.isMounted){let{next:Q,bu:de,u:se,parent:H,vnode:Z}=A;{const oe=W_(A);if(oe){Q&&(Q.el=Z.el,re(A,Q,pe)),oe.asyncDep.then(()=>{A.isUnmounted||E()});return}}let Se=Q,M;_o(A,!1),Q?(Q.el=Z.el,re(A,Q,pe)):Q=Z,de&&ms(de),(M=Q.props&&Q.props.onVnodeBeforeUpdate)&&cn(M,H,Q,Z),_o(A,!0);const V=Ea(A),G=A.subTree;A.subTree=V,g(G,V,d(G.el),Y(G),A,X,ie),Q.el=V.el,Se===null&&Od(A,V.el),se&&Ut(se,X),(M=Q.props&&Q.props.onVnodeUpdated)&&Ut(()=>cn(M,H,Q,Z),X)}else{let Q;const{el:de,props:se}=P,{bm:H,m:Z,parent:Se}=A,M=Ao(P);if(_o(A,!1),H&&ms(H),!M&&(Q=se&&se.onVnodeBeforeMount)&&cn(Q,Se,P),_o(A,!0),de&&Ge){const V=()=>{A.subTree=Ea(A),Ge(de,A.subTree,A,X,null)};M?P.type.__asyncLoader().then(()=>!A.isUnmounted&&V()):V()}else{const V=A.subTree=Ea(A);g(null,V,j,te,A,X,ie),P.el=V.el}if(Z&&Ut(Z,X),!M&&(Q=se&&se.onVnodeMounted)){const V=P;Ut(()=>cn(Q,Se,V),X)}(P.shapeFlag&256||Se&&Ao(Se.vnode)&&Se.vnode.shapeFlag&256)&&A.a&&Ut(A.a,X),A.isMounted=!0,P=j=te=null}},T=A.effect=new ys(E,fn,()=>$l(R),A.scope),R=A.update=()=>{T.dirty&&T.run()};R.i=A,R.id=A.uid,_o(A,!0),R()},re=(A,P,j)=>{P.component=A;const te=A.vnode.props;A.vnode=P,A.next=null,sb(A,P.props,te,j),cb(A,P.children,j),uo(),xm(A),mo()},ce=(A,P,j,te,X,ie,pe,E,T=!1)=>{const R=A&&A.children,Q=A?A.shapeFlag:0,de=P.children,{patchFlag:se,shapeFlag:H}=P;if(se>0){if(se&128){it(R,de,j,te,X,ie,pe,E,T);return}else if(se&256){Ne(R,de,j,te,X,ie,pe,E,T);return}}H&8?(Q&16&&We(R,X,ie),de!==R&&m(j,de)):Q&16?H&16?it(R,de,j,te,X,ie,pe,E,T):We(R,X,ie,!0):(Q&8&&m(j,""),H&16&&D(de,j,te,X,ie,pe,E,T))},Ne=(A,P,j,te,X,ie,pe,E,T)=>{A=A||cs,P=P||cs;const R=A.length,Q=P.length,de=Math.min(R,Q);let se;for(se=0;seQ?We(A,X,ie,!0,!1,de):D(P,j,te,X,ie,pe,E,T,de)},it=(A,P,j,te,X,ie,pe,E,T)=>{let R=0;const Q=P.length;let de=A.length-1,se=Q-1;for(;R<=de&&R<=se;){const H=A[R],Z=P[R]=T?Kr(P[R]):un(P[R]);if(Yn(H,Z))g(H,Z,j,null,X,ie,pe,E,T);else break;R++}for(;R<=de&&R<=se;){const H=A[de],Z=P[se]=T?Kr(P[se]):un(P[se]);if(Yn(H,Z))g(H,Z,j,null,X,ie,pe,E,T);else break;de--,se--}if(R>de){if(R<=se){const H=se+1,Z=Hse)for(;R<=de;)He(A[R],X,ie,!0),R++;else{const H=R,Z=R,Se=new Map;for(R=Z;R<=se;R++){const Re=P[R]=T?Kr(P[R]):un(P[R]);Re.key!=null&&Se.set(Re.key,R)}let M,V=0;const G=se-Z+1;let oe=!1,ye=0;const $e=new Array(G);for(R=0;R=G){He(Re,X,ie,!0);continue}let nt;if(Re.key!=null)nt=Se.get(Re.key);else for(M=Z;M<=se;M++)if($e[M-Z]===0&&Yn(Re,P[M])){nt=M;break}nt===void 0?He(Re,X,ie,!0):($e[nt-Z]=R+1,nt>=ye?ye=nt:oe=!0,g(Re,P[nt],j,null,X,ie,pe,E,T),V++)}const Me=oe?_b($e):cs;for(M=Me.length-1,R=G-1;R>=0;R--){const Re=Z+R,nt=P[Re],Pe=Re+1{const{el:ie,type:pe,transition:E,children:T,shapeFlag:R}=A;if(R&6){Ve(A.component.subTree,P,j,te);return}if(R&128){A.suspense.move(P,j,te);return}if(R&64){pe.move(A,P,j,ge);return}if(pe===ve){r(ie,P,j);for(let de=0;deE.enter(ie),X);else{const{leave:de,delayLeave:se,afterLeave:H}=E,Z=()=>r(ie,P,j),Se=()=>{de(ie,()=>{Z(),H&&H()})};se?se(ie,Z,Se):Se()}else r(ie,P,j)},He=(A,P,j,te=!1,X=!1)=>{const{type:ie,props:pe,ref:E,children:T,dynamicChildren:R,shapeFlag:Q,patchFlag:de,dirs:se,cacheIndex:H}=A;if(de===-2&&(X=!1),E!=null&&Ka(E,null,j,A,!0),H!=null&&(P.renderCache[H]=void 0),Q&256){P.ctx.deactivate(A);return}const Z=Q&1&&se,Se=!Ao(A);let M;if(Se&&(M=pe&&pe.onVnodeBeforeUnmount)&&cn(M,P,A),Q&6)ut(A.component,j,te);else{if(Q&128){A.suspense.unmount(j,te);return}Z&&cr(A,null,P,"beforeUnmount"),Q&64?A.type.remove(A,P,j,ge,te):R&&!R.hasOnce&&(ie!==ve||de>0&&de&64)?We(R,P,j,!1,!0):(ie===ve&&de&384||!X&&Q&16)&&We(T,P,j),te&&at(A)}(Se&&(M=pe&&pe.onVnodeUnmounted)||Z)&&Ut(()=>{M&&cn(M,P,A),Z&&cr(A,null,P,"unmounted")},j)},at=A=>{const{type:P,el:j,anchor:te,transition:X}=A;if(P===ve){lt(j,te);return}if(P===Po){v(A);return}const ie=()=>{o(j),X&&!X.persisted&&X.afterLeave&&X.afterLeave()};if(A.shapeFlag&1&&X&&!X.persisted){const{leave:pe,delayLeave:E}=X,T=()=>pe(j,ie);E?E(A.el,ie,T):T()}else ie()},lt=(A,P)=>{let j;for(;A!==P;)j=f(A),o(A),A=j;o(P)},ut=(A,P,j)=>{const{bum:te,scope:X,update:ie,subTree:pe,um:E,m:T,a:R}=A;Za(T),Za(R),te&&ms(te),X.stop(),ie&&(ie.active=!1,He(pe,A,P,j)),E&&Ut(E,P),Ut(()=>{A.isUnmounted=!0},P),P&&P.pendingBranch&&!P.isUnmounted&&A.asyncDep&&!A.asyncResolved&&A.suspenseId===P.pendingId&&(P.deps--,P.deps===0&&P.resolve())},We=(A,P,j,te=!1,X=!1,ie=0)=>{for(let pe=ie;pe{if(A.shapeFlag&6)return Y(A.component.subTree);if(A.shapeFlag&128)return A.suspense.next();const P=f(A.anchor||A.el),j=P&&P[M_];return j?f(j):P};let fe=!1;const le=(A,P,j)=>{A==null?P._vnode&&He(P._vnode,null,null,!0):g(P._vnode||null,A,P,null,null,null,j),P._vnode=A,fe||(fe=!0,xm(),qa(),fe=!1)},ge={p:g,um:He,m:Ve,r:at,mt:ne,mc:D,pc:ce,pbc:F,n:Y,o:e};let Ue,Ge;return t&&([Ue,Ge]=t(ge)),{render:le,hydrate:Ue,createApp:rb(le,Ue)}}function pc({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function _o({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function B_(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ad(e,t,n=!1){const r=e.children,o=t.children;if(ze(r)&&ze(o))for(let s=0;s>1,e[n[a]]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}function W_(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:W_(t)}function Za(e){if(e)for(let t=0;tNn(q_);function K_(e,t){return Mi(e,null,t)}function Z_(e,t){return Mi(e,null,{flush:"post"})}function Y_(e,t){return Mi(e,null,{flush:"sync"})}const aa={};function Dn(e,t,n){return Mi(e,t,n)}function Mi(e,t,{immediate:n,deep:r,flush:o,once:s,onTrack:i,onTrigger:a}=st){if(t&&s){const C=t;t=(...L)=>{C(...L),S()}}const l=Ft,u=C=>r===!0?C:Jr(C,r===!1?1:void 0);let m,d=!1,f=!1;if(Ot(e)?(m=()=>e.value,d=No(e)):Er(e)?(m=()=>u(e),d=!0):ze(e)?(f=!0,d=e.some(C=>Er(C)||No(C)),m=()=>e.map(C=>{if(Ot(C))return C.value;if(Er(C))return u(C);if(Oe(C))return $r(C,l,2)})):Oe(e)?t?m=()=>$r(e,l,2):m=()=>(p&&p(),kn(e,l,3,[h])):m=fn,t&&r){const C=m;m=()=>Jr(C())}let p,h=C=>{p=_.onStop=()=>{$r(C,l,4),p=_.onStop=void 0}},g;if(Fi)if(h=fn,t?n&&kn(t,l,3,[m(),f?[]:void 0,h]):m(),o==="sync"){const C=G_();g=C.__watcherHandles||(C.__watcherHandles=[])}else return fn;let z=f?new Array(e.length).fill(aa):aa;const k=()=>{if(!(!_.active||!_.dirty))if(t){const C=_.run();(r||d||(f?C.some((L,D)=>nn(L,z[D])):nn(C,z)))&&(p&&p(),kn(t,l,3,[C,z===aa?void 0:f&&z[0]===aa?[]:z,h]),z=C)}else _.run()};k.allowRecurse=!!t;let w;o==="sync"?w=k:o==="post"?w=()=>Ut(k,l&&l.suspense):(k.pre=!0,l&&(k.id=l.uid),w=()=>$l(k));const _=new ys(m,fn,w),v=ld(),S=()=>{_.stop(),v&&od(v.effects,_)};return t?n?k():z=_.run():o==="post"?Ut(_.run.bind(_),l&&l.suspense):_.run(),g&&g.push(S),S}function gb(e,t,n){const r=this.proxy,o=bt(e)?e.includes(".")?X_(r,e):()=>r[e]:e.bind(r,r);let s;Oe(t)?s=t:(s=t.handler,n=t);const i=Ro(this),a=Mi(o,s.bind(r),n);return i(),a}function X_(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Jr(r,t,n)});else if(Rh(e)){for(const r in e)Jr(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Jr(e[r],t,n)}return e}function yb(e,t,n=st){const r=Un(),o=Xt(t),s=mn(t),i=J_(e,t),a=i_((l,u)=>{let m,d=st,f;return Y_(()=>{const p=e[t];nn(m,p)&&(m=p,u())}),{get(){return l(),n.get?n.get(m):m},set(p){const h=n.set?n.set(p):p;if(!nn(h,m)&&!(d!==st&&nn(p,d)))return;const g=r.vnode.props;g&&(t in g||o in g||s in g)&&(`onUpdate:${t}`in g||`onUpdate:${o}`in g||`onUpdate:${s}`in g)||(m=p,u()),r.emit(`update:${t}`,h),nn(p,h)&&nn(p,d)&&!nn(h,f)&&u(),d=p,f=h}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?i||st:a,done:!1}:{done:!0}}}},a}const J_=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Xt(t)}Modifiers`]||e[`${mn(t)}Modifiers`];function zb(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||st;let o=n;const s=t.startsWith("update:"),i=s&&J_(r,t.slice(7));i&&(i.trim&&(o=n.map(m=>bt(m)?m.trim():m)),i.number&&(o=n.map(Ua)));let a,l=r[a=ri(t)]||r[a=ri(Xt(t))];!l&&s&&(l=r[a=ri(mn(t))]),l&&kn(l,e,6,o);const u=r[a+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,kn(u,e,6,o)}}function Q_(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!Oe(e)){const l=u=>{const m=Q_(u,t,!0);m&&(a=!0,kt(i,m))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(ft(e)&&r.set(e,null),null):(ze(s)?s.forEach(l=>i[l]=null):kt(i,s),ft(e)&&r.set(e,i),i)}function Nl(e,t){return!e||!Li(t)?!1:(t=t.slice(2).replace(/Once$/,""),tt(e,t[0].toLowerCase()+t.slice(1))||tt(e,mn(t))||tt(e,t))}function Ea(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:i,attrs:a,emit:l,render:u,renderCache:m,props:d,data:f,setupState:p,ctx:h,inheritAttrs:g}=e,z=Ci(e);let k,w;try{if(n.shapeFlag&4){const v=o||r,S=v;k=un(u.call(S,v,m,d,p,f,h)),w=a}else{const v=t;k=un(v.length>1?v(d,{attrs:a,slots:i,emit:l}):v(d,null)),w=t.props?a:bb(a)}}catch(v){ai.length=0,Ho(v,e,1),k=b(Mt)}let _=k;if(w&&g!==!1){const v=Object.keys(w),{shapeFlag:S}=_;v.length&&S&7&&(s&&v.some(rd)&&(w=Cb(w,s)),_=_r(_,w,!1,!0))}return n.dirs&&(_=_r(_,null,!1,!0),_.dirs=_.dirs?_.dirs.concat(n.dirs):n.dirs),n.transition&&(_.transition=n.transition),k=_,Ci(z),k}function vb(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||Li(n))&&((t||(t={}))[n]=e[n]);return t},Cb=(e,t)=>{const n={};for(const r in e)(!rd(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function wb(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?Dm(r,i,u):!!i;if(l&8){const m=t.dynamicProps;for(let d=0;de.__isSuspense;let mu=0;const kb={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,s,i,a,l,u){if(e==null)xb(t,n,r,o,s,i,a,l,u);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}Eb(e,t,n,r,o,i,a,l,u)}},hydrate:$b,normalize:Tb},Sb=kb;function ki(e,t){const n=e.props&&e.props[t];Oe(n)&&n()}function xb(e,t,n,r,o,s,i,a,l){const{p:u,o:{createElement:m}}=l,d=m("div"),f=e.suspense=eg(e,o,r,t,d,n,s,i,a,l);u(null,f.pendingBranch=e.ssContent,d,null,r,f,s,i),f.deps>0?(ki(e,"onPending"),ki(e,"onFallback"),u(null,e.ssFallback,t,n,r,null,s,i),hs(f,e.ssFallback)):f.resolve(!1,!0)}function Eb(e,t,n,r,o,s,i,a,{p:l,um:u,o:{createElement:m}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,p=t.ssFallback,{activeBranch:h,pendingBranch:g,isInFallback:z,isHydrating:k}=d;if(g)d.pendingBranch=f,Yn(f,g)?(l(g,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():z&&(k||(l(h,p,n,r,o,null,s,i,a),hs(d,p)))):(d.pendingId=mu++,k?(d.isHydrating=!1,d.activeBranch=g):u(g,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=m("div"),z?(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():(l(h,p,n,r,o,null,s,i,a),hs(d,p))):h&&Yn(f,h)?(l(h,f,n,r,o,d,s,i,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0&&d.resolve()));else if(h&&Yn(f,h))l(h,f,n,r,o,d,s,i,a),hs(d,f);else if(ki(t,"onPending"),d.pendingBranch=f,f.shapeFlag&512?d.pendingId=f.component.suspenseId:d.pendingId=mu++,l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0)d.resolve();else{const{timeout:w,pendingId:_}=d;w>0?setTimeout(()=>{d.pendingId===_&&d.fallback(p)},w):w===0&&d.fallback(p)}}function eg(e,t,n,r,o,s,i,a,l,u,m=!1){const{p:d,m:f,um:p,n:h,o:{parentNode:g,remove:z}}=u;let k;const w=Ab(e);w&&t&&t.pendingBranch&&(k=t.pendingId,t.deps++);const _=e.props?ja(e.props.timeout):void 0,v=s,S={vnode:e,parent:t,parentComponent:n,namespace:i,container:r,hiddenContainer:o,deps:0,pendingId:mu++,timeout:typeof _=="number"?_:-1,activeBranch:null,pendingBranch:null,isInFallback:!m,isHydrating:m,isUnmounted:!1,effects:[],resolve(C=!1,L=!1){const{vnode:D,activeBranch:$,pendingBranch:F,pendingId:q,effects:U,parentComponent:W,container:ne}=S;let me=!1;S.isHydrating?S.isHydrating=!1:C||(me=$&&F.transition&&F.transition.mode==="out-in",me&&($.transition.afterLeave=()=>{q===S.pendingId&&(f(F,ne,s===v?h($):s,0),Wa(U))}),$&&(g($.el)!==S.hiddenContainer&&(s=h($)),p($,W,S,!0)),me||f(F,ne,s,0)),hs(S,F),S.pendingBranch=null,S.isInFallback=!1;let K=S.parent,re=!1;for(;K;){if(K.pendingBranch){K.effects.push(...U),re=!0;break}K=K.parent}!re&&!me&&Wa(U),S.effects=[],w&&t&&t.pendingBranch&&k===t.pendingId&&(t.deps--,t.deps===0&&!L&&t.resolve()),ki(D,"onResolve")},fallback(C){if(!S.pendingBranch)return;const{vnode:L,activeBranch:D,parentComponent:$,container:F,namespace:q}=S;ki(L,"onFallback");const U=h(D),W=()=>{S.isInFallback&&(d(null,C,F,U,$,null,q,a,l),hs(S,C))},ne=C.transition&&C.transition.mode==="out-in";ne&&(D.transition.afterLeave=W),S.isInFallback=!0,p(D,$,null,!0),ne||W()},move(C,L,D){S.activeBranch&&f(S.activeBranch,C,L,D),S.container=C},next(){return S.activeBranch&&h(S.activeBranch)},registerDep(C,L,D){const $=!!S.pendingBranch;$&&S.deps++;const F=C.vnode.el;C.asyncDep.catch(q=>{Ho(q,C,0)}).then(q=>{if(C.isUnmounted||S.isUnmounted||S.pendingId!==C.suspenseId)return;C.asyncResolved=!0;const{vnode:U}=C;_u(C,q,!1),F&&(U.el=F);const W=!F&&C.subTree.el;L(C,U,g(F||C.subTree.el),F?null:h(C.subTree),S,i,D),W&&z(W),Od(C,U.el),$&&--S.deps===0&&S.resolve()})},unmount(C,L){S.isUnmounted=!0,S.activeBranch&&p(S.activeBranch,n,C,L),S.pendingBranch&&p(S.pendingBranch,n,C,L)}};return S}function $b(e,t,n,r,o,s,i,a,l){const u=t.suspense=eg(t,r,n,e.parentNode,document.createElement("div"),null,o,s,i,a,!0),m=l(e,u.pendingBranch=t.ssContent,n,u,s,i);return u.deps===0&&u.resolve(!1,!0),m}function Tb(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=Rm(r?n.default:n),e.ssFallback=r?Rm(n.fallback):b(Mt)}function Rm(e){let t;if(Oe(e)){const n=Do&&e._c;n&&(e._d=!1,x()),e=e(),n&&(e._d=!0,t=Yt,ng())}return ze(e)&&(e=vb(e)),e=un(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function tg(e,t){t&&t.pendingBranch?ze(e)?t.effects.push(...e):t.effects.push(e):Wa(e)}function hs(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;for(;!o&&t.component;)t=t.component.subTree,o=t.el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,Od(r,o))}function Ab(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const ve=Symbol.for("v-fgt"),Tr=Symbol.for("v-txt"),Mt=Symbol.for("v-cmt"),Po=Symbol.for("v-stc"),ai=[];let Yt=null;function x(e=!1){ai.push(Yt=e?null:[])}function ng(){ai.pop(),Yt=ai[ai.length-1]||null}let Do=1;function fu(e){Do+=e,e<0&&Yt&&(Yt.hasOnce=!0)}function rg(e){return e.dynamicChildren=Do>0?Yt||cs:null,ng(),Do>0&&Yt&&Yt.push(e),e}function I(e,t,n,r,o,s){return rg(c(e,t,n,r,o,s,!0))}function we(e,t,n,r,o){return rg(b(e,t,n,r,o,!0))}function ao(e){return e?e.__v_isVNode===!0:!1}function Yn(e,t){return e.type===t.type&&e.key===t.key}function Ob(e){}const og=({key:e})=>e??null,$a=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?bt(e)||Ot(e)||Oe(e)?{i:Vt,r:e,k:t,f:!!n}:e:null);function c(e,t=null,n=null,r=0,o=null,s=e===ve?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&og(t),ref:t&&$a(t),scopeId:Tl,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Vt};return a?(Pd(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=bt(n)?8:16),Do>0&&!i&&Yt&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&Yt.push(l),l}const b=Pb;function Pb(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===k_)&&(e=Mt),ao(e)){const a=_r(e,t,!0);return n&&Pd(a,n),Do>0&&!s&&Yt&&(a.shapeFlag&6?Yt[Yt.indexOf(e)]=a:Yt.push(a)),a.patchFlag=-2,a}if(Vb(e)&&(e=e.__vccOpts),t){t=sg(t);let{class:a,style:l}=t;a&&!bt(a)&&(t.class=ke(a)),ft(l)&&(pd(l)&&!ze(l)&&(l=kt({},l)),t.style=co(l))}const i=bt(e)?1:du(e)?128:ub(e)?64:ft(e)?4:Oe(e)?2:0;return c(e,t,n,r,o,i,s,!0)}function sg(e){return e?pd(e)||O_(e)?kt({},e):e:null}function _r(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:i,children:a,transition:l}=e,u=t?is(o||{},t):o,m={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&og(u),ref:t&&t.ref?n&&s?ze(s)?s.concat($a(t)):[s,$a(t)]:$a(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ve?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&_r(e.ssContent),ssFallback:e.ssFallback&&_r(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&io(m,l.clone(m)),m}function Dt(e=" ",t=0){return b(Tr,null,e,t)}function Ib(e,t){const n=b(Po,null,e);return n.staticCount=t,n}function ee(e="",t=!1){return t?(x(),we(Mt,null,e)):b(Mt,null,e)}function un(e){return e==null||typeof e=="boolean"?b(Mt):ze(e)?b(ve,null,e.slice()):typeof e=="object"?Kr(e):b(Tr,null,String(e))}function Kr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:_r(e)}function Pd(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ze(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Pd(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!O_(t)?t._ctx=Vt:o===3&&Vt&&(Vt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Oe(t)?(t={default:t,_ctx:Vt},n=32):(t=String(t),r&64?(n=16,t=[Dt(t)]):n=8);e.children=t,e.shapeFlag|=n}function is(...e){const t={};for(let n=0;nFt||Vt;let Ya,pu;{const e=Fh(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(i=>i(s)):o[0](s)}};Ya=t("__VUE_INSTANCE_SETTERS__",n=>Ft=n),pu=t("__VUE_SSR_SETTERS__",n=>Fi=n)}const Ro=e=>{const t=Ft;return Ya(e),e.scope.on(),()=>{e.scope.off(),Ya(t)}},hu=()=>{Ft&&Ft.scope.off(),Ya(null)};function ag(e){return e.vnode.shapeFlag&4}let Fi=!1;function lg(e,t=!1,n=!1){t&&pu(t);const{props:r,children:o}=e.vnode,s=ag(e);ob(e,r,s,t),lb(e,o,n);const i=s?Db(e,t):void 0;return t&&pu(!1),i}function Db(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,iu);const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?ug(e):null,s=Ro(e);uo();const i=$r(r,e,0,[e.props,o]);if(mo(),s(),sd(i)){if(i.then(hu,hu),t)return i.then(a=>{_u(e,a,t)}).catch(a=>{Ho(a,e,0)});e.asyncDep=i}else _u(e,i,t)}else cg(e,t)}function _u(e,t,n){Oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ft(t)&&(e.setupState=yd(t)),cg(e,n)}let Xa,gu;function Rb(e){Xa=e,gu=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,Rv))}}const Mb=()=>!Xa;function cg(e,t,n){const r=e.type;if(!e.render){if(!t&&Xa&&!r.render){const o=r.template||$d(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,u=kt(kt({isCustomElement:s,delimiters:a},i),l);r.render=Xa(o,u)}}e.render=r.render||fn,gu&&gu(e)}{const o=Ro(e);uo();try{Xv(e)}finally{mo(),o()}}}const Fb={get(e,t){return hn(e,"get",""),e[t]}};function ug(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Fb),slots:e.slots,emit:e.emit,expose:t}}function Vi(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(yd(El(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in oi)return oi[n](e)},has(t,n){return n in t||n in oi}})):e.proxy}function yu(e,t=!0){return Oe(e)?e.displayName||e.name:e.name||t&&e.__name}function Vb(e){return Oe(e)&&"__vccOpts"in e}const jt=(e,t)=>cv(e,t,Fi);function mr(e,t,n){const r=arguments.length;return r===2?ft(t)&&!ze(t)?ao(t)?b(e,null,[t]):b(e,t):b(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&ao(n)&&(n=[n]),b(e,t,n))}function Hb(){}function Ub(e,t,n,r){const o=n[r];if(o&&dg(o,e))return o;const s=t();return s.memo=e.slice(),s.cacheIndex=r,n[r]=s}function dg(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r0&&Yt&&Yt.push(e),!0}const mg="3.4.38",jb=fn,Bb=Cv,Wb=es,qb=m_,Gb={createComponentInstance:ig,setupComponent:lg,renderComponentRoot:Ea,setCurrentRenderingInstance:Ci,isVNode:ao,normalizeVNode:un,getComponentPublicInstance:Vi,ensureValidVNode:Ed},Kb=Gb,Zb=null,Yb=null,Xb=null;/** +**/function zv(e,t){}const vv={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",WATCH_GETTER:2,2:"WATCH_GETTER",WATCH_CALLBACK:3,3:"WATCH_CALLBACK",WATCH_CLEANUP:4,4:"WATCH_CLEANUP",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE"},bv={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update"};function $r(e,t,n,r){try{return r?e(...r):e()}catch(o){Ho(o,t,n)}}function kn(e,t,n,r){if(Oe(e)){const o=$r(e,t,n,r);return o&&sd(o)&&o.catch(s=>{Ho(s,t,n)}),o}if(ze(e)){const o=[];for(let s=0;s>>1,o=Gt[r],s=bi(o);sur&&Gt.splice(t,1)}function Wa(e){ze(e)?ps.push(...e):(!qr||!qr.includes(e,e.allowRecurse?So+1:So))&&ps.push(e),c_()}function xm(e,t,n=vi?ur+1:0){for(;nbi(n)-bi(r));if(ps.length=0,qr){qr.push(...t);return}for(qr=t,So=0;Soe.id==null?1/0:e.id,Sv=(e,t)=>{const n=bi(e)-bi(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function u_(e){ou=!1,vi=!0,Gt.sort(Sv);try{for(ur=0;ures.emit(o,...s)),ta=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{d_(s,t)}),setTimeout(()=>{es||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,ta=[])},3e3)):ta=[]}let Vt=null,Tl=null;function Ci(e){const t=Vt;return Vt=e,Tl=e&&e.type.__scopeId||null,t}function xv(e){Tl=e}function Ev(){Tl=null}const $v=e=>N;function N(e,t=Vt,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&fu(-1);const s=Ci(t);let i;try{i=e(...o)}finally{Ci(s),r._d&&fu(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function ht(e,t){if(Vt===null)return e;const n=Vi(Vt),r=e.dirs||(e.dirs=[]);for(let o=0;o{e.isMounted=!0}),Il(()=>{e.isUnmounting=!0}),e}const $n=[Function,Array],bd={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$n,onEnter:$n,onAfterEnter:$n,onEnterCancelled:$n,onBeforeLeave:$n,onLeave:$n,onAfterLeave:$n,onLeaveCancelled:$n,onBeforeAppear:$n,onAppear:$n,onAfterAppear:$n,onAppearCancelled:$n},m_=e=>{const t=e.subTree;return t.component?m_(t.component):t},Tv={name:"BaseTransition",props:bd,setup(e,{slots:t}){const n=Un(),r=vd();return()=>{const o=t.default&&Al(t.default(),!0);if(!o||!o.length)return;let s=o[0];if(o.length>1){for(const f of o)if(f.type!==Mt){s=f;break}}const i=Xe(e),{mode:a}=i;if(r.isLeaving)return uc(s);const l=Em(s);if(!l)return uc(s);let u=zs(l,i,r,n,f=>u=f);io(l,u);const m=n.subTree,d=m&&Em(m);if(d&&d.type!==Mt&&!Yn(l,d)&&m_(n).type!==Mt){const f=zs(d,i,r,n);if(io(d,f),a==="out-in"&&l.type!==Mt)return r.isLeaving=!0,f.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},uc(s);a==="in-out"&&l.type!==Mt&&(f.delayLeave=(p,h,g)=>{const z=p_(r,d);z[String(d.key)]=d,p[Gr]=()=>{h(),p[Gr]=void 0,delete u.delayedLeave},u.delayedLeave=g})}return s}}},f_=Tv;function p_(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function zs(e,t,n,r,o){const{appear:s,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:m,onEnterCancelled:d,onBeforeLeave:f,onLeave:p,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:z,onAppear:k,onAfterAppear:w,onAppearCancelled:_}=t,v=String(e.key),S=p_(n,e),C=($,F)=>{$&&kn($,r,9,F)},L=($,F)=>{const q=F[1];C($,F),ze($)?$.every(U=>U.length<=1)&&q():$.length<=1&&q()},D={mode:i,persisted:a,beforeEnter($){let F=l;if(!n.isMounted)if(s)F=z||l;else return;$[Gr]&&$[Gr](!0);const q=S[v];q&&Yn(e,q)&&q.el[Gr]&&q.el[Gr](),C(F,[$])},enter($){let F=u,q=m,U=d;if(!n.isMounted)if(s)F=k||u,q=w||m,U=_||d;else return;let W=!1;const ne=$[na]=me=>{W||(W=!0,me?C(U,[$]):C(q,[$]),D.delayedLeave&&D.delayedLeave(),$[na]=void 0)};F?L(F,[$,ne]):ne()},leave($,F){const q=String(e.key);if($[na]&&$[na](!0),n.isUnmounting)return F();C(f,[$]);let U=!1;const W=$[Gr]=ne=>{U||(U=!0,F(),ne?C(g,[$]):C(h,[$]),$[Gr]=void 0,S[q]===e&&delete S[q])};S[q]=e,p?L(p,[$,W]):W()},clone($){const F=zs($,t,n,r,o);return o&&o(F),F}};return D}function uc(e){if(Di(e))return e=_r(e),e.children=null,e}function Em(e){if(!Di(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Oe(n.default))return n.default()}}function io(e,t){e.shapeFlag&6&&e.component?io(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Al(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Av(e){Oe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:i=!0,onError:a}=e;let l=null,u,m=0;const d=()=>(m++,l=null,f()),f=()=>{let p;return l||(p=l=t().catch(h=>{if(h=h instanceof Error?h:new Error(String(h)),a)return new Promise((g,z)=>{a(h,()=>g(d()),()=>z(h),m+1)});throw h}).then(h=>p!==l&&l?l:(h&&(h.__esModule||h[Symbol.toStringTag]==="Module")&&(h=h.default),u=h,h)))};return Pr({name:"AsyncComponentWrapper",__asyncLoader:f,get __asyncResolved(){return u},setup(){const p=Ft;if(u)return()=>dc(u,p);const h=w=>{l=null,Ho(w,p,13,!r)};if(i&&p.suspense||Fi)return f().then(w=>()=>dc(w,p)).catch(w=>(h(w),()=>r?b(r,{error:w}):null));const g=Ln(!1),z=Ln(),k=Ln(!!o);return o&&setTimeout(()=>{k.value=!1},o),s!=null&&setTimeout(()=>{if(!g.value&&!z.value){const w=new Error(`Async component timed out after ${s}ms.`);h(w),z.value=w}},s),f().then(()=>{g.value=!0,p.parent&&Di(p.parent.vnode)&&(p.parent.effect.dirty=!0,$l(p.parent.update))}).catch(w=>{h(w),z.value=w}),()=>{if(g.value&&u)return dc(u,p);if(z.value&&r)return b(r,{error:z.value});if(n&&!k.value)return b(n)}}})}function dc(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=b(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const Di=e=>e.type.__isKeepAlive,Ov={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Un(),r=n.ctx;if(!r.renderer)return()=>{const w=t.default&&t.default();return w&&w.length===1?w[0]:w};const o=new Map,s=new Set;let i=null;const a=n.suspense,{renderer:{p:l,m:u,um:m,o:{createElement:d}}}=r,f=d("div");r.activate=(w,_,v,S,C)=>{const L=w.component;u(w,_,v,0,a),l(L.vnode,w,_,v,L,a,S,w.slotScopeIds,C),Ut(()=>{L.isDeactivated=!1,L.a&&ms(L.a);const D=w.props&&w.props.onVnodeMounted;D&&cn(D,L.parent,w)},a)},r.deactivate=w=>{const _=w.component;Za(_.m),Za(_.a),u(w,f,null,1,a),Ut(()=>{_.da&&ms(_.da);const v=w.props&&w.props.onVnodeUnmounted;v&&cn(v,_.parent,w),_.isDeactivated=!0},a)};function p(w){mc(w),m(w,n,a,!0)}function h(w){o.forEach((_,v)=>{const S=yu(_.type);S&&(!w||!w(S))&&g(v)})}function g(w){const _=o.get(w);_&&(!i||!Yn(_,i))?p(_):i&&mc(i),o.delete(w),s.delete(w)}Dn(()=>[e.include,e.exclude],([w,_])=>{w&&h(v=>Zs(w,v)),_&&h(v=>!Zs(_,v))},{flush:"post",deep:!0});let z=null;const k=()=>{z!=null&&(du(n.subTree.type)?Ut(()=>{o.set(z,ra(n.subTree))},n.subTree.suspense):o.set(z,ra(n.subTree)))};return As(k),Pl(k),Il(()=>{o.forEach(w=>{const{subTree:_,suspense:v}=n,S=ra(_);if(w.type===S.type&&w.key===S.key){mc(S);const C=S.component.da;C&&Ut(C,v);return}p(w)})}),()=>{if(z=null,!t.default)return null;const w=t.default(),_=w[0];if(w.length>1)return i=null,w;if(!ao(_)||!(_.shapeFlag&4)&&!(_.shapeFlag&128))return i=null,_;let v=ra(_);if(v.type===Mt)return i=null,v;const S=v.type,C=yu(Ao(v)?v.type.__asyncResolved||{}:S),{include:L,exclude:D,max:$}=e;if(L&&(!C||!Zs(L,C))||D&&C&&Zs(D,C))return i=v,_;const F=v.key==null?S:v.key,q=o.get(F);return v.el&&(v=_r(v),_.shapeFlag&128&&(_.ssContent=v)),z=F,q?(v.el=q.el,v.component=q.component,v.transition&&io(v,v.transition),v.shapeFlag|=512,s.delete(F),s.add(F)):(s.add(F),$&&s.size>parseInt($,10)&&g(s.values().next().value)),v.shapeFlag|=256,i=v,du(_.type)?_:v}}},Pv=Ov;function Zs(e,t){return ze(e)?e.some(n=>Zs(n,t)):bt(e)?e.split(",").includes(t):xz(e)?e.test(t):!1}function h_(e,t){g_(e,"a",t)}function __(e,t){g_(e,"da",t)}function g_(e,t,n=Ft){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ol(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Di(o.parent.vnode)&&Iv(r,t,n,o),o=o.parent}}function Iv(e,t,n,r){const o=Ol(t,e,r,!0);Ri(()=>{od(r[t],o)},n)}function mc(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ra(e){return e.shapeFlag&128?e.ssContent:e}function Ol(e,t,n=Ft,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{uo();const a=Ro(n),l=kn(t,n,e,i);return a(),mo(),l});return r?o.unshift(s):o.push(s),s}}const Ir=e=>(t,n=Ft)=>{(!Fi||e==="sp")&&Ol(e,(...r)=>t(...r),n)},Cd=Ir("bm"),As=Ir("m"),y_=Ir("bu"),Pl=Ir("u"),Il=Ir("bum"),Ri=Ir("um"),z_=Ir("sp"),v_=Ir("rtg"),b_=Ir("rtc");function C_(e,t=Ft){Ol("ec",e,t)}const wd="components",Lv="directives";function O(e,t){return Sd(wd,e,!0,t)||e}const w_=Symbol.for("v-ndc");function Ll(e){return bt(e)?Sd(wd,e,!1)||e:e||w_}function kd(e){return Sd(Lv,e)}function Sd(e,t,n=!0,r=!1){const o=Vt||Ft;if(o){const s=o.type;if(e===wd){const a=yu(s,!1);if(a&&(a===t||a===Xt(t)||a===Ni(Xt(t))))return s}const i=$m(o[e]||s[e],t)||$m(o.appContext[e],t);return!i&&r?s:i}}function $m(e,t){return e&&(e[t]||e[Xt(t)]||e[Ni(Xt(t))])}function _t(e,t,n,r){let o;const s=n&&n[r];if(ze(e)||bt(e)){o=new Array(e.length);for(let i=0,a=e.length;it(i,a,void 0,s&&s[a]));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,l=i.length;a{const s=r.fn(...o);return s&&(s.key=r.key),s}:r.fn)}return e}function vt(e,t,n={},r,o){if(Vt.isCE||Vt.parent&&Ao(Vt.parent)&&Vt.parent.isCE)return t!=="default"&&(n.name=t),b("slot",n,r&&r());let s=e[t];s&&s._c&&(s._d=!1),x();const i=s&&Ed(s(n)),a=we(ve,{key:(n.key||i&&i.key||`_${t}`)+(!i&&r?"_fb":"")},i||(r?r():[]),i&&e._===1?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),s&&s._c&&(s._d=!0),a}function Ed(e){return e.some(t=>ao(t)?!(t.type===Mt||t.type===ve&&!Ed(t.children)):!0)?e:null}function Nv(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:ri(r)]=e[r];return n}const su=e=>e?ig(e)?Vi(e):su(e.parent):null,oi=kt(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=>su(e.parent),$root:e=>su(e.root),$emit:e=>e.emit,$options:e=>$d(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,$l(e.update)}),$nextTick:e=>e.n||(e.n=Uo.bind(e.proxy)),$watch:e=>_b.bind(e)}),fc=(e,t)=>e!==st&&!e.__isScriptSetup&&tt(e,t),iu={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let u;if(t[0]!=="$"){const p=i[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(fc(r,t))return i[t]=1,r[t];if(o!==st&&tt(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&tt(u,t))return i[t]=3,s[t];if(n!==st&&tt(n,t))return i[t]=4,n[t];au&&(i[t]=0)}}const m=oi[t];let d,f;if(m)return t==="$attrs"&&hn(e.attrs,"get",""),m(e);if((d=a.__cssModules)&&(d=d[t]))return d;if(n!==st&&tt(n,t))return i[t]=4,n[t];if(f=l.config.globalProperties,tt(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return fc(o,t)?(o[t]=n,!0):r!==st&&tt(r,t)?(r[t]=n,!0):tt(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 a;return!!n[i]||e!==st&&tt(e,i)||fc(t,i)||(a=s[0])&&tt(a,i)||tt(r,i)||tt(oi,i)||tt(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:tt(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},Dv=kt({},iu,{get(e,t){if(t!==Symbol.unscopables)return iu.get(e,t,e)},has(e,t){return t[0]!=="_"&&!Oz(t)}});function Rv(){return null}function Mv(){return null}function Fv(e){}function Vv(e){}function Hv(){return null}function Uv(){}function jv(e,t){return null}function Bv(){return k_().slots}function Wv(){return k_().attrs}function k_(){const e=Un();return e.setupContext||(e.setupContext=cg(e))}function wi(e){return ze(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function qv(e,t){const n=wi(e);for(const r in t){if(r.startsWith("__skip"))continue;let o=n[r];o?ze(o)||Oe(o)?o=n[r]={type:o,default:t[r]}:o.default=t[r]:o===null&&(o=n[r]={default:t[r]}),o&&t[`__skip_${r}`]&&(o.skipFactory=!0)}return n}function Gv(e,t){return!e||!t?e||t:ze(e)&&ze(t)?e.concat(t):kt({},wi(e),wi(t))}function Kv(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function Zv(e){const t=Un();let n=e();return hu(),sd(n)&&(n=n.catch(r=>{throw Ro(t),r})),[n,()=>Ro(t)]}let au=!0;function Yv(e){const t=$d(e),n=e.proxy,r=e.ctx;au=!1,t.beforeCreate&&Tm(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:u,created:m,beforeMount:d,mounted:f,beforeUpdate:p,updated:h,activated:g,deactivated:z,beforeDestroy:k,beforeUnmount:w,destroyed:_,unmounted:v,render:S,renderTracked:C,renderTriggered:L,errorCaptured:D,serverPrefetch:$,expose:F,inheritAttrs:q,components:U,directives:W,filters:ne}=t;if(u&&Xv(u,r,null),i)for(const re in i){const ce=i[re];Oe(ce)&&(r[re]=ce.bind(n))}if(o){const re=o.call(n,n);ft(re)&&(e.data=Ts(re))}if(au=!0,s)for(const re in s){const ce=s[re],Ne=Oe(ce)?ce.bind(n,n):Oe(ce.get)?ce.get.bind(n,n):fn,it=!Oe(ce)&&Oe(ce.set)?ce.set.bind(n):fn,Ve=jt({get:Ne,set:it});Object.defineProperty(r,re,{enumerable:!0,configurable:!0,get:()=>Ve.value,set:He=>Ve.value=He})}if(a)for(const re in a)S_(a[re],r,n,re);if(l){const re=Oe(l)?l.call(n):l;Reflect.ownKeys(re).forEach(ce=>{si(ce,re[ce])})}m&&Tm(m,e,"c");function K(re,ce){ze(ce)?ce.forEach(Ne=>re(Ne.bind(n))):ce&&re(ce.bind(n))}if(K(Cd,d),K(As,f),K(y_,p),K(Pl,h),K(h_,g),K(__,z),K(C_,D),K(b_,C),K(v_,L),K(Il,w),K(Ri,v),K(z_,$),ze(F))if(F.length){const re=e.exposed||(e.exposed={});F.forEach(ce=>{Object.defineProperty(re,ce,{get:()=>n[ce],set:Ne=>n[ce]=Ne})})}else e.exposed||(e.exposed={});S&&e.render===fn&&(e.render=S),q!=null&&(e.inheritAttrs=q),U&&(e.components=U),W&&(e.directives=W)}function Xv(e,t,n=fn){ze(e)&&(e=lu(e));for(const r in e){const o=e[r];let s;ft(o)?"default"in o?s=Nn(o.from||r,o.default,!0):s=Nn(o.from||r):s=Nn(o),Ot(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function Tm(e,t,n){kn(ze(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function S_(e,t,n,r){const o=r.includes(".")?Y_(n,r):()=>n[r];if(bt(e)){const s=t[e];Oe(s)&&Dn(o,s)}else if(Oe(e))Dn(o,e.bind(n));else if(ft(e))if(ze(e))e.forEach(s=>S_(s,t,n,r));else{const s=Oe(e.handler)?e.handler.bind(n):t[e.handler];Oe(s)&&Dn(o,s,e)}}function $d(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(u=>Ga(l,u,i,!0)),Ga(l,t,i)),ft(t)&&s.set(t,l),l}function Ga(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&Ga(e,s,n,!0),o&&o.forEach(i=>Ga(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const a=Jv[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const Jv={data:Am,props:Om,emits:Om,methods:Ys,computed:Ys,beforeCreate:Qt,created:Qt,beforeMount:Qt,mounted:Qt,beforeUpdate:Qt,updated:Qt,beforeDestroy:Qt,beforeUnmount:Qt,destroyed:Qt,unmounted:Qt,activated:Qt,deactivated:Qt,errorCaptured:Qt,serverPrefetch:Qt,components:Ys,directives:Ys,watch:eb,provide:Am,inject:Qv};function Am(e,t){return t?e?function(){return kt(Oe(e)?e.call(this,this):e,Oe(t)?t.call(this,this):t)}:t:e}function Qv(e,t){return Ys(lu(e),lu(t))}function lu(e){if(ze(e)){const t={};for(let n=0;n1)return n&&Oe(t)?t.call(r&&r.proxy):t}}function E_(){return!!(Ft||Vt||Oo)}const $_={},T_=()=>Object.create($_),A_=e=>Object.getPrototypeOf(e)===$_;function rb(e,t,n,r=!1){const o={},s=T_();e.propsDefaults=Object.create(null),O_(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:md(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function ob(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=Xe(o),[l]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const m=e.vnode.dynamicProps;for(let d=0;d{l=!0;const[f,p]=P_(d,t,!0);kt(i,f),p&&a.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(m),e.extends&&m(e.extends),e.mixins&&e.mixins.forEach(m)}if(!s&&!l)return ft(e)&&r.set(e,cs),cs;if(ze(s))for(let m=0;me[0]==="_"||e==="$stable",Td=e=>ze(e)?e.map(un):[un(e)],ib=(e,t,n)=>{if(t._n)return t;const r=N((...o)=>Td(t(...o)),n);return r._c=!1,r},L_=(e,t,n)=>{const r=e._ctx;for(const o in e){if(I_(o))continue;const s=e[o];if(Oe(s))t[o]=ib(o,s,r);else if(s!=null){const i=Td(s);t[o]=()=>i}}},N_=(e,t)=>{const n=Td(t);e.slots.default=()=>n},D_=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},ab=(e,t,n)=>{const r=e.slots=T_();if(e.vnode.shapeFlag&32){const o=t._;o?(D_(r,t,n),n&&Rh(r,"_",o,!0)):L_(t,r)}else t&&N_(e,t)},lb=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=st;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:D_(o,t,n):(s=!t.$stable,L_(t,o)),i=t}else t&&(N_(e,t),i={default:1});if(s)for(const a in o)!I_(a)&&i[a]==null&&delete o[a]};function Ka(e,t,n,r,o=!1){if(ze(e)){e.forEach((f,p)=>Ka(f,t&&(ze(t)?t[p]:t),n,r,o));return}if(Ao(r)&&!o)return;const s=r.shapeFlag&4?Vi(r.component):r.el,i=o?null:s,{i:a,r:l}=e,u=t&&t.r,m=a.refs===st?a.refs={}:a.refs,d=a.setupState;if(u!=null&&u!==l&&(bt(u)?(m[u]=null,tt(d,u)&&(d[u]=null)):Ot(u)&&(u.value=null)),Oe(l))$r(l,a,12,[i,m]);else{const f=bt(l),p=Ot(l);if(f||p){const h=()=>{if(e.f){const g=f?tt(d,l)?d[l]:m[l]:l.value;o?ze(g)&&od(g,s):ze(g)?g.includes(s)||g.push(s):f?(m[l]=[s],tt(d,l)&&(d[l]=m[l])):(l.value=[s],e.k&&(m[e.k]=l.value))}else f?(m[l]=i,tt(d,l)&&(d[l]=i)):p&&(l.value=i,e.k&&(m[e.k]=i))};i?(h.id=-1,Ut(h,n)):h()}}}const R_=Symbol("_vte"),cb=e=>e.__isTeleport,ii=e=>e&&(e.disabled||e.disabled===""),Im=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Lm=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,uu=(e,t)=>{const n=e&&e.to;return bt(n)?t?t(n):null:n},ub={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,i,a,l,u){const{mc:m,pc:d,pbc:f,o:{insert:p,querySelector:h,createText:g,createComment:z}}=u,k=ii(t.props);let{shapeFlag:w,children:_,dynamicChildren:v}=t;if(e==null){const S=t.el=g(""),C=t.anchor=g("");p(S,n,r),p(C,n,r);const L=t.target=uu(t.props,h),D=F_(L,t,g,p);L&&(i==="svg"||Im(L)?i="svg":(i==="mathml"||Lm(L))&&(i="mathml"));const $=(F,q)=>{w&16&&m(_,F,q,o,s,i,a,l)};k?$(n,C):L&&$(L,D)}else{t.el=e.el,t.targetStart=e.targetStart;const S=t.anchor=e.anchor,C=t.target=e.target,L=t.targetAnchor=e.targetAnchor,D=ii(e.props),$=D?n:C,F=D?S:L;if(i==="svg"||Im(C)?i="svg":(i==="mathml"||Lm(C))&&(i="mathml"),v?(f(e.dynamicChildren,v,$,o,s,i,a),Ad(e,t,!0)):l||d(e,t,$,F,o,s,i,a,!1),k)D?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):oa(t,n,S,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const q=t.target=uu(t.props,h);q&&oa(t,q,null,u,0)}else D&&oa(t,C,L,u,1)}M_(t)},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:i,children:a,anchor:l,targetStart:u,targetAnchor:m,target:d,props:f}=e;if(d&&(o(u),o(m)),s&&o(l),i&16){const p=s||!ii(f);for(let h=0;h{Nm||(console.error("Hydration completed but contains mismatches."),Nm=!0)},mb=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",fb=e=>e.namespaceURI.includes("MathML"),sa=e=>{if(mb(e))return"svg";if(fb(e))return"mathml"},ia=e=>e.nodeType===8;function pb(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:a,insert:l,createComment:u}}=e,m=(_,v)=>{if(!v.hasChildNodes()){n(null,_,v),qa(),v._vnode=_;return}d(v.firstChild,_,null,null,null),qa(),v._vnode=_},d=(_,v,S,C,L,D=!1)=>{D=D||!!v.dynamicChildren;const $=ia(_)&&_.data==="[",F=()=>g(_,v,S,C,L,$),{type:q,ref:U,shapeFlag:W,patchFlag:ne}=v;let me=_.nodeType;v.el=_,ne===-2&&(D=!1,v.dynamicChildren=null);let K=null;switch(q){case Tr:me!==3?v.children===""?(l(v.el=o(""),i(_),_),K=_):K=F():(_.data!==v.children&&(Wo(),_.data=v.children),K=s(_));break;case Mt:w(_)?(K=s(_),k(v.el=_.content.firstChild,_,S)):me!==8||$?K=F():K=s(_);break;case Po:if($&&(_=s(_),me=_.nodeType),me===1||me===3){K=_;const re=!v.children.length;for(let ce=0;ce{D=D||!!v.dynamicChildren;const{type:$,props:F,patchFlag:q,shapeFlag:U,dirs:W,transition:ne}=v,me=$==="input"||$==="option";if(me||q!==-1){W&&cr(v,null,S,"created");let K=!1;if(w(_)){K=j_(C,ne)&&S&&S.vnode.props&&S.vnode.props.appear;const ce=_.content.firstChild;K&&ne.beforeEnter(ce),k(ce,_,S),v.el=_=ce}if(U&16&&!(F&&(F.innerHTML||F.textContent))){let ce=p(_.firstChild,v,_,S,C,L,D);for(;ce;){Wo();const Ne=ce;ce=ce.nextSibling,a(Ne)}}else U&8&&_.textContent!==v.children&&(Wo(),_.textContent=v.children);if(F){if(me||!D||q&48){const ce=_.tagName.includes("-");for(const Ne in F)(me&&(Ne.endsWith("value")||Ne==="indeterminate")||Li(Ne)&&!ds(Ne)||Ne[0]==="."||ce)&&r(_,Ne,null,F[Ne],void 0,S)}else if(F.onClick)r(_,"onClick",null,F.onClick,void 0,S);else if(q&4&&Er(F.style))for(const ce in F.style)F.style[ce]}let re;(re=F&&F.onVnodeBeforeMount)&&cn(re,S,v),W&&cr(v,null,S,"beforeMount"),((re=F&&F.onVnodeMounted)||W||K)&&eg(()=>{re&&cn(re,S,v),K&&ne.enter(_),W&&cr(v,null,S,"mounted")},C)}return _.nextSibling},p=(_,v,S,C,L,D,$)=>{$=$||!!v.dynamicChildren;const F=v.children,q=F.length;for(let U=0;U{const{slotScopeIds:$}=v;$&&(L=L?L.concat($):$);const F=i(_),q=p(s(_),v,F,S,C,L,D);return q&&ia(q)&&q.data==="]"?s(v.anchor=q):(Wo(),l(v.anchor=u("]"),F,q),q)},g=(_,v,S,C,L,D)=>{if(Wo(),v.el=null,D){const q=z(_);for(;;){const U=s(_);if(U&&U!==q)a(U);else break}}const $=s(_),F=i(_);return a(_),n(null,v,F,$,S,C,sa(F),L),$},z=(_,v="[",S="]")=>{let C=0;for(;_;)if(_=s(_),_&&ia(_)&&(_.data===v&&C++,_.data===S)){if(C===0)return s(_);C--}return _},k=(_,v,S)=>{const C=v.parentNode;C&&C.replaceChild(_,v);let L=S;for(;L;)L.vnode.el===v&&(L.vnode.el=L.subTree.el=_),L=L.parent},w=_=>_.nodeType===1&&_.tagName.toLowerCase()==="template";return[m,d]}const Ut=eg;function V_(e){return U_(e)}function H_(e){return U_(e,pb)}function U_(e,t){const n=Mh();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:u,setElementText:m,parentNode:d,nextSibling:f,setScopeId:p=fn,insertStaticContent:h}=e,g=(A,P,j,te=null,X=null,ie=null,pe=void 0,E=null,T=!!P.dynamicChildren)=>{if(A===P)return;A&&!Yn(A,P)&&(te=Y(A),He(A,X,ie,!0),A=null),P.patchFlag===-2&&(T=!1,P.dynamicChildren=null);const{type:R,ref:Q,shapeFlag:de}=P;switch(R){case Tr:z(A,P,j,te);break;case Mt:k(A,P,j,te);break;case Po:A==null&&w(P,j,te,pe);break;case ve:U(A,P,j,te,X,ie,pe,E,T);break;default:de&1?S(A,P,j,te,X,ie,pe,E,T):de&6?W(A,P,j,te,X,ie,pe,E,T):(de&64||de&128)&&R.process(A,P,j,te,X,ie,pe,E,T,ge)}Q!=null&&X&&Ka(Q,A&&A.ref,ie,P||A,!P)},z=(A,P,j,te)=>{if(A==null)r(P.el=a(P.children),j,te);else{const X=P.el=A.el;P.children!==A.children&&u(X,P.children)}},k=(A,P,j,te)=>{A==null?r(P.el=l(P.children||""),j,te):P.el=A.el},w=(A,P,j,te)=>{[A.el,A.anchor]=h(A.children,P,j,te,A.el,A.anchor)},_=({el:A,anchor:P},j,te)=>{let X;for(;A&&A!==P;)X=f(A),r(A,j,te),A=X;r(P,j,te)},v=({el:A,anchor:P})=>{let j;for(;A&&A!==P;)j=f(A),o(A),A=j;o(P)},S=(A,P,j,te,X,ie,pe,E,T)=>{P.type==="svg"?pe="svg":P.type==="math"&&(pe="mathml"),A==null?C(P,j,te,X,ie,pe,E,T):$(A,P,X,ie,pe,E,T)},C=(A,P,j,te,X,ie,pe,E)=>{let T,R;const{props:Q,shapeFlag:de,transition:se,dirs:H}=A;if(T=A.el=i(A.type,ie,Q&&Q.is,Q),de&8?m(T,A.children):de&16&&D(A.children,T,null,te,X,pc(A,ie),pe,E),H&&cr(A,null,te,"created"),L(T,A,A.scopeId,pe,te),Q){for(const Se in Q)Se!=="value"&&!ds(Se)&&s(T,Se,null,Q[Se],ie,te);"value"in Q&&s(T,"value",null,Q.value,ie),(R=Q.onVnodeBeforeMount)&&cn(R,te,A)}H&&cr(A,null,te,"beforeMount");const Z=j_(X,se);Z&&se.beforeEnter(T),r(T,P,j),((R=Q&&Q.onVnodeMounted)||Z||H)&&Ut(()=>{R&&cn(R,te,A),Z&&se.enter(T),H&&cr(A,null,te,"mounted")},X)},L=(A,P,j,te,X)=>{if(j&&p(A,j),te)for(let ie=0;ie{for(let R=T;R{const E=P.el=A.el;let{patchFlag:T,dynamicChildren:R,dirs:Q}=P;T|=A.patchFlag&16;const de=A.props||st,se=P.props||st;let H;if(j&&_o(j,!1),(H=se.onVnodeBeforeUpdate)&&cn(H,j,P,A),Q&&cr(P,A,j,"beforeUpdate"),j&&_o(j,!0),(de.innerHTML&&se.innerHTML==null||de.textContent&&se.textContent==null)&&m(E,""),R?F(A.dynamicChildren,R,E,j,te,pc(P,X),ie):pe||ce(A,P,E,null,j,te,pc(P,X),ie,!1),T>0){if(T&16)q(E,de,se,j,X);else if(T&2&&de.class!==se.class&&s(E,"class",null,se.class,X),T&4&&s(E,"style",de.style,se.style,X),T&8){const Z=P.dynamicProps;for(let Se=0;Se{H&&cn(H,j,P,A),Q&&cr(P,A,j,"updated")},te)},F=(A,P,j,te,X,ie,pe)=>{for(let E=0;E{if(P!==j){if(P!==st)for(const ie in P)!ds(ie)&&!(ie in j)&&s(A,ie,P[ie],null,X,te);for(const ie in j){if(ds(ie))continue;const pe=j[ie],E=P[ie];pe!==E&&ie!=="value"&&s(A,ie,E,pe,X,te)}"value"in j&&s(A,"value",P.value,j.value,X)}},U=(A,P,j,te,X,ie,pe,E,T)=>{const R=P.el=A?A.el:a(""),Q=P.anchor=A?A.anchor:a("");let{patchFlag:de,dynamicChildren:se,slotScopeIds:H}=P;H&&(E=E?E.concat(H):H),A==null?(r(R,j,te),r(Q,j,te),D(P.children||[],j,Q,X,ie,pe,E,T)):de>0&&de&64&&se&&A.dynamicChildren?(F(A.dynamicChildren,se,j,X,ie,pe,E),(P.key!=null||X&&P===X.subTree)&&Ad(A,P,!0)):ce(A,P,j,Q,X,ie,pe,E,T)},W=(A,P,j,te,X,ie,pe,E,T)=>{P.slotScopeIds=E,A==null?P.shapeFlag&512?X.ctx.activate(P,j,te,pe,T):ne(P,j,te,X,ie,pe,T):me(A,P,T)},ne=(A,P,j,te,X,ie,pe)=>{const E=A.component=sg(A,te,X);if(Di(A)&&(E.ctx.renderer=ge),ag(E,!1,pe),E.asyncDep){if(X&&X.registerDep(E,K,pe),!A.el){const T=E.subTree=b(Mt);k(null,T,P,j)}}else K(E,A,P,j,X,ie,pe)},me=(A,P,j)=>{const te=P.component=A.component;if(Cb(A,P,j))if(te.asyncDep&&!te.asyncResolved){re(te,P,j);return}else te.next=P,kv(te.update),te.effect.dirty=!0,te.update();else P.el=A.el,te.vnode=P},K=(A,P,j,te,X,ie,pe)=>{const E=()=>{if(A.isMounted){let{next:Q,bu:de,u:se,parent:H,vnode:Z}=A;{const oe=B_(A);if(oe){Q&&(Q.el=Z.el,re(A,Q,pe)),oe.asyncDep.then(()=>{A.isUnmounted||E()});return}}let Se=Q,M;_o(A,!1),Q?(Q.el=Z.el,re(A,Q,pe)):Q=Z,de&&ms(de),(M=Q.props&&Q.props.onVnodeBeforeUpdate)&&cn(M,H,Q,Z),_o(A,!0);const V=Ea(A),G=A.subTree;A.subTree=V,g(G,V,d(G.el),Y(G),A,X,ie),Q.el=V.el,Se===null&&Od(A,V.el),se&&Ut(se,X),(M=Q.props&&Q.props.onVnodeUpdated)&&Ut(()=>cn(M,H,Q,Z),X)}else{let Q;const{el:de,props:se}=P,{bm:H,m:Z,parent:Se}=A,M=Ao(P);if(_o(A,!1),H&&ms(H),!M&&(Q=se&&se.onVnodeBeforeMount)&&cn(Q,Se,P),_o(A,!0),de&&Ge){const V=()=>{A.subTree=Ea(A),Ge(de,A.subTree,A,X,null)};M?P.type.__asyncLoader().then(()=>!A.isUnmounted&&V()):V()}else{const V=A.subTree=Ea(A);g(null,V,j,te,A,X,ie),P.el=V.el}if(Z&&Ut(Z,X),!M&&(Q=se&&se.onVnodeMounted)){const V=P;Ut(()=>cn(Q,Se,V),X)}(P.shapeFlag&256||Se&&Ao(Se.vnode)&&Se.vnode.shapeFlag&256)&&A.a&&Ut(A.a,X),A.isMounted=!0,P=j=te=null}},T=A.effect=new ys(E,fn,()=>$l(R),A.scope),R=A.update=()=>{T.dirty&&T.run()};R.i=A,R.id=A.uid,_o(A,!0),R()},re=(A,P,j)=>{P.component=A;const te=A.vnode.props;A.vnode=P,A.next=null,ob(A,P.props,te,j),lb(A,P.children,j),uo(),xm(A),mo()},ce=(A,P,j,te,X,ie,pe,E,T=!1)=>{const R=A&&A.children,Q=A?A.shapeFlag:0,de=P.children,{patchFlag:se,shapeFlag:H}=P;if(se>0){if(se&128){it(R,de,j,te,X,ie,pe,E,T);return}else if(se&256){Ne(R,de,j,te,X,ie,pe,E,T);return}}H&8?(Q&16&&We(R,X,ie),de!==R&&m(j,de)):Q&16?H&16?it(R,de,j,te,X,ie,pe,E,T):We(R,X,ie,!0):(Q&8&&m(j,""),H&16&&D(de,j,te,X,ie,pe,E,T))},Ne=(A,P,j,te,X,ie,pe,E,T)=>{A=A||cs,P=P||cs;const R=A.length,Q=P.length,de=Math.min(R,Q);let se;for(se=0;seQ?We(A,X,ie,!0,!1,de):D(P,j,te,X,ie,pe,E,T,de)},it=(A,P,j,te,X,ie,pe,E,T)=>{let R=0;const Q=P.length;let de=A.length-1,se=Q-1;for(;R<=de&&R<=se;){const H=A[R],Z=P[R]=T?Kr(P[R]):un(P[R]);if(Yn(H,Z))g(H,Z,j,null,X,ie,pe,E,T);else break;R++}for(;R<=de&&R<=se;){const H=A[de],Z=P[se]=T?Kr(P[se]):un(P[se]);if(Yn(H,Z))g(H,Z,j,null,X,ie,pe,E,T);else break;de--,se--}if(R>de){if(R<=se){const H=se+1,Z=Hse)for(;R<=de;)He(A[R],X,ie,!0),R++;else{const H=R,Z=R,Se=new Map;for(R=Z;R<=se;R++){const Re=P[R]=T?Kr(P[R]):un(P[R]);Re.key!=null&&Se.set(Re.key,R)}let M,V=0;const G=se-Z+1;let oe=!1,ye=0;const $e=new Array(G);for(R=0;R=G){He(Re,X,ie,!0);continue}let nt;if(Re.key!=null)nt=Se.get(Re.key);else for(M=Z;M<=se;M++)if($e[M-Z]===0&&Yn(Re,P[M])){nt=M;break}nt===void 0?He(Re,X,ie,!0):($e[nt-Z]=R+1,nt>=ye?ye=nt:oe=!0,g(Re,P[nt],j,null,X,ie,pe,E,T),V++)}const Me=oe?hb($e):cs;for(M=Me.length-1,R=G-1;R>=0;R--){const Re=Z+R,nt=P[Re],Pe=Re+1{const{el:ie,type:pe,transition:E,children:T,shapeFlag:R}=A;if(R&6){Ve(A.component.subTree,P,j,te);return}if(R&128){A.suspense.move(P,j,te);return}if(R&64){pe.move(A,P,j,ge);return}if(pe===ve){r(ie,P,j);for(let de=0;deE.enter(ie),X);else{const{leave:de,delayLeave:se,afterLeave:H}=E,Z=()=>r(ie,P,j),Se=()=>{de(ie,()=>{Z(),H&&H()})};se?se(ie,Z,Se):Se()}else r(ie,P,j)},He=(A,P,j,te=!1,X=!1)=>{const{type:ie,props:pe,ref:E,children:T,dynamicChildren:R,shapeFlag:Q,patchFlag:de,dirs:se,cacheIndex:H}=A;if(de===-2&&(X=!1),E!=null&&Ka(E,null,j,A,!0),H!=null&&(P.renderCache[H]=void 0),Q&256){P.ctx.deactivate(A);return}const Z=Q&1&&se,Se=!Ao(A);let M;if(Se&&(M=pe&&pe.onVnodeBeforeUnmount)&&cn(M,P,A),Q&6)ut(A.component,j,te);else{if(Q&128){A.suspense.unmount(j,te);return}Z&&cr(A,null,P,"beforeUnmount"),Q&64?A.type.remove(A,P,j,ge,te):R&&!R.hasOnce&&(ie!==ve||de>0&&de&64)?We(R,P,j,!1,!0):(ie===ve&&de&384||!X&&Q&16)&&We(T,P,j),te&&at(A)}(Se&&(M=pe&&pe.onVnodeUnmounted)||Z)&&Ut(()=>{M&&cn(M,P,A),Z&&cr(A,null,P,"unmounted")},j)},at=A=>{const{type:P,el:j,anchor:te,transition:X}=A;if(P===ve){lt(j,te);return}if(P===Po){v(A);return}const ie=()=>{o(j),X&&!X.persisted&&X.afterLeave&&X.afterLeave()};if(A.shapeFlag&1&&X&&!X.persisted){const{leave:pe,delayLeave:E}=X,T=()=>pe(j,ie);E?E(A.el,ie,T):T()}else ie()},lt=(A,P)=>{let j;for(;A!==P;)j=f(A),o(A),A=j;o(P)},ut=(A,P,j)=>{const{bum:te,scope:X,update:ie,subTree:pe,um:E,m:T,a:R}=A;Za(T),Za(R),te&&ms(te),X.stop(),ie&&(ie.active=!1,He(pe,A,P,j)),E&&Ut(E,P),Ut(()=>{A.isUnmounted=!0},P),P&&P.pendingBranch&&!P.isUnmounted&&A.asyncDep&&!A.asyncResolved&&A.suspenseId===P.pendingId&&(P.deps--,P.deps===0&&P.resolve())},We=(A,P,j,te=!1,X=!1,ie=0)=>{for(let pe=ie;pe{if(A.shapeFlag&6)return Y(A.component.subTree);if(A.shapeFlag&128)return A.suspense.next();const P=f(A.anchor||A.el),j=P&&P[R_];return j?f(j):P};let fe=!1;const le=(A,P,j)=>{A==null?P._vnode&&He(P._vnode,null,null,!0):g(P._vnode||null,A,P,null,null,null,j),P._vnode=A,fe||(fe=!0,xm(),qa(),fe=!1)},ge={p:g,um:He,m:Ve,r:at,mt:ne,mc:D,pc:ce,pbc:F,n:Y,o:e};let Ue,Ge;return t&&([Ue,Ge]=t(ge)),{render:le,hydrate:Ue,createApp:nb(le,Ue)}}function pc({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function _o({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function j_(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ad(e,t,n=!1){const r=e.children,o=t.children;if(ze(r)&&ze(o))for(let s=0;s>1,e[n[a]]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}function B_(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:B_(t)}function Za(e){if(e)for(let t=0;tNn(W_);function G_(e,t){return Mi(e,null,t)}function K_(e,t){return Mi(e,null,{flush:"post"})}function Z_(e,t){return Mi(e,null,{flush:"sync"})}const aa={};function Dn(e,t,n){return Mi(e,t,n)}function Mi(e,t,{immediate:n,deep:r,flush:o,once:s,onTrack:i,onTrigger:a}=st){if(t&&s){const C=t;t=(...L)=>{C(...L),S()}}const l=Ft,u=C=>r===!0?C:Jr(C,r===!1?1:void 0);let m,d=!1,f=!1;if(Ot(e)?(m=()=>e.value,d=No(e)):Er(e)?(m=()=>u(e),d=!0):ze(e)?(f=!0,d=e.some(C=>Er(C)||No(C)),m=()=>e.map(C=>{if(Ot(C))return C.value;if(Er(C))return u(C);if(Oe(C))return $r(C,l,2)})):Oe(e)?t?m=()=>$r(e,l,2):m=()=>(p&&p(),kn(e,l,3,[h])):m=fn,t&&r){const C=m;m=()=>Jr(C())}let p,h=C=>{p=_.onStop=()=>{$r(C,l,4),p=_.onStop=void 0}},g;if(Fi)if(h=fn,t?n&&kn(t,l,3,[m(),f?[]:void 0,h]):m(),o==="sync"){const C=q_();g=C.__watcherHandles||(C.__watcherHandles=[])}else return fn;let z=f?new Array(e.length).fill(aa):aa;const k=()=>{if(!(!_.active||!_.dirty))if(t){const C=_.run();(r||d||(f?C.some((L,D)=>nn(L,z[D])):nn(C,z)))&&(p&&p(),kn(t,l,3,[C,z===aa?void 0:f&&z[0]===aa?[]:z,h]),z=C)}else _.run()};k.allowRecurse=!!t;let w;o==="sync"?w=k:o==="post"?w=()=>Ut(k,l&&l.suspense):(k.pre=!0,l&&(k.id=l.uid),w=()=>$l(k));const _=new ys(m,fn,w),v=ld(),S=()=>{_.stop(),v&&od(v.effects,_)};return t?n?k():z=_.run():o==="post"?Ut(_.run.bind(_),l&&l.suspense):_.run(),g&&g.push(S),S}function _b(e,t,n){const r=this.proxy,o=bt(e)?e.includes(".")?Y_(r,e):()=>r[e]:e.bind(r,r);let s;Oe(t)?s=t:(s=t.handler,n=t);const i=Ro(this),a=Mi(o,s.bind(r),n);return i(),a}function Y_(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Jr(r,t,n)});else if(Dh(e)){for(const r in e)Jr(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Jr(e[r],t,n)}return e}function gb(e,t,n=st){const r=Un(),o=Xt(t),s=mn(t),i=X_(e,t),a=s_((l,u)=>{let m,d=st,f;return Z_(()=>{const p=e[t];nn(m,p)&&(m=p,u())}),{get(){return l(),n.get?n.get(m):m},set(p){const h=n.set?n.set(p):p;if(!nn(h,m)&&!(d!==st&&nn(p,d)))return;const g=r.vnode.props;g&&(t in g||o in g||s in g)&&(`onUpdate:${t}`in g||`onUpdate:${o}`in g||`onUpdate:${s}`in g)||(m=p,u()),r.emit(`update:${t}`,h),nn(p,h)&&nn(p,d)&&!nn(h,f)&&u(),d=p,f=h}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?i||st:a,done:!1}:{done:!0}}}},a}const X_=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Xt(t)}Modifiers`]||e[`${mn(t)}Modifiers`];function yb(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||st;let o=n;const s=t.startsWith("update:"),i=s&&X_(r,t.slice(7));i&&(i.trim&&(o=n.map(m=>bt(m)?m.trim():m)),i.number&&(o=n.map(Ua)));let a,l=r[a=ri(t)]||r[a=ri(Xt(t))];!l&&s&&(l=r[a=ri(mn(t))]),l&&kn(l,e,6,o);const u=r[a+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,kn(u,e,6,o)}}function J_(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!Oe(e)){const l=u=>{const m=J_(u,t,!0);m&&(a=!0,kt(i,m))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(ft(e)&&r.set(e,null),null):(ze(s)?s.forEach(l=>i[l]=null):kt(i,s),ft(e)&&r.set(e,i),i)}function Nl(e,t){return!e||!Li(t)?!1:(t=t.slice(2).replace(/Once$/,""),tt(e,t[0].toLowerCase()+t.slice(1))||tt(e,mn(t))||tt(e,t))}function Ea(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:i,attrs:a,emit:l,render:u,renderCache:m,props:d,data:f,setupState:p,ctx:h,inheritAttrs:g}=e,z=Ci(e);let k,w;try{if(n.shapeFlag&4){const v=o||r,S=v;k=un(u.call(S,v,m,d,p,f,h)),w=a}else{const v=t;k=un(v.length>1?v(d,{attrs:a,slots:i,emit:l}):v(d,null)),w=t.props?a:vb(a)}}catch(v){ai.length=0,Ho(v,e,1),k=b(Mt)}let _=k;if(w&&g!==!1){const v=Object.keys(w),{shapeFlag:S}=_;v.length&&S&7&&(s&&v.some(rd)&&(w=bb(w,s)),_=_r(_,w,!1,!0))}return n.dirs&&(_=_r(_,null,!1,!0),_.dirs=_.dirs?_.dirs.concat(n.dirs):n.dirs),n.transition&&(_.transition=n.transition),k=_,Ci(z),k}function zb(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||Li(n))&&((t||(t={}))[n]=e[n]);return t},bb=(e,t)=>{const n={};for(const r in e)(!rd(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Cb(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?Dm(r,i,u):!!i;if(l&8){const m=t.dynamicProps;for(let d=0;de.__isSuspense;let mu=0;const wb={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,s,i,a,l,u){if(e==null)Sb(t,n,r,o,s,i,a,l,u);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}xb(e,t,n,r,o,i,a,l,u)}},hydrate:Eb,normalize:$b},kb=wb;function ki(e,t){const n=e.props&&e.props[t];Oe(n)&&n()}function Sb(e,t,n,r,o,s,i,a,l){const{p:u,o:{createElement:m}}=l,d=m("div"),f=e.suspense=Q_(e,o,r,t,d,n,s,i,a,l);u(null,f.pendingBranch=e.ssContent,d,null,r,f,s,i),f.deps>0?(ki(e,"onPending"),ki(e,"onFallback"),u(null,e.ssFallback,t,n,r,null,s,i),hs(f,e.ssFallback)):f.resolve(!1,!0)}function xb(e,t,n,r,o,s,i,a,{p:l,um:u,o:{createElement:m}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,p=t.ssFallback,{activeBranch:h,pendingBranch:g,isInFallback:z,isHydrating:k}=d;if(g)d.pendingBranch=f,Yn(f,g)?(l(g,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():z&&(k||(l(h,p,n,r,o,null,s,i,a),hs(d,p)))):(d.pendingId=mu++,k?(d.isHydrating=!1,d.activeBranch=g):u(g,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=m("div"),z?(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():(l(h,p,n,r,o,null,s,i,a),hs(d,p))):h&&Yn(f,h)?(l(h,f,n,r,o,d,s,i,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0&&d.resolve()));else if(h&&Yn(f,h))l(h,f,n,r,o,d,s,i,a),hs(d,f);else if(ki(t,"onPending"),d.pendingBranch=f,f.shapeFlag&512?d.pendingId=f.component.suspenseId:d.pendingId=mu++,l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0)d.resolve();else{const{timeout:w,pendingId:_}=d;w>0?setTimeout(()=>{d.pendingId===_&&d.fallback(p)},w):w===0&&d.fallback(p)}}function Q_(e,t,n,r,o,s,i,a,l,u,m=!1){const{p:d,m:f,um:p,n:h,o:{parentNode:g,remove:z}}=u;let k;const w=Tb(e);w&&t&&t.pendingBranch&&(k=t.pendingId,t.deps++);const _=e.props?ja(e.props.timeout):void 0,v=s,S={vnode:e,parent:t,parentComponent:n,namespace:i,container:r,hiddenContainer:o,deps:0,pendingId:mu++,timeout:typeof _=="number"?_:-1,activeBranch:null,pendingBranch:null,isInFallback:!m,isHydrating:m,isUnmounted:!1,effects:[],resolve(C=!1,L=!1){const{vnode:D,activeBranch:$,pendingBranch:F,pendingId:q,effects:U,parentComponent:W,container:ne}=S;let me=!1;S.isHydrating?S.isHydrating=!1:C||(me=$&&F.transition&&F.transition.mode==="out-in",me&&($.transition.afterLeave=()=>{q===S.pendingId&&(f(F,ne,s===v?h($):s,0),Wa(U))}),$&&(g($.el)!==S.hiddenContainer&&(s=h($)),p($,W,S,!0)),me||f(F,ne,s,0)),hs(S,F),S.pendingBranch=null,S.isInFallback=!1;let K=S.parent,re=!1;for(;K;){if(K.pendingBranch){K.effects.push(...U),re=!0;break}K=K.parent}!re&&!me&&Wa(U),S.effects=[],w&&t&&t.pendingBranch&&k===t.pendingId&&(t.deps--,t.deps===0&&!L&&t.resolve()),ki(D,"onResolve")},fallback(C){if(!S.pendingBranch)return;const{vnode:L,activeBranch:D,parentComponent:$,container:F,namespace:q}=S;ki(L,"onFallback");const U=h(D),W=()=>{S.isInFallback&&(d(null,C,F,U,$,null,q,a,l),hs(S,C))},ne=C.transition&&C.transition.mode==="out-in";ne&&(D.transition.afterLeave=W),S.isInFallback=!0,p(D,$,null,!0),ne||W()},move(C,L,D){S.activeBranch&&f(S.activeBranch,C,L,D),S.container=C},next(){return S.activeBranch&&h(S.activeBranch)},registerDep(C,L,D){const $=!!S.pendingBranch;$&&S.deps++;const F=C.vnode.el;C.asyncDep.catch(q=>{Ho(q,C,0)}).then(q=>{if(C.isUnmounted||S.isUnmounted||S.pendingId!==C.suspenseId)return;C.asyncResolved=!0;const{vnode:U}=C;_u(C,q,!1),F&&(U.el=F);const W=!F&&C.subTree.el;L(C,U,g(F||C.subTree.el),F?null:h(C.subTree),S,i,D),W&&z(W),Od(C,U.el),$&&--S.deps===0&&S.resolve()})},unmount(C,L){S.isUnmounted=!0,S.activeBranch&&p(S.activeBranch,n,C,L),S.pendingBranch&&p(S.pendingBranch,n,C,L)}};return S}function Eb(e,t,n,r,o,s,i,a,l){const u=t.suspense=Q_(t,r,n,e.parentNode,document.createElement("div"),null,o,s,i,a,!0),m=l(e,u.pendingBranch=t.ssContent,n,u,s,i);return u.deps===0&&u.resolve(!1,!0),m}function $b(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=Rm(r?n.default:n),e.ssFallback=r?Rm(n.fallback):b(Mt)}function Rm(e){let t;if(Oe(e)){const n=Do&&e._c;n&&(e._d=!1,x()),e=e(),n&&(e._d=!0,t=Yt,tg())}return ze(e)&&(e=zb(e)),e=un(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function eg(e,t){t&&t.pendingBranch?ze(e)?t.effects.push(...e):t.effects.push(e):Wa(e)}function hs(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;for(;!o&&t.component;)t=t.component.subTree,o=t.el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,Od(r,o))}function Tb(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const ve=Symbol.for("v-fgt"),Tr=Symbol.for("v-txt"),Mt=Symbol.for("v-cmt"),Po=Symbol.for("v-stc"),ai=[];let Yt=null;function x(e=!1){ai.push(Yt=e?null:[])}function tg(){ai.pop(),Yt=ai[ai.length-1]||null}let Do=1;function fu(e){Do+=e,e<0&&Yt&&(Yt.hasOnce=!0)}function ng(e){return e.dynamicChildren=Do>0?Yt||cs:null,tg(),Do>0&&Yt&&Yt.push(e),e}function I(e,t,n,r,o,s){return ng(c(e,t,n,r,o,s,!0))}function we(e,t,n,r,o){return ng(b(e,t,n,r,o,!0))}function ao(e){return e?e.__v_isVNode===!0:!1}function Yn(e,t){return e.type===t.type&&e.key===t.key}function Ab(e){}const rg=({key:e})=>e??null,$a=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?bt(e)||Ot(e)||Oe(e)?{i:Vt,r:e,k:t,f:!!n}:e:null);function c(e,t=null,n=null,r=0,o=null,s=e===ve?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&rg(t),ref:t&&$a(t),scopeId:Tl,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Vt};return a?(Pd(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=bt(n)?8:16),Do>0&&!i&&Yt&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&Yt.push(l),l}const b=Ob;function Ob(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===w_)&&(e=Mt),ao(e)){const a=_r(e,t,!0);return n&&Pd(a,n),Do>0&&!s&&Yt&&(a.shapeFlag&6?Yt[Yt.indexOf(e)]=a:Yt.push(a)),a.patchFlag=-2,a}if(Fb(e)&&(e=e.__vccOpts),t){t=og(t);let{class:a,style:l}=t;a&&!bt(a)&&(t.class=ke(a)),ft(l)&&(pd(l)&&!ze(l)&&(l=kt({},l)),t.style=co(l))}const i=bt(e)?1:du(e)?128:cb(e)?64:ft(e)?4:Oe(e)?2:0;return c(e,t,n,r,o,i,s,!0)}function og(e){return e?pd(e)||A_(e)?kt({},e):e:null}function _r(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:i,children:a,transition:l}=e,u=t?is(o||{},t):o,m={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&rg(u),ref:t&&t.ref?n&&s?ze(s)?s.concat($a(t)):[s,$a(t)]:$a(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ve?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&_r(e.ssContent),ssFallback:e.ssFallback&&_r(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&io(m,l.clone(m)),m}function Dt(e=" ",t=0){return b(Tr,null,e,t)}function Pb(e,t){const n=b(Po,null,e);return n.staticCount=t,n}function ee(e="",t=!1){return t?(x(),we(Mt,null,e)):b(Mt,null,e)}function un(e){return e==null||typeof e=="boolean"?b(Mt):ze(e)?b(ve,null,e.slice()):typeof e=="object"?Kr(e):b(Tr,null,String(e))}function Kr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:_r(e)}function Pd(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ze(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Pd(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!A_(t)?t._ctx=Vt:o===3&&Vt&&(Vt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Oe(t)?(t={default:t,_ctx:Vt},n=32):(t=String(t),r&64?(n=16,t=[Dt(t)]):n=8);e.children=t,e.shapeFlag|=n}function is(...e){const t={};for(let n=0;nFt||Vt;let Ya,pu;{const e=Mh(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(i=>i(s)):o[0](s)}};Ya=t("__VUE_INSTANCE_SETTERS__",n=>Ft=n),pu=t("__VUE_SSR_SETTERS__",n=>Fi=n)}const Ro=e=>{const t=Ft;return Ya(e),e.scope.on(),()=>{e.scope.off(),Ya(t)}},hu=()=>{Ft&&Ft.scope.off(),Ya(null)};function ig(e){return e.vnode.shapeFlag&4}let Fi=!1;function ag(e,t=!1,n=!1){t&&pu(t);const{props:r,children:o}=e.vnode,s=ig(e);rb(e,r,s,t),ab(e,o,n);const i=s?Nb(e,t):void 0;return t&&pu(!1),i}function Nb(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,iu);const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?cg(e):null,s=Ro(e);uo();const i=$r(r,e,0,[e.props,o]);if(mo(),s(),sd(i)){if(i.then(hu,hu),t)return i.then(a=>{_u(e,a,t)}).catch(a=>{Ho(a,e,0)});e.asyncDep=i}else _u(e,i,t)}else lg(e,t)}function _u(e,t,n){Oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ft(t)&&(e.setupState=yd(t)),lg(e,n)}let Xa,gu;function Db(e){Xa=e,gu=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,Dv))}}const Rb=()=>!Xa;function lg(e,t,n){const r=e.type;if(!e.render){if(!t&&Xa&&!r.render){const o=r.template||$d(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,u=kt(kt({isCustomElement:s,delimiters:a},i),l);r.render=Xa(o,u)}}e.render=r.render||fn,gu&&gu(e)}{const o=Ro(e);uo();try{Yv(e)}finally{mo(),o()}}}const Mb={get(e,t){return hn(e,"get",""),e[t]}};function cg(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Mb),slots:e.slots,emit:e.emit,expose:t}}function Vi(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(yd(El(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in oi)return oi[n](e)},has(t,n){return n in t||n in oi}})):e.proxy}function yu(e,t=!0){return Oe(e)?e.displayName||e.name:e.name||t&&e.__name}function Fb(e){return Oe(e)&&"__vccOpts"in e}const jt=(e,t)=>lv(e,t,Fi);function mr(e,t,n){const r=arguments.length;return r===2?ft(t)&&!ze(t)?ao(t)?b(e,null,[t]):b(e,t):b(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&ao(n)&&(n=[n]),b(e,t,n))}function Vb(){}function Hb(e,t,n,r){const o=n[r];if(o&&ug(o,e))return o;const s=t();return s.memo=e.slice(),s.cacheIndex=r,n[r]=s}function ug(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r0&&Yt&&Yt.push(e),!0}const dg="3.4.38",Ub=fn,jb=bv,Bb=es,Wb=d_,qb={createComponentInstance:sg,setupComponent:ag,renderComponentRoot:Ea,setCurrentRenderingInstance:Ci,isVNode:ao,normalizeVNode:un,getComponentPublicInstance:Vi,ensureValidVNode:Ed},Gb=qb,Kb=null,Zb=null,Yb=null;/** * @vue/runtime-dom v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const Jb="http://www.w3.org/2000/svg",Qb="http://www.w3.org/1998/Math/MathML",wr=typeof document<"u"?document:null,Mm=wr&&wr.createElement("template"),e0={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==="svg"?wr.createElementNS(Jb,e):t==="mathml"?wr.createElementNS(Qb,e):n?wr.createElement(e,{is:n}):wr.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>wr.createTextNode(e),createComment:e=>wr.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>wr.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{Mm.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const a=Mm.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Rr="transition",Ms="animation",vs=Symbol("_vtc"),Rt=(e,{slots:t})=>mr(p_,pg(e),t);Rt.displayName="Transition";const fg={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},t0=Rt.props=kt({},bd,fg),go=(e,t=[])=>{ze(e)?e.forEach(n=>n(...t)):e&&e(...t)},Fm=e=>e?ze(e)?e.some(t=>t.length>1):e.length>1:!1;function pg(e){const t={};for(const U in e)U in fg||(t[U]=e[U]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=i,appearToClass:m=a,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,h=n0(o),g=h&&h[0],z=h&&h[1],{onBeforeEnter:k,onEnter:w,onEnterCancelled:_,onLeave:v,onLeaveCancelled:S,onBeforeAppear:C=k,onAppear:L=w,onAppearCancelled:D=_}=t,$=(U,W,ne)=>{Br(U,W?m:a),Br(U,W?u:i),ne&&ne()},F=(U,W)=>{U._isLeaving=!1,Br(U,d),Br(U,p),Br(U,f),W&&W()},q=U=>(W,ne)=>{const me=U?L:w,K=()=>$(W,U,ne);go(me,[W,K]),Vm(()=>{Br(W,U?l:s),Cr(W,U?m:a),Fm(me)||Hm(W,r,g,K)})};return kt(t,{onBeforeEnter(U){go(k,[U]),Cr(U,s),Cr(U,i)},onBeforeAppear(U){go(C,[U]),Cr(U,l),Cr(U,u)},onEnter:q(!1),onAppear:q(!0),onLeave(U,W){U._isLeaving=!0;const ne=()=>F(U,W);Cr(U,d),Cr(U,f),_g(),Vm(()=>{U._isLeaving&&(Br(U,d),Cr(U,p),Fm(v)||Hm(U,r,z,ne))}),go(v,[U,ne])},onEnterCancelled(U){$(U,!1),go(_,[U])},onAppearCancelled(U){$(U,!0),go(D,[U])},onLeaveCancelled(U){F(U),go(S,[U])}})}function n0(e){if(e==null)return null;if(ft(e))return[hc(e.enter),hc(e.leave)];{const t=hc(e);return[t,t]}}function hc(e){return ja(e)}function Cr(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[vs]||(e[vs]=new Set)).add(t)}function Br(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[vs];n&&(n.delete(t),n.size||(e[vs]=void 0))}function Vm(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let r0=0;function Hm(e,t,n,r){const o=e._endId=++r0,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=hg(e,t);if(!i)return r();const u=i+"end";let m=0;const d=()=>{e.removeEventListener(u,f),s()},f=p=>{p.target===e&&++m>=l&&d()};setTimeout(()=>{m(n[h]||"").split(", "),o=r(`${Rr}Delay`),s=r(`${Rr}Duration`),i=Um(o,s),a=r(`${Ms}Delay`),l=r(`${Ms}Duration`),u=Um(a,l);let m=null,d=0,f=0;t===Rr?i>0&&(m=Rr,d=i,f=s.length):t===Ms?u>0&&(m=Ms,d=u,f=l.length):(d=Math.max(i,u),m=d>0?i>u?Rr:Ms:null,f=m?m===Rr?s.length:l.length:0);const p=m===Rr&&/\b(transform|all)(,|$)/.test(r(`${Rr}Property`).toString());return{type:m,timeout:d,propCount:f,hasTransform:p}}function Um(e,t){for(;e.lengthjm(n)+jm(e[r])))}function jm(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function _g(){return document.body.offsetHeight}function o0(e,t,n){const r=e[vs];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ja=Symbol("_vod"),gg=Symbol("_vsh"),Si={beforeMount(e,{value:t},{transition:n}){e[Ja]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Fs(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Fs(e,!0),r.enter(e)):r.leave(e,()=>{Fs(e,!1)}):Fs(e,t))},beforeUnmount(e,{value:t}){Fs(e,t)}};function Fs(e,t){e.style.display=t?e[Ja]:"none",e[gg]=!t}function s0(){Si.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const yg=Symbol("");function i0(e){const t=Un();if(!t)return;const n=t.ut=(o=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(s=>vu(s,o))},r=()=>{const o=e(t.proxy);zu(t.subTree,o),n(o)};Cd(()=>{Z_(r)}),As(()=>{const o=new MutationObserver(r);o.observe(t.subTree.el.parentNode,{childList:!0}),Ri(()=>o.disconnect())})}function zu(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{zu(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)vu(e.el,t);else if(e.type===ve)e.children.forEach(n=>zu(n,t));else if(e.type===Po){let{el:n,anchor:r}=e;for(;n&&(vu(n,t),n!==r);)n=n.nextSibling}}function vu(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const o in t)n.setProperty(`--${o}`,t[o]),r+=`--${o}: ${t[o]};`;n[yg]=r}}const a0=/(^|;)\s*display\s*:/;function l0(e,t,n){const r=e.style,o=bt(n);let s=!1;if(n&&!o){if(t)if(bt(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&Ta(r,a,"")}else for(const i in t)n[i]==null&&Ta(r,i,"");for(const i in n)i==="display"&&(s=!0),Ta(r,i,n[i])}else if(o){if(t!==n){const i=r[yg];i&&(n+=";"+i),r.cssText=n,s=a0.test(n)}}else t&&e.removeAttribute("style");Ja in e&&(e[Ja]=s?r.display:"",e[gg]&&(r.display="none"))}const Bm=/\s*!important$/;function Ta(e,t,n){if(ze(n))n.forEach(r=>Ta(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=c0(e,t);Bm.test(n)?e.setProperty(mn(r),n.replace(Bm,""),"important"):e[r]=n}}const Wm=["Webkit","Moz","ms"],_c={};function c0(e,t){const n=_c[t];if(n)return n;let r=Xt(t);if(r!=="filter"&&r in e)return _c[t]=r;r=Ni(r);for(let o=0;ogc||(p0.then(()=>gc=0),gc=Date.now());function _0(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;kn(g0(r,n.value),t,5,[r])};return n.value=e,n.attached=h0(),n}function g0(e,t){if(ze(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 Ym=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,y0=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?o0(e,r,i):t==="style"?l0(e,n,r):Li(t)?rd(t)||m0(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):z0(e,t,r,i))?(u0(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Gm(e,t,r,i,s,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Gm(e,t,r,i))};function z0(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ym(t)&&Oe(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;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Ym(t)&&bt(n)?!1:t in e}/*! #__NO_SIDE_EFFECTS__ */function zg(e,t,n){const r=Pr(e,t);class o extends Dl{constructor(i){super(r,i,n)}}return o.def=r,o}/*! #__NO_SIDE_EFFECTS__ */const v0=(e,t)=>zg(e,t,Tg),b0=typeof HTMLElement<"u"?HTMLElement:class{};class Dl extends b0{constructor(t,n={},r){super(),this._def=t,this._props=n,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this._ob=null,this.shadowRoot&&r?r(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,Uo(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),bu(null,this.shadowRoot),this._instance=null)})}_resolveDef(){this._resolved=!0;for(let r=0;r{for(const o of r)this._setAttr(o.attributeName)}),this._ob.observe(this,{attributes:!0});const t=(r,o=!1)=>{const{props:s,styles:i}=r;let a;if(s&&!ze(s))for(const l in s){const u=s[l];(u===Number||u&&u.type===Number)&&(l in this._props&&(this._props[l]=ja(this._props[l])),(a||(a=Object.create(null)))[Xt(l)]=!0)}this._numberProps=a,o&&this._resolveProps(r),this._applyStyles(i),this._update()},n=this._def.__asyncLoader;n?n().then(r=>t(r,!0)):t(this._def)}_resolveProps(t){const{props:n}=t,r=ze(n)?n:Object.keys(n||{});for(const o of Object.keys(this))o[0]!=="_"&&r.includes(o)&&this._setProp(o,this[o],!0,!1);for(const o of r.map(Xt))Object.defineProperty(this,o,{get(){return this._getProp(o)},set(s){this._setProp(o,s)}})}_setAttr(t){let n=this.hasAttribute(t)?this.getAttribute(t):void 0;const r=Xt(t);this._numberProps&&this._numberProps[r]&&(n=ja(n)),this._setProp(r,n,!1)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,o=!0){n!==this._props[t]&&(this._props[t]=n,o&&this._instance&&this._update(),r&&(n===!0?this.setAttribute(mn(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(mn(t),n+""):n||this.removeAttribute(mn(t))))}_update(){bu(this._createVNode(),this.shadowRoot)}_createVNode(){const t=b(this._def,kt({},this._props));return this._instance||(t.ce=n=>{this._instance=n,n.isCE=!0;const r=(s,i)=>{this.dispatchEvent(new CustomEvent(s,{detail:i}))};n.emit=(s,...i)=>{r(s,i),mn(s)!==s&&r(mn(s),i)};let o=this;for(;o=o&&(o.parentNode||o.host);)if(o instanceof Dl){n.parent=o._instance,n.provides=o._instance.provides;break}}),t}_applyStyles(t){t&&t.forEach(n=>{const r=document.createElement("style");r.textContent=n,this.shadowRoot.appendChild(r)})}}function C0(e="$style"){{const t=Un();if(!t)return st;const n=t.type.__cssModules;if(!n)return st;const r=n[e];return r||st}}const vg=new WeakMap,bg=new WeakMap,Qa=Symbol("_moveCb"),Xm=Symbol("_enterCb"),Cg={name:"TransitionGroup",props:kt({},t0,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Un(),r=vd();let o,s;return Pl(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!$0(o[0].el,n.vnode.el,i))return;o.forEach(S0),o.forEach(x0);const a=o.filter(E0);_g(),a.forEach(l=>{const u=l.el,m=u.style;Cr(u,i),m.transform=m.webkitTransform=m.transitionDuration="";const d=u[Qa]=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener("transitionend",d),u[Qa]=null,Br(u,i))};u.addEventListener("transitionend",d)})}),()=>{const i=Xe(e),a=pg(i);let l=i.tag||ve;if(o=[],s)for(let u=0;udelete e.mode;Cg.props;const k0=Cg;function S0(e){const t=e.el;t[Qa]&&t[Qa](),t[Xm]&&t[Xm]()}function x0(e){bg.set(e,e.el.getBoundingClientRect())}function E0(e){const t=vg.get(e),n=bg.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${o}px)`,s.transitionDuration="0s",e}}function $0(e,t,n){const r=e.cloneNode(),o=e[vs];o&&o.forEach(a=>{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=hg(r);return s.removeChild(r),i}const lo=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ze(t)?n=>ms(t,n):t};function T0(e){e.target.composing=!0}function Jm(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Rn=Symbol("_assign"),_n={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Rn]=lo(o);const s=r||o.props&&o.props.type==="number";kr(e,t?"change":"input",i=>{if(i.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=Ua(a)),e[Rn](a)}),n&&kr(e,"change",()=>{e.value=e.value.trim()}),t||(kr(e,"compositionstart",T0),kr(e,"compositionend",Jm),kr(e,"change",Jm))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:s}},i){if(e[Rn]=lo(i),e.composing)return;const a=(s||e.type==="number")&&!/^0\d/.test(e.value)?Ua(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===l)||(e.value=l))}},Mn={deep:!0,created(e,t,n){e[Rn]=lo(n),kr(e,"change",()=>{const r=e._modelValue,o=bs(e),s=e.checked,i=e[Rn];if(ze(r)){const a=Cl(r,o),l=a!==-1;if(s&&!l)i(r.concat(o));else if(!s&&l){const u=[...r];u.splice(a,1),i(u)}}else if(Vo(r)){const a=new Set(r);s?a.add(o):a.delete(o),i(a)}else i(wg(e,s))})},mounted:Qm,beforeUpdate(e,t,n){e[Rn]=lo(n),Qm(e,t,n)}};function Qm(e,{value:t,oldValue:n},r){e._modelValue=t,ze(t)?e.checked=Cl(t,r.props.value)>-1:Vo(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=oo(t,wg(e,!0)))}const Id={created(e,{value:t},n){e.checked=oo(t,n.props.value),e[Rn]=lo(n),kr(e,"change",()=>{e[Rn](bs(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Rn]=lo(r),t!==n&&(e.checked=oo(t,r.props.value))}},Ld={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=Vo(t);kr(e,"change",()=>{const s=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?Ua(bs(i)):bs(i));e[Rn](e.multiple?o?new Set(s):s:s[0]),e._assigning=!0,Uo(()=>{e._assigning=!1})}),e[Rn]=lo(r)},mounted(e,{value:t,modifiers:{number:n}}){ef(e,t)},beforeUpdate(e,t,n){e[Rn]=lo(n)},updated(e,{value:t,modifiers:{number:n}}){e._assigning||ef(e,t)}};function ef(e,t,n){const r=e.multiple,o=ze(t);if(!(r&&!o&&!Vo(t))){for(let s=0,i=e.options.length;sString(m)===String(l)):a.selected=Cl(t,l)>-1}else a.selected=t.has(l);else if(oo(bs(a),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!r&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function bs(e){return"_value"in e?e._value:e.value}function wg(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const kg={created(e,t,n){la(e,t,n,null,"created")},mounted(e,t,n){la(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){la(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){la(e,t,n,r,"updated")}};function Sg(e,t){switch(e){case"SELECT":return Ld;case"TEXTAREA":return _n;default:switch(t){case"checkbox":return Mn;case"radio":return Id;default:return _n}}}function la(e,t,n,r,o){const i=Sg(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}function A0(){_n.getSSRProps=({value:e})=>({value:e}),Id.getSSRProps=({value:e},t)=>{if(t.props&&oo(t.props.value,e))return{checked:!0}},Mn.getSSRProps=({value:e},t)=>{if(ze(e)){if(t.props&&Cl(e,t.props.value)>-1)return{checked:!0}}else if(Vo(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},kg.getSSRProps=(e,t)=>{if(typeof t.type!="string")return;const n=Sg(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const O0=["ctrl","shift","alt","meta"],P0={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)=>O0.some(n=>e[`${n}Key`]&&!t.includes(n))},gt=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...s)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=mn(o.key);if(t.some(i=>i===s||I0[i]===s))return e(o)})},xg=kt({patchProp:y0},e0);let li,tf=!1;function Eg(){return li||(li=H_(xg))}function $g(){return li=tf?li:U_(xg),tf=!0,li}const bu=(...e)=>{Eg().render(...e)},Tg=(...e)=>{$g().hydrate(...e)},Ag=(...e)=>{const t=Eg().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Pg(r);if(!o)return;const s=t._component;!Oe(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,Og(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t},L0=(...e)=>{const t=$g().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Pg(r);if(o)return n(o,!0,Og(o))},t};function Og(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Pg(e){return bt(e)?document.querySelector(e):e}let nf=!1;const N0=()=>{nf||(nf=!0,A0(),s0())};/** +**/const Xb="http://www.w3.org/2000/svg",Jb="http://www.w3.org/1998/Math/MathML",wr=typeof document<"u"?document:null,Mm=wr&&wr.createElement("template"),Qb={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==="svg"?wr.createElementNS(Xb,e):t==="mathml"?wr.createElementNS(Jb,e):n?wr.createElement(e,{is:n}):wr.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>wr.createTextNode(e),createComment:e=>wr.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>wr.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{Mm.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const a=Mm.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Rr="transition",Ms="animation",vs=Symbol("_vtc"),Rt=(e,{slots:t})=>mr(f_,fg(e),t);Rt.displayName="Transition";const mg={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},e0=Rt.props=kt({},bd,mg),go=(e,t=[])=>{ze(e)?e.forEach(n=>n(...t)):e&&e(...t)},Fm=e=>e?ze(e)?e.some(t=>t.length>1):e.length>1:!1;function fg(e){const t={};for(const U in e)U in mg||(t[U]=e[U]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=i,appearToClass:m=a,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,h=t0(o),g=h&&h[0],z=h&&h[1],{onBeforeEnter:k,onEnter:w,onEnterCancelled:_,onLeave:v,onLeaveCancelled:S,onBeforeAppear:C=k,onAppear:L=w,onAppearCancelled:D=_}=t,$=(U,W,ne)=>{Br(U,W?m:a),Br(U,W?u:i),ne&&ne()},F=(U,W)=>{U._isLeaving=!1,Br(U,d),Br(U,p),Br(U,f),W&&W()},q=U=>(W,ne)=>{const me=U?L:w,K=()=>$(W,U,ne);go(me,[W,K]),Vm(()=>{Br(W,U?l:s),Cr(W,U?m:a),Fm(me)||Hm(W,r,g,K)})};return kt(t,{onBeforeEnter(U){go(k,[U]),Cr(U,s),Cr(U,i)},onBeforeAppear(U){go(C,[U]),Cr(U,l),Cr(U,u)},onEnter:q(!1),onAppear:q(!0),onLeave(U,W){U._isLeaving=!0;const ne=()=>F(U,W);Cr(U,d),Cr(U,f),hg(),Vm(()=>{U._isLeaving&&(Br(U,d),Cr(U,p),Fm(v)||Hm(U,r,z,ne))}),go(v,[U,ne])},onEnterCancelled(U){$(U,!1),go(_,[U])},onAppearCancelled(U){$(U,!0),go(D,[U])},onLeaveCancelled(U){F(U),go(S,[U])}})}function t0(e){if(e==null)return null;if(ft(e))return[hc(e.enter),hc(e.leave)];{const t=hc(e);return[t,t]}}function hc(e){return ja(e)}function Cr(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[vs]||(e[vs]=new Set)).add(t)}function Br(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[vs];n&&(n.delete(t),n.size||(e[vs]=void 0))}function Vm(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let n0=0;function Hm(e,t,n,r){const o=e._endId=++n0,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=pg(e,t);if(!i)return r();const u=i+"end";let m=0;const d=()=>{e.removeEventListener(u,f),s()},f=p=>{p.target===e&&++m>=l&&d()};setTimeout(()=>{m(n[h]||"").split(", "),o=r(`${Rr}Delay`),s=r(`${Rr}Duration`),i=Um(o,s),a=r(`${Ms}Delay`),l=r(`${Ms}Duration`),u=Um(a,l);let m=null,d=0,f=0;t===Rr?i>0&&(m=Rr,d=i,f=s.length):t===Ms?u>0&&(m=Ms,d=u,f=l.length):(d=Math.max(i,u),m=d>0?i>u?Rr:Ms:null,f=m?m===Rr?s.length:l.length:0);const p=m===Rr&&/\b(transform|all)(,|$)/.test(r(`${Rr}Property`).toString());return{type:m,timeout:d,propCount:f,hasTransform:p}}function Um(e,t){for(;e.lengthjm(n)+jm(e[r])))}function jm(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function hg(){return document.body.offsetHeight}function r0(e,t,n){const r=e[vs];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ja=Symbol("_vod"),_g=Symbol("_vsh"),Si={beforeMount(e,{value:t},{transition:n}){e[Ja]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Fs(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Fs(e,!0),r.enter(e)):r.leave(e,()=>{Fs(e,!1)}):Fs(e,t))},beforeUnmount(e,{value:t}){Fs(e,t)}};function Fs(e,t){e.style.display=t?e[Ja]:"none",e[_g]=!t}function o0(){Si.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const gg=Symbol("");function s0(e){const t=Un();if(!t)return;const n=t.ut=(o=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(s=>vu(s,o))},r=()=>{const o=e(t.proxy);zu(t.subTree,o),n(o)};Cd(()=>{K_(r)}),As(()=>{const o=new MutationObserver(r);o.observe(t.subTree.el.parentNode,{childList:!0}),Ri(()=>o.disconnect())})}function zu(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{zu(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)vu(e.el,t);else if(e.type===ve)e.children.forEach(n=>zu(n,t));else if(e.type===Po){let{el:n,anchor:r}=e;for(;n&&(vu(n,t),n!==r);)n=n.nextSibling}}function vu(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const o in t)n.setProperty(`--${o}`,t[o]),r+=`--${o}: ${t[o]};`;n[gg]=r}}const i0=/(^|;)\s*display\s*:/;function a0(e,t,n){const r=e.style,o=bt(n);let s=!1;if(n&&!o){if(t)if(bt(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&Ta(r,a,"")}else for(const i in t)n[i]==null&&Ta(r,i,"");for(const i in n)i==="display"&&(s=!0),Ta(r,i,n[i])}else if(o){if(t!==n){const i=r[gg];i&&(n+=";"+i),r.cssText=n,s=i0.test(n)}}else t&&e.removeAttribute("style");Ja in e&&(e[Ja]=s?r.display:"",e[_g]&&(r.display="none"))}const Bm=/\s*!important$/;function Ta(e,t,n){if(ze(n))n.forEach(r=>Ta(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=l0(e,t);Bm.test(n)?e.setProperty(mn(r),n.replace(Bm,""),"important"):e[r]=n}}const Wm=["Webkit","Moz","ms"],_c={};function l0(e,t){const n=_c[t];if(n)return n;let r=Xt(t);if(r!=="filter"&&r in e)return _c[t]=r;r=Ni(r);for(let o=0;ogc||(f0.then(()=>gc=0),gc=Date.now());function h0(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;kn(_0(r,n.value),t,5,[r])};return n.value=e,n.attached=p0(),n}function _0(e,t){if(ze(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 Ym=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,g0=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?r0(e,r,i):t==="style"?a0(e,n,r):Li(t)?rd(t)||d0(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):y0(e,t,r,i))?(c0(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Gm(e,t,r,i,s,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Gm(e,t,r,i))};function y0(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ym(t)&&Oe(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;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Ym(t)&&bt(n)?!1:t in e}/*! #__NO_SIDE_EFFECTS__ */function yg(e,t,n){const r=Pr(e,t);class o extends Dl{constructor(i){super(r,i,n)}}return o.def=r,o}/*! #__NO_SIDE_EFFECTS__ */const z0=(e,t)=>yg(e,t,$g),v0=typeof HTMLElement<"u"?HTMLElement:class{};class Dl extends v0{constructor(t,n={},r){super(),this._def=t,this._props=n,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this._ob=null,this.shadowRoot&&r?r(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,Uo(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),bu(null,this.shadowRoot),this._instance=null)})}_resolveDef(){this._resolved=!0;for(let r=0;r{for(const o of r)this._setAttr(o.attributeName)}),this._ob.observe(this,{attributes:!0});const t=(r,o=!1)=>{const{props:s,styles:i}=r;let a;if(s&&!ze(s))for(const l in s){const u=s[l];(u===Number||u&&u.type===Number)&&(l in this._props&&(this._props[l]=ja(this._props[l])),(a||(a=Object.create(null)))[Xt(l)]=!0)}this._numberProps=a,o&&this._resolveProps(r),this._applyStyles(i),this._update()},n=this._def.__asyncLoader;n?n().then(r=>t(r,!0)):t(this._def)}_resolveProps(t){const{props:n}=t,r=ze(n)?n:Object.keys(n||{});for(const o of Object.keys(this))o[0]!=="_"&&r.includes(o)&&this._setProp(o,this[o],!0,!1);for(const o of r.map(Xt))Object.defineProperty(this,o,{get(){return this._getProp(o)},set(s){this._setProp(o,s)}})}_setAttr(t){let n=this.hasAttribute(t)?this.getAttribute(t):void 0;const r=Xt(t);this._numberProps&&this._numberProps[r]&&(n=ja(n)),this._setProp(r,n,!1)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,o=!0){n!==this._props[t]&&(this._props[t]=n,o&&this._instance&&this._update(),r&&(n===!0?this.setAttribute(mn(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(mn(t),n+""):n||this.removeAttribute(mn(t))))}_update(){bu(this._createVNode(),this.shadowRoot)}_createVNode(){const t=b(this._def,kt({},this._props));return this._instance||(t.ce=n=>{this._instance=n,n.isCE=!0;const r=(s,i)=>{this.dispatchEvent(new CustomEvent(s,{detail:i}))};n.emit=(s,...i)=>{r(s,i),mn(s)!==s&&r(mn(s),i)};let o=this;for(;o=o&&(o.parentNode||o.host);)if(o instanceof Dl){n.parent=o._instance,n.provides=o._instance.provides;break}}),t}_applyStyles(t){t&&t.forEach(n=>{const r=document.createElement("style");r.textContent=n,this.shadowRoot.appendChild(r)})}}function b0(e="$style"){{const t=Un();if(!t)return st;const n=t.type.__cssModules;if(!n)return st;const r=n[e];return r||st}}const zg=new WeakMap,vg=new WeakMap,Qa=Symbol("_moveCb"),Xm=Symbol("_enterCb"),bg={name:"TransitionGroup",props:kt({},e0,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Un(),r=vd();let o,s;return Pl(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!E0(o[0].el,n.vnode.el,i))return;o.forEach(k0),o.forEach(S0);const a=o.filter(x0);hg(),a.forEach(l=>{const u=l.el,m=u.style;Cr(u,i),m.transform=m.webkitTransform=m.transitionDuration="";const d=u[Qa]=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener("transitionend",d),u[Qa]=null,Br(u,i))};u.addEventListener("transitionend",d)})}),()=>{const i=Xe(e),a=fg(i);let l=i.tag||ve;if(o=[],s)for(let u=0;udelete e.mode;bg.props;const w0=bg;function k0(e){const t=e.el;t[Qa]&&t[Qa](),t[Xm]&&t[Xm]()}function S0(e){vg.set(e,e.el.getBoundingClientRect())}function x0(e){const t=zg.get(e),n=vg.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${o}px)`,s.transitionDuration="0s",e}}function E0(e,t,n){const r=e.cloneNode(),o=e[vs];o&&o.forEach(a=>{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=pg(r);return s.removeChild(r),i}const lo=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ze(t)?n=>ms(t,n):t};function $0(e){e.target.composing=!0}function Jm(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Rn=Symbol("_assign"),_n={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Rn]=lo(o);const s=r||o.props&&o.props.type==="number";kr(e,t?"change":"input",i=>{if(i.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=Ua(a)),e[Rn](a)}),n&&kr(e,"change",()=>{e.value=e.value.trim()}),t||(kr(e,"compositionstart",$0),kr(e,"compositionend",Jm),kr(e,"change",Jm))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:s}},i){if(e[Rn]=lo(i),e.composing)return;const a=(s||e.type==="number")&&!/^0\d/.test(e.value)?Ua(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===l)||(e.value=l))}},Mn={deep:!0,created(e,t,n){e[Rn]=lo(n),kr(e,"change",()=>{const r=e._modelValue,o=bs(e),s=e.checked,i=e[Rn];if(ze(r)){const a=Cl(r,o),l=a!==-1;if(s&&!l)i(r.concat(o));else if(!s&&l){const u=[...r];u.splice(a,1),i(u)}}else if(Vo(r)){const a=new Set(r);s?a.add(o):a.delete(o),i(a)}else i(Cg(e,s))})},mounted:Qm,beforeUpdate(e,t,n){e[Rn]=lo(n),Qm(e,t,n)}};function Qm(e,{value:t,oldValue:n},r){e._modelValue=t,ze(t)?e.checked=Cl(t,r.props.value)>-1:Vo(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=oo(t,Cg(e,!0)))}const Id={created(e,{value:t},n){e.checked=oo(t,n.props.value),e[Rn]=lo(n),kr(e,"change",()=>{e[Rn](bs(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Rn]=lo(r),t!==n&&(e.checked=oo(t,r.props.value))}},Ld={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=Vo(t);kr(e,"change",()=>{const s=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?Ua(bs(i)):bs(i));e[Rn](e.multiple?o?new Set(s):s:s[0]),e._assigning=!0,Uo(()=>{e._assigning=!1})}),e[Rn]=lo(r)},mounted(e,{value:t,modifiers:{number:n}}){ef(e,t)},beforeUpdate(e,t,n){e[Rn]=lo(n)},updated(e,{value:t,modifiers:{number:n}}){e._assigning||ef(e,t)}};function ef(e,t,n){const r=e.multiple,o=ze(t);if(!(r&&!o&&!Vo(t))){for(let s=0,i=e.options.length;sString(m)===String(l)):a.selected=Cl(t,l)>-1}else a.selected=t.has(l);else if(oo(bs(a),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!r&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function bs(e){return"_value"in e?e._value:e.value}function Cg(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const wg={created(e,t,n){la(e,t,n,null,"created")},mounted(e,t,n){la(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){la(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){la(e,t,n,r,"updated")}};function kg(e,t){switch(e){case"SELECT":return Ld;case"TEXTAREA":return _n;default:switch(t){case"checkbox":return Mn;case"radio":return Id;default:return _n}}}function la(e,t,n,r,o){const i=kg(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}function T0(){_n.getSSRProps=({value:e})=>({value:e}),Id.getSSRProps=({value:e},t)=>{if(t.props&&oo(t.props.value,e))return{checked:!0}},Mn.getSSRProps=({value:e},t)=>{if(ze(e)){if(t.props&&Cl(e,t.props.value)>-1)return{checked:!0}}else if(Vo(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},wg.getSSRProps=(e,t)=>{if(typeof t.type!="string")return;const n=kg(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const A0=["ctrl","shift","alt","meta"],O0={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)=>A0.some(n=>e[`${n}Key`]&&!t.includes(n))},gt=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...s)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=mn(o.key);if(t.some(i=>i===s||P0[i]===s))return e(o)})},Sg=kt({patchProp:g0},Qb);let li,tf=!1;function xg(){return li||(li=V_(Sg))}function Eg(){return li=tf?li:H_(Sg),tf=!0,li}const bu=(...e)=>{xg().render(...e)},$g=(...e)=>{Eg().hydrate(...e)},Tg=(...e)=>{const t=xg().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Og(r);if(!o)return;const s=t._component;!Oe(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,Ag(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t},I0=(...e)=>{const t=Eg().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Og(r);if(o)return n(o,!0,Ag(o))},t};function Ag(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Og(e){return bt(e)?document.querySelector(e):e}let nf=!1;const L0=()=>{nf||(nf=!0,T0(),o0())};/** * vue v3.4.38 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const D0=()=>{},R0=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:p_,BaseTransitionPropsValidators:bd,Comment:Mt,DeprecationTypes:Xb,EffectScope:ad,ErrorCodes:bv,ErrorTypeStrings:Bb,Fragment:ve,KeepAlive:Iv,ReactiveEffect:ys,Static:Po,Suspense:Sb,Teleport:Hn,Text:Tr,TrackOpTypes:yv,Transition:Rt,TransitionGroup:k0,TriggerOpTypes:zv,VueElement:Dl,assertNumber:vv,callWithAsyncErrorHandling:kn,callWithErrorHandling:$r,camelize:Xt,capitalize:Ni,cloneVNode:_r,compatUtils:Yb,compile:D0,computed:jt,createApp:Ag,createBlock:we,createCommentVNode:ee,createElementBlock:I,createElementVNode:c,createHydrationRenderer:U_,createPropsRestProxy:Zv,createRenderer:H_,createSSRApp:L0,createSlots:xd,createStaticVNode:Ib,createTextVNode:Dt,createVNode:b,customRef:i_,defineAsyncComponent:Ov,defineComponent:Pr,defineCustomElement:zg,defineEmits:Fv,defineExpose:Vv,defineModel:jv,defineOptions:Hv,defineProps:Mv,defineSSRCustomElement:v0,defineSlots:Uv,devtools:Wb,effect:Hz,effectScope:wl,getCurrentInstance:Un,getCurrentScope:ld,getTransitionRawChildren:Al,guardReactiveProps:sg,h:mr,handleError:Ho,hasInjectionContext:$_,hydrate:Tg,initCustomFormatter:Hb,initDirectivesForSSR:N0,inject:Nn,isMemoSame:dg,isProxy:pd,isReactive:Er,isReadonly:so,isRef:Ot,isRuntimeOnly:Mb,isShallow:No,isVNode:ao,markRaw:El,mergeDefaults:Gv,mergeModels:Kv,mergeProps:is,nextTick:Uo,normalizeClass:ke,normalizeProps:Ks,normalizeStyle:co,onActivated:__,onBeforeMount:Cd,onBeforeUnmount:Il,onBeforeUpdate:z_,onDeactivated:g_,onErrorCaptured:w_,onMounted:As,onRenderTracked:C_,onRenderTriggered:b_,onScopeDispose:Bh,onServerPrefetch:v_,onUnmounted:Ri,onUpdated:Pl,openBlock:x,popScopeId:$v,provide:si,proxyRefs:yd,pushScopeId:Ev,queuePostFlushCb:Wa,reactive:Ts,readonly:fd,ref:Ln,registerRuntimeCompiler:Rb,render:bu,renderList:_t,renderSlot:vt,resolveComponent:O,resolveDirective:kd,resolveDynamicComponent:Ll,resolveFilter:Zb,resolveTransitionHooks:zs,setBlockTracking:fu,setDevtoolsHook:qb,setTransitionHooks:io,shallowReactive:md,shallowReadonly:lv,shallowRef:gd,ssrContextKey:q_,ssrUtils:Kb,stop:Uz,toDisplayString:y,toHandlerKey:ri,toHandlers:Dv,toRaw:Xe,toRef:gv,toRefs:a_,toValue:mv,transformVNodeArgs:Ob,triggerRef:dv,unref:Cn,useAttrs:qv,useCssModule:C0,useCssVars:i0,useModel:yb,useSSRContext:G_,useSlots:Wv,useTransitionState:vd,vModelCheckbox:Mn,vModelDynamic:kg,vModelRadio:Id,vModelSelect:Ld,vModelText:_n,vShow:Si,version:mg,warn:jb,watch:Dn,watchEffect:K_,watchPostEffect:Z_,watchSyncEffect:Y_,withAsyncContext:Yv,withCtx:N,withDefaults:Bv,withDirectives:ht,withKeys:dn,withMemo:Ub,withModifiers:gt,withScopeId:Tv},Symbol.toStringTag,{value:"Module"}));var M0=!1;/*! +**/const N0=()=>{},D0=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:f_,BaseTransitionPropsValidators:bd,Comment:Mt,DeprecationTypes:Yb,EffectScope:ad,ErrorCodes:vv,ErrorTypeStrings:jb,Fragment:ve,KeepAlive:Pv,ReactiveEffect:ys,Static:Po,Suspense:kb,Teleport:Hn,Text:Tr,TrackOpTypes:gv,Transition:Rt,TransitionGroup:w0,TriggerOpTypes:yv,VueElement:Dl,assertNumber:zv,callWithAsyncErrorHandling:kn,callWithErrorHandling:$r,camelize:Xt,capitalize:Ni,cloneVNode:_r,compatUtils:Zb,compile:N0,computed:jt,createApp:Tg,createBlock:we,createCommentVNode:ee,createElementBlock:I,createElementVNode:c,createHydrationRenderer:H_,createPropsRestProxy:Kv,createRenderer:V_,createSSRApp:I0,createSlots:xd,createStaticVNode:Pb,createTextVNode:Dt,createVNode:b,customRef:s_,defineAsyncComponent:Av,defineComponent:Pr,defineCustomElement:yg,defineEmits:Mv,defineExpose:Fv,defineModel:Uv,defineOptions:Vv,defineProps:Rv,defineSSRCustomElement:z0,defineSlots:Hv,devtools:Bb,effect:Vz,effectScope:wl,getCurrentInstance:Un,getCurrentScope:ld,getTransitionRawChildren:Al,guardReactiveProps:og,h:mr,handleError:Ho,hasInjectionContext:E_,hydrate:$g,initCustomFormatter:Vb,initDirectivesForSSR:L0,inject:Nn,isMemoSame:ug,isProxy:pd,isReactive:Er,isReadonly:so,isRef:Ot,isRuntimeOnly:Rb,isShallow:No,isVNode:ao,markRaw:El,mergeDefaults:qv,mergeModels:Gv,mergeProps:is,nextTick:Uo,normalizeClass:ke,normalizeProps:Ks,normalizeStyle:co,onActivated:h_,onBeforeMount:Cd,onBeforeUnmount:Il,onBeforeUpdate:y_,onDeactivated:__,onErrorCaptured:C_,onMounted:As,onRenderTracked:b_,onRenderTriggered:v_,onScopeDispose:jh,onServerPrefetch:z_,onUnmounted:Ri,onUpdated:Pl,openBlock:x,popScopeId:Ev,provide:si,proxyRefs:yd,pushScopeId:xv,queuePostFlushCb:Wa,reactive:Ts,readonly:fd,ref:Ln,registerRuntimeCompiler:Db,render:bu,renderList:_t,renderSlot:vt,resolveComponent:O,resolveDirective:kd,resolveDynamicComponent:Ll,resolveFilter:Kb,resolveTransitionHooks:zs,setBlockTracking:fu,setDevtoolsHook:Wb,setTransitionHooks:io,shallowReactive:md,shallowReadonly:av,shallowRef:gd,ssrContextKey:W_,ssrUtils:Gb,stop:Hz,toDisplayString:y,toHandlerKey:ri,toHandlers:Nv,toRaw:Xe,toRef:_v,toRefs:i_,toValue:dv,transformVNodeArgs:Ab,triggerRef:uv,unref:Cn,useAttrs:Wv,useCssModule:b0,useCssVars:s0,useModel:gb,useSSRContext:q_,useSlots:Bv,useTransitionState:vd,vModelCheckbox:Mn,vModelDynamic:wg,vModelRadio:Id,vModelSelect:Ld,vModelText:_n,vShow:Si,version:dg,warn:Ub,watch:Dn,watchEffect:G_,watchPostEffect:K_,watchSyncEffect:Z_,withAsyncContext:Zv,withCtx:N,withDefaults:jv,withDirectives:ht,withKeys:dn,withMemo:Hb,withModifiers:gt,withScopeId:$v},Symbol.toStringTag,{value:"Module"}));var R0=!1;/*! * pinia v2.2.2 * (c) 2024 Eduardo San Martin Morote * @license MIT - */let Ig;const Rl=e=>Ig=e,Lg=Symbol();function Cu(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var ci;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(ci||(ci={}));function F0(){const e=wl(!0),t=e.run(()=>Ln({}));let n=[],r=[];const o=El({install(s){Rl(o),o._a=s,s.provide(Lg,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!M0?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const Ng=()=>{};function rf(e,t,n,r=Ng){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&ld()&&Bh(o),o}function qo(e,...t){e.slice().forEach(n=>{n(...t)})}const V0=e=>e(),of=Symbol(),yc=Symbol();function wu(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];Cu(o)&&Cu(r)&&e.hasOwnProperty(n)&&!Ot(r)&&!Er(r)?e[n]=wu(o,r):e[n]=r}return e}const H0=Symbol();function U0(e){return!Cu(e)||!e.hasOwnProperty(H0)}const{assign:Wr}=Object;function j0(e){return!!(Ot(e)&&e.effect)}function B0(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function u(){a||(n.state.value[e]=o?o():{});const m=a_(n.state.value[e]);return Wr(m,s,Object.keys(i||{}).reduce((d,f)=>(d[f]=El(jt(()=>{Rl(n);const p=n._s.get(e);return i[f].call(p,p)})),d),{}))}return l=Dg(e,u,t,n,r,!0),l}function Dg(e,t,n={},r,o,s){let i;const a=Wr({actions:{}},n),l={deep:!0};let u,m,d=[],f=[],p;const h=r.state.value[e];!s&&!h&&(r.state.value[e]={}),Ln({});let g;function z(D){let $;u=m=!1,typeof D=="function"?(D(r.state.value[e]),$={type:ci.patchFunction,storeId:e,events:p}):(wu(r.state.value[e],D),$={type:ci.patchObject,payload:D,storeId:e,events:p});const F=g=Symbol();Uo().then(()=>{g===F&&(u=!0)}),m=!0,qo(d,$,r.state.value[e])}const k=s?function(){const{state:$}=n,F=$?$():{};this.$patch(q=>{Wr(q,F)})}:Ng;function w(){i.stop(),d=[],f=[],r._s.delete(e)}const _=(D,$="")=>{if(of in D)return D[yc]=$,D;const F=function(){Rl(r);const q=Array.from(arguments),U=[],W=[];function ne(re){U.push(re)}function me(re){W.push(re)}qo(f,{args:q,name:F[yc],store:S,after:ne,onError:me});let K;try{K=D.apply(this&&this.$id===e?this:S,q)}catch(re){throw qo(W,re),re}return K instanceof Promise?K.then(re=>(qo(U,re),re)).catch(re=>(qo(W,re),Promise.reject(re))):(qo(U,K),K)};return F[of]=!0,F[yc]=$,F},v={_p:r,$id:e,$onAction:rf.bind(null,f),$patch:z,$reset:k,$subscribe(D,$={}){const F=rf(d,D,$.detached,()=>q()),q=i.run(()=>Dn(()=>r.state.value[e],U=>{($.flush==="sync"?m:u)&&D({storeId:e,type:ci.direct,events:p},U)},Wr({},l,$)));return F},$dispose:w},S=Ts(v);r._s.set(e,S);const L=(r._a&&r._a.runWithContext||V0)(()=>r._e.run(()=>(i=wl()).run(()=>t({action:_}))));for(const D in L){const $=L[D];if(Ot($)&&!j0($)||Er($))s||(h&&U0($)&&(Ot($)?$.value=h[D]:wu($,h[D])),r.state.value[e][D]=$);else if(typeof $=="function"){const F=_($,D);L[D]=F,a.actions[D]=$}}return Wr(S,L),Wr(Xe(S),L),Object.defineProperty(S,"$state",{get:()=>r.state.value[e],set:D=>{z($=>{Wr($,D)})}}),r._p.forEach(D=>{Wr(S,i.run(()=>D({store:S,app:r._a,pinia:r,options:a})))}),h&&s&&n.hydrate&&n.hydrate(S.$state,h),u=!0,m=!0,S}function jn(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(a,l){const u=$_();return a=a||(u?Nn(Lg,null):null),a&&Rl(a),a=Ig,a._s.has(r)||(s?Dg(r,t,o,a):B0(r,o,a)),a._s.get(r)}return i.$id=r,i}const Nd=jn("RemotesStore",{state:()=>({pairing:{}})});function Rg(e,t){return function(){return e.apply(t,arguments)}}const{toString:W0}=Object.prototype,{getPrototypeOf:Dd}=Object,Ml=(e=>t=>{const n=W0.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),or=e=>(e=e.toLowerCase(),t=>Ml(t)===e),Fl=e=>t=>typeof t===e,{isArray:Os}=Array,xi=Fl("undefined");function q0(e){return e!==null&&!xi(e)&&e.constructor!==null&&!xi(e.constructor)&&Sn(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Mg=or("ArrayBuffer");function G0(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Mg(e.buffer),t}const K0=Fl("string"),Sn=Fl("function"),Fg=Fl("number"),Vl=e=>e!==null&&typeof e=="object",Z0=e=>e===!0||e===!1,Aa=e=>{if(Ml(e)!=="object")return!1;const t=Dd(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},Y0=or("Date"),X0=or("File"),J0=or("Blob"),Q0=or("FileList"),eC=e=>Vl(e)&&Sn(e.pipe),tC=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Sn(e.append)&&((t=Ml(e))==="formdata"||t==="object"&&Sn(e.toString)&&e.toString()==="[object FormData]"))},nC=or("URLSearchParams"),[rC,oC,sC,iC]=["ReadableStream","Request","Response","Headers"].map(or),aC=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Hi(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),Os(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const xo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Hg=e=>!xi(e)&&e!==xo;function ku(){const{caseless:e}=Hg(this)&&this||{},t={},n=(r,o)=>{const s=e&&Vg(t,o)||o;Aa(t[s])&&Aa(r)?t[s]=ku(t[s],r):Aa(r)?t[s]=ku({},r):Os(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(Hi(t,(o,s)=>{n&&Sn(o)?e[s]=Rg(o,n):e[s]=o},{allOwnKeys:r}),e),cC=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),uC=(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)},dC=(e,t,n,r)=>{let o,s,i;const a={};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))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&Dd(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},mC=(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},fC=e=>{if(!e)return null;if(Os(e))return e;let t=e.length;if(!Fg(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},pC=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Dd(Uint8Array)),hC=(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])}},_C=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},gC=or("HTMLFormElement"),yC=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),sf=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),zC=or("RegExp"),Ug=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Hi(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},vC=e=>{Ug(e,(t,n)=>{if(Sn(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(Sn(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+"'")})}})},bC=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return Os(e)?r(e):r(String(e).split(t)),n},CC=()=>{},wC=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,zc="abcdefghijklmnopqrstuvwxyz",af="0123456789",jg={DIGIT:af,ALPHA:zc,ALPHA_DIGIT:zc+zc.toUpperCase()+af},kC=(e=16,t=jg.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function SC(e){return!!(e&&Sn(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const xC=e=>{const t=new Array(10),n=(r,o)=>{if(Vl(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=Os(r)?[]:{};return Hi(r,(i,a)=>{const l=n(i,o+1);!xi(l)&&(s[a]=l)}),t[o]=void 0,s}}return r};return n(e,0)},EC=or("AsyncFunction"),$C=e=>e&&(Vl(e)||Sn(e))&&Sn(e.then)&&Sn(e.catch),Bg=((e,t)=>e?setImmediate:t?((n,r)=>(xo.addEventListener("message",({source:o,data:s})=>{o===xo&&s===n&&r.length&&r.shift()()},!1),o=>{r.push(o),xo.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",Sn(xo.postMessage)),TC=typeof queueMicrotask<"u"?queueMicrotask.bind(xo):typeof process<"u"&&process.nextTick||Bg,J={isArray:Os,isArrayBuffer:Mg,isBuffer:q0,isFormData:tC,isArrayBufferView:G0,isString:K0,isNumber:Fg,isBoolean:Z0,isObject:Vl,isPlainObject:Aa,isReadableStream:rC,isRequest:oC,isResponse:sC,isHeaders:iC,isUndefined:xi,isDate:Y0,isFile:X0,isBlob:J0,isRegExp:zC,isFunction:Sn,isStream:eC,isURLSearchParams:nC,isTypedArray:pC,isFileList:Q0,forEach:Hi,merge:ku,extend:lC,trim:aC,stripBOM:cC,inherits:uC,toFlatObject:dC,kindOf:Ml,kindOfTest:or,endsWith:mC,toArray:fC,forEachEntry:hC,matchAll:_C,isHTMLForm:gC,hasOwnProperty:sf,hasOwnProp:sf,reduceDescriptors:Ug,freezeMethods:vC,toObjectSet:bC,toCamelCase:yC,noop:CC,toFiniteNumber:wC,findKey:Vg,global:xo,isContextDefined:Hg,ALPHABET:jg,generateString:kC,isSpecCompliantForm:SC,toJSONObject:xC,isAsyncFn:EC,isThenable:$C,setImmediate:Bg,asap:TC};function Be(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)}J.inherits(Be,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:J.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Wg=Be.prototype,qg={};["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=>{qg[e]={value:e}});Object.defineProperties(Be,qg);Object.defineProperty(Wg,"isAxiosError",{value:!0});Be.from=(e,t,n,r,o,s)=>{const i=Object.create(Wg);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),Be.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const AC=null;function Su(e){return J.isPlainObject(e)||J.isArray(e)}function Gg(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function lf(e,t,n){return e?e.concat(t).map(function(o,s){return o=Gg(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function OC(e){return J.isArray(e)&&!e.some(Su)}const PC=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function Hl(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,z){return!J.isUndefined(z[g])});const r=n.metaTokens,o=n.visitor||m,s=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(o))throw new TypeError("visitor must be a function");function u(h){if(h===null)return"";if(J.isDate(h))return h.toISOString();if(!l&&J.isBlob(h))throw new Be("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(h)||J.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function m(h,g,z){let k=h;if(h&&!z&&typeof h=="object"){if(J.endsWith(g,"{}"))g=r?g:g.slice(0,-2),h=JSON.stringify(h);else if(J.isArray(h)&&OC(h)||(J.isFileList(h)||J.endsWith(g,"[]"))&&(k=J.toArray(h)))return g=Gg(g),k.forEach(function(_,v){!(J.isUndefined(_)||_===null)&&t.append(i===!0?lf([g],v,s):i===null?g:g+"[]",u(_))}),!1}return Su(h)?!0:(t.append(lf(z,g,s),u(h)),!1)}const d=[],f=Object.assign(PC,{defaultVisitor:m,convertValue:u,isVisitable:Su});function p(h,g){if(!J.isUndefined(h)){if(d.indexOf(h)!==-1)throw Error("Circular reference detected in "+g.join("."));d.push(h),J.forEach(h,function(k,w){(!(J.isUndefined(k)||k===null)&&o.call(t,k,J.isString(w)?w.trim():w,g,f))===!0&&p(k,g?g.concat(w):[w])}),d.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return p(e),t}function cf(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Rd(e,t){this._pairs=[],e&&Hl(e,this,t)}const Kg=Rd.prototype;Kg.append=function(t,n){this._pairs.push([t,n])};Kg.toString=function(t){const n=t?function(r){return t.call(this,r,cf)}:cf;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function IC(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Zg(e,t,n){if(!t)return e;const r=n&&n.encode||IC,o=n&&n.serialize;let s;if(o?s=o(t,n):s=J.isURLSearchParams(t)?t.toString():new Rd(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class uf{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){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const Yg={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},LC=typeof URLSearchParams<"u"?URLSearchParams:Rd,NC=typeof FormData<"u"?FormData:null,DC=typeof Blob<"u"?Blob:null,RC={isBrowser:!0,classes:{URLSearchParams:LC,FormData:NC,Blob:DC},protocols:["http","https","file","blob","url","data"]},Md=typeof window<"u"&&typeof document<"u",MC=(e=>Md&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),FC=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",VC=Md&&window.location.href||"http://localhost",HC=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Md,hasStandardBrowserEnv:MC,hasStandardBrowserWebWorkerEnv:FC,origin:VC},Symbol.toStringTag,{value:"Module"})),Qn={...HC,...RC};function UC(e,t){return Hl(e,new Qn.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return Qn.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function jC(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function BC(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&J.isArray(o)?o.length:i,l?(J.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!a):((!o[i]||!J.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&J.isArray(o[i])&&(o[i]=BC(o[i])),!a)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,o)=>{t(jC(r),o,n,0)}),n}return null}function WC(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(0,JSON.stringify)(e)}const Ui={transitional:Yg,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=J.isObject(t);if(s&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return o?JSON.stringify(Xg(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t)||J.isReadableStream(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return UC(t,this.formSerializer).toString();if((a=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Hl(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),WC(t)):t}],transformResponse:[function(t){const n=this.transitional||Ui.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(J.isResponse(t)||J.isReadableStream(t))return t;if(t&&J.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?Be.from(a,Be.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Qn.classes.FormData,Blob:Qn.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{Ui.headers[e]={}});const qC=J.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"]),GC=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]&&qC[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},df=Symbol("internals");function Vs(e){return e&&String(e).trim().toLowerCase()}function Oa(e){return e===!1||e==null?e:J.isArray(e)?e.map(Oa):String(e)}function KC(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 ZC=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function vc(e,t,n,r,o){if(J.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!J.isString(t)){if(J.isString(r))return t.indexOf(r)!==-1;if(J.isRegExp(r))return r.test(t)}}function YC(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function XC(e,t){const n=J.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 pn{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(a,l,u){const m=Vs(l);if(!m)throw new Error("header name must be a non-empty string");const d=J.findKey(o,m);(!d||o[d]===void 0||u===!0||u===void 0&&o[d]!==!1)&&(o[d||l]=Oa(a))}const i=(a,l)=>J.forEach(a,(u,m)=>s(u,m,l));if(J.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(J.isString(t)&&(t=t.trim())&&!ZC(t))i(GC(t),n);else if(J.isHeaders(t))for(const[a,l]of t.entries())s(l,a,r);else t!=null&&s(n,t,r);return this}get(t,n){if(t=Vs(t),t){const r=J.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return KC(o);if(J.isFunction(n))return n.call(this,o,r);if(J.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Vs(t),t){const r=J.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||vc(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(i){if(i=Vs(i),i){const a=J.findKey(r,i);a&&(!n||vc(r,r[a],a,n))&&(delete r[a],o=!0)}}return J.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||vc(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return J.forEach(this,(o,s)=>{const i=J.findKey(r,s);if(i){n[i]=Oa(o),delete n[s];return}const a=t?YC(s):String(s).trim();a!==s&&delete n[s],n[a]=Oa(o),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return J.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&J.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[df]=this[df]={accessors:{}}).accessors,o=this.prototype;function s(i){const a=Vs(i);r[a]||(XC(o,i),r[a]=!0)}return J.isArray(t)?t.forEach(s):s(t),this}}pn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(pn.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(pn);function bc(e,t){const n=this||Ui,r=t||n,o=pn.from(r.headers);let s=r.data;return J.forEach(e,function(a){s=a.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function Jg(e){return!!(e&&e.__CANCEL__)}function Ps(e,t,n){Be.call(this,e??"canceled",Be.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(Ps,Be,{__CANCEL__:!0});function Qg(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Be("Request failed with status code "+n.status,[Be.ERR_BAD_REQUEST,Be.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function JC(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function QC(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(l){const u=Date.now(),m=r[s];i||(i=u),n[o]=l,r[o]=u;let d=s,f=0;for(;d!==o;)f+=n[d++],d=d%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),u-i{n=m,o=null,s&&(clearTimeout(s),s=null),e.apply(null,u)};return[(...u)=>{const m=Date.now(),d=m-n;d>=r?i(u,m):(o=u,s||(s=setTimeout(()=>{s=null,i(o)},r-d)))},()=>o&&i(o)]}const el=(e,t,n=3)=>{let r=0;const o=QC(50,250);return ew(s=>{const i=s.loaded,a=s.lengthComputable?s.total:void 0,l=i-r,u=o(l),m=i<=a;r=i;const d={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:u||void 0,estimated:u&&a&&m?(a-i)/u:void 0,event:s,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(d)},n)},mf=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},ff=e=>(...t)=>J.asap(()=>e(...t)),tw=Qn.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 a=J.isString(i)?o(i):i;return a.protocol===r.protocol&&a.host===r.host}}():function(){return function(){return!0}}(),nw=Qn.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.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 rw(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function ow(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function ey(e,t){return e&&!rw(t)?ow(e,t):t}const pf=e=>e instanceof pn?{...e}:e;function Mo(e,t){t=t||{};const n={};function r(u,m,d){return J.isPlainObject(u)&&J.isPlainObject(m)?J.merge.call({caseless:d},u,m):J.isPlainObject(m)?J.merge({},m):J.isArray(m)?m.slice():m}function o(u,m,d){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u,d)}else return r(u,m,d)}function s(u,m){if(!J.isUndefined(m))return r(void 0,m)}function i(u,m){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u)}else return r(void 0,m)}function a(u,m,d){if(d in t)return r(u,m);if(d in e)return r(void 0,u)}const l={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:a,headers:(u,m)=>o(pf(u),pf(m),!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(m){const d=l[m]||o,f=d(e[m],t[m],m);J.isUndefined(f)&&d!==a||(n[m]=f)}),n}const ty=e=>{const t=Mo({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=t;t.headers=i=pn.from(i),t.url=Zg(ey(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(J.isFormData(n)){if(Qn.hasStandardBrowserEnv||Qn.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[u,...m]=l?l.split(";").map(d=>d.trim()).filter(Boolean):[];i.setContentType([u||"multipart/form-data",...m].join("; "))}}if(Qn.hasStandardBrowserEnv&&(r&&J.isFunction(r)&&(r=r(t)),r||r!==!1&&tw(t.url))){const u=o&&s&&nw.read(s);u&&i.set(o,u)}return t},sw=typeof XMLHttpRequest<"u",iw=sw&&function(e){return new Promise(function(n,r){const o=ty(e);let s=o.data;const i=pn.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:u}=o,m,d,f,p,h;function g(){p&&p(),h&&h(),o.cancelToken&&o.cancelToken.unsubscribe(m),o.signal&&o.signal.removeEventListener("abort",m)}let z=new XMLHttpRequest;z.open(o.method.toUpperCase(),o.url,!0),z.timeout=o.timeout;function k(){if(!z)return;const _=pn.from("getAllResponseHeaders"in z&&z.getAllResponseHeaders()),S={data:!a||a==="text"||a==="json"?z.responseText:z.response,status:z.status,statusText:z.statusText,headers:_,config:e,request:z};Qg(function(L){n(L),g()},function(L){r(L),g()},S),z=null}"onloadend"in z?z.onloadend=k:z.onreadystatechange=function(){!z||z.readyState!==4||z.status===0&&!(z.responseURL&&z.responseURL.indexOf("file:")===0)||setTimeout(k)},z.onabort=function(){z&&(r(new Be("Request aborted",Be.ECONNABORTED,e,z)),z=null)},z.onerror=function(){r(new Be("Network Error",Be.ERR_NETWORK,e,z)),z=null},z.ontimeout=function(){let v=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const S=o.transitional||Yg;o.timeoutErrorMessage&&(v=o.timeoutErrorMessage),r(new Be(v,S.clarifyTimeoutError?Be.ETIMEDOUT:Be.ECONNABORTED,e,z)),z=null},s===void 0&&i.setContentType(null),"setRequestHeader"in z&&J.forEach(i.toJSON(),function(v,S){z.setRequestHeader(S,v)}),J.isUndefined(o.withCredentials)||(z.withCredentials=!!o.withCredentials),a&&a!=="json"&&(z.responseType=o.responseType),u&&([f,h]=el(u,!0),z.addEventListener("progress",f)),l&&z.upload&&([d,p]=el(l),z.upload.addEventListener("progress",d),z.upload.addEventListener("loadend",p)),(o.cancelToken||o.signal)&&(m=_=>{z&&(r(!_||_.type?new Ps(null,e,z):_),z.abort(),z=null)},o.cancelToken&&o.cancelToken.subscribe(m),o.signal&&(o.signal.aborted?m():o.signal.addEventListener("abort",m)));const w=JC(o.url);if(w&&Qn.protocols.indexOf(w)===-1){r(new Be("Unsupported protocol "+w+":",Be.ERR_BAD_REQUEST,e));return}z.send(s||null)})},aw=(e,t)=>{let n=new AbortController,r;const o=function(l){if(!r){r=!0,i();const u=l instanceof Error?l:this.reason;n.abort(u instanceof Be?u:new Ps(u instanceof Error?u.message:u))}};let s=t&&setTimeout(()=>{o(new Be(`timeout ${t} of ms exceeded`,Be.ETIMEDOUT))},t);const i=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(l=>{l&&(l.removeEventListener?l.removeEventListener("abort",o):l.unsubscribe(o))}),e=null)};e.forEach(l=>l&&l.addEventListener&&l.addEventListener("abort",o));const{signal:a}=n;return a.unsubscribe=i,[a,()=>{s&&clearTimeout(s),s=null}]},lw=function*(e,t){let n=e.byteLength;if(n{const s=cw(e,t,o);let i=0,a,l=u=>{a||(a=!0,r&&r(u))};return new ReadableStream({async pull(u){try{const{done:m,value:d}=await s.next();if(m){l(),u.close();return}let f=d.byteLength;if(n){let p=i+=f;n(p)}u.enqueue(new Uint8Array(d))}catch(m){throw l(m),m}},cancel(u){return l(u),s.return()}},{highWaterMark:2})},Ul=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",ny=Ul&&typeof ReadableStream=="function",xu=Ul&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),ry=(e,...t)=>{try{return!!e(...t)}catch{return!1}},uw=ny&&ry(()=>{let e=!1;const t=new Request(Qn.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),_f=64*1024,Eu=ny&&ry(()=>J.isReadableStream(new Response("").body)),tl={stream:Eu&&(e=>e.body)};Ul&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!tl[t]&&(tl[t]=J.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Be(`Response type '${t}' is not supported`,Be.ERR_NOT_SUPPORT,r)})})})(new Response);const dw=async e=>{if(e==null)return 0;if(J.isBlob(e))return e.size;if(J.isSpecCompliantForm(e))return(await new Request(e).arrayBuffer()).byteLength;if(J.isArrayBufferView(e)||J.isArrayBuffer(e))return e.byteLength;if(J.isURLSearchParams(e)&&(e=e+""),J.isString(e))return(await xu(e)).byteLength},mw=async(e,t)=>{const n=J.toFiniteNumber(e.getContentLength());return n??dw(t)},fw=Ul&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:m,withCredentials:d="same-origin",fetchOptions:f}=ty(e);u=u?(u+"").toLowerCase():"text";let[p,h]=o||s||i?aw([o,s],i):[],g,z;const k=()=>{!g&&setTimeout(()=>{p&&p.unsubscribe()}),g=!0};let w;try{if(l&&uw&&n!=="get"&&n!=="head"&&(w=await mw(m,r))!==0){let C=new Request(t,{method:"POST",body:r,duplex:"half"}),L;if(J.isFormData(r)&&(L=C.headers.get("content-type"))&&m.setContentType(L),C.body){const[D,$]=mf(w,el(ff(l)));r=hf(C.body,_f,D,$,xu)}}J.isString(d)||(d=d?"include":"omit"),z=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:m.normalize().toJSON(),body:r,duplex:"half",credentials:d});let _=await fetch(z);const v=Eu&&(u==="stream"||u==="response");if(Eu&&(a||v)){const C={};["status","statusText","headers"].forEach(F=>{C[F]=_[F]});const L=J.toFiniteNumber(_.headers.get("content-length")),[D,$]=a&&mf(L,el(ff(a),!0))||[];_=new Response(hf(_.body,_f,D,()=>{$&&$(),v&&k()},xu),C)}u=u||"text";let S=await tl[J.findKey(tl,u)||"text"](_,e);return!v&&k(),h&&h(),await new Promise((C,L)=>{Qg(C,L,{data:S,headers:pn.from(_.headers),status:_.status,statusText:_.statusText,config:e,request:z})})}catch(_){throw k(),_&&_.name==="TypeError"&&/fetch/i.test(_.message)?Object.assign(new Be("Network Error",Be.ERR_NETWORK,e,z),{cause:_.cause||_}):Be.from(_,_&&_.code,e,z)}}),$u={http:AC,xhr:iw,fetch:fw};J.forEach($u,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const gf=e=>`- ${e}`,pw=e=>J.isFunction(e)||e===null||e===!1,oy={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : + */let Pg;const Rl=e=>Pg=e,Ig=Symbol();function Cu(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var ci;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(ci||(ci={}));function M0(){const e=wl(!0),t=e.run(()=>Ln({}));let n=[],r=[];const o=El({install(s){Rl(o),o._a=s,s.provide(Ig,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!R0?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const Lg=()=>{};function rf(e,t,n,r=Lg){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&ld()&&jh(o),o}function qo(e,...t){e.slice().forEach(n=>{n(...t)})}const F0=e=>e(),of=Symbol(),yc=Symbol();function wu(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];Cu(o)&&Cu(r)&&e.hasOwnProperty(n)&&!Ot(r)&&!Er(r)?e[n]=wu(o,r):e[n]=r}return e}const V0=Symbol();function H0(e){return!Cu(e)||!e.hasOwnProperty(V0)}const{assign:Wr}=Object;function U0(e){return!!(Ot(e)&&e.effect)}function j0(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function u(){a||(n.state.value[e]=o?o():{});const m=i_(n.state.value[e]);return Wr(m,s,Object.keys(i||{}).reduce((d,f)=>(d[f]=El(jt(()=>{Rl(n);const p=n._s.get(e);return i[f].call(p,p)})),d),{}))}return l=Ng(e,u,t,n,r,!0),l}function Ng(e,t,n={},r,o,s){let i;const a=Wr({actions:{}},n),l={deep:!0};let u,m,d=[],f=[],p;const h=r.state.value[e];!s&&!h&&(r.state.value[e]={}),Ln({});let g;function z(D){let $;u=m=!1,typeof D=="function"?(D(r.state.value[e]),$={type:ci.patchFunction,storeId:e,events:p}):(wu(r.state.value[e],D),$={type:ci.patchObject,payload:D,storeId:e,events:p});const F=g=Symbol();Uo().then(()=>{g===F&&(u=!0)}),m=!0,qo(d,$,r.state.value[e])}const k=s?function(){const{state:$}=n,F=$?$():{};this.$patch(q=>{Wr(q,F)})}:Lg;function w(){i.stop(),d=[],f=[],r._s.delete(e)}const _=(D,$="")=>{if(of in D)return D[yc]=$,D;const F=function(){Rl(r);const q=Array.from(arguments),U=[],W=[];function ne(re){U.push(re)}function me(re){W.push(re)}qo(f,{args:q,name:F[yc],store:S,after:ne,onError:me});let K;try{K=D.apply(this&&this.$id===e?this:S,q)}catch(re){throw qo(W,re),re}return K instanceof Promise?K.then(re=>(qo(U,re),re)).catch(re=>(qo(W,re),Promise.reject(re))):(qo(U,K),K)};return F[of]=!0,F[yc]=$,F},v={_p:r,$id:e,$onAction:rf.bind(null,f),$patch:z,$reset:k,$subscribe(D,$={}){const F=rf(d,D,$.detached,()=>q()),q=i.run(()=>Dn(()=>r.state.value[e],U=>{($.flush==="sync"?m:u)&&D({storeId:e,type:ci.direct,events:p},U)},Wr({},l,$)));return F},$dispose:w},S=Ts(v);r._s.set(e,S);const L=(r._a&&r._a.runWithContext||F0)(()=>r._e.run(()=>(i=wl()).run(()=>t({action:_}))));for(const D in L){const $=L[D];if(Ot($)&&!U0($)||Er($))s||(h&&H0($)&&(Ot($)?$.value=h[D]:wu($,h[D])),r.state.value[e][D]=$);else if(typeof $=="function"){const F=_($,D);L[D]=F,a.actions[D]=$}}return Wr(S,L),Wr(Xe(S),L),Object.defineProperty(S,"$state",{get:()=>r.state.value[e],set:D=>{z($=>{Wr($,D)})}}),r._p.forEach(D=>{Wr(S,i.run(()=>D({store:S,app:r._a,pinia:r,options:a})))}),h&&s&&n.hydrate&&n.hydrate(S.$state,h),u=!0,m=!0,S}function jn(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(a,l){const u=E_();return a=a||(u?Nn(Ig,null):null),a&&Rl(a),a=Pg,a._s.has(r)||(s?Ng(r,t,o,a):j0(r,o,a)),a._s.get(r)}return i.$id=r,i}const Nd=jn("RemotesStore",{state:()=>({pairing:{}})});function Dg(e,t){return function(){return e.apply(t,arguments)}}const{toString:B0}=Object.prototype,{getPrototypeOf:Dd}=Object,Ml=(e=>t=>{const n=B0.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),or=e=>(e=e.toLowerCase(),t=>Ml(t)===e),Fl=e=>t=>typeof t===e,{isArray:Os}=Array,xi=Fl("undefined");function W0(e){return e!==null&&!xi(e)&&e.constructor!==null&&!xi(e.constructor)&&Sn(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Rg=or("ArrayBuffer");function q0(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Rg(e.buffer),t}const G0=Fl("string"),Sn=Fl("function"),Mg=Fl("number"),Vl=e=>e!==null&&typeof e=="object",K0=e=>e===!0||e===!1,Aa=e=>{if(Ml(e)!=="object")return!1;const t=Dd(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},Z0=or("Date"),Y0=or("File"),X0=or("Blob"),J0=or("FileList"),Q0=e=>Vl(e)&&Sn(e.pipe),eC=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Sn(e.append)&&((t=Ml(e))==="formdata"||t==="object"&&Sn(e.toString)&&e.toString()==="[object FormData]"))},tC=or("URLSearchParams"),[nC,rC,oC,sC]=["ReadableStream","Request","Response","Headers"].map(or),iC=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Hi(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),Os(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const xo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Vg=e=>!xi(e)&&e!==xo;function ku(){const{caseless:e}=Vg(this)&&this||{},t={},n=(r,o)=>{const s=e&&Fg(t,o)||o;Aa(t[s])&&Aa(r)?t[s]=ku(t[s],r):Aa(r)?t[s]=ku({},r):Os(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(Hi(t,(o,s)=>{n&&Sn(o)?e[s]=Dg(o,n):e[s]=o},{allOwnKeys:r}),e),lC=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),cC=(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)},uC=(e,t,n,r)=>{let o,s,i;const a={};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))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&Dd(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},dC=(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},mC=e=>{if(!e)return null;if(Os(e))return e;let t=e.length;if(!Mg(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},fC=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Dd(Uint8Array)),pC=(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])}},hC=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},_C=or("HTMLFormElement"),gC=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),sf=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),yC=or("RegExp"),Hg=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Hi(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},zC=e=>{Hg(e,(t,n)=>{if(Sn(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(Sn(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+"'")})}})},vC=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return Os(e)?r(e):r(String(e).split(t)),n},bC=()=>{},CC=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,zc="abcdefghijklmnopqrstuvwxyz",af="0123456789",Ug={DIGIT:af,ALPHA:zc,ALPHA_DIGIT:zc+zc.toUpperCase()+af},wC=(e=16,t=Ug.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function kC(e){return!!(e&&Sn(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const SC=e=>{const t=new Array(10),n=(r,o)=>{if(Vl(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=Os(r)?[]:{};return Hi(r,(i,a)=>{const l=n(i,o+1);!xi(l)&&(s[a]=l)}),t[o]=void 0,s}}return r};return n(e,0)},xC=or("AsyncFunction"),EC=e=>e&&(Vl(e)||Sn(e))&&Sn(e.then)&&Sn(e.catch),jg=((e,t)=>e?setImmediate:t?((n,r)=>(xo.addEventListener("message",({source:o,data:s})=>{o===xo&&s===n&&r.length&&r.shift()()},!1),o=>{r.push(o),xo.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",Sn(xo.postMessage)),$C=typeof queueMicrotask<"u"?queueMicrotask.bind(xo):typeof process<"u"&&process.nextTick||jg,J={isArray:Os,isArrayBuffer:Rg,isBuffer:W0,isFormData:eC,isArrayBufferView:q0,isString:G0,isNumber:Mg,isBoolean:K0,isObject:Vl,isPlainObject:Aa,isReadableStream:nC,isRequest:rC,isResponse:oC,isHeaders:sC,isUndefined:xi,isDate:Z0,isFile:Y0,isBlob:X0,isRegExp:yC,isFunction:Sn,isStream:Q0,isURLSearchParams:tC,isTypedArray:fC,isFileList:J0,forEach:Hi,merge:ku,extend:aC,trim:iC,stripBOM:lC,inherits:cC,toFlatObject:uC,kindOf:Ml,kindOfTest:or,endsWith:dC,toArray:mC,forEachEntry:pC,matchAll:hC,isHTMLForm:_C,hasOwnProperty:sf,hasOwnProp:sf,reduceDescriptors:Hg,freezeMethods:zC,toObjectSet:vC,toCamelCase:gC,noop:bC,toFiniteNumber:CC,findKey:Fg,global:xo,isContextDefined:Vg,ALPHABET:Ug,generateString:wC,isSpecCompliantForm:kC,toJSONObject:SC,isAsyncFn:xC,isThenable:EC,setImmediate:jg,asap:$C};function Be(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)}J.inherits(Be,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:J.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Bg=Be.prototype,Wg={};["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=>{Wg[e]={value:e}});Object.defineProperties(Be,Wg);Object.defineProperty(Bg,"isAxiosError",{value:!0});Be.from=(e,t,n,r,o,s)=>{const i=Object.create(Bg);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),Be.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const TC=null;function Su(e){return J.isPlainObject(e)||J.isArray(e)}function qg(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function lf(e,t,n){return e?e.concat(t).map(function(o,s){return o=qg(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function AC(e){return J.isArray(e)&&!e.some(Su)}const OC=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function Hl(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,z){return!J.isUndefined(z[g])});const r=n.metaTokens,o=n.visitor||m,s=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(o))throw new TypeError("visitor must be a function");function u(h){if(h===null)return"";if(J.isDate(h))return h.toISOString();if(!l&&J.isBlob(h))throw new Be("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(h)||J.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function m(h,g,z){let k=h;if(h&&!z&&typeof h=="object"){if(J.endsWith(g,"{}"))g=r?g:g.slice(0,-2),h=JSON.stringify(h);else if(J.isArray(h)&&AC(h)||(J.isFileList(h)||J.endsWith(g,"[]"))&&(k=J.toArray(h)))return g=qg(g),k.forEach(function(_,v){!(J.isUndefined(_)||_===null)&&t.append(i===!0?lf([g],v,s):i===null?g:g+"[]",u(_))}),!1}return Su(h)?!0:(t.append(lf(z,g,s),u(h)),!1)}const d=[],f=Object.assign(OC,{defaultVisitor:m,convertValue:u,isVisitable:Su});function p(h,g){if(!J.isUndefined(h)){if(d.indexOf(h)!==-1)throw Error("Circular reference detected in "+g.join("."));d.push(h),J.forEach(h,function(k,w){(!(J.isUndefined(k)||k===null)&&o.call(t,k,J.isString(w)?w.trim():w,g,f))===!0&&p(k,g?g.concat(w):[w])}),d.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return p(e),t}function cf(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Rd(e,t){this._pairs=[],e&&Hl(e,this,t)}const Gg=Rd.prototype;Gg.append=function(t,n){this._pairs.push([t,n])};Gg.toString=function(t){const n=t?function(r){return t.call(this,r,cf)}:cf;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function PC(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Kg(e,t,n){if(!t)return e;const r=n&&n.encode||PC,o=n&&n.serialize;let s;if(o?s=o(t,n):s=J.isURLSearchParams(t)?t.toString():new Rd(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class uf{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){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const Zg={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},IC=typeof URLSearchParams<"u"?URLSearchParams:Rd,LC=typeof FormData<"u"?FormData:null,NC=typeof Blob<"u"?Blob:null,DC={isBrowser:!0,classes:{URLSearchParams:IC,FormData:LC,Blob:NC},protocols:["http","https","file","blob","url","data"]},Md=typeof window<"u"&&typeof document<"u",RC=(e=>Md&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),MC=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",FC=Md&&window.location.href||"http://localhost",VC=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Md,hasStandardBrowserEnv:RC,hasStandardBrowserWebWorkerEnv:MC,origin:FC},Symbol.toStringTag,{value:"Module"})),Qn={...VC,...DC};function HC(e,t){return Hl(e,new Qn.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return Qn.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function UC(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function jC(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&J.isArray(o)?o.length:i,l?(J.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!a):((!o[i]||!J.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&J.isArray(o[i])&&(o[i]=jC(o[i])),!a)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,o)=>{t(UC(r),o,n,0)}),n}return null}function BC(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(0,JSON.stringify)(e)}const Ui={transitional:Zg,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=J.isObject(t);if(s&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return o?JSON.stringify(Yg(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t)||J.isReadableStream(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return HC(t,this.formSerializer).toString();if((a=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Hl(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),BC(t)):t}],transformResponse:[function(t){const n=this.transitional||Ui.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(J.isResponse(t)||J.isReadableStream(t))return t;if(t&&J.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?Be.from(a,Be.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Qn.classes.FormData,Blob:Qn.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{Ui.headers[e]={}});const WC=J.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"]),qC=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]&&WC[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},df=Symbol("internals");function Vs(e){return e&&String(e).trim().toLowerCase()}function Oa(e){return e===!1||e==null?e:J.isArray(e)?e.map(Oa):String(e)}function GC(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 KC=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function vc(e,t,n,r,o){if(J.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!J.isString(t)){if(J.isString(r))return t.indexOf(r)!==-1;if(J.isRegExp(r))return r.test(t)}}function ZC(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function YC(e,t){const n=J.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 pn{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(a,l,u){const m=Vs(l);if(!m)throw new Error("header name must be a non-empty string");const d=J.findKey(o,m);(!d||o[d]===void 0||u===!0||u===void 0&&o[d]!==!1)&&(o[d||l]=Oa(a))}const i=(a,l)=>J.forEach(a,(u,m)=>s(u,m,l));if(J.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(J.isString(t)&&(t=t.trim())&&!KC(t))i(qC(t),n);else if(J.isHeaders(t))for(const[a,l]of t.entries())s(l,a,r);else t!=null&&s(n,t,r);return this}get(t,n){if(t=Vs(t),t){const r=J.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return GC(o);if(J.isFunction(n))return n.call(this,o,r);if(J.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Vs(t),t){const r=J.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||vc(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(i){if(i=Vs(i),i){const a=J.findKey(r,i);a&&(!n||vc(r,r[a],a,n))&&(delete r[a],o=!0)}}return J.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||vc(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return J.forEach(this,(o,s)=>{const i=J.findKey(r,s);if(i){n[i]=Oa(o),delete n[s];return}const a=t?ZC(s):String(s).trim();a!==s&&delete n[s],n[a]=Oa(o),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return J.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&J.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[df]=this[df]={accessors:{}}).accessors,o=this.prototype;function s(i){const a=Vs(i);r[a]||(YC(o,i),r[a]=!0)}return J.isArray(t)?t.forEach(s):s(t),this}}pn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(pn.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(pn);function bc(e,t){const n=this||Ui,r=t||n,o=pn.from(r.headers);let s=r.data;return J.forEach(e,function(a){s=a.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function Xg(e){return!!(e&&e.__CANCEL__)}function Ps(e,t,n){Be.call(this,e??"canceled",Be.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(Ps,Be,{__CANCEL__:!0});function Jg(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Be("Request failed with status code "+n.status,[Be.ERR_BAD_REQUEST,Be.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function XC(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function JC(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(l){const u=Date.now(),m=r[s];i||(i=u),n[o]=l,r[o]=u;let d=s,f=0;for(;d!==o;)f+=n[d++],d=d%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),u-i{n=m,o=null,s&&(clearTimeout(s),s=null),e.apply(null,u)};return[(...u)=>{const m=Date.now(),d=m-n;d>=r?i(u,m):(o=u,s||(s=setTimeout(()=>{s=null,i(o)},r-d)))},()=>o&&i(o)]}const el=(e,t,n=3)=>{let r=0;const o=JC(50,250);return QC(s=>{const i=s.loaded,a=s.lengthComputable?s.total:void 0,l=i-r,u=o(l),m=i<=a;r=i;const d={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:u||void 0,estimated:u&&a&&m?(a-i)/u:void 0,event:s,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(d)},n)},mf=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},ff=e=>(...t)=>J.asap(()=>e(...t)),ew=Qn.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 a=J.isString(i)?o(i):i;return a.protocol===r.protocol&&a.host===r.host}}():function(){return function(){return!0}}(),tw=Qn.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.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 nw(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function rw(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function Qg(e,t){return e&&!nw(t)?rw(e,t):t}const pf=e=>e instanceof pn?{...e}:e;function Mo(e,t){t=t||{};const n={};function r(u,m,d){return J.isPlainObject(u)&&J.isPlainObject(m)?J.merge.call({caseless:d},u,m):J.isPlainObject(m)?J.merge({},m):J.isArray(m)?m.slice():m}function o(u,m,d){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u,d)}else return r(u,m,d)}function s(u,m){if(!J.isUndefined(m))return r(void 0,m)}function i(u,m){if(J.isUndefined(m)){if(!J.isUndefined(u))return r(void 0,u)}else return r(void 0,m)}function a(u,m,d){if(d in t)return r(u,m);if(d in e)return r(void 0,u)}const l={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:a,headers:(u,m)=>o(pf(u),pf(m),!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(m){const d=l[m]||o,f=d(e[m],t[m],m);J.isUndefined(f)&&d!==a||(n[m]=f)}),n}const ey=e=>{const t=Mo({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=t;t.headers=i=pn.from(i),t.url=Kg(Qg(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(J.isFormData(n)){if(Qn.hasStandardBrowserEnv||Qn.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[u,...m]=l?l.split(";").map(d=>d.trim()).filter(Boolean):[];i.setContentType([u||"multipart/form-data",...m].join("; "))}}if(Qn.hasStandardBrowserEnv&&(r&&J.isFunction(r)&&(r=r(t)),r||r!==!1&&ew(t.url))){const u=o&&s&&tw.read(s);u&&i.set(o,u)}return t},ow=typeof XMLHttpRequest<"u",sw=ow&&function(e){return new Promise(function(n,r){const o=ey(e);let s=o.data;const i=pn.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:u}=o,m,d,f,p,h;function g(){p&&p(),h&&h(),o.cancelToken&&o.cancelToken.unsubscribe(m),o.signal&&o.signal.removeEventListener("abort",m)}let z=new XMLHttpRequest;z.open(o.method.toUpperCase(),o.url,!0),z.timeout=o.timeout;function k(){if(!z)return;const _=pn.from("getAllResponseHeaders"in z&&z.getAllResponseHeaders()),S={data:!a||a==="text"||a==="json"?z.responseText:z.response,status:z.status,statusText:z.statusText,headers:_,config:e,request:z};Jg(function(L){n(L),g()},function(L){r(L),g()},S),z=null}"onloadend"in z?z.onloadend=k:z.onreadystatechange=function(){!z||z.readyState!==4||z.status===0&&!(z.responseURL&&z.responseURL.indexOf("file:")===0)||setTimeout(k)},z.onabort=function(){z&&(r(new Be("Request aborted",Be.ECONNABORTED,e,z)),z=null)},z.onerror=function(){r(new Be("Network Error",Be.ERR_NETWORK,e,z)),z=null},z.ontimeout=function(){let v=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const S=o.transitional||Zg;o.timeoutErrorMessage&&(v=o.timeoutErrorMessage),r(new Be(v,S.clarifyTimeoutError?Be.ETIMEDOUT:Be.ECONNABORTED,e,z)),z=null},s===void 0&&i.setContentType(null),"setRequestHeader"in z&&J.forEach(i.toJSON(),function(v,S){z.setRequestHeader(S,v)}),J.isUndefined(o.withCredentials)||(z.withCredentials=!!o.withCredentials),a&&a!=="json"&&(z.responseType=o.responseType),u&&([f,h]=el(u,!0),z.addEventListener("progress",f)),l&&z.upload&&([d,p]=el(l),z.upload.addEventListener("progress",d),z.upload.addEventListener("loadend",p)),(o.cancelToken||o.signal)&&(m=_=>{z&&(r(!_||_.type?new Ps(null,e,z):_),z.abort(),z=null)},o.cancelToken&&o.cancelToken.subscribe(m),o.signal&&(o.signal.aborted?m():o.signal.addEventListener("abort",m)));const w=XC(o.url);if(w&&Qn.protocols.indexOf(w)===-1){r(new Be("Unsupported protocol "+w+":",Be.ERR_BAD_REQUEST,e));return}z.send(s||null)})},iw=(e,t)=>{let n=new AbortController,r;const o=function(l){if(!r){r=!0,i();const u=l instanceof Error?l:this.reason;n.abort(u instanceof Be?u:new Ps(u instanceof Error?u.message:u))}};let s=t&&setTimeout(()=>{o(new Be(`timeout ${t} of ms exceeded`,Be.ETIMEDOUT))},t);const i=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(l=>{l&&(l.removeEventListener?l.removeEventListener("abort",o):l.unsubscribe(o))}),e=null)};e.forEach(l=>l&&l.addEventListener&&l.addEventListener("abort",o));const{signal:a}=n;return a.unsubscribe=i,[a,()=>{s&&clearTimeout(s),s=null}]},aw=function*(e,t){let n=e.byteLength;if(n{const s=lw(e,t,o);let i=0,a,l=u=>{a||(a=!0,r&&r(u))};return new ReadableStream({async pull(u){try{const{done:m,value:d}=await s.next();if(m){l(),u.close();return}let f=d.byteLength;if(n){let p=i+=f;n(p)}u.enqueue(new Uint8Array(d))}catch(m){throw l(m),m}},cancel(u){return l(u),s.return()}},{highWaterMark:2})},Ul=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",ty=Ul&&typeof ReadableStream=="function",xu=Ul&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),ny=(e,...t)=>{try{return!!e(...t)}catch{return!1}},cw=ty&&ny(()=>{let e=!1;const t=new Request(Qn.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),_f=64*1024,Eu=ty&&ny(()=>J.isReadableStream(new Response("").body)),tl={stream:Eu&&(e=>e.body)};Ul&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!tl[t]&&(tl[t]=J.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Be(`Response type '${t}' is not supported`,Be.ERR_NOT_SUPPORT,r)})})})(new Response);const uw=async e=>{if(e==null)return 0;if(J.isBlob(e))return e.size;if(J.isSpecCompliantForm(e))return(await new Request(e).arrayBuffer()).byteLength;if(J.isArrayBufferView(e)||J.isArrayBuffer(e))return e.byteLength;if(J.isURLSearchParams(e)&&(e=e+""),J.isString(e))return(await xu(e)).byteLength},dw=async(e,t)=>{const n=J.toFiniteNumber(e.getContentLength());return n??uw(t)},mw=Ul&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:m,withCredentials:d="same-origin",fetchOptions:f}=ey(e);u=u?(u+"").toLowerCase():"text";let[p,h]=o||s||i?iw([o,s],i):[],g,z;const k=()=>{!g&&setTimeout(()=>{p&&p.unsubscribe()}),g=!0};let w;try{if(l&&cw&&n!=="get"&&n!=="head"&&(w=await dw(m,r))!==0){let C=new Request(t,{method:"POST",body:r,duplex:"half"}),L;if(J.isFormData(r)&&(L=C.headers.get("content-type"))&&m.setContentType(L),C.body){const[D,$]=mf(w,el(ff(l)));r=hf(C.body,_f,D,$,xu)}}J.isString(d)||(d=d?"include":"omit"),z=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:m.normalize().toJSON(),body:r,duplex:"half",credentials:d});let _=await fetch(z);const v=Eu&&(u==="stream"||u==="response");if(Eu&&(a||v)){const C={};["status","statusText","headers"].forEach(F=>{C[F]=_[F]});const L=J.toFiniteNumber(_.headers.get("content-length")),[D,$]=a&&mf(L,el(ff(a),!0))||[];_=new Response(hf(_.body,_f,D,()=>{$&&$(),v&&k()},xu),C)}u=u||"text";let S=await tl[J.findKey(tl,u)||"text"](_,e);return!v&&k(),h&&h(),await new Promise((C,L)=>{Jg(C,L,{data:S,headers:pn.from(_.headers),status:_.status,statusText:_.statusText,config:e,request:z})})}catch(_){throw k(),_&&_.name==="TypeError"&&/fetch/i.test(_.message)?Object.assign(new Be("Network Error",Be.ERR_NETWORK,e,z),{cause:_.cause||_}):Be.from(_,_&&_.code,e,z)}}),$u={http:TC,xhr:sw,fetch:mw};J.forEach($u,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const gf=e=>`- ${e}`,fw=e=>J.isFunction(e)||e===null||e===!1,ry={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : `+s.map(gf).join(` -`):" "+gf(s[0]):"as no adapter specified";throw new Be("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:$u};function Cc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ps(null,e)}function yf(e){return Cc(e),e.headers=pn.from(e.headers),e.data=bc.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),oy.getAdapter(e.adapter||Ui.adapter)(e).then(function(r){return Cc(e),r.data=bc.call(e,e.transformResponse,r),r.headers=pn.from(r.headers),r},function(r){return Jg(r)||(Cc(e),r&&r.response&&(r.response.data=bc.call(e,e.transformResponse,r.response),r.response.headers=pn.from(r.response.headers))),Promise.reject(r)})}const sy="1.7.4",Fd={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Fd[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const zf={};Fd.transitional=function(t,n,r){function o(s,i){return"[Axios v"+sy+"] Transitional option '"+s+"'"+i+(r?". "+r:"")}return(s,i,a)=>{if(t===!1)throw new Be(o(i," has been removed"+(n?" in "+n:"")),Be.ERR_DEPRECATED);return n&&!zf[i]&&(zf[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,i,a):!0}};function hw(e,t,n){if(typeof e!="object")throw new Be("options must be an object",Be.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 a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new Be("option "+s+" must be "+l,Be.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Be("Unknown option "+s,Be.ERR_BAD_OPTION)}}const Tu={assertOptions:hw,validators:Fd},Mr=Tu.validators;class Io{constructor(t){this.defaults=t,this.interceptors={request:new uf,response:new uf}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let o;Error.captureStackTrace?Error.captureStackTrace(o={}):o=new Error;const s=o.stack?o.stack.replace(/^.+\n/,""):"";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(r.stack+=` -`+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Mo(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&Tu.assertOptions(r,{silentJSONParsing:Mr.transitional(Mr.boolean),forcedJSONParsing:Mr.transitional(Mr.boolean),clarifyTimeoutError:Mr.transitional(Mr.boolean)},!1),o!=null&&(J.isFunction(o)?n.paramsSerializer={serialize:o}:Tu.assertOptions(o,{encode:Mr.function,serialize:Mr.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=s&&J.merge(s.common,s[n.method]);s&&J.forEach(["delete","get","head","post","put","patch","common"],h=>{delete s[h]}),n.headers=pn.concat(i,s);const a=[];let l=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen=="function"&&g.runWhen(n)===!1||(l=l&&g.synchronous,a.unshift(g.fulfilled,g.rejected))});const u=[];this.interceptors.response.forEach(function(g){u.push(g.fulfilled,g.rejected)});let m,d=0,f;if(!l){const h=[yf.bind(this),void 0];for(h.unshift.apply(h,a),h.push.apply(h,u),f=h.length,m=Promise.resolve(n);d{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(a=>{r.subscribe(a),s=a}).then(o);return i.cancel=function(){r.unsubscribe(s)},i},t(function(s,i,a){r.reason||(r.reason=new Ps(s,i,a),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 Vd(function(o){t=o}),cancel:t}}}function _w(e){return function(n){return e.apply(null,n)}}function gw(e){return J.isObject(e)&&e.isAxiosError===!0}const Au={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(Au).forEach(([e,t])=>{Au[t]=e});function iy(e){const t=new Io(e),n=Rg(Io.prototype.request,t);return J.extend(n,Io.prototype,t,{allOwnKeys:!0}),J.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return iy(Mo(e,o))},n}const ue=iy(Ui);ue.Axios=Io;ue.CanceledError=Ps;ue.CancelToken=Vd;ue.isCancel=Jg;ue.VERSION=sy;ue.toFormData=Hl;ue.AxiosError=Be;ue.Cancel=ue.CanceledError;ue.all=function(t){return Promise.all(t)};ue.spread=_w;ue.isAxiosError=gw;ue.mergeConfig=Mo;ue.AxiosHeaders=pn;ue.formToJSON=e=>Xg(J.isHTMLForm(e)?new FormData(e):e);ue.getAdapter=oy.getAdapter;ue.HttpStatusCode=Au;ue.default=ue;/*! +`):" "+gf(s[0]):"as no adapter specified";throw new Be("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:$u};function Cc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ps(null,e)}function yf(e){return Cc(e),e.headers=pn.from(e.headers),e.data=bc.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),ry.getAdapter(e.adapter||Ui.adapter)(e).then(function(r){return Cc(e),r.data=bc.call(e,e.transformResponse,r),r.headers=pn.from(r.headers),r},function(r){return Xg(r)||(Cc(e),r&&r.response&&(r.response.data=bc.call(e,e.transformResponse,r.response),r.response.headers=pn.from(r.response.headers))),Promise.reject(r)})}const oy="1.7.4",Fd={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Fd[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const zf={};Fd.transitional=function(t,n,r){function o(s,i){return"[Axios v"+oy+"] Transitional option '"+s+"'"+i+(r?". "+r:"")}return(s,i,a)=>{if(t===!1)throw new Be(o(i," has been removed"+(n?" in "+n:"")),Be.ERR_DEPRECATED);return n&&!zf[i]&&(zf[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,i,a):!0}};function pw(e,t,n){if(typeof e!="object")throw new Be("options must be an object",Be.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 a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new Be("option "+s+" must be "+l,Be.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Be("Unknown option "+s,Be.ERR_BAD_OPTION)}}const Tu={assertOptions:pw,validators:Fd},Mr=Tu.validators;class Io{constructor(t){this.defaults=t,this.interceptors={request:new uf,response:new uf}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let o;Error.captureStackTrace?Error.captureStackTrace(o={}):o=new Error;const s=o.stack?o.stack.replace(/^.+\n/,""):"";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(r.stack+=` +`+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Mo(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&Tu.assertOptions(r,{silentJSONParsing:Mr.transitional(Mr.boolean),forcedJSONParsing:Mr.transitional(Mr.boolean),clarifyTimeoutError:Mr.transitional(Mr.boolean)},!1),o!=null&&(J.isFunction(o)?n.paramsSerializer={serialize:o}:Tu.assertOptions(o,{encode:Mr.function,serialize:Mr.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=s&&J.merge(s.common,s[n.method]);s&&J.forEach(["delete","get","head","post","put","patch","common"],h=>{delete s[h]}),n.headers=pn.concat(i,s);const a=[];let l=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen=="function"&&g.runWhen(n)===!1||(l=l&&g.synchronous,a.unshift(g.fulfilled,g.rejected))});const u=[];this.interceptors.response.forEach(function(g){u.push(g.fulfilled,g.rejected)});let m,d=0,f;if(!l){const h=[yf.bind(this),void 0];for(h.unshift.apply(h,a),h.push.apply(h,u),f=h.length,m=Promise.resolve(n);d{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(a=>{r.subscribe(a),s=a}).then(o);return i.cancel=function(){r.unsubscribe(s)},i},t(function(s,i,a){r.reason||(r.reason=new Ps(s,i,a),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 Vd(function(o){t=o}),cancel:t}}}function hw(e){return function(n){return e.apply(null,n)}}function _w(e){return J.isObject(e)&&e.isAxiosError===!0}const Au={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(Au).forEach(([e,t])=>{Au[t]=e});function sy(e){const t=new Io(e),n=Dg(Io.prototype.request,t);return J.extend(n,Io.prototype,t,{allOwnKeys:!0}),J.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return sy(Mo(e,o))},n}const ue=sy(Ui);ue.Axios=Io;ue.CanceledError=Ps;ue.CancelToken=Vd;ue.isCancel=Xg;ue.VERSION=oy;ue.toFormData=Hl;ue.AxiosError=Be;ue.Cancel=ue.CanceledError;ue.all=function(t){return Promise.all(t)};ue.spread=hw;ue.isAxiosError=_w;ue.mergeConfig=Mo;ue.AxiosHeaders=pn;ue.formToJSON=e=>Yg(J.isHTMLForm(e)?new FormData(e):e);ue.getAdapter=ry.getAdapter;ue.HttpStatusCode=Au;ue.default=ue;/*! * shared v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */const nl=typeof window<"u",fo=(e,t=!1)=>t?Symbol.for(e):Symbol(e),yw=(e,t,n)=>zw({l:e,k:t,s:n}),zw=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Nt=e=>typeof e=="number"&&isFinite(e),vw=e=>ly(e)==="[object Date]",rl=e=>ly(e)==="[object RegExp]",jl=e=>Je(e)&&Object.keys(e).length===0,Jt=Object.assign,bw=Object.create,mt=(e=null)=>bw(e);let vf;const Hd=()=>vf||(vf=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:mt());function bf(e){return e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const Cw=Object.prototype.hasOwnProperty;function Xn(e,t){return Cw.call(e,t)}const Ht=Array.isArray,At=e=>typeof e=="function",Ce=e=>typeof e=="string",wt=e=>typeof e=="boolean",rt=e=>e!==null&&typeof e=="object",ww=e=>rt(e)&&At(e.then)&&At(e.catch),ay=Object.prototype.toString,ly=e=>ay.call(e),Je=e=>{if(!rt(e))return!1;const t=Object.getPrototypeOf(e);return t===null||t.constructor===Object},kw=e=>e==null?"":Ht(e)||Je(e)&&e.toString===ay?JSON.stringify(e,null,2):String(e);function Sw(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}function Bl(e){let t=e;return()=>++t}function xw(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const ca=e=>!rt(e)||Ht(e);function Pa(e,t){if(ca(e)||ca(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:r,des:o}=n.pop();Object.keys(r).forEach(s=>{s!=="__proto__"&&(rt(r[s])&&!rt(o[s])&&(o[s]=Array.isArray(r[s])?[]:mt()),ca(o[s])||ca(r[s])?o[s]=r[s]:n.push({src:r[s],des:o[s]}))})}}/*! + */const nl=typeof window<"u",fo=(e,t=!1)=>t?Symbol.for(e):Symbol(e),gw=(e,t,n)=>yw({l:e,k:t,s:n}),yw=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Nt=e=>typeof e=="number"&&isFinite(e),zw=e=>ay(e)==="[object Date]",rl=e=>ay(e)==="[object RegExp]",jl=e=>Je(e)&&Object.keys(e).length===0,Jt=Object.assign,vw=Object.create,mt=(e=null)=>vw(e);let vf;const Hd=()=>vf||(vf=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:mt());function bf(e){return e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const bw=Object.prototype.hasOwnProperty;function Xn(e,t){return bw.call(e,t)}const Ht=Array.isArray,At=e=>typeof e=="function",Ce=e=>typeof e=="string",wt=e=>typeof e=="boolean",rt=e=>e!==null&&typeof e=="object",Cw=e=>rt(e)&&At(e.then)&&At(e.catch),iy=Object.prototype.toString,ay=e=>iy.call(e),Je=e=>{if(!rt(e))return!1;const t=Object.getPrototypeOf(e);return t===null||t.constructor===Object},ww=e=>e==null?"":Ht(e)||Je(e)&&e.toString===iy?JSON.stringify(e,null,2):String(e);function kw(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}function Bl(e){let t=e;return()=>++t}function Sw(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const ca=e=>!rt(e)||Ht(e);function Pa(e,t){if(ca(e)||ca(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:r,des:o}=n.pop();Object.keys(r).forEach(s=>{s!=="__proto__"&&(rt(r[s])&&!rt(o[s])&&(o[s]=Array.isArray(r[s])?[]:mt()),ca(o[s])||ca(r[s])?o[s]=r[s]:n.push({src:r[s],des:o[s]}))})}}/*! * message-compiler v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */function Ew(e,t,n){return{line:e,column:t,offset:n}}function ol(e,t,n){return{start:e,end:t}}const $w=/\{([0-9a-zA-Z]+)\}/g;function cy(e,...t){return t.length===1&&Tw(t[0])&&(t=t[0]),(!t||!t.hasOwnProperty)&&(t={}),e.replace($w,(n,r)=>t.hasOwnProperty(r)?t[r]:"")}const uy=Object.assign,Cf=e=>typeof e=="string",Tw=e=>e!==null&&typeof e=="object";function dy(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}const Ud={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},Aw={[Ud.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};function Ow(e,t,...n){const r=cy(Aw[e],...n||[]),o={message:String(r),code:e};return t&&(o.location=t),o}const Le={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},Pw={[Le.EXPECTED_TOKEN]:"Expected token: '{0}'",[Le.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[Le.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[Le.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[Le.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[Le.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[Le.EMPTY_PLACEHOLDER]:"Empty placeholder",[Le.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[Le.INVALID_LINKED_FORMAT]:"Invalid linked format",[Le.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[Le.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[Le.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[Le.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[Le.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[Le.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function Is(e,t,n={}){const{domain:r,messages:o,args:s}=n,i=cy((o||Pw)[e]||"",...s||[]),a=new SyntaxError(String(i));return a.code=e,t&&(a.location=t),a.domain=r,a}function Iw(e){throw e}const zr=" ",Lw="\r",tn=` -`,Nw="\u2028",Dw="\u2029";function Rw(e){const t=e;let n=0,r=1,o=1,s=0;const i=L=>t[L]===Lw&&t[L+1]===tn,a=L=>t[L]===tn,l=L=>t[L]===Dw,u=L=>t[L]===Nw,m=L=>i(L)||a(L)||l(L)||u(L),d=()=>n,f=()=>r,p=()=>o,h=()=>s,g=L=>i(L)||l(L)||u(L)?tn:t[L],z=()=>g(n),k=()=>g(n+s);function w(){return s=0,m(n)&&(r++,o=0),i(n)&&n++,n++,o++,t[n]}function _(){return i(n+s)&&s++,s++,t[n+s]}function v(){n=0,r=1,o=1,s=0}function S(L=0){s=L}function C(){const L=n+s;for(;L!==n;)w();s=0}return{index:d,line:f,column:p,peekOffset:h,charAt:g,currentChar:z,currentPeek:k,next:w,peek:_,reset:v,resetPeek:S,skipToPeek:C}}const Fr=void 0,Mw=".",wf="'",Fw="tokenizer";function Vw(e,t={}){const n=t.location!==!1,r=Rw(e),o=()=>r.index(),s=()=>Ew(r.line(),r.column(),r.index()),i=s(),a=o(),l={currentType:14,offset:a,startLoc:i,endLoc:i,lastType:14,lastOffset:a,lastStartLoc:i,lastEndLoc:i,braceNest:0,inLinked:!1,text:""},u=()=>l,{onError:m}=t;function d(E,T,R,...Q){const de=u();if(T.column+=R,T.offset+=R,m){const se=n?ol(de.startLoc,T):null,H=Is(E,se,{domain:Fw,args:Q});m(H)}}function f(E,T,R){E.endLoc=s(),E.currentType=T;const Q={type:T};return n&&(Q.loc=ol(E.startLoc,E.endLoc)),R!=null&&(Q.value=R),Q}const p=E=>f(E,14);function h(E,T){return E.currentChar()===T?(E.next(),T):(d(Le.EXPECTED_TOKEN,s(),0,T),"")}function g(E){let T="";for(;E.currentPeek()===zr||E.currentPeek()===tn;)T+=E.currentPeek(),E.peek();return T}function z(E){const T=g(E);return E.skipToPeek(),T}function k(E){if(E===Fr)return!1;const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T===95}function w(E){if(E===Fr)return!1;const T=E.charCodeAt(0);return T>=48&&T<=57}function _(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=k(E.currentPeek());return E.resetPeek(),Q}function v(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=E.currentPeek()==="-"?E.peek():E.currentPeek(),de=w(Q);return E.resetPeek(),de}function S(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=E.currentPeek()===wf;return E.resetPeek(),Q}function C(E,T){const{currentType:R}=T;if(R!==8)return!1;g(E);const Q=E.currentPeek()===".";return E.resetPeek(),Q}function L(E,T){const{currentType:R}=T;if(R!==9)return!1;g(E);const Q=k(E.currentPeek());return E.resetPeek(),Q}function D(E,T){const{currentType:R}=T;if(!(R===8||R===12))return!1;g(E);const Q=E.currentPeek()===":";return E.resetPeek(),Q}function $(E,T){const{currentType:R}=T;if(R!==10)return!1;const Q=()=>{const se=E.currentPeek();return se==="{"?k(E.peek()):se==="@"||se==="%"||se==="|"||se===":"||se==="."||se===zr||!se?!1:se===tn?(E.peek(),Q()):U(E,!1)},de=Q();return E.resetPeek(),de}function F(E){g(E);const T=E.currentPeek()==="|";return E.resetPeek(),T}function q(E){const T=g(E),R=E.currentPeek()==="%"&&E.peek()==="{";return E.resetPeek(),{isModulo:R,hasSpace:T.length>0}}function U(E,T=!0){const R=(de=!1,se="",H=!1)=>{const Z=E.currentPeek();return Z==="{"?se==="%"?!1:de:Z==="@"||!Z?se==="%"?!0:de:Z==="%"?(E.peek(),R(de,"%",!0)):Z==="|"?se==="%"||H?!0:!(se===zr||se===tn):Z===zr?(E.peek(),R(!0,zr,H)):Z===tn?(E.peek(),R(!0,tn,H)):!0},Q=R();return T&&E.resetPeek(),Q}function W(E,T){const R=E.currentChar();return R===Fr?Fr:T(R)?(E.next(),R):null}function ne(E){const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===95||T===36}function me(E){return W(E,ne)}function K(E){const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===95||T===36||T===45}function re(E){return W(E,K)}function ce(E){const T=E.charCodeAt(0);return T>=48&&T<=57}function Ne(E){return W(E,ce)}function it(E){const T=E.charCodeAt(0);return T>=48&&T<=57||T>=65&&T<=70||T>=97&&T<=102}function Ve(E){return W(E,it)}function He(E){let T="",R="";for(;T=Ne(E);)R+=T;return R}function at(E){z(E);const T=E.currentChar();return T!=="%"&&d(Le.EXPECTED_TOKEN,s(),0,T),E.next(),"%"}function lt(E){let T="";for(;;){const R=E.currentChar();if(R==="{"||R==="}"||R==="@"||R==="|"||!R)break;if(R==="%")if(U(E))T+=R,E.next();else break;else if(R===zr||R===tn)if(U(E))T+=R,E.next();else{if(F(E))break;T+=R,E.next()}else T+=R,E.next()}return T}function ut(E){z(E);let T="",R="";for(;T=re(E);)R+=T;return E.currentChar()===Fr&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R}function We(E){z(E);let T="";return E.currentChar()==="-"?(E.next(),T+=`-${He(E)}`):T+=He(E),E.currentChar()===Fr&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),T}function Y(E){return E!==wf&&E!==tn}function fe(E){z(E),h(E,"'");let T="",R="";for(;T=W(E,Y);)T==="\\"?R+=le(E):R+=T;const Q=E.currentChar();return Q===tn||Q===Fr?(d(Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,s(),0),Q===tn&&(E.next(),h(E,"'")),R):(h(E,"'"),R)}function le(E){const T=E.currentChar();switch(T){case"\\":case"'":return E.next(),`\\${T}`;case"u":return ge(E,T,4);case"U":return ge(E,T,6);default:return d(Le.UNKNOWN_ESCAPE_SEQUENCE,s(),0,T),""}}function ge(E,T,R){h(E,T);let Q="";for(let de=0;de{const Q=E.currentChar();return Q==="{"||Q==="%"||Q==="@"||Q==="|"||Q==="("||Q===")"||!Q||Q===zr?R:(R+=Q,E.next(),T(R))};return T("")}function j(E){z(E);const T=h(E,"|");return z(E),T}function te(E,T){let R=null;switch(E.currentChar()){case"{":return T.braceNest>=1&&d(Le.NOT_ALLOW_NEST_PLACEHOLDER,s(),0),E.next(),R=f(T,2,"{"),z(E),T.braceNest++,R;case"}":return T.braceNest>0&&T.currentType===2&&d(Le.EMPTY_PLACEHOLDER,s(),0),E.next(),R=f(T,3,"}"),T.braceNest--,T.braceNest>0&&z(E),T.inLinked&&T.braceNest===0&&(T.inLinked=!1),R;case"@":return T.braceNest>0&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=X(E,T)||p(T),T.braceNest=0,R;default:{let de=!0,se=!0,H=!0;if(F(E))return T.braceNest>0&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,R;if(T.braceNest>0&&(T.currentType===5||T.currentType===6||T.currentType===7))return d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),T.braceNest=0,ie(E,T);if(de=_(E,T))return R=f(T,5,ut(E)),z(E),R;if(se=v(E,T))return R=f(T,6,We(E)),z(E),R;if(H=S(E,T))return R=f(T,7,fe(E)),z(E),R;if(!de&&!se&&!H)return R=f(T,13,Ge(E)),d(Le.INVALID_TOKEN_IN_PLACEHOLDER,s(),0,R.value),z(E),R;break}}return R}function X(E,T){const{currentType:R}=T;let Q=null;const de=E.currentChar();switch((R===8||R===9||R===12||R===10)&&(de===tn||de===zr)&&d(Le.INVALID_LINKED_FORMAT,s(),0),de){case"@":return E.next(),Q=f(T,8,"@"),T.inLinked=!0,Q;case".":return z(E),E.next(),f(T,9,".");case":":return z(E),E.next(),f(T,10,":");default:return F(E)?(Q=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,Q):C(E,T)||D(E,T)?(z(E),X(E,T)):L(E,T)?(z(E),f(T,12,A(E))):$(E,T)?(z(E),de==="{"?te(E,T)||Q:f(T,11,P(E))):(R===8&&d(Le.INVALID_LINKED_FORMAT,s(),0),T.braceNest=0,T.inLinked=!1,ie(E,T))}}function ie(E,T){let R={type:14};if(T.braceNest>0)return te(E,T)||p(T);if(T.inLinked)return X(E,T)||p(T);switch(E.currentChar()){case"{":return te(E,T)||p(T);case"}":return d(Le.UNBALANCED_CLOSING_BRACE,s(),0),E.next(),f(T,3,"}");case"@":return X(E,T)||p(T);default:{if(F(E))return R=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,R;const{isModulo:de,hasSpace:se}=q(E);if(de)return se?f(T,0,lt(E)):f(T,4,at(E));if(U(E))return f(T,0,lt(E));break}}return R}function pe(){const{currentType:E,offset:T,startLoc:R,endLoc:Q}=l;return l.lastType=E,l.lastOffset=T,l.lastStartLoc=R,l.lastEndLoc=Q,l.offset=o(),l.startLoc=s(),r.currentChar()===Fr?f(l,14):ie(r,l)}return{nextToken:pe,currentOffset:o,currentPosition:s,context:u}}const Hw="parser",Uw=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function jw(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 Bw(e={}){const t=e.location!==!1,{onError:n,onWarn:r}=e;function o(_,v,S,C,...L){const D=_.currentPosition();if(D.offset+=C,D.column+=C,n){const $=t?ol(S,D):null,F=Is(v,$,{domain:Hw,args:L});n(F)}}function s(_,v,S,C,...L){const D=_.currentPosition();if(D.offset+=C,D.column+=C,r){const $=t?ol(S,D):null;r(Ow(v,$,L))}}function i(_,v,S){const C={type:_};return t&&(C.start=v,C.end=v,C.loc={start:S,end:S}),C}function a(_,v,S,C){t&&(_.end=v,_.loc&&(_.loc.end=S))}function l(_,v){const S=_.context(),C=i(3,S.offset,S.startLoc);return C.value=v,a(C,_.currentOffset(),_.currentPosition()),C}function u(_,v){const S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(5,C,L);return D.index=parseInt(v,10),_.nextToken(),a(D,_.currentOffset(),_.currentPosition()),D}function m(_,v,S){const C=_.context(),{lastOffset:L,lastStartLoc:D}=C,$=i(4,L,D);return $.key=v,S===!0&&($.modulo=!0),_.nextToken(),a($,_.currentOffset(),_.currentPosition()),$}function d(_,v){const S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(9,C,L);return D.value=v.replace(Uw,jw),_.nextToken(),a(D,_.currentOffset(),_.currentPosition()),D}function f(_){const v=_.nextToken(),S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(8,C,L);return v.type!==12?(o(_,Le.UNEXPECTED_EMPTY_LINKED_MODIFIER,S.lastStartLoc,0),D.value="",a(D,C,L),{nextConsumeToken:v,node:D}):(v.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,Bn(v)),D.value=v.value||"",a(D,_.currentOffset(),_.currentPosition()),{node:D})}function p(_,v){const S=_.context(),C=i(7,S.offset,S.startLoc);return C.value=v,a(C,_.currentOffset(),_.currentPosition()),C}function h(_){const v=_.context(),S=i(6,v.offset,v.startLoc);let C=_.nextToken();if(C.type===9){const L=f(_);S.modifier=L.node,C=L.nextConsumeToken||_.nextToken()}switch(C.type!==10&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),C=_.nextToken(),C.type===2&&(C=_.nextToken()),C.type){case 11:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=p(_,C.value||"");break;case 5:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=m(_,C.value||"");break;case 6:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=u(_,C.value||"");break;case 7:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=d(_,C.value||"");break;default:{o(_,Le.UNEXPECTED_EMPTY_LINKED_KEY,v.lastStartLoc,0);const L=_.context(),D=i(7,L.offset,L.startLoc);return D.value="",a(D,L.offset,L.startLoc),S.key=D,a(S,L.offset,L.startLoc),{nextConsumeToken:C,node:S}}}return a(S,_.currentOffset(),_.currentPosition()),{node:S}}function g(_){const v=_.context(),S=v.currentType===1?_.currentOffset():v.offset,C=v.currentType===1?v.endLoc:v.startLoc,L=i(2,S,C);L.items=[];let D=null,$=null;do{const U=D||_.nextToken();switch(D=null,U.type){case 0:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(l(_,U.value||""));break;case 6:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(u(_,U.value||""));break;case 4:$=!0;break;case 5:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(m(_,U.value||"",!!$)),$&&(s(_,Ud.USE_MODULO_SYNTAX,v.lastStartLoc,0,Bn(U)),$=null);break;case 7:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(d(_,U.value||""));break;case 8:{const W=h(_);L.items.push(W.node),D=W.nextConsumeToken||null;break}}}while(v.currentType!==14&&v.currentType!==1);const F=v.currentType===1?v.lastOffset:_.currentOffset(),q=v.currentType===1?v.lastEndLoc:_.currentPosition();return a(L,F,q),L}function z(_,v,S,C){const L=_.context();let D=C.items.length===0;const $=i(1,v,S);$.cases=[],$.cases.push(C);do{const F=g(_);D||(D=F.items.length===0),$.cases.push(F)}while(L.currentType!==14);return D&&o(_,Le.MUST_HAVE_MESSAGES_IN_PLURAL,S,0),a($,_.currentOffset(),_.currentPosition()),$}function k(_){const v=_.context(),{offset:S,startLoc:C}=v,L=g(_);return v.currentType===14?L:z(_,S,C,L)}function w(_){const v=Vw(_,uy({},e)),S=v.context(),C=i(0,S.offset,S.startLoc);return t&&C.loc&&(C.loc.source=_),C.body=k(v),e.onCacheKey&&(C.cacheKey=e.onCacheKey(_)),S.currentType!==14&&o(v,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,_[S.offset]||""),a(C,v.currentOffset(),v.currentPosition()),C}return{parse:w}}function Bn(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 Ww(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:s=>(n.helpers.add(s),s)}}function kf(e,t){for(let n=0;nSf(n)),e}function Sf(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;na;function u(z,k){a.code+=z}function m(z,k=!0){const w=k?o:"";u(s?w+" ".repeat(z):w)}function d(z=!0){const k=++a.indentLevel;z&&m(k)}function f(z=!0){const k=--a.indentLevel;z&&m(k)}function p(){m(a.indentLevel)}return{context:l,push:u,indent:d,deindent:f,newline:p,helper:z=>`_${z}`,needIndent:()=>a.needIndent}}function Xw(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),Cs(e,t.key),t.modifier?(e.push(", "),Cs(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function Jw(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=Cf(t.mode)?t.mode:"normal",r=Cf(t.filename)?t.filename:"message.intl",o=!!t.sourceMap,s=t.breakLineCode!=null?t.breakLineCode:n==="arrow"?";":` -`,i=t.needIndent?t.needIndent:n!=="arrow",a=e.helpers||[],l=Yw(e,{mode:n,filename:r,sourceMap:o,breakLineCode:s,needIndent:i});l.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(i),a.length>0&&(l.push(`const { ${dy(a.map(d=>`${d}: _${d}`),", ")} } = ctx`),l.newline()),l.push("return "),Cs(l,e),l.deindent(i),l.push("}"),delete e.helpers;const{code:u,map:m}=l.context();return{ast:e,code:u,map:m?m.toJSON():void 0}};function nk(e,t={}){const n=uy({},t),r=!!n.jit,o=!!n.minify,s=n.optimize==null?!0:n.optimize,a=Bw(n).parse(e);return r?(s&&Gw(a),o&&ts(a),{ast:a,code:""}):(qw(a,n),tk(a,n))}/*! + */function xw(e,t,n){return{line:e,column:t,offset:n}}function ol(e,t,n){return{start:e,end:t}}const Ew=/\{([0-9a-zA-Z]+)\}/g;function ly(e,...t){return t.length===1&&$w(t[0])&&(t=t[0]),(!t||!t.hasOwnProperty)&&(t={}),e.replace(Ew,(n,r)=>t.hasOwnProperty(r)?t[r]:"")}const cy=Object.assign,Cf=e=>typeof e=="string",$w=e=>e!==null&&typeof e=="object";function uy(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}const Ud={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},Tw={[Ud.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};function Aw(e,t,...n){const r=ly(Tw[e],...n||[]),o={message:String(r),code:e};return t&&(o.location=t),o}const Le={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},Ow={[Le.EXPECTED_TOKEN]:"Expected token: '{0}'",[Le.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[Le.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[Le.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[Le.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[Le.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[Le.EMPTY_PLACEHOLDER]:"Empty placeholder",[Le.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[Le.INVALID_LINKED_FORMAT]:"Invalid linked format",[Le.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[Le.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[Le.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[Le.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[Le.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[Le.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function Is(e,t,n={}){const{domain:r,messages:o,args:s}=n,i=ly((o||Ow)[e]||"",...s||[]),a=new SyntaxError(String(i));return a.code=e,t&&(a.location=t),a.domain=r,a}function Pw(e){throw e}const zr=" ",Iw="\r",tn=` +`,Lw="\u2028",Nw="\u2029";function Dw(e){const t=e;let n=0,r=1,o=1,s=0;const i=L=>t[L]===Iw&&t[L+1]===tn,a=L=>t[L]===tn,l=L=>t[L]===Nw,u=L=>t[L]===Lw,m=L=>i(L)||a(L)||l(L)||u(L),d=()=>n,f=()=>r,p=()=>o,h=()=>s,g=L=>i(L)||l(L)||u(L)?tn:t[L],z=()=>g(n),k=()=>g(n+s);function w(){return s=0,m(n)&&(r++,o=0),i(n)&&n++,n++,o++,t[n]}function _(){return i(n+s)&&s++,s++,t[n+s]}function v(){n=0,r=1,o=1,s=0}function S(L=0){s=L}function C(){const L=n+s;for(;L!==n;)w();s=0}return{index:d,line:f,column:p,peekOffset:h,charAt:g,currentChar:z,currentPeek:k,next:w,peek:_,reset:v,resetPeek:S,skipToPeek:C}}const Fr=void 0,Rw=".",wf="'",Mw="tokenizer";function Fw(e,t={}){const n=t.location!==!1,r=Dw(e),o=()=>r.index(),s=()=>xw(r.line(),r.column(),r.index()),i=s(),a=o(),l={currentType:14,offset:a,startLoc:i,endLoc:i,lastType:14,lastOffset:a,lastStartLoc:i,lastEndLoc:i,braceNest:0,inLinked:!1,text:""},u=()=>l,{onError:m}=t;function d(E,T,R,...Q){const de=u();if(T.column+=R,T.offset+=R,m){const se=n?ol(de.startLoc,T):null,H=Is(E,se,{domain:Mw,args:Q});m(H)}}function f(E,T,R){E.endLoc=s(),E.currentType=T;const Q={type:T};return n&&(Q.loc=ol(E.startLoc,E.endLoc)),R!=null&&(Q.value=R),Q}const p=E=>f(E,14);function h(E,T){return E.currentChar()===T?(E.next(),T):(d(Le.EXPECTED_TOKEN,s(),0,T),"")}function g(E){let T="";for(;E.currentPeek()===zr||E.currentPeek()===tn;)T+=E.currentPeek(),E.peek();return T}function z(E){const T=g(E);return E.skipToPeek(),T}function k(E){if(E===Fr)return!1;const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T===95}function w(E){if(E===Fr)return!1;const T=E.charCodeAt(0);return T>=48&&T<=57}function _(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=k(E.currentPeek());return E.resetPeek(),Q}function v(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=E.currentPeek()==="-"?E.peek():E.currentPeek(),de=w(Q);return E.resetPeek(),de}function S(E,T){const{currentType:R}=T;if(R!==2)return!1;g(E);const Q=E.currentPeek()===wf;return E.resetPeek(),Q}function C(E,T){const{currentType:R}=T;if(R!==8)return!1;g(E);const Q=E.currentPeek()===".";return E.resetPeek(),Q}function L(E,T){const{currentType:R}=T;if(R!==9)return!1;g(E);const Q=k(E.currentPeek());return E.resetPeek(),Q}function D(E,T){const{currentType:R}=T;if(!(R===8||R===12))return!1;g(E);const Q=E.currentPeek()===":";return E.resetPeek(),Q}function $(E,T){const{currentType:R}=T;if(R!==10)return!1;const Q=()=>{const se=E.currentPeek();return se==="{"?k(E.peek()):se==="@"||se==="%"||se==="|"||se===":"||se==="."||se===zr||!se?!1:se===tn?(E.peek(),Q()):U(E,!1)},de=Q();return E.resetPeek(),de}function F(E){g(E);const T=E.currentPeek()==="|";return E.resetPeek(),T}function q(E){const T=g(E),R=E.currentPeek()==="%"&&E.peek()==="{";return E.resetPeek(),{isModulo:R,hasSpace:T.length>0}}function U(E,T=!0){const R=(de=!1,se="",H=!1)=>{const Z=E.currentPeek();return Z==="{"?se==="%"?!1:de:Z==="@"||!Z?se==="%"?!0:de:Z==="%"?(E.peek(),R(de,"%",!0)):Z==="|"?se==="%"||H?!0:!(se===zr||se===tn):Z===zr?(E.peek(),R(!0,zr,H)):Z===tn?(E.peek(),R(!0,tn,H)):!0},Q=R();return T&&E.resetPeek(),Q}function W(E,T){const R=E.currentChar();return R===Fr?Fr:T(R)?(E.next(),R):null}function ne(E){const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===95||T===36}function me(E){return W(E,ne)}function K(E){const T=E.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===95||T===36||T===45}function re(E){return W(E,K)}function ce(E){const T=E.charCodeAt(0);return T>=48&&T<=57}function Ne(E){return W(E,ce)}function it(E){const T=E.charCodeAt(0);return T>=48&&T<=57||T>=65&&T<=70||T>=97&&T<=102}function Ve(E){return W(E,it)}function He(E){let T="",R="";for(;T=Ne(E);)R+=T;return R}function at(E){z(E);const T=E.currentChar();return T!=="%"&&d(Le.EXPECTED_TOKEN,s(),0,T),E.next(),"%"}function lt(E){let T="";for(;;){const R=E.currentChar();if(R==="{"||R==="}"||R==="@"||R==="|"||!R)break;if(R==="%")if(U(E))T+=R,E.next();else break;else if(R===zr||R===tn)if(U(E))T+=R,E.next();else{if(F(E))break;T+=R,E.next()}else T+=R,E.next()}return T}function ut(E){z(E);let T="",R="";for(;T=re(E);)R+=T;return E.currentChar()===Fr&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R}function We(E){z(E);let T="";return E.currentChar()==="-"?(E.next(),T+=`-${He(E)}`):T+=He(E),E.currentChar()===Fr&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),T}function Y(E){return E!==wf&&E!==tn}function fe(E){z(E),h(E,"'");let T="",R="";for(;T=W(E,Y);)T==="\\"?R+=le(E):R+=T;const Q=E.currentChar();return Q===tn||Q===Fr?(d(Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,s(),0),Q===tn&&(E.next(),h(E,"'")),R):(h(E,"'"),R)}function le(E){const T=E.currentChar();switch(T){case"\\":case"'":return E.next(),`\\${T}`;case"u":return ge(E,T,4);case"U":return ge(E,T,6);default:return d(Le.UNKNOWN_ESCAPE_SEQUENCE,s(),0,T),""}}function ge(E,T,R){h(E,T);let Q="";for(let de=0;de{const Q=E.currentChar();return Q==="{"||Q==="%"||Q==="@"||Q==="|"||Q==="("||Q===")"||!Q||Q===zr?R:(R+=Q,E.next(),T(R))};return T("")}function j(E){z(E);const T=h(E,"|");return z(E),T}function te(E,T){let R=null;switch(E.currentChar()){case"{":return T.braceNest>=1&&d(Le.NOT_ALLOW_NEST_PLACEHOLDER,s(),0),E.next(),R=f(T,2,"{"),z(E),T.braceNest++,R;case"}":return T.braceNest>0&&T.currentType===2&&d(Le.EMPTY_PLACEHOLDER,s(),0),E.next(),R=f(T,3,"}"),T.braceNest--,T.braceNest>0&&z(E),T.inLinked&&T.braceNest===0&&(T.inLinked=!1),R;case"@":return T.braceNest>0&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=X(E,T)||p(T),T.braceNest=0,R;default:{let de=!0,se=!0,H=!0;if(F(E))return T.braceNest>0&&d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,R;if(T.braceNest>0&&(T.currentType===5||T.currentType===6||T.currentType===7))return d(Le.UNTERMINATED_CLOSING_BRACE,s(),0),T.braceNest=0,ie(E,T);if(de=_(E,T))return R=f(T,5,ut(E)),z(E),R;if(se=v(E,T))return R=f(T,6,We(E)),z(E),R;if(H=S(E,T))return R=f(T,7,fe(E)),z(E),R;if(!de&&!se&&!H)return R=f(T,13,Ge(E)),d(Le.INVALID_TOKEN_IN_PLACEHOLDER,s(),0,R.value),z(E),R;break}}return R}function X(E,T){const{currentType:R}=T;let Q=null;const de=E.currentChar();switch((R===8||R===9||R===12||R===10)&&(de===tn||de===zr)&&d(Le.INVALID_LINKED_FORMAT,s(),0),de){case"@":return E.next(),Q=f(T,8,"@"),T.inLinked=!0,Q;case".":return z(E),E.next(),f(T,9,".");case":":return z(E),E.next(),f(T,10,":");default:return F(E)?(Q=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,Q):C(E,T)||D(E,T)?(z(E),X(E,T)):L(E,T)?(z(E),f(T,12,A(E))):$(E,T)?(z(E),de==="{"?te(E,T)||Q:f(T,11,P(E))):(R===8&&d(Le.INVALID_LINKED_FORMAT,s(),0),T.braceNest=0,T.inLinked=!1,ie(E,T))}}function ie(E,T){let R={type:14};if(T.braceNest>0)return te(E,T)||p(T);if(T.inLinked)return X(E,T)||p(T);switch(E.currentChar()){case"{":return te(E,T)||p(T);case"}":return d(Le.UNBALANCED_CLOSING_BRACE,s(),0),E.next(),f(T,3,"}");case"@":return X(E,T)||p(T);default:{if(F(E))return R=f(T,1,j(E)),T.braceNest=0,T.inLinked=!1,R;const{isModulo:de,hasSpace:se}=q(E);if(de)return se?f(T,0,lt(E)):f(T,4,at(E));if(U(E))return f(T,0,lt(E));break}}return R}function pe(){const{currentType:E,offset:T,startLoc:R,endLoc:Q}=l;return l.lastType=E,l.lastOffset=T,l.lastStartLoc=R,l.lastEndLoc=Q,l.offset=o(),l.startLoc=s(),r.currentChar()===Fr?f(l,14):ie(r,l)}return{nextToken:pe,currentOffset:o,currentPosition:s,context:u}}const Vw="parser",Hw=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function Uw(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 jw(e={}){const t=e.location!==!1,{onError:n,onWarn:r}=e;function o(_,v,S,C,...L){const D=_.currentPosition();if(D.offset+=C,D.column+=C,n){const $=t?ol(S,D):null,F=Is(v,$,{domain:Vw,args:L});n(F)}}function s(_,v,S,C,...L){const D=_.currentPosition();if(D.offset+=C,D.column+=C,r){const $=t?ol(S,D):null;r(Aw(v,$,L))}}function i(_,v,S){const C={type:_};return t&&(C.start=v,C.end=v,C.loc={start:S,end:S}),C}function a(_,v,S,C){t&&(_.end=v,_.loc&&(_.loc.end=S))}function l(_,v){const S=_.context(),C=i(3,S.offset,S.startLoc);return C.value=v,a(C,_.currentOffset(),_.currentPosition()),C}function u(_,v){const S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(5,C,L);return D.index=parseInt(v,10),_.nextToken(),a(D,_.currentOffset(),_.currentPosition()),D}function m(_,v,S){const C=_.context(),{lastOffset:L,lastStartLoc:D}=C,$=i(4,L,D);return $.key=v,S===!0&&($.modulo=!0),_.nextToken(),a($,_.currentOffset(),_.currentPosition()),$}function d(_,v){const S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(9,C,L);return D.value=v.replace(Hw,Uw),_.nextToken(),a(D,_.currentOffset(),_.currentPosition()),D}function f(_){const v=_.nextToken(),S=_.context(),{lastOffset:C,lastStartLoc:L}=S,D=i(8,C,L);return v.type!==12?(o(_,Le.UNEXPECTED_EMPTY_LINKED_MODIFIER,S.lastStartLoc,0),D.value="",a(D,C,L),{nextConsumeToken:v,node:D}):(v.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,Bn(v)),D.value=v.value||"",a(D,_.currentOffset(),_.currentPosition()),{node:D})}function p(_,v){const S=_.context(),C=i(7,S.offset,S.startLoc);return C.value=v,a(C,_.currentOffset(),_.currentPosition()),C}function h(_){const v=_.context(),S=i(6,v.offset,v.startLoc);let C=_.nextToken();if(C.type===9){const L=f(_);S.modifier=L.node,C=L.nextConsumeToken||_.nextToken()}switch(C.type!==10&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),C=_.nextToken(),C.type===2&&(C=_.nextToken()),C.type){case 11:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=p(_,C.value||"");break;case 5:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=m(_,C.value||"");break;case 6:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=u(_,C.value||"");break;case 7:C.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(C)),S.key=d(_,C.value||"");break;default:{o(_,Le.UNEXPECTED_EMPTY_LINKED_KEY,v.lastStartLoc,0);const L=_.context(),D=i(7,L.offset,L.startLoc);return D.value="",a(D,L.offset,L.startLoc),S.key=D,a(S,L.offset,L.startLoc),{nextConsumeToken:C,node:S}}}return a(S,_.currentOffset(),_.currentPosition()),{node:S}}function g(_){const v=_.context(),S=v.currentType===1?_.currentOffset():v.offset,C=v.currentType===1?v.endLoc:v.startLoc,L=i(2,S,C);L.items=[];let D=null,$=null;do{const U=D||_.nextToken();switch(D=null,U.type){case 0:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(l(_,U.value||""));break;case 6:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(u(_,U.value||""));break;case 4:$=!0;break;case 5:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(m(_,U.value||"",!!$)),$&&(s(_,Ud.USE_MODULO_SYNTAX,v.lastStartLoc,0,Bn(U)),$=null);break;case 7:U.value==null&&o(_,Le.UNEXPECTED_LEXICAL_ANALYSIS,v.lastStartLoc,0,Bn(U)),L.items.push(d(_,U.value||""));break;case 8:{const W=h(_);L.items.push(W.node),D=W.nextConsumeToken||null;break}}}while(v.currentType!==14&&v.currentType!==1);const F=v.currentType===1?v.lastOffset:_.currentOffset(),q=v.currentType===1?v.lastEndLoc:_.currentPosition();return a(L,F,q),L}function z(_,v,S,C){const L=_.context();let D=C.items.length===0;const $=i(1,v,S);$.cases=[],$.cases.push(C);do{const F=g(_);D||(D=F.items.length===0),$.cases.push(F)}while(L.currentType!==14);return D&&o(_,Le.MUST_HAVE_MESSAGES_IN_PLURAL,S,0),a($,_.currentOffset(),_.currentPosition()),$}function k(_){const v=_.context(),{offset:S,startLoc:C}=v,L=g(_);return v.currentType===14?L:z(_,S,C,L)}function w(_){const v=Fw(_,cy({},e)),S=v.context(),C=i(0,S.offset,S.startLoc);return t&&C.loc&&(C.loc.source=_),C.body=k(v),e.onCacheKey&&(C.cacheKey=e.onCacheKey(_)),S.currentType!==14&&o(v,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,_[S.offset]||""),a(C,v.currentOffset(),v.currentPosition()),C}return{parse:w}}function Bn(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 Bw(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:s=>(n.helpers.add(s),s)}}function kf(e,t){for(let n=0;nSf(n)),e}function Sf(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;na;function u(z,k){a.code+=z}function m(z,k=!0){const w=k?o:"";u(s?w+" ".repeat(z):w)}function d(z=!0){const k=++a.indentLevel;z&&m(k)}function f(z=!0){const k=--a.indentLevel;z&&m(k)}function p(){m(a.indentLevel)}return{context:l,push:u,indent:d,deindent:f,newline:p,helper:z=>`_${z}`,needIndent:()=>a.needIndent}}function Yw(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),Cs(e,t.key),t.modifier?(e.push(", "),Cs(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function Xw(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=Cf(t.mode)?t.mode:"normal",r=Cf(t.filename)?t.filename:"message.intl",o=!!t.sourceMap,s=t.breakLineCode!=null?t.breakLineCode:n==="arrow"?";":` +`,i=t.needIndent?t.needIndent:n!=="arrow",a=e.helpers||[],l=Zw(e,{mode:n,filename:r,sourceMap:o,breakLineCode:s,needIndent:i});l.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(i),a.length>0&&(l.push(`const { ${uy(a.map(d=>`${d}: _${d}`),", ")} } = ctx`),l.newline()),l.push("return "),Cs(l,e),l.deindent(i),l.push("}"),delete e.helpers;const{code:u,map:m}=l.context();return{ast:e,code:u,map:m?m.toJSON():void 0}};function tk(e,t={}){const n=cy({},t),r=!!n.jit,o=!!n.minify,s=n.optimize==null?!0:n.optimize,a=jw(n).parse(e);return r?(s&&qw(a),o&&ts(a),{ast:a,code:""}):(Ww(a,n),ek(a,n))}/*! * core-base v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */function rk(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Hd().__INTLIFY_PROD_DEVTOOLS__=!1)}const po=[];po[0]={w:[0],i:[3,0],"[":[4],o:[7]};po[1]={w:[1],".":[2],"[":[4],o:[7]};po[2]={w:[2],i:[3,0],0:[3,0]};po[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};po[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};po[5]={"'":[4,0],o:8,l:[5,0]};po[6]={'"':[4,0],o:8,l:[6,0]};const ok=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function sk(e){return ok.test(e)}function ik(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 ak(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 lk(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:sk(t)?ik(t):"*"+t}function ck(e){const t=[];let n=-1,r=0,o=0,s,i,a,l,u,m,d;const f=[];f[0]=()=>{i===void 0?i=a:i+=a},f[1]=()=>{i!==void 0&&(t.push(i),i=void 0)},f[2]=()=>{f[0](),o++},f[3]=()=>{if(o>0)o--,r=4,f[0]();else{if(o=0,i===void 0||(i=lk(i),i===!1))return!1;f[1]()}};function p(){const h=e[n+1];if(r===5&&h==="'"||r===6&&h==='"')return n++,a="\\"+h,f[0](),!0}for(;r!==null;)if(n++,s=e[n],!(s==="\\"&&p())){if(l=ak(s),d=po[r],u=d[l]||d.l||8,u===8||(r=u[0],u[1]!==void 0&&(m=f[u[1]],m&&(a=s,m()===!1))))return;if(r===7)return t}}const xf=new Map;function uk(e,t){return rt(e)?e[t]:null}function dk(e,t){if(!rt(e))return null;let n=xf.get(t);if(n||(n=ck(t),n&&xf.set(t,n)),!n)return null;const r=n.length;let o=e,s=0;for(;se,fk=e=>"",pk="text",hk=e=>e.length===0?"":Sw(e),_k=kw;function Ef(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function gk(e){const t=Nt(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Nt(e.named.count)||Nt(e.named.n))?Nt(e.named.count)?e.named.count:Nt(e.named.n)?e.named.n:t:t}function yk(e,t){t.count||(t.count=e),t.n||(t.n=e)}function zk(e={}){const t=e.locale,n=gk(e),r=rt(e.pluralRules)&&Ce(t)&&At(e.pluralRules[t])?e.pluralRules[t]:Ef,o=rt(e.pluralRules)&&Ce(t)&&At(e.pluralRules[t])?Ef:void 0,s=k=>k[r(n,k.length,o)],i=e.list||[],a=k=>i[k],l=e.named||mt();Nt(e.pluralIndex)&&yk(n,l);const u=k=>l[k];function m(k){const w=At(e.messages)?e.messages(k):rt(e.messages)?e.messages[k]:!1;return w||(e.parent?e.parent.message(k):fk)}const d=k=>e.modifiers?e.modifiers[k]:mk,f=Je(e.processor)&&At(e.processor.normalize)?e.processor.normalize:hk,p=Je(e.processor)&&At(e.processor.interpolate)?e.processor.interpolate:_k,h=Je(e.processor)&&Ce(e.processor.type)?e.processor.type:pk,z={list:a,named:u,plural:s,linked:(k,...w)=>{const[_,v]=w;let S="text",C="";w.length===1?rt(_)?(C=_.modifier||C,S=_.type||S):Ce(_)&&(C=_||C):w.length===2&&(Ce(_)&&(C=_||C),Ce(v)&&(S=v||S));const L=m(k)(z),D=S==="vnode"&&Ht(L)&&C?L[0]:L;return C?d(C)(D,S):D},message:m,type:h,interpolate:p,normalize:f,values:Jt(mt(),i,l)};return z}let Ei=null;function vk(e){Ei=e}function bk(e,t,n){Ei&&Ei.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const Ck=wk("function:translate");function wk(e){return t=>Ei&&Ei.emit(e,t)}const my=Ud.__EXTEND_POINT__,yo=Bl(my),kk={NOT_FOUND_KEY:my,FALLBACK_TO_TRANSLATE:yo(),CANNOT_FORMAT_NUMBER:yo(),FALLBACK_TO_NUMBER_FORMAT:yo(),CANNOT_FORMAT_DATE:yo(),FALLBACK_TO_DATE_FORMAT:yo(),EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:yo(),__EXTEND_POINT__:yo()},fy=Le.__EXTEND_POINT__,zo=Bl(fy),fr={INVALID_ARGUMENT:fy,INVALID_DATE_ARGUMENT:zo(),INVALID_ISO_DATE_ARGUMENT:zo(),NOT_SUPPORT_NON_STRING_MESSAGE:zo(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:zo(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:zo(),NOT_SUPPORT_LOCALE_TYPE:zo(),__EXTEND_POINT__:zo()};function Sr(e){return Is(e,null,void 0)}function Bd(e,t){return t.locale!=null?$f(t.locale):$f(e.locale)}let wc;function $f(e){if(Ce(e))return e;if(At(e)){if(e.resolvedOnce&&wc!=null)return wc;if(e.constructor.name==="Function"){const t=e();if(ww(t))throw Sr(fr.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return wc=t}else throw Sr(fr.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw Sr(fr.NOT_SUPPORT_LOCALE_TYPE)}function Sk(e,t,n){return[...new Set([n,...Ht(t)?t:rt(t)?Object.keys(t):Ce(t)?[t]:[n]])]}function py(e,t,n){const r=Ce(n)?n:sl,o=e;o.__localeChainCache||(o.__localeChainCache=new Map);let s=o.__localeChainCache.get(r);if(!s){s=[];let i=[n];for(;Ht(i);)i=Tf(s,i,t);const a=Ht(t)||!Je(t)?t:t.default?t.default:null;i=Ce(a)?[a]:a,Ht(i)&&Tf(s,i,!1),o.__localeChainCache.set(r,s)}return s}function Tf(e,t,n){let r=!0;for(let o=0;o`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function Tk(){return{upper:(e,t)=>t==="text"&&Ce(e)?e.toUpperCase():t==="vnode"&&rt(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&Ce(e)?e.toLowerCase():t==="vnode"&&rt(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&Ce(e)?Of(e):t==="vnode"&&rt(e)&&"__v_isVNode"in e?Of(e.children):e}}let hy;function Ak(e){hy=e}let _y;function Ok(e){_y=e}let gy;function Pk(e){gy=e}let yy=null;const Ik=e=>{yy=e},Lk=()=>yy;let zy=null;const Pf=e=>{zy=e},Nk=()=>zy;let If=0;function Dk(e={}){const t=At(e.onWarn)?e.onWarn:xw,n=Ce(e.version)?e.version:$k,r=Ce(e.locale)||At(e.locale)?e.locale:sl,o=At(r)?sl:r,s=Ht(e.fallbackLocale)||Je(e.fallbackLocale)||Ce(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:o,i=Je(e.messages)?e.messages:kc(o),a=Je(e.datetimeFormats)?e.datetimeFormats:kc(o),l=Je(e.numberFormats)?e.numberFormats:kc(o),u=Jt(mt(),e.modifiers,Tk()),m=e.pluralRules||mt(),d=At(e.missing)?e.missing:null,f=wt(e.missingWarn)||rl(e.missingWarn)?e.missingWarn:!0,p=wt(e.fallbackWarn)||rl(e.fallbackWarn)?e.fallbackWarn:!0,h=!!e.fallbackFormat,g=!!e.unresolving,z=At(e.postTranslation)?e.postTranslation:null,k=Je(e.processor)?e.processor:null,w=wt(e.warnHtmlMessage)?e.warnHtmlMessage:!0,_=!!e.escapeParameter,v=At(e.messageCompiler)?e.messageCompiler:hy,S=At(e.messageResolver)?e.messageResolver:_y||uk,C=At(e.localeFallbacker)?e.localeFallbacker:gy||Sk,L=rt(e.fallbackContext)?e.fallbackContext:void 0,D=e,$=rt(D.__datetimeFormatters)?D.__datetimeFormatters:new Map,F=rt(D.__numberFormatters)?D.__numberFormatters:new Map,q=rt(D.__meta)?D.__meta:{};If++;const U={version:n,cid:If,locale:r,fallbackLocale:s,messages:i,modifiers:u,pluralRules:m,missing:d,missingWarn:f,fallbackWarn:p,fallbackFormat:h,unresolving:g,postTranslation:z,processor:k,warnHtmlMessage:w,escapeParameter:_,messageCompiler:v,messageResolver:S,localeFallbacker:C,fallbackContext:L,onWarn:t,__meta:q};return U.datetimeFormats=a,U.numberFormats=l,U.__datetimeFormatters=$,U.__numberFormatters=F,__INTLIFY_PROD_DEVTOOLS__&&bk(U,n,q),U}const kc=e=>({[e]:mt()});function Wd(e,t,n,r,o){const{missing:s,onWarn:i}=e;if(s!==null){const a=s(e,n,t,o);return Ce(a)?a:t}else return t}function Hs(e,t,n){const r=e;r.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function Rk(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function Mk(e,t){const n=t.indexOf(e);if(n===-1)return!1;for(let r=n+1;rFk(n,e)}function Fk(e,t){const n=Hk(t);if(n==null)throw $i(0);if(qd(n)===1){const s=jk(n);return e.plural(s.reduce((i,a)=>[...i,Lf(e,a)],[]))}else return Lf(e,n)}const Vk=["b","body"];function Hk(e){return ho(e,Vk)}const Uk=["c","cases"];function jk(e){return ho(e,Uk,[])}function Lf(e,t){const n=Wk(t);if(n!=null)return e.type==="text"?n:e.normalize([n]);{const r=Gk(t).reduce((o,s)=>[...o,Ou(e,s)],[]);return e.normalize(r)}}const Bk=["s","static"];function Wk(e){return ho(e,Bk)}const qk=["i","items"];function Gk(e){return ho(e,qk,[])}function Ou(e,t){const n=qd(t);switch(n){case 3:return ua(t,n);case 9:return ua(t,n);case 4:{const r=t;if(Xn(r,"k")&&r.k)return e.interpolate(e.named(r.k));if(Xn(r,"key")&&r.key)return e.interpolate(e.named(r.key));throw $i(n)}case 5:{const r=t;if(Xn(r,"i")&&Nt(r.i))return e.interpolate(e.list(r.i));if(Xn(r,"index")&&Nt(r.index))return e.interpolate(e.list(r.index));throw $i(n)}case 6:{const r=t,o=Xk(r),s=Qk(r);return e.linked(Ou(e,s),o?Ou(e,o):void 0,e.type)}case 7:return ua(t,n);case 8:return ua(t,n);default:throw new Error(`unhandled node on format message part: ${n}`)}}const Kk=["t","type"];function qd(e){return ho(e,Kk)}const Zk=["v","value"];function ua(e,t){const n=ho(e,Zk);if(n)return n;throw $i(t)}const Yk=["m","modifier"];function Xk(e){return ho(e,Yk)}const Jk=["k","key"];function Qk(e){const t=ho(e,Jk);if(t)return t;throw $i(6)}function ho(e,t,n){for(let r=0;re;let da=mt();function ws(e){return rt(e)&&qd(e)===0&&(Xn(e,"b")||Xn(e,"body"))}function tS(e,t={}){let n=!1;const r=t.onError||Iw;return t.onError=o=>{n=!0,r(o)},{...nk(e,t),detectError:n}}function nS(e,t){if(Ce(e)){wt(t.warnHtmlMessage)&&t.warnHtmlMessage;const r=(t.onCacheKey||eS)(e),o=da[r];if(o)return o;const{ast:s,detectError:i}=tS(e,{...t,location:!1,jit:!0}),a=Sc(s);return i?a:da[r]=a}else{const n=e.cacheKey;if(n){const r=da[n];return r||(da[n]=Sc(e))}else return Sc(e)}}const Nf=()=>"",On=e=>At(e);function Df(e,...t){const{fallbackFormat:n,postTranslation:r,unresolving:o,messageCompiler:s,fallbackLocale:i,messages:a}=e,[l,u]=Pu(...t),m=wt(u.missingWarn)?u.missingWarn:e.missingWarn,d=wt(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn,f=wt(u.escapeParameter)?u.escapeParameter:e.escapeParameter,p=!!u.resolvedMessage,h=Ce(u.default)||wt(u.default)?wt(u.default)?s?l:()=>l:u.default:n?s?l:()=>l:"",g=n||h!=="",z=Bd(e,u);f&&rS(u);let[k,w,_]=p?[l,z,a[z]||mt()]:vy(e,l,z,i,d,m),v=k,S=l;if(!p&&!(Ce(v)||ws(v)||On(v))&&g&&(v=h,S=v),!p&&(!(Ce(v)||ws(v)||On(v))||!Ce(w)))return o?Wl:l;let C=!1;const L=()=>{C=!0},D=On(v)?v:by(e,l,w,v,S,L);if(C)return v;const $=iS(e,w,_,u),F=zk($),q=oS(e,D,F),U=r?r(q,l):q;if(__INTLIFY_PROD_DEVTOOLS__){const W={timestamp:Date.now(),key:Ce(l)?l:On(v)?v.key:"",locale:w||(On(v)?v.locale:""),format:Ce(v)?v:On(v)?v.source:"",message:U};W.meta=Jt({},e.__meta,Lk()||{}),Ck(W)}return U}function rS(e){Ht(e.list)?e.list=e.list.map(t=>Ce(t)?bf(t):t):rt(e.named)&&Object.keys(e.named).forEach(t=>{Ce(e.named[t])&&(e.named[t]=bf(e.named[t]))})}function vy(e,t,n,r,o,s){const{messages:i,onWarn:a,messageResolver:l,localeFallbacker:u}=e,m=u(e,r,n);let d=mt(),f,p=null;const h="translate";for(let g=0;gr;return u.locale=n,u.key=t,u}const l=i(r,sS(e,n,o,r,a,s));return l.locale=n,l.key=t,l.source=r,l}function oS(e,t,n){return t(n)}function Pu(...e){const[t,n,r]=e,o=mt();if(!Ce(t)&&!Nt(t)&&!On(t)&&!ws(t))throw Sr(fr.INVALID_ARGUMENT);const s=Nt(t)?String(t):(On(t),t);return Nt(n)?o.plural=n:Ce(n)?o.default=n:Je(n)&&!jl(n)?o.named=n:Ht(n)&&(o.list=n),Nt(r)?o.plural=r:Ce(r)?o.default=r:Je(r)&&Jt(o,r),[s,o]}function sS(e,t,n,r,o,s){return{locale:t,key:n,warnHtmlMessage:o,onError:i=>{throw s&&s(i),i},onCacheKey:i=>yw(t,n,i)}}function iS(e,t,n,r){const{modifiers:o,pluralRules:s,messageResolver:i,fallbackLocale:a,fallbackWarn:l,missingWarn:u,fallbackContext:m}=e,f={locale:t,modifiers:o,pluralRules:s,messages:p=>{let h=i(n,p);if(h==null&&m){const[,,g]=vy(m,p,t,a,l,u);h=i(g,p)}if(Ce(h)||ws(h)){let g=!1;const k=by(e,p,t,h,p,()=>{g=!0});return g?Nf:k}else return On(h)?h:Nf}};return e.processor&&(f.processor=e.processor),r.list&&(f.list=r.list),r.named&&(f.named=r.named),Nt(r.plural)&&(f.pluralIndex=r.plural),f}function Rf(e,...t){const{datetimeFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__datetimeFormatters:a}=e,[l,u,m,d]=Iu(...t),f=wt(m.missingWarn)?m.missingWarn:e.missingWarn;wt(m.fallbackWarn)?m.fallbackWarn:e.fallbackWarn;const p=!!m.part,h=Bd(e,m),g=i(e,o,h);if(!Ce(l)||l==="")return new Intl.DateTimeFormat(h,d).format(u);let z={},k,w=null;const _="datetime format";for(let C=0;C{Cy.includes(l)?i[l]=n[l]:s[l]=n[l]}),Ce(r)?s.locale=r:Je(r)&&(i=r),Je(o)&&(i=o),[s.key||"",a,s,i]}function Mf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__datetimeFormatters.has(s)&&r.__datetimeFormatters.delete(s)}}function Ff(e,...t){const{numberFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__numberFormatters:a}=e,[l,u,m,d]=Lu(...t),f=wt(m.missingWarn)?m.missingWarn:e.missingWarn;wt(m.fallbackWarn)?m.fallbackWarn:e.fallbackWarn;const p=!!m.part,h=Bd(e,m),g=i(e,o,h);if(!Ce(l)||l==="")return new Intl.NumberFormat(h,d).format(u);let z={},k,w=null;const _="number format";for(let C=0;C{wy.includes(l)?i[l]=n[l]:s[l]=n[l]}),Ce(r)?s.locale=r:Je(r)&&(i=r),Je(o)&&(i=o),[s.key||"",a,s,i]}function Vf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__numberFormatters.has(s)&&r.__numberFormatters.delete(s)}}rk();/*! + */function nk(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Hd().__INTLIFY_PROD_DEVTOOLS__=!1)}const po=[];po[0]={w:[0],i:[3,0],"[":[4],o:[7]};po[1]={w:[1],".":[2],"[":[4],o:[7]};po[2]={w:[2],i:[3,0],0:[3,0]};po[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};po[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};po[5]={"'":[4,0],o:8,l:[5,0]};po[6]={'"':[4,0],o:8,l:[6,0]};const rk=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function ok(e){return rk.test(e)}function sk(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 ik(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 ak(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:ok(t)?sk(t):"*"+t}function lk(e){const t=[];let n=-1,r=0,o=0,s,i,a,l,u,m,d;const f=[];f[0]=()=>{i===void 0?i=a:i+=a},f[1]=()=>{i!==void 0&&(t.push(i),i=void 0)},f[2]=()=>{f[0](),o++},f[3]=()=>{if(o>0)o--,r=4,f[0]();else{if(o=0,i===void 0||(i=ak(i),i===!1))return!1;f[1]()}};function p(){const h=e[n+1];if(r===5&&h==="'"||r===6&&h==='"')return n++,a="\\"+h,f[0](),!0}for(;r!==null;)if(n++,s=e[n],!(s==="\\"&&p())){if(l=ik(s),d=po[r],u=d[l]||d.l||8,u===8||(r=u[0],u[1]!==void 0&&(m=f[u[1]],m&&(a=s,m()===!1))))return;if(r===7)return t}}const xf=new Map;function ck(e,t){return rt(e)?e[t]:null}function uk(e,t){if(!rt(e))return null;let n=xf.get(t);if(n||(n=lk(t),n&&xf.set(t,n)),!n)return null;const r=n.length;let o=e,s=0;for(;se,mk=e=>"",fk="text",pk=e=>e.length===0?"":kw(e),hk=ww;function Ef(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function _k(e){const t=Nt(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Nt(e.named.count)||Nt(e.named.n))?Nt(e.named.count)?e.named.count:Nt(e.named.n)?e.named.n:t:t}function gk(e,t){t.count||(t.count=e),t.n||(t.n=e)}function yk(e={}){const t=e.locale,n=_k(e),r=rt(e.pluralRules)&&Ce(t)&&At(e.pluralRules[t])?e.pluralRules[t]:Ef,o=rt(e.pluralRules)&&Ce(t)&&At(e.pluralRules[t])?Ef:void 0,s=k=>k[r(n,k.length,o)],i=e.list||[],a=k=>i[k],l=e.named||mt();Nt(e.pluralIndex)&&gk(n,l);const u=k=>l[k];function m(k){const w=At(e.messages)?e.messages(k):rt(e.messages)?e.messages[k]:!1;return w||(e.parent?e.parent.message(k):mk)}const d=k=>e.modifiers?e.modifiers[k]:dk,f=Je(e.processor)&&At(e.processor.normalize)?e.processor.normalize:pk,p=Je(e.processor)&&At(e.processor.interpolate)?e.processor.interpolate:hk,h=Je(e.processor)&&Ce(e.processor.type)?e.processor.type:fk,z={list:a,named:u,plural:s,linked:(k,...w)=>{const[_,v]=w;let S="text",C="";w.length===1?rt(_)?(C=_.modifier||C,S=_.type||S):Ce(_)&&(C=_||C):w.length===2&&(Ce(_)&&(C=_||C),Ce(v)&&(S=v||S));const L=m(k)(z),D=S==="vnode"&&Ht(L)&&C?L[0]:L;return C?d(C)(D,S):D},message:m,type:h,interpolate:p,normalize:f,values:Jt(mt(),i,l)};return z}let Ei=null;function zk(e){Ei=e}function vk(e,t,n){Ei&&Ei.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const bk=Ck("function:translate");function Ck(e){return t=>Ei&&Ei.emit(e,t)}const dy=Ud.__EXTEND_POINT__,yo=Bl(dy),wk={NOT_FOUND_KEY:dy,FALLBACK_TO_TRANSLATE:yo(),CANNOT_FORMAT_NUMBER:yo(),FALLBACK_TO_NUMBER_FORMAT:yo(),CANNOT_FORMAT_DATE:yo(),FALLBACK_TO_DATE_FORMAT:yo(),EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:yo(),__EXTEND_POINT__:yo()},my=Le.__EXTEND_POINT__,zo=Bl(my),fr={INVALID_ARGUMENT:my,INVALID_DATE_ARGUMENT:zo(),INVALID_ISO_DATE_ARGUMENT:zo(),NOT_SUPPORT_NON_STRING_MESSAGE:zo(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:zo(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:zo(),NOT_SUPPORT_LOCALE_TYPE:zo(),__EXTEND_POINT__:zo()};function Sr(e){return Is(e,null,void 0)}function Bd(e,t){return t.locale!=null?$f(t.locale):$f(e.locale)}let wc;function $f(e){if(Ce(e))return e;if(At(e)){if(e.resolvedOnce&&wc!=null)return wc;if(e.constructor.name==="Function"){const t=e();if(Cw(t))throw Sr(fr.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return wc=t}else throw Sr(fr.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw Sr(fr.NOT_SUPPORT_LOCALE_TYPE)}function kk(e,t,n){return[...new Set([n,...Ht(t)?t:rt(t)?Object.keys(t):Ce(t)?[t]:[n]])]}function fy(e,t,n){const r=Ce(n)?n:sl,o=e;o.__localeChainCache||(o.__localeChainCache=new Map);let s=o.__localeChainCache.get(r);if(!s){s=[];let i=[n];for(;Ht(i);)i=Tf(s,i,t);const a=Ht(t)||!Je(t)?t:t.default?t.default:null;i=Ce(a)?[a]:a,Ht(i)&&Tf(s,i,!1),o.__localeChainCache.set(r,s)}return s}function Tf(e,t,n){let r=!0;for(let o=0;o`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function $k(){return{upper:(e,t)=>t==="text"&&Ce(e)?e.toUpperCase():t==="vnode"&&rt(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&Ce(e)?e.toLowerCase():t==="vnode"&&rt(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&Ce(e)?Of(e):t==="vnode"&&rt(e)&&"__v_isVNode"in e?Of(e.children):e}}let py;function Tk(e){py=e}let hy;function Ak(e){hy=e}let _y;function Ok(e){_y=e}let gy=null;const Pk=e=>{gy=e},Ik=()=>gy;let yy=null;const Pf=e=>{yy=e},Lk=()=>yy;let If=0;function Nk(e={}){const t=At(e.onWarn)?e.onWarn:Sw,n=Ce(e.version)?e.version:Ek,r=Ce(e.locale)||At(e.locale)?e.locale:sl,o=At(r)?sl:r,s=Ht(e.fallbackLocale)||Je(e.fallbackLocale)||Ce(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:o,i=Je(e.messages)?e.messages:kc(o),a=Je(e.datetimeFormats)?e.datetimeFormats:kc(o),l=Je(e.numberFormats)?e.numberFormats:kc(o),u=Jt(mt(),e.modifiers,$k()),m=e.pluralRules||mt(),d=At(e.missing)?e.missing:null,f=wt(e.missingWarn)||rl(e.missingWarn)?e.missingWarn:!0,p=wt(e.fallbackWarn)||rl(e.fallbackWarn)?e.fallbackWarn:!0,h=!!e.fallbackFormat,g=!!e.unresolving,z=At(e.postTranslation)?e.postTranslation:null,k=Je(e.processor)?e.processor:null,w=wt(e.warnHtmlMessage)?e.warnHtmlMessage:!0,_=!!e.escapeParameter,v=At(e.messageCompiler)?e.messageCompiler:py,S=At(e.messageResolver)?e.messageResolver:hy||ck,C=At(e.localeFallbacker)?e.localeFallbacker:_y||kk,L=rt(e.fallbackContext)?e.fallbackContext:void 0,D=e,$=rt(D.__datetimeFormatters)?D.__datetimeFormatters:new Map,F=rt(D.__numberFormatters)?D.__numberFormatters:new Map,q=rt(D.__meta)?D.__meta:{};If++;const U={version:n,cid:If,locale:r,fallbackLocale:s,messages:i,modifiers:u,pluralRules:m,missing:d,missingWarn:f,fallbackWarn:p,fallbackFormat:h,unresolving:g,postTranslation:z,processor:k,warnHtmlMessage:w,escapeParameter:_,messageCompiler:v,messageResolver:S,localeFallbacker:C,fallbackContext:L,onWarn:t,__meta:q};return U.datetimeFormats=a,U.numberFormats=l,U.__datetimeFormatters=$,U.__numberFormatters=F,__INTLIFY_PROD_DEVTOOLS__&&vk(U,n,q),U}const kc=e=>({[e]:mt()});function Wd(e,t,n,r,o){const{missing:s,onWarn:i}=e;if(s!==null){const a=s(e,n,t,o);return Ce(a)?a:t}else return t}function Hs(e,t,n){const r=e;r.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function Dk(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function Rk(e,t){const n=t.indexOf(e);if(n===-1)return!1;for(let r=n+1;rMk(n,e)}function Mk(e,t){const n=Vk(t);if(n==null)throw $i(0);if(qd(n)===1){const s=Uk(n);return e.plural(s.reduce((i,a)=>[...i,Lf(e,a)],[]))}else return Lf(e,n)}const Fk=["b","body"];function Vk(e){return ho(e,Fk)}const Hk=["c","cases"];function Uk(e){return ho(e,Hk,[])}function Lf(e,t){const n=Bk(t);if(n!=null)return e.type==="text"?n:e.normalize([n]);{const r=qk(t).reduce((o,s)=>[...o,Ou(e,s)],[]);return e.normalize(r)}}const jk=["s","static"];function Bk(e){return ho(e,jk)}const Wk=["i","items"];function qk(e){return ho(e,Wk,[])}function Ou(e,t){const n=qd(t);switch(n){case 3:return ua(t,n);case 9:return ua(t,n);case 4:{const r=t;if(Xn(r,"k")&&r.k)return e.interpolate(e.named(r.k));if(Xn(r,"key")&&r.key)return e.interpolate(e.named(r.key));throw $i(n)}case 5:{const r=t;if(Xn(r,"i")&&Nt(r.i))return e.interpolate(e.list(r.i));if(Xn(r,"index")&&Nt(r.index))return e.interpolate(e.list(r.index));throw $i(n)}case 6:{const r=t,o=Yk(r),s=Jk(r);return e.linked(Ou(e,s),o?Ou(e,o):void 0,e.type)}case 7:return ua(t,n);case 8:return ua(t,n);default:throw new Error(`unhandled node on format message part: ${n}`)}}const Gk=["t","type"];function qd(e){return ho(e,Gk)}const Kk=["v","value"];function ua(e,t){const n=ho(e,Kk);if(n)return n;throw $i(t)}const Zk=["m","modifier"];function Yk(e){return ho(e,Zk)}const Xk=["k","key"];function Jk(e){const t=ho(e,Xk);if(t)return t;throw $i(6)}function ho(e,t,n){for(let r=0;re;let da=mt();function ws(e){return rt(e)&&qd(e)===0&&(Xn(e,"b")||Xn(e,"body"))}function eS(e,t={}){let n=!1;const r=t.onError||Pw;return t.onError=o=>{n=!0,r(o)},{...tk(e,t),detectError:n}}function tS(e,t){if(Ce(e)){wt(t.warnHtmlMessage)&&t.warnHtmlMessage;const r=(t.onCacheKey||Qk)(e),o=da[r];if(o)return o;const{ast:s,detectError:i}=eS(e,{...t,location:!1,jit:!0}),a=Sc(s);return i?a:da[r]=a}else{const n=e.cacheKey;if(n){const r=da[n];return r||(da[n]=Sc(e))}else return Sc(e)}}const Nf=()=>"",On=e=>At(e);function Df(e,...t){const{fallbackFormat:n,postTranslation:r,unresolving:o,messageCompiler:s,fallbackLocale:i,messages:a}=e,[l,u]=Pu(...t),m=wt(u.missingWarn)?u.missingWarn:e.missingWarn,d=wt(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn,f=wt(u.escapeParameter)?u.escapeParameter:e.escapeParameter,p=!!u.resolvedMessage,h=Ce(u.default)||wt(u.default)?wt(u.default)?s?l:()=>l:u.default:n?s?l:()=>l:"",g=n||h!=="",z=Bd(e,u);f&&nS(u);let[k,w,_]=p?[l,z,a[z]||mt()]:zy(e,l,z,i,d,m),v=k,S=l;if(!p&&!(Ce(v)||ws(v)||On(v))&&g&&(v=h,S=v),!p&&(!(Ce(v)||ws(v)||On(v))||!Ce(w)))return o?Wl:l;let C=!1;const L=()=>{C=!0},D=On(v)?v:vy(e,l,w,v,S,L);if(C)return v;const $=sS(e,w,_,u),F=yk($),q=rS(e,D,F),U=r?r(q,l):q;if(__INTLIFY_PROD_DEVTOOLS__){const W={timestamp:Date.now(),key:Ce(l)?l:On(v)?v.key:"",locale:w||(On(v)?v.locale:""),format:Ce(v)?v:On(v)?v.source:"",message:U};W.meta=Jt({},e.__meta,Ik()||{}),bk(W)}return U}function nS(e){Ht(e.list)?e.list=e.list.map(t=>Ce(t)?bf(t):t):rt(e.named)&&Object.keys(e.named).forEach(t=>{Ce(e.named[t])&&(e.named[t]=bf(e.named[t]))})}function zy(e,t,n,r,o,s){const{messages:i,onWarn:a,messageResolver:l,localeFallbacker:u}=e,m=u(e,r,n);let d=mt(),f,p=null;const h="translate";for(let g=0;gr;return u.locale=n,u.key=t,u}const l=i(r,oS(e,n,o,r,a,s));return l.locale=n,l.key=t,l.source=r,l}function rS(e,t,n){return t(n)}function Pu(...e){const[t,n,r]=e,o=mt();if(!Ce(t)&&!Nt(t)&&!On(t)&&!ws(t))throw Sr(fr.INVALID_ARGUMENT);const s=Nt(t)?String(t):(On(t),t);return Nt(n)?o.plural=n:Ce(n)?o.default=n:Je(n)&&!jl(n)?o.named=n:Ht(n)&&(o.list=n),Nt(r)?o.plural=r:Ce(r)?o.default=r:Je(r)&&Jt(o,r),[s,o]}function oS(e,t,n,r,o,s){return{locale:t,key:n,warnHtmlMessage:o,onError:i=>{throw s&&s(i),i},onCacheKey:i=>gw(t,n,i)}}function sS(e,t,n,r){const{modifiers:o,pluralRules:s,messageResolver:i,fallbackLocale:a,fallbackWarn:l,missingWarn:u,fallbackContext:m}=e,f={locale:t,modifiers:o,pluralRules:s,messages:p=>{let h=i(n,p);if(h==null&&m){const[,,g]=zy(m,p,t,a,l,u);h=i(g,p)}if(Ce(h)||ws(h)){let g=!1;const k=vy(e,p,t,h,p,()=>{g=!0});return g?Nf:k}else return On(h)?h:Nf}};return e.processor&&(f.processor=e.processor),r.list&&(f.list=r.list),r.named&&(f.named=r.named),Nt(r.plural)&&(f.pluralIndex=r.plural),f}function Rf(e,...t){const{datetimeFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__datetimeFormatters:a}=e,[l,u,m,d]=Iu(...t),f=wt(m.missingWarn)?m.missingWarn:e.missingWarn;wt(m.fallbackWarn)?m.fallbackWarn:e.fallbackWarn;const p=!!m.part,h=Bd(e,m),g=i(e,o,h);if(!Ce(l)||l==="")return new Intl.DateTimeFormat(h,d).format(u);let z={},k,w=null;const _="datetime format";for(let C=0;C{by.includes(l)?i[l]=n[l]:s[l]=n[l]}),Ce(r)?s.locale=r:Je(r)&&(i=r),Je(o)&&(i=o),[s.key||"",a,s,i]}function Mf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__datetimeFormatters.has(s)&&r.__datetimeFormatters.delete(s)}}function Ff(e,...t){const{numberFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__numberFormatters:a}=e,[l,u,m,d]=Lu(...t),f=wt(m.missingWarn)?m.missingWarn:e.missingWarn;wt(m.fallbackWarn)?m.fallbackWarn:e.fallbackWarn;const p=!!m.part,h=Bd(e,m),g=i(e,o,h);if(!Ce(l)||l==="")return new Intl.NumberFormat(h,d).format(u);let z={},k,w=null;const _="number format";for(let C=0;C{Cy.includes(l)?i[l]=n[l]:s[l]=n[l]}),Ce(r)?s.locale=r:Je(r)&&(i=r),Je(o)&&(i=o),[s.key||"",a,s,i]}function Vf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__numberFormatters.has(s)&&r.__numberFormatters.delete(s)}}nk();/*! * vue-i18n v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */const aS="9.14.2";function lS(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Hd().__INTLIFY_PROD_DEVTOOLS__=!1)}const ky=kk.__EXTEND_POINT__,vr=Bl(ky);vr(),vr(),vr(),vr(),vr(),vr(),vr(),vr(),vr();const Sy=fr.__EXTEND_POINT__,sn=Bl(Sy),Fn={UNEXPECTED_RETURN_TYPE:Sy,INVALID_ARGUMENT:sn(),MUST_BE_CALL_SETUP_TOP:sn(),NOT_INSTALLED:sn(),NOT_AVAILABLE_IN_LEGACY_MODE:sn(),REQUIRED_VALUE:sn(),INVALID_VALUE:sn(),CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN:sn(),NOT_INSTALLED_WITH_PROVIDE:sn(),UNEXPECTED_ERROR:sn(),NOT_COMPATIBLE_LEGACY_VUE_I18N:sn(),BRIDGE_SUPPORT_VUE_2_ONLY:sn(),MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION:sn(),NOT_AVAILABLE_COMPOSITION_IN_LEGACY:sn(),__EXTEND_POINT__:sn()};function er(e,...t){return Is(e,null,void 0)}const Nu=fo("__translateVNode"),Du=fo("__datetimeParts"),Ru=fo("__numberParts"),cS=fo("__setPluralRules"),uS=fo("__injectWithOption"),Mu=fo("__dispose");function Ti(e){if(!rt(e))return e;for(const t in e)if(Xn(e,t))if(!t.includes("."))rt(e[t])&&Ti(e[t]);else{const n=t.split("."),r=n.length-1;let o=e,s=!1;for(let i=0;i{if("locale"in a&&"resource"in a){const{locale:l,resource:u}=a;l?(i[l]=i[l]||mt(),Pa(u,i[l])):Pa(u,i)}else Ce(a)&&Pa(JSON.parse(a),i)}),o==null&&s)for(const a in i)Xn(i,a)&&Ti(i[a]);return i}function Ey(e){return e.type}function dS(e,t,n){let r=rt(t.messages)?t.messages:mt();"__i18nGlobal"in n&&(r=xy(e.locale.value,{messages:r,__i18n:n.__i18nGlobal}));const o=Object.keys(r);o.length&&o.forEach(s=>{e.mergeLocaleMessage(s,r[s])});{if(rt(t.datetimeFormats)){const s=Object.keys(t.datetimeFormats);s.length&&s.forEach(i=>{e.mergeDateTimeFormat(i,t.datetimeFormats[i])})}if(rt(t.numberFormats)){const s=Object.keys(t.numberFormats);s.length&&s.forEach(i=>{e.mergeNumberFormat(i,t.numberFormats[i])})}}}function Hf(e){return b(Tr,null,e,0)}const Uf="__INTLIFY_META__",jf=()=>[],mS=()=>!1;let Bf=0;function Wf(e){return(t,n,r,o)=>e(n,r,Un()||void 0,o)}const fS=()=>{const e=Un();let t=null;return e&&(t=Ey(e)[Uf])?{[Uf]:t}:null};function $y(e={},t){const{__root:n,__injectWithOption:r}=e,o=n===void 0,s=e.flatJson,i=nl?Ln:gd,a=!!e.translateExistCompatible;let l=wt(e.inheritLocale)?e.inheritLocale:!0;const u=i(n&&l?n.locale.value:Ce(e.locale)?e.locale:sl),m=i(n&&l?n.fallbackLocale.value:Ce(e.fallbackLocale)||Ht(e.fallbackLocale)||Je(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:u.value),d=i(xy(u.value,e)),f=i(Je(e.datetimeFormats)?e.datetimeFormats:{[u.value]:{}}),p=i(Je(e.numberFormats)?e.numberFormats:{[u.value]:{}});let h=n?n.missingWarn:wt(e.missingWarn)||rl(e.missingWarn)?e.missingWarn:!0,g=n?n.fallbackWarn:wt(e.fallbackWarn)||rl(e.fallbackWarn)?e.fallbackWarn:!0,z=n?n.fallbackRoot:wt(e.fallbackRoot)?e.fallbackRoot:!0,k=!!e.fallbackFormat,w=At(e.missing)?e.missing:null,_=At(e.missing)?Wf(e.missing):null,v=At(e.postTranslation)?e.postTranslation:null,S=n?n.warnHtmlMessage:wt(e.warnHtmlMessage)?e.warnHtmlMessage:!0,C=!!e.escapeParameter;const L=n?n.modifiers:Je(e.modifiers)?e.modifiers:{};let D=e.pluralRules||n&&n.pluralRules,$;$=(()=>{o&&Pf(null);const H={version:aS,locale:u.value,fallbackLocale:m.value,messages:d.value,modifiers:L,pluralRules:D,missing:_===null?void 0:_,missingWarn:h,fallbackWarn:g,fallbackFormat:k,unresolving:!0,postTranslation:v===null?void 0:v,warnHtmlMessage:S,escapeParameter:C,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};H.datetimeFormats=f.value,H.numberFormats=p.value,H.__datetimeFormatters=Je($)?$.__datetimeFormatters:void 0,H.__numberFormatters=Je($)?$.__numberFormatters:void 0;const Z=Dk(H);return o&&Pf(Z),Z})(),Hs($,u.value,m.value);function q(){return[u.value,m.value,d.value,f.value,p.value]}const U=jt({get:()=>u.value,set:H=>{u.value=H,$.locale=u.value}}),W=jt({get:()=>m.value,set:H=>{m.value=H,$.fallbackLocale=m.value,Hs($,u.value,H)}}),ne=jt(()=>d.value),me=jt(()=>f.value),K=jt(()=>p.value);function re(){return At(v)?v:null}function ce(H){v=H,$.postTranslation=H}function Ne(){return w}function it(H){H!==null&&(_=Wf(H)),w=H,$.missing=_}const Ve=(H,Z,Se,M,V,G)=>{q();let oe;try{__INTLIFY_PROD_DEVTOOLS__,o||($.fallbackContext=n?Nk():void 0),oe=H($)}finally{__INTLIFY_PROD_DEVTOOLS__,o||($.fallbackContext=void 0)}if(Se!=="translate exists"&&Nt(oe)&&oe===Wl||Se==="translate exists"&&!oe){const[ye,$e]=Z();return n&&z?M(n):V(ye)}else{if(G(oe))return oe;throw er(Fn.UNEXPECTED_RETURN_TYPE)}};function He(...H){return Ve(Z=>Reflect.apply(Df,null,[Z,...H]),()=>Pu(...H),"translate",Z=>Reflect.apply(Z.t,Z,[...H]),Z=>Z,Z=>Ce(Z))}function at(...H){const[Z,Se,M]=H;if(M&&!rt(M))throw er(Fn.INVALID_ARGUMENT);return He(Z,Se,Jt({resolvedMessage:!0},M||{}))}function lt(...H){return Ve(Z=>Reflect.apply(Rf,null,[Z,...H]),()=>Iu(...H),"datetime format",Z=>Reflect.apply(Z.d,Z,[...H]),()=>Af,Z=>Ce(Z))}function ut(...H){return Ve(Z=>Reflect.apply(Ff,null,[Z,...H]),()=>Lu(...H),"number format",Z=>Reflect.apply(Z.n,Z,[...H]),()=>Af,Z=>Ce(Z))}function We(H){return H.map(Z=>Ce(Z)||Nt(Z)||wt(Z)?Hf(String(Z)):Z)}const fe={normalize:We,interpolate:H=>H,type:"vnode"};function le(...H){return Ve(Z=>{let Se;const M=Z;try{M.processor=fe,Se=Reflect.apply(Df,null,[M,...H])}finally{M.processor=null}return Se},()=>Pu(...H),"translate",Z=>Z[Nu](...H),Z=>[Hf(Z)],Z=>Ht(Z))}function ge(...H){return Ve(Z=>Reflect.apply(Ff,null,[Z,...H]),()=>Lu(...H),"number format",Z=>Z[Ru](...H),jf,Z=>Ce(Z)||Ht(Z))}function Ue(...H){return Ve(Z=>Reflect.apply(Rf,null,[Z,...H]),()=>Iu(...H),"datetime format",Z=>Z[Du](...H),jf,Z=>Ce(Z)||Ht(Z))}function Ge(H){D=H,$.pluralRules=D}function A(H,Z){return Ve(()=>{if(!H)return!1;const Se=Ce(Z)?Z:u.value,M=te(Se),V=$.messageResolver(M,H);return a?V!=null:ws(V)||On(V)||Ce(V)},()=>[H],"translate exists",Se=>Reflect.apply(Se.te,Se,[H,Z]),mS,Se=>wt(Se))}function P(H){let Z=null;const Se=py($,m.value,u.value);for(let M=0;M{l&&(u.value=H,$.locale=H,Hs($,u.value,m.value))}),Dn(n.fallbackLocale,H=>{l&&(m.value=H,$.fallbackLocale=H,Hs($,u.value,m.value))}));const se={id:Bf,locale:U,fallbackLocale:W,get inheritLocale(){return l},set inheritLocale(H){l=H,H&&n&&(u.value=n.locale.value,m.value=n.fallbackLocale.value,Hs($,u.value,m.value))},get availableLocales(){return Object.keys(d.value).sort()},messages:ne,get modifiers(){return L},get pluralRules(){return D||{}},get isGlobal(){return o},get missingWarn(){return h},set missingWarn(H){h=H,$.missingWarn=h},get fallbackWarn(){return g},set fallbackWarn(H){g=H,$.fallbackWarn=g},get fallbackRoot(){return z},set fallbackRoot(H){z=H},get fallbackFormat(){return k},set fallbackFormat(H){k=H,$.fallbackFormat=k},get warnHtmlMessage(){return S},set warnHtmlMessage(H){S=H,$.warnHtmlMessage=H},get escapeParameter(){return C},set escapeParameter(H){C=H,$.escapeParameter=H},t:He,getLocaleMessage:te,setLocaleMessage:X,mergeLocaleMessage:ie,getPostTranslationHandler:re,setPostTranslationHandler:ce,getMissingHandler:Ne,setMissingHandler:it,[cS]:Ge};return se.datetimeFormats=me,se.numberFormats=K,se.rt=at,se.te=A,se.tm=j,se.d=lt,se.n=ut,se.getDateTimeFormat=pe,se.setDateTimeFormat=E,se.mergeDateTimeFormat=T,se.getNumberFormat=R,se.setNumberFormat=Q,se.mergeNumberFormat=de,se[uS]=r,se[Nu]=le,se[Du]=Ue,se[Ru]=ge,se}const Gd={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e==="parent"||e==="global",default:"parent"},i18n:{type:Object}};function pS({slots:e},t){return t.length===1&&t[0]==="default"?(e.default?e.default():[]).reduce((r,o)=>[...r,...o.type===ve?o.children:[o]],[]):t.reduce((n,r)=>{const o=e[r];return o&&(n[r]=o()),n},mt())}function Ty(e){return ve}const hS=Pr({name:"i18n-t",props:Jt({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>Nt(e)||!isNaN(e)}},Gd),setup(e,t){const{slots:n,attrs:r}=t,o=e.i18n||Kd({useScope:e.scope,__useComponent:!0});return()=>{const s=Object.keys(n).filter(d=>d!=="_"),i=mt();e.locale&&(i.locale=e.locale),e.plural!==void 0&&(i.plural=Ce(e.plural)?+e.plural:e.plural);const a=pS(t,s),l=o[Nu](e.keypath,a,i),u=Jt(mt(),r),m=Ce(e.tag)||rt(e.tag)?e.tag:Ty();return mr(m,u,l)}}}),qf=hS;function _S(e){return Ht(e)&&!Ce(e[0])}function Ay(e,t,n,r){const{slots:o,attrs:s}=t;return()=>{const i={part:!0};let a=mt();e.locale&&(i.locale=e.locale),Ce(e.format)?i.key=e.format:rt(e.format)&&(Ce(e.format.key)&&(i.key=e.format.key),a=Object.keys(e.format).reduce((f,p)=>n.includes(p)?Jt(mt(),f,{[p]:e.format[p]}):f,mt()));const l=r(e.value,i,a);let u=[i.key];Ht(l)?u=l.map((f,p)=>{const h=o[f.type],g=h?h({[f.type]:f.value,index:p,parts:l}):[f.value];return _S(g)&&(g[0].key=`${f.type}-${p}`),g}):Ce(l)&&(u=[l]);const m=Jt(mt(),s),d=Ce(e.tag)||rt(e.tag)?e.tag:Ty();return mr(d,m,u)}}const gS=Pr({name:"i18n-n",props:Jt({value:{type:Number,required:!0},format:{type:[String,Object]}},Gd),setup(e,t){const n=e.i18n||Kd({useScope:e.scope,__useComponent:!0});return Ay(e,t,wy,(...r)=>n[Ru](...r))}}),Gf=gS,yS=Pr({name:"i18n-d",props:Jt({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},Gd),setup(e,t){const n=e.i18n||Kd({useScope:e.scope,__useComponent:!0});return Ay(e,t,Cy,(...r)=>n[Du](...r))}}),Kf=yS;function zS(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 vS(e){const t=i=>{const{instance:a,modifiers:l,value:u}=i;if(!a||!a.$)throw er(Fn.UNEXPECTED_ERROR);const m=zS(e,a.$),d=Zf(u);return[Reflect.apply(m.t,m,[...Yf(d)]),m]};return{created:(i,a)=>{const[l,u]=t(a);nl&&e.global===u&&(i.__i18nWatcher=Dn(u.locale,()=>{a.instance&&a.instance.$forceUpdate()})),i.__composer=u,i.textContent=l},unmounted:i=>{nl&&i.__i18nWatcher&&(i.__i18nWatcher(),i.__i18nWatcher=void 0,delete i.__i18nWatcher),i.__composer&&(i.__composer=void 0,delete i.__composer)},beforeUpdate:(i,{value:a})=>{if(i.__composer){const l=i.__composer,u=Zf(a);i.textContent=Reflect.apply(l.t,l,[...Yf(u)])}},getSSRProps:i=>{const[a]=t(i);return{textContent:a}}}}function Zf(e){if(Ce(e))return{path:e};if(Je(e)){if(!("path"in e))throw er(Fn.REQUIRED_VALUE,"path");return e}else throw er(Fn.INVALID_VALUE)}function Yf(e){const{path:t,locale:n,args:r,choice:o,plural:s}=e,i={},a=r||{};return Ce(n)&&(i.locale=n),Nt(o)&&(i.plural=o),Nt(s)&&(i.plural=s),[t,a,i]}function bS(e,t,...n){const r=Je(n[0])?n[0]:{},o=!!r.useI18nComponentName;(wt(r.globalInstall)?r.globalInstall:!0)&&([o?"i18n":qf.name,"I18nT"].forEach(i=>e.component(i,qf)),[Gf.name,"I18nN"].forEach(i=>e.component(i,Gf)),[Kf.name,"I18nD"].forEach(i=>e.component(i,Kf))),e.directive("t",vS(t))}const CS=fo("global-vue-i18n");function wS(e={},t){const n=wt(e.globalInjection)?e.globalInjection:!0,r=!0,o=new Map,[s,i]=kS(e),a=fo("");function l(d){return o.get(d)||null}function u(d,f){o.set(d,f)}function m(d){o.delete(d)}{const d={get mode(){return"composition"},get allowComposition(){return r},async install(f,...p){if(f.__VUE_I18N_SYMBOL__=a,f.provide(f.__VUE_I18N_SYMBOL__,d),Je(p[0])){const z=p[0];d.__composerExtend=z.__composerExtend,d.__vueI18nExtend=z.__vueI18nExtend}let h=null;n&&(h=PS(f,d.global)),bS(f,d,...p);const g=f.unmount;f.unmount=()=>{h&&h(),d.dispose(),g()}},get global(){return i},dispose(){s.stop()},__instances:o,__getInstance:l,__setInstance:u,__deleteInstance:m};return d}}function Kd(e={}){const t=Un();if(t==null)throw er(Fn.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw er(Fn.NOT_INSTALLED);const n=SS(t),r=ES(n),o=Ey(t),s=xS(e,o);if(s==="global")return dS(r,e,o),r;if(s==="parent"){let l=$S(n,t,e.__useComponent);return l==null&&(l=r),l}const i=n;let a=i.__getInstance(t);if(a==null){const l=Jt({},e);"__i18n"in o&&(l.__i18n=o.__i18n),r&&(l.__root=r),a=$y(l),i.__composerExtend&&(a[Mu]=i.__composerExtend(a)),AS(i,t,a),i.__setInstance(t,a)}return a}function kS(e,t,n){const r=wl();{const o=r.run(()=>$y(e));if(o==null)throw er(Fn.UNEXPECTED_ERROR);return[r,o]}}function SS(e){{const t=Nn(e.isCE?CS:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw er(e.isCE?Fn.NOT_INSTALLED_WITH_PROVIDE:Fn.UNEXPECTED_ERROR);return t}}function xS(e,t){return jl(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function ES(e){return e.mode==="composition"?e.global:e.global.__composer}function $S(e,t,n=!1){let r=null;const o=t.root;let s=TS(t,n);for(;s!=null;){const i=e;if(e.mode==="composition"&&(r=i.__getInstance(s)),r!=null||o===s)break;s=s.parent}return r}function TS(e,t=!1){return e==null?null:t&&e.vnode.ctx||e.parent}function AS(e,t,n){As(()=>{},t),Ri(()=>{const r=n;e.__deleteInstance(t);const o=r[Mu];o&&(o(),delete r[Mu])},t)}const OS=["locale","fallbackLocale","availableLocales"],Xf=["t","rt","d","n","tm","te"];function PS(e,t){const n=Object.create(null);return OS.forEach(o=>{const s=Object.getOwnPropertyDescriptor(t,o);if(!s)throw er(Fn.UNEXPECTED_ERROR);const i=Ot(s.value)?{get(){return s.value.value},set(a){s.value.value=a}}:{get(){return s.get&&s.get()}};Object.defineProperty(n,o,i)}),e.config.globalProperties.$i18n=n,Xf.forEach(o=>{const s=Object.getOwnPropertyDescriptor(t,o);if(!s||!s.value)throw er(Fn.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${o}`,s)}),()=>{delete e.config.globalProperties.$i18n,Xf.forEach(o=>{delete e.config.globalProperties[`$${o}`]})}}lS();Ak(nS);Ok(dk);Pk(py);if(__INTLIFY_PROD_DEVTOOLS__){const e=Hd();e.__INTLIFY__=!0,vk(e.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}const xc=e=>e&&typeof e=="object"&&!Array.isArray(e),Fu=(e,...t)=>{if(!t.length)return e;const n=t.shift();if(xc(e)&&xc(n))for(const r in n)xc(n[r])?(e[r]||Object.assign(e,{[r]:{}}),Fu(e[r],n[r])):Object.assign(e,{[r]:n[r]});return Fu(e,...t)},IS=Fu({},{de:{data:{kind:{file:e=>{const{normalize:t}=e;return t(["Datei"])},url:e=>{const{normalize:t}=e;return t(["URL"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["Stream"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},help:e=>{const{normalize:t}=e;return t(["Hinzufügen eines Podcasts führt zur Anlage einer RSS-Playlist, so kann OwnTone das Podcast-Abo verwalten."])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["Verarbeite…"])},title:e=>{const{normalize:t}=e;return t(["Podcast hinzufügen"])}},stream:{add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},loading:e=>{const{normalize:t}=e;return t(["Lade…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},title:e=>{const{normalize:t}=e;return t(["Stream hinzufügen"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"added-on":e=>{const{normalize:t}=e;return t(["Hinzugefügt am"])},artist:e=>{const{normalize:t}=e;return t(["Album Künstler"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Markiere als gespielt"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Entferne podcast"])},tracks:e=>{const{normalize:t}=e;return t(["Track Nummer"])},type:e=>{const{normalize:t}=e;return t(["Art"])},year:e=>{const{normalize:t}=e;return t(["Jahr"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"added-on":e=>{const{normalize:t}=e;return t(["Hinzugefügt am"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Art"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Art"])},save:{cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},"playlist-name":e=>{const{normalize:t}=e;return t(["Playlistname"])},save:e=>{const{normalize:t}=e;return t(["Speichern"])},saving:e=>{const{normalize:t}=e;return t(["Speichere…"])},title:e=>{const{normalize:t}=e;return t(["Warteschlange als Playlist speichern"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["Komponist"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Qualität"])},remove:e=>{const{normalize:t}=e;return t(["Entfernen"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["Album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["Künstler"])},type:e=>{const{normalize:t}=e;return t(["Art"])},year:e=>{const{normalize:t}=e;return t(["Jahr"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},pair:e=>{const{normalize:t}=e;return t(["Remote paaren"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing-Code"])},title:e=>{const{normalize:t}=e;return t(["Remote-Paarungs-Anfrage"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])},type:e=>{const{normalize:t}=e;return t(["Art"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},popularity:e=>{const{normalize:t}=e;return t(["Popularität / Followers"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},owner:e=>{const{normalize:t}=e;return t(["Besitzer"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},album:e=>{const{normalize:t}=e;return t(["Album"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"added-on":e=>{const{normalize:t}=e;return t(["Hinzugefügt am"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Kb/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["Kommentar"])},composer:e=>{const{normalize:t}=e;return t(["Komponist"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["Markiere als neu"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Markiere als gespielt"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Qualität"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["Album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["Künstler"])},type:e=>{const{normalize:t}=e;return t(["Art"])},year:e=>{const{normalize:t}=e;return t(["Jahr"])}},update:{all:e=>{const{normalize:t}=e;return t(["Alles neu einlesen"])},cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},feeds:e=>{const{normalize:t}=e;return t(["Nur RSS-Feeds neu einlesen"])},info:e=>{const{normalize:t}=e;return t(["Suche nach neuen, gelöschten und veränderten Dateien"])},local:e=>{const{normalize:t}=e;return t(["Nur lokale Bibliothek neu einlesen"])},progress:e=>{const{normalize:t}=e;return t(["Bibliothek wird neu eingelesen…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["Metadata von unveränderten Dateien neu einlesen"])},rescan:e=>{const{normalize:t}=e;return t(["Neu einlesen"])},spotify:e=>{const{normalize:t}=e;return t(["Nur Spotify neu einlesen"])},title:e=>{const{normalize:t}=e;return t(["Bibliothek neu einlesen"])}}},language:{de:e=>{const{normalize:t}=e;return t(["Deutsch"])},en:e=>{const{normalize:t}=e;return t(["Englisch (English)"])},fr:e=>{const{normalize:t}=e;return t(["Französisch (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["Vereinfachtes Chinesisch (簡體中文)"])},"zh-TW":e=>{const{normalize:t}=e;return t(["Traditionelles Chinesisch (繁體中文)"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["Diesen Podcast dauerhaft aus der Bibliothek löschen?"])},"info-2":e=>{const{normalize:t}=e;return t(["Dies wir auch RSS-Playlisten löschen "])},remove:e=>{const{normalize:t}=e;return t(["Entfernen"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Entferne podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["Track kann nicht gespielt werden"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([", Beschränkungsgrund: ",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["Album"])},audiobook:e=>{const{normalize:t}=e;return t(["Hörbuch"])},music:e=>{const{normalize:t}=e;return t(["Musik"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["Über"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP-stream-Fehler: Stream kann nicht geladen werden oder wurde wg. Netzwerkfehler gestopt"])},stream:e=>{const{normalize:t}=e;return t(["HTTP-stream"])},volume:e=>{const{normalize:t}=e;return t(["Lautstärke"])},files:e=>{const{normalize:t}=e;return t(["Dateien"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},music:e=>{const{normalize:t}=e;return t(["Musik"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},search:e=>{const{normalize:t}=e;return t(["Suche"])},settings:e=>{const{normalize:t}=e;return t(["Einstellungen"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["Bibliothek neu einlesen"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Oberfläche erstellt mit ",n(r("bulma")),", ",n(r("mdi")),", ",n(r("vuejs")),", ",n(r("axios"))," und ",n(r("others")),"."])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Compiliert mit Unterstützung von ",n(r("options")),"."])},library:e=>{const{normalize:t}=e;return t(["Bibliothek"])},more:e=>{const{normalize:t}=e;return t(["mehr"])},"total-playtime":e=>{const{normalize:t}=e;return t(["Gesamte Spielzeit"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},update:e=>{const{normalize:t}=e;return t(["Neu einlesen"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["vor ",n(r("time"))])},updated:e=>{const{normalize:t}=e;return t(["Neu eingelesen"])},uptime:e=>{const{normalize:t}=e;return t(["Laufzeit"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Version ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles und Alben angezeigt, die nur in Playlisten enthalten sind."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles angezeigt"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Alben angezeigt, die nur in der Spotify-Bibliothek enthalten sind."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Verbirgt Spotify-Alben"])},title:e=>{const{normalize:t}=e;return t(["Alben"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["Künstler › Name"])},"artist-date":e=>{const{normalize:t}=e;return t(["Künstler › Erscheinungsdatum"])},title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},"recently-added":e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt"])},"recently-released":e=>{const{normalize:t}=e;return t(["Kürzlich erschienen"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung wird kein Inhalt angezeigt, der nur in der Spotify-Bibliothek enthalten ist."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Verbirgt Spotify-Inhalt"])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("count"))," Künstler"])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Namen"])},"recently-added":e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles und Alben angezeigt, die nur in Playlisten enthalten sind."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles angezeigt"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Alben angezeigt, die nur in der Spotify-Bibliothek enthalten sind."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Verbirgt Künstler auf Spotify"])},title:e=>{const{normalize:t}=e;return t(["Künstler"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["Spielen"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Hörbuch"]),t([n(r("count"))," Hörbuch"]),t([n(r("count"))," Hörbücher"])])},title:e=>{const{normalize:t}=e;return t(["Hörbücher"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},play:e=>{const{normalize:t}=e;return t(["Spielen"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Autor"]),t([n(r("count"))," Autor"]),t([n(r("count"))," Autoren"])])},title:e=>{const{normalize:t}=e;return t(["Autoren"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["Autoren"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Komponist"]),t([n(r("count"))," Komponist"]),t([n(r("count"))," Komponisten"])])},title:e=>{const{normalize:t}=e;return t(["Komponisten"])}},files:{play:e=>{const{normalize:t}=e;return t(["Spielen"])},title:e=>{const{normalize:t}=e;return t(["Dateien"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Genre"]),t([n(r("count"))," Genre"]),t([n(r("count"))," Genres"])])},title:e=>{const{normalize:t}=e;return t(["Genres"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["Zeige mehr"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["Kürzlich gespielt"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},composers:e=>{const{normalize:t}=e;return t(["Komponisten"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},history:e=>{const{normalize:t}=e;return t(["Verlauf"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["Tracks durch Auswählen aus der Bibliothek anfügen"])},live:e=>{const{normalize:t}=e;return t(["Live"])},title:e=>{const{normalize:t}=e;return t(["Deine Playliste ist leer."])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," Tracks"])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["Playlisten"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Playlist"]),t([n(r("count"))," Playlisten"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},remove:e=>{const{normalize:t}=e;return t(["Entfernen"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["Diesen Podcast wirklich dauerhaft aus der Bibliothek löschen?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["Damit wird auch die RSS-Playliste gelöscht. "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Entferne podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Podcast"]),t([n(r("count"))," Podcasts"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["Alle abgespielten markieren"])},"new-episodes":e=>{const{normalize:t}=e;return t(["Neue Episoden"])},title:e=>{const{normalize:t}=e;return t(["Podcasts"])},update:e=>{const{normalize:t}=e;return t(["Neu einlesen"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["Stream hinzufügen"])},clear:e=>{const{normalize:t}=e;return t(["Alle entfernen"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},edit:e=>{const{normalize:t}=e;return t(["Bearbeiten"])},"hide-previous":e=>{const{normalize:t}=e;return t(["Vorherige verbergen"])},title:e=>{const{normalize:t}=e;return t(["Warteschlange"])},save:e=>{const{normalize:t}=e;return t(["Speichern"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Station"]),t([n(r("count"))," Station"]),t([n(r("count"))," Stationen"])])},title:e=>{const{normalize:t}=e;return t(["Radio"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},composers:e=>{const{normalize:t}=e;return t(["Komponisten"])},expression:e=>{const{normalize:t}=e;return t(["Ausdrücken"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Tip: Du kannst mit einer Smart-Playlist-Abfrage-Sprache nach ",n(r("help"))," suchen wenn Du dem Ausdruck ein ",n(r("query"))," voranstellst."])},"no-results":e=>{const{normalize:t}=e;return t(["Keine Ergebnisse gefunden"])},placeholder:e=>{const{normalize:t}=e;return t(["Suche"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige das Album"]),t(["Zeige alle ",n(r("count"))," Alben"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Künstler"]),t(["Zeige alle ",n(r("count"))," Künstler"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige das Buch"]),t(["Zeige alle ",n(r("count"))," Hörbücher"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Komponist"]),t(["Zeige alle ",n(r("count"))," Komponisten"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige die Playlist"]),t(["Zeige alle ",n(r("count"))," Playlisten"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Podcast"]),t(["Zeige alle ",n(r("count"))," Podcasts"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Track"]),t(["Zeige alle ",n(r("count"))," Tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},tabs:{library:e=>{const{normalize:t}=e;return t(["Bibliothek"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["Artwork"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone verarbeitet PNG- und JPEG-Artwork, welches in einer eigenen Datei in der Bibliothek, in die Dateien eingebettet oder online von Radiostationen bereitgestellt werden kann."])},"explanation-2":e=>{const{normalize:t}=e;return t(["Zusätzlich kann auf folgende Artwork-Anbieter zugegriffen werden:"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["Bereitgestellte Artwork von Radiostationen ignorieren"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["Keine aktive Pairing-Anfrage"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing-Code"])},"pairing-request":e=>{const{normalize:t}=e;return t(["Remote-Pairing-Anfrage von "])},pairing:e=>{const{normalize:t}=e;return t(["Pairing Remote"])},send:e=>{const{normalize:t}=e;return t(["Senden"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["Wenn der Laufsprecher PIN-basiertes Pairing verlangt, aktiviere ihn hier und gib dann den hier PIN an, der am Lautsprecher angezeigt wird."])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["Lautsprecher-Pairing und Geräteverifikation"])},"verification-code":e=>{const{normalize:t}=e;return t(["Verifikationscode"])},verify:e=>{const{normalize:t}=e;return t(["Verifizieren"])}},general:{"album-lists":e=>{const{normalize:t}=e;return t(["Album-Listen"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},files:e=>{const{normalize:t}=e;return t(["Dateien"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},language:e=>{const{normalize:t}=e;return t(["Sprache"])},music:e=>{const{normalize:t}=e;return t(["Musik"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["Wenn mehr Dateien ausgewählt werden, als der Bildschirm anzeigen kann, verschwindet das Burger-Menü."])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["Wähle hier die Einträge des oberen Navigationsmenüs "])},"navigation-items":e=>{const{normalize:t}=e;return t(["Navigationsmenüs"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["Aktuell läuft-Seite"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(['Beschränkte die Zahl der Alben auf der "kürzlich hinzugefügt"-Seite'])},"recently-added-page":e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt-Seite"])},search:e=>{const{normalize:t}=e;return t(["Suche"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(['Komma-separierte Liste der Genres, wo der Komponist auf der "Aktuell läuft"-Seite angezeigt werden soll'])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["Leer lassen, um ihn immer anzuzeigen."])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(['Der Genre-Tag des aktuellen Tracks wird abgeglichen als Teil-String des Genre-Tags. Z.B. "classical, soundtrack" wird den Komponisten beim Genre-Tag "Contemporary Classical" anzeigen'])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["Zeige den Komponisten für die aufgelisteten Genres an"])},"show-composer-info":e=>{const{normalize:t}=e;return t(['Wenn aktiviert, wird der Komponist auf der "Aktuell läuft"-Seite angezeigt.'])},"show-composer":e=>{const{normalize:t}=e;return t(["Komponisten anzeigen"])},"show-coverart":e=>{const{normalize:t}=e;return t(["Zeige Cover-Artwork in der Albumliste"])},"show-path":e=>{const{normalize:t}=e;return t(['Dateipfad auf der "Aktuell läuft"-Seite anzeigen'])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["Melde Dich mit Deinem Last.fm-Benutzernamen und Passwort an, um Scrobbeln zu aktivieren"])},info:e=>{const{normalize:t}=e;return t(["OwnTone wird den Benutzernamen und das Passwort von last.fm nicht speichern, nur den Sitzungs-Schlüssel. Dieser läuft nicht ab."])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone wurde ohne Unterstützung für Last.fm erstellt."])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone wurde entweder ohne Unterstützung für Spotify erstellt oder libspotify ist nicht installiert."])},"logged-as":e=>{const{normalize:t}=e;return t(["Angemeldet als "])},requirements:e=>{const{normalize:t}=e;return t(["Spotify Premium Abo erforderlich."])},scopes:e=>{const{normalize:t}=e;return t(["Zugriff auf die Spotify Web-Api ermöglicht scannen der Spotify-Blibliothek. Erforderliche scopes sind: "])},user:e=>{const{normalize:t}=e;return t(["Zugriff gestattet für "])},authorize:e=>{const{normalize:t}=e;return t(["Authorisiere Web-API-Zugriff"])},"grant-access":e=>{const{normalize:t}=e;return t(["Zugriff auf die Spotify Web-API gestatten"])},reauthorize:e=>{const{normalize:t}=e;return t(["Bitte den Zugriff der Web-API durch setzen folgender Zugriffsrechte für OwnTone: "])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["Einloggen"])},logout:e=>{const{normalize:t}=e;return t(["Ausloggen"])},password:e=>{const{normalize:t}=e;return t(["Passwort"])},username:e=>{const{normalize:t}=e;return t(["Benutzername"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["Artwork"])},general:e=>{const{normalize:t}=e;return t(["Allgemein"])},"online-services":e=>{const{normalize:t}=e;return t(["Online-Services"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["Fernbedienungen und Ausgänge"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["Ausgezeichnete Playlisten"])},"new-releases":e=>{const{normalize:t}=e;return t(["Neuvorstellung"])},"show-more":e=>{const{normalize:t}=e;return t(["Zeige mehr"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},"no-results":e=>{const{normalize:t}=e;return t(["Keine Ergebnisse gefunden"])},placeholder:e=>{const{normalize:t}=e;return t(["Suche"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige das Album"]),t(["Zeige alle ",n(r("count"))," Alben"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Künstler"]),t(["Zeige alle ",n(r("count"))," Künstler"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige die Playlist"]),t(["Zeige alle ",n(r("count"))," Playlisten"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Track"]),t(["Zeige alle ",n(r("count"))," Tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["Ordner"])},plain:e=>{const{normalize:t}=e;return t(["Einfache"])},smart:e=>{const{normalize:t}=e;return t(["Intelligente"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["Verlauf löschen"])},pause:e=>{const{normalize:t}=e;return t(["Wiedergabe anhalten"])},play:e=>{const{normalize:t}=e;return t(["Wiedergeben"])},repeat:e=>{const{normalize:t}=e;return t(["Alle Tracks wiederholen"])},"repeat-off":e=>{const{normalize:t}=e;return t(["Tracks einmal lesen"])},"repeat-once":e=>{const{normalize:t}=e;return t(["Aktuellen Track wiederholen"])},"seek-backward":e=>{const{normalize:t}=e;return t(["Rückwärts im Track suchen"])},"seek-forward":e=>{const{normalize:t}=e;return t(["Vorwärts im Track suchen"])},shuffle:e=>{const{normalize:t}=e;return t(["Tracks zufällig wiedergeben"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["Tracks in Reihenfolge wiedergeben"])},"skip-backward":e=>{const{normalize:t}=e;return t(["Zum vorherigen Track springen"])},"skip-forward":e=>{const{normalize:t}=e;return t(["Zum nächsten Track springen"])},stop:e=>{const{normalize:t}=e;return t(["Wiedergabe stoppen"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["Liedtexte anzeigen/verbergen"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (Fehler beim Speichern der Einstellungen)"])},saved:e=>{const{normalize:t}=e;return t([" (Einstellungen gesichert)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["Fehler bei Verbindung zum OwnTone-Server"])},"missing-port":e=>{const{normalize:t}=e;return t(["Fehlender Websocket-Port"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Anfrage gescheitert (Status: ",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Warteschlange zu Playlist ",n(r("name"))," gesichert"])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track an die Abspielliste angehängt"]),t([n(r("count"))," Tracks an die Abspielliste angehängt"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["Warteschlange ist leer"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["Heute"])},"last-week":e=>{const{normalize:t}=e;return t(["Letzte Woche"])},"last-month":e=>{const{normalize:t}=e;return t(["Letzer Monat"])},undefined:e=>{const{normalize:t}=e;return t(["Unbestimmt"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["Mono"])},stereo:e=>{const{normalize:t}=e;return t(["Stereo"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Kanal"]),t([n(r("count"))," Kanäle"])])}}}},{en:{data:{kind:{file:e=>{const{normalize:t}=e;return t(["File"])},url:e=>{const{normalize:t}=e;return t(["URL"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["Stream"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["Add"])},cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},help:e=>{const{normalize:t}=e;return t(["Adding a podcast includes creating an RSS playlist, that will allow OwnTone to manage the podcast subscription."])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["Processing…"])},title:e=>{const{normalize:t}=e;return t(["Add podcast"])}},stream:{add:e=>{const{normalize:t}=e;return t(["Add"])},cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},loading:e=>{const{normalize:t}=e;return t(["Loading…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["Play"])},title:e=>{const{normalize:t}=e;return t(["Add stream"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"added-on":e=>{const{normalize:t}=e;return t(["Added on"])},artist:e=>{const{normalize:t}=e;return t(["Album artist"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Mark as played"])},play:e=>{const{normalize:t}=e;return t(["Play"])},"release-date":e=>{const{normalize:t}=e;return t(["Release date"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Remove podcast"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Year"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"added-on":e=>{const{normalize:t}=e;return t(["Added On"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},play:e=>{const{normalize:t}=e;return t(["Play"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},play:e=>{const{normalize:t}=e;return t(["Play"])},path:e=>{const{normalize:t}=e;return t(["Path"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Type"])},save:{cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},"playlist-name":e=>{const{normalize:t}=e;return t(["Playlist name"])},save:e=>{const{normalize:t}=e;return t(["Save"])},saving:e=>{const{normalize:t}=e;return t(["Saving…"])},title:e=>{const{normalize:t}=e;return t(["Save queue to playlist"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["Composer"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Quality"])},remove:e=>{const{normalize:t}=e;return t(["Remove"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artist"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Year"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},pair:e=>{const{normalize:t}=e;return t(["Pair Remote"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing code"])},title:e=>{const{normalize:t}=e;return t(["Remote pairing request"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},play:e=>{const{normalize:t}=e;return t(["Play"])},"release-date":e=>{const{normalize:t}=e;return t(["Release Date"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},play:e=>{const{normalize:t}=e;return t(["Play"])},popularity:e=>{const{normalize:t}=e;return t(["Popularity / Followers"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},owner:e=>{const{normalize:t}=e;return t(["Owner"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},album:e=>{const{normalize:t}=e;return t(["Album"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},"release-date":e=>{const{normalize:t}=e;return t(["Release Date"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"added-on":e=>{const{normalize:t}=e;return t(["Added On"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["Comment"])},composer:e=>{const{normalize:t}=e;return t(["Composer"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["Mark as new"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Mark as played"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Quality"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])},"release-date":e=>{const{normalize:t}=e;return t(["Release Date"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artist"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Year"])}},update:{all:e=>{const{normalize:t}=e;return t(["Update everything"])},cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},feeds:e=>{const{normalize:t}=e;return t(["Only update RSS feeds"])},info:e=>{const{normalize:t}=e;return t(["Scan for new, deleted and modified files"])},local:e=>{const{normalize:t}=e;return t(["Only update local library"])},progress:e=>{const{normalize:t}=e;return t(["Library update in progress…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["Rescan metadata of unmodified files"])},rescan:e=>{const{normalize:t}=e;return t(["Rescan"])},spotify:e=>{const{normalize:t}=e;return t(["Only update Spotify"])},title:e=>{const{normalize:t}=e;return t(["Update library"])}}},language:{de:e=>{const{normalize:t}=e;return t(["German (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["English"])},fr:e=>{const{normalize:t}=e;return t(["French (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["Simplified Chinese (簡體中文)"])},"zh-TW":e=>{const{normalize:t}=e;return t(["Traditional Chinese (繁體中文)"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["Permanently remove this podcast from your library?"])},"info-2":e=>{const{normalize:t}=e;return t(["This will also remove the RSS playlist "])},remove:e=>{const{normalize:t}=e;return t(["Remove"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Remove podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["Track is not playable"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([", restriction reason: ",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["Album"])},audiobook:e=>{const{normalize:t}=e;return t(["Audiobook"])},music:e=>{const{normalize:t}=e;return t(["Music"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["About"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP stream error: failed to load stream or stopped loading due to network problem"])},stream:e=>{const{normalize:t}=e;return t(["HTTP stream"])},volume:e=>{const{normalize:t}=e;return t(["Volume"])},files:e=>{const{normalize:t}=e;return t(["Files"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},music:e=>{const{normalize:t}=e;return t(["Music"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},search:e=>{const{normalize:t}=e;return t(["Search"])},settings:e=>{const{normalize:t}=e;return t(["Settings"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["Update Library"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Web interface built with ",n(r("bulma")),", ",n(r("mdi")),", ",n(r("vuejs")),", ",n(r("axios"))," and ",n(r("others")),"."])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Compiled with support for ",n(r("options")),"."])},library:e=>{const{normalize:t}=e;return t(["Library"])},more:e=>{const{normalize:t}=e;return t(["more"])},"total-playtime":e=>{const{normalize:t}=e;return t(["Total playtime"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},update:e=>{const{normalize:t}=e;return t(["Update"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("time"))," ago"])},updated:e=>{const{normalize:t}=e;return t(["Updated"])},uptime:e=>{const{normalize:t}=e;return t(["Uptime"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Version ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["If active, hides singles and albums with tracks that only appear in playlists."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Hide singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["If active, hides albums that only appear in your Spotify library."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Hide albums from Spotify"])},title:e=>{const{normalize:t}=e;return t(["Albums"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["Artist › Name"])},"artist-date":e=>{const{normalize:t}=e;return t(["Artist › Release date"])},title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},"recently-added":e=>{const{normalize:t}=e;return t(["Recently added"])},"recently-released":e=>{const{normalize:t}=e;return t(["Recently released"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["If active, hides the content only appearing in your Spotify library."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Hide the content from Spotify"])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])},"release-date":e=>{const{normalize:t}=e;return t(["Release date"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," artist"]),t([n(r("count"))," artist"]),t([n(r("count"))," artists"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},"recently-added":e=>{const{normalize:t}=e;return t(["Recently added"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["If active, hides artists that only appear on singles or playlists."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Hide singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["If active, hides artists that only appear in your Spotify library."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Hide artists from Spotify"])},title:e=>{const{normalize:t}=e;return t(["Artists"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["Play"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," audiobook"]),t([n(r("count"))," audiobook"]),t([n(r("count"))," audiobooks"])])},title:e=>{const{normalize:t}=e;return t(["Audiobooks"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},play:e=>{const{normalize:t}=e;return t(["Play"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," author"]),t([n(r("count"))," author"]),t([n(r("count"))," authors"])])},title:e=>{const{normalize:t}=e;return t(["Authors"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["Authors"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," composer"]),t([n(r("count"))," composer"]),t([n(r("count"))," composers"])])},title:e=>{const{normalize:t}=e;return t(["Composers"])}},files:{play:e=>{const{normalize:t}=e;return t(["Play"])},title:e=>{const{normalize:t}=e;return t(["Files"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," genre"]),t([n(r("count"))," genre"]),t([n(r("count"))," genres"])])},title:e=>{const{normalize:t}=e;return t(["Genres"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["Show more"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["Recently added"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["Recently played"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},composers:e=>{const{normalize:t}=e;return t(["Composers"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},history:e=>{const{normalize:t}=e;return t(["History"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["Add some tracks by browsing your library"])},live:e=>{const{normalize:t}=e;return t(["Live"])},title:e=>{const{normalize:t}=e;return t(["Your play queue is empty"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," tracks"])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["Playlists"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," playlist"]),t([n(r("count"))," playlist"]),t([n(r("count"))," playlists"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},play:e=>{const{normalize:t}=e;return t(["Play"])},remove:e=>{const{normalize:t}=e;return t(["Remove"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["Permanently remove this podcast from your library?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["This will also remove the RSS playlist "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Remove podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["Add"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," podcast"]),t([n(r("count"))," podcast"]),t([n(r("count"))," podcasts"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["Mark All Played"])},"new-episodes":e=>{const{normalize:t}=e;return t(["New Episodes"])},title:e=>{const{normalize:t}=e;return t(["Podcasts"])},update:e=>{const{normalize:t}=e;return t(["Update"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["Add stream"])},clear:e=>{const{normalize:t}=e;return t(["Clear"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},edit:e=>{const{normalize:t}=e;return t(["Edit"])},"hide-previous":e=>{const{normalize:t}=e;return t(["Hide previous"])},title:e=>{const{normalize:t}=e;return t(["Queue"])},save:e=>{const{normalize:t}=e;return t(["Save"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," station"]),t([n(r("count"))," station"]),t([n(r("count"))," stations"])])},title:e=>{const{normalize:t}=e;return t(["Radio"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},composers:e=>{const{normalize:t}=e;return t(["Composers"])},expression:e=>{const{normalize:t}=e;return t(["expression"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Tip: you can search by a smart playlist query language ",n(r("help"))," if you prefix it with ",n(r("query")),"."])},"no-results":e=>{const{normalize:t}=e;return t(["No results found"])},placeholder:e=>{const{normalize:t}=e;return t(["Search"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the album"]),t(["Show all ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the artist"]),t(["Show all ",n(r("count"))," artists"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the audiobook"]),t(["Show all ",n(r("count"))," audiobooks"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the composer"]),t(["Show all ",n(r("count"))," composers"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the playlist"]),t(["Show all ",n(r("count"))," playlists"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the podcast"]),t(["Show all ",n(r("count"))," podcasts"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the track"]),t(["Show all ",n(r("count"))," tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},tabs:{library:e=>{const{normalize:t}=e;return t(["Library"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["Artwork"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone supports PNG and JPEG artwork which is either placed as separate image files in the library, embedded in the media files or made available online by radio stations."])},"explanation-2":e=>{const{normalize:t}=e;return t(["In addition to that, you can enable fetching artwork from the following artwork providers:"])},"show-coverart":e=>{const{normalize:t}=e;return t(["Show cover artwork in album list"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["Ignore artwork provided by radio stations"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["No active pairing request."])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing code"])},"pairing-request":e=>{const{normalize:t}=e;return t(["Remote pairing request from "])},pairing:e=>{const{normalize:t}=e;return t(["Remote Pairing"])},send:e=>{const{normalize:t}=e;return t(["Send"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["If your speaker requires pairing then activate it below and enter the PIN that it displays."])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["Speaker pairing and device verification"])},"verification-code":e=>{const{normalize:t}=e;return t(["Verification code"])},verify:e=>{const{normalize:t}=e;return t(["Verify"])}},general:{audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},files:e=>{const{normalize:t}=e;return t(["Files"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},language:e=>{const{normalize:t}=e;return t(["Language"])},music:e=>{const{normalize:t}=e;return t(["Music"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["If you select more items than can be shown on your screen then the burger menu will disappear."])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["Select the top navigation bar menu items"])},"navigation-items":e=>{const{normalize:t}=e;return t(["Navigation Bar"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["Now playing page"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(['Limit the number of albums shown on the "Recently Added" page'])},"recently-added-page":e=>{const{normalize:t}=e;return t(["Recently added page"])},search:e=>{const{normalize:t}=e;return t(["Search"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(['Comma separated list of genres the composer should be displayed on the "Now playing page"'])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["Leave empty to always show the composer."])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(['The genre tag of the current track is matched by checking, if one of the defined genres are included. For example setting to "classical, soundtrack" will show the composer for tracks with a genre tag of "Contemporary Classical"'])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["Show composer only for listed genres"])},"show-composer-info":e=>{const{normalize:t}=e;return t(['If enabled the composer of the current playing track is shown on the "Now playing page"'])},"show-composer":e=>{const{normalize:t}=e;return t(["Show composer"])},"show-path":e=>{const{normalize:t}=e;return t(['Show filepath on the "Now playing" page'])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["Login with your Last.fm username and password to enable scrobbling"])},info:e=>{const{normalize:t}=e;return t(["OwnTone will not store your Last.fm username/password, only the session key. The session key does not expire."])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone was built without support for Last.fm."])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone was either built without support for Spotify or libspotify is not installed."])},"logged-as":e=>{const{normalize:t}=e;return t(["Logged in as "])},requirements:e=>{const{normalize:t}=e;return t(["You must have a Spotify premium account."])},scopes:e=>{const{normalize:t}=e;return t(["Access to the Spotify Web API enables scanning of your Spotify library. Required scopes are: "])},user:e=>{const{normalize:t}=e;return t(["Access granted for "])},authorize:e=>{const{normalize:t}=e;return t(["Authorize Web API access"])},"grant-access":e=>{const{normalize:t}=e;return t(["Grant access to the Spotify Web API"])},reauthorize:e=>{const{normalize:t}=e;return t(["Please reauthorize Web API access to grant OwnTone the following additional access rights: "])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["Login"])},logout:e=>{const{normalize:t}=e;return t(["Logout"])},password:e=>{const{normalize:t}=e;return t(["Password"])},username:e=>{const{normalize:t}=e;return t(["Username"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["Artwork"])},general:e=>{const{normalize:t}=e;return t(["General"])},"online-services":e=>{const{normalize:t}=e;return t(["Online Services"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["Remotes and Outputs"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["Featured Playlists"])},"new-releases":e=>{const{normalize:t}=e;return t(["New Releases"])},"show-more":e=>{const{normalize:t}=e;return t(["Show More"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},"no-results":e=>{const{normalize:t}=e;return t(["No results found"])},placeholder:e=>{const{normalize:t}=e;return t(["Search"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the album"]),t(["Show all ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the artist"]),t(["Show all ",n(r("count"))," artists"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the playlist"]),t(["Show all ",n(r("count"))," playlists"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the track"]),t(["Show all ",n(r("count"))," tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["Folder"])},plain:e=>{const{normalize:t}=e;return t(["Plain"])},smart:e=>{const{normalize:t}=e;return t(["Smart"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["Clear history"])},pause:e=>{const{normalize:t}=e;return t(["Pause"])},play:e=>{const{normalize:t}=e;return t(["Play"])},repeat:e=>{const{normalize:t}=e;return t(["Repeat all tracks"])},"repeat-off":e=>{const{normalize:t}=e;return t(["Read tracks once"])},"repeat-once":e=>{const{normalize:t}=e;return t(["Repeat current track"])},"seek-backward":e=>{const{normalize:t}=e;return t(["Seek backward in the track"])},"seek-forward":e=>{const{normalize:t}=e;return t(["Seek forward in the track"])},shuffle:e=>{const{normalize:t}=e;return t(["Play tracks randomly"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["Play tracks in order"])},"skip-backward":e=>{const{normalize:t}=e;return t(["Skip to previous track"])},"skip-forward":e=>{const{normalize:t}=e;return t(["Skip to next track"])},stop:e=>{const{normalize:t}=e;return t(["Stop"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["Toggle lyrics"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (error saving setting)"])},saved:e=>{const{normalize:t}=e;return t([" (setting saved)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["Failed to connect to OwnTone server"])},"missing-port":e=>{const{normalize:t}=e;return t(["Missing websocket port"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Request failed (status: ",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Queue saved to playlist ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track appended to the queue"]),t([n(r("count"))," tracks appended to the queue"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["Queue is empty"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["Today"])},"last-week":e=>{const{normalize:t}=e;return t(["Last week"])},"last-month":e=>{const{normalize:t}=e;return t(["Last month"])},undefined:e=>{const{normalize:t}=e;return t(["Undefined"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["mono"])},stereo:e=>{const{normalize:t}=e;return t(["stereo"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," channel"]),t([n(r("count"))," channels"])])}}}},{fr:{data:{kind:{file:e=>{const{normalize:t}=e;return t(["Fichier"])},url:e=>{const{normalize:t}=e;return t(["URL"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["Flux"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["Ajouter"])},cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},help:e=>{const{normalize:t}=e;return t(["L’ajout d’un podcast inclut la création d’une liste de lecture RSS, qui permettra à OwnTone de gérer l’abonnement au podcast."])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-du-flux-rss"])},processing:e=>{const{normalize:t}=e;return t(["Traitement en cours…"])},title:e=>{const{normalize:t}=e;return t(["Ajouter un podcast"])}},stream:{add:e=>{const{normalize:t}=e;return t(["Ajouter"])},cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},loading:e=>{const{normalize:t}=e;return t(["Chargement…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-du-flux"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},title:e=>{const{normalize:t}=e;return t(["Ajouter un flux"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"added-on":e=>{const{normalize:t}=e;return t(["Ajouté le"])},artist:e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Marquer comme lu"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Supprimer le podcast"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Année"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"added-on":e=>{const{normalize:t}=e;return t(["Ajouté le"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},play:e=>{const{normalize:t}=e;return t(["Lire"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},type:e=>{const{normalize:t}=e;return t(["Type"])},save:{cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},"playlist-name":e=>{const{normalize:t}=e;return t(["Nom de la liste de lecture"])},save:e=>{const{normalize:t}=e;return t(["Enregistrer"])},saving:e=>{const{normalize:t}=e;return t(["Enregistrement en cours…"])},title:e=>{const{normalize:t}=e;return t(["Enregistrer la file d’attente dans une liste de lecture"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["Compositeur"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},position:e=>{const{normalize:t}=e;return t(["Disque / Piste"])},quality:e=>{const{normalize:t}=e;return t(["Qualité"])},remove:e=>{const{normalize:t}=e;return t(["Supprimer"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artiste"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Année"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},pair:e=>{const{normalize:t}=e;return t(["Jumeler la télécommande"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Code de jumelage"])},title:e=>{const{normalize:t}=e;return t(["Demande de jumelage de télécommande"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},popularity:e=>{const{normalize:t}=e;return t(["Popularité / Abonnements"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},owner:e=>{const{normalize:t}=e;return t(["Propriétaire"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},album:e=>{const{normalize:t}=e;return t(["Album"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},position:e=>{const{normalize:t}=e;return t(["Disque / Piste"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"added-on":e=>{const{normalize:t}=e;return t(["Ajouté le"])},"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["Commentaire"])},composer:e=>{const{normalize:t}=e;return t(["Compositeur"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["Marquer comme nouveau"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Marquer comme lu"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},position:e=>{const{normalize:t}=e;return t(["Disque / Piste"])},quality:e=>{const{normalize:t}=e;return t(["Qualité"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artiste"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Année"])}},update:{all:e=>{const{normalize:t}=e;return t(["Tout actualiser"])},cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},feeds:e=>{const{normalize:t}=e;return t(["Actualiser uniquement les flux RSS"])},info:e=>{const{normalize:t}=e;return t(["Recherche les fichiers ajoutés, supprimés et modifiés"])},local:e=>{const{normalize:t}=e;return t(["Actualiser uniquement la bibliothèque locale"])},progress:e=>{const{normalize:t}=e;return t(["Actualisation de la bibliothèque en cours…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["Analyser les métadonnées des fichiers non modifiés"])},rescan:e=>{const{normalize:t}=e;return t(["Analyser"])},spotify:e=>{const{normalize:t}=e;return t(["Actualiser uniquement Spotify"])},title:e=>{const{normalize:t}=e;return t(["Actualiser la bibliothèque"])}}},language:{de:e=>{const{normalize:t}=e;return t(["Allemand (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["Anglais (English)"])},fr:e=>{const{normalize:t}=e;return t(["Français"])},"zh-CN":e=>{const{normalize:t}=e;return t(["Chinois simplifié (簡體中文)"])},"zh-TW":e=>{const{normalize:t}=e;return t(["Chinois traditionnel (繁體中文)"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["Supprimer définitivement ce podcast de votre bibliothèque ?"])},"info-2":e=>{const{normalize:t}=e;return t(["Cela supprimera également la liste de lecture RSS "])},remove:e=>{const{normalize:t}=e;return t(["Supprimer"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Supprimer le podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["La piste ne peut pas être lue"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([", raison de la restriction : ",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["Album"])},audiobook:e=>{const{normalize:t}=e;return t(["Livre audio"])},music:e=>{const{normalize:t}=e;return t(["Musique"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["À propos"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["Erreur du flux HTTP : échec du chargement du flux ou arrêt du chargement en raison d’un problème réseau"])},stream:e=>{const{normalize:t}=e;return t(["Flux HTTP"])},volume:e=>{const{normalize:t}=e;return t(["Volume"])},files:e=>{const{normalize:t}=e;return t(["Fichiers"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},music:e=>{const{normalize:t}=e;return t(["Musique"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},search:e=>{const{normalize:t}=e;return t(["Recherche"])},settings:e=>{const{normalize:t}=e;return t(["Réglages"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["Actualiser la bibliothèque"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Interface utilisateur construite avec ",n(r("bulma")),", ",n(r("mdi")),", ",n(r("vuejs")),", ",n(r("axios"))," et ",n(r("others")),"."])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Compilé avec les options ",n(r("options")),"."])},library:e=>{const{normalize:t}=e;return t(["Bibliothèque"])},more:e=>{const{normalize:t}=e;return t(["plus"])},"total-playtime":e=>{const{normalize:t}=e;return t(["Durée totale de lecture"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},update:e=>{const{normalize:t}=e;return t(["Actualiser"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["il y a ",n(r("time"))])},updated:e=>{const{normalize:t}=e;return t(["Mis à jour"])},uptime:e=>{const{normalize:t}=e;return t(["Temps de fonctionnement"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Version ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filtrer"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les singles et les albums dont les pistes n’apparaissent que dans les listes de lecture."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Masquer les singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les albums qui n’apparaissent que dans votre bibliothèque Spotify."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Masquer les albums de Spotify"])},title:e=>{const{normalize:t}=e;return t(["Albums"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["Artiste › Nom"])},"artist-date":e=>{const{normalize:t}=e;return t(["Artiste › Date de sortie"])},title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},"recently-added":e=>{const{normalize:t}=e;return t(["Ajouts récents"])},"recently-released":e=>{const{normalize:t}=e;return t(["Sorties récentes"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filtrer"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Si actif, masque le contenu qui n’apparaît que dans votre bibliothèque Spotify."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Masquer le contenu de Spotify"])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," artiste"]),t([n(r("count"))," artiste"]),t([n(r("count"))," artistes"])])},filter:e=>{const{normalize:t}=e;return t(["Filtrer"])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},"recently-added":e=>{const{normalize:t}=e;return t(["Ajouts récents"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les artistes qui n’apparaissent que dans des singles ou des listes de lecture."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Masquer les singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les artistes qui n’apparaissent que dans votre bibliothèque Spotify."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Masquer les artistes de Spotify"])},title:e=>{const{normalize:t}=e;return t(["Artistes"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["Lire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," livre audio"]),t([n(r("count"))," livre audio"]),t([n(r("count"))," livres audio"])])},title:e=>{const{normalize:t}=e;return t(["Livres audio"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},play:e=>{const{normalize:t}=e;return t(["Lire"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," auteur"]),t([n(r("count"))," auteur"]),t([n(r("count"))," auteurs"])])},title:e=>{const{normalize:t}=e;return t(["Auteurs"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["Auteurs"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," compositeur"]),t([n(r("count"))," compositeur"]),t([n(r("count"))," compositeurs"])])},title:e=>{const{normalize:t}=e;return t(["Compositeurs"])}},files:{play:e=>{const{normalize:t}=e;return t(["Lire"])},title:e=>{const{normalize:t}=e;return t(["Fichiers"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," genre"]),t([n(r("count"))," genre"]),t([n(r("count"))," genres"])])},title:e=>{const{normalize:t}=e;return t(["Genres"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["Afficher plus"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["Ajouts récents"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["Lectures récentes"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},composers:e=>{const{normalize:t}=e;return t(["Compositeurs"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},history:e=>{const{normalize:t}=e;return t(["Historique"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["Ajoutez des pistes en parcourant votre bibliothèque"])},live:e=>{const{normalize:t}=e;return t(["En direct"])},title:e=>{const{normalize:t}=e;return t(["La file d’attente est vide"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," pistes"])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," liste de lecture"]),t([n(r("count"))," liste de lecture"]),t([n(r("count"))," listes de lecture"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},remove:e=>{const{normalize:t}=e;return t(["Supprimer"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["Supprimer ce podcast de manière permanente de la bibliothèque ?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["Cela supprimera également la liste de lecture RSS "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Supprimer le podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["Ajouter"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," podcast"]),t([n(r("count"))," podcast"]),t([n(r("count"))," podcasts"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["Marquer comme lus"])},"new-episodes":e=>{const{normalize:t}=e;return t(["Nouveaux épisodes"])},title:e=>{const{normalize:t}=e;return t(["Podcasts"])},update:e=>{const{normalize:t}=e;return t(["Actualiser"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["Ajouter un flux"])},clear:e=>{const{normalize:t}=e;return t(["Effacer"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},edit:e=>{const{normalize:t}=e;return t(["Éditer"])},"hide-previous":e=>{const{normalize:t}=e;return t(["Masquer l’historique"])},queue:e=>{const{normalize:t}=e;return t(["File d’attente"])},save:e=>{const{normalize:t}=e;return t(["Enregistrer"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," station"]),t([n(r("count"))," station"]),t([n(r("count"))," stations"])])},title:e=>{const{normalize:t}=e;return t(["Radio"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},composers:e=>{const{normalize:t}=e;return t(["Compositeurs"])},expression:e=>{const{normalize:t}=e;return t(["expression"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Astuce : vous pouvez effectuer une recherche avec une ",n(r("help"))," du langage de requête de liste de lecture intelligente en préfixant votre requête avec ",n(r("query"))])},"no-results":e=>{const{normalize:t}=e;return t(["Aucun résultat trouvé"])},placeholder:e=>{const{normalize:t}=e;return t(["Recherche"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’album"]),t(["Afficher les ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’artiste"]),t(["Afficher les ",n(r("count"))," artistes"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher le livre audio"]),t(["Afficher les ",n(r("count"))," livres audio"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher le compositeur"]),t(["Afficher les ",n(r("count"))," compositeurs"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la liste de lecture"]),t(["Afficher les ",n(r("count"))," listes de lecture"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher le podcast"]),t(["Afficher les ",n(r("count"))," podcasts"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la piste"]),t(["Afficher les ",n(r("n"))," pistes"])])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},tabs:{library:e=>{const{normalize:t}=e;return t(["Bibliothèque"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["Illustrations"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone prend en charge les illustrations au format PNG et JPEG qui sont soit placées dans la bibliothèque en tant que fichiers image séparés, soit intégrées dans les fichiers média, soit mises à disposition en ligne par les stations de radio."])},"explanation-2":e=>{const{normalize:t}=e;return t(["En outre, vous pouvez activer la récupération des illustrations à partir des fournisseurs d’illustrations suivants :"])},"show-coverart":e=>{const{normalize:t}=e;return t(["Afficher les illustrations dans la liste d’albums"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["Ignorer les illustrations fournies par les stations de radio"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["Aucune demande de jumelage active."])},"pairing-code":e=>{const{normalize:t}=e;return t(["Code de jumelage"])},"pairing-request":e=>{const{normalize:t}=e;return t(["Demande de jumelage de télécommande "])},pairing:e=>{const{normalize:t}=e;return t(["Jumelage de télécommande"])},send:e=>{const{normalize:t}=e;return t(["Envoyer"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["Si votre enceinte nécessite un jumelage, activez-la ci-dessous et entrez le code PIN qu’elle affiche."])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["Jumelage d’enceinte et vérification d’appareil"])},"verification-code":e=>{const{normalize:t}=e;return t(["Code de vérification"])},verify:e=>{const{normalize:t}=e;return t(["Vérifier"])}},general:{audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},files:e=>{const{normalize:t}=e;return t(["Fichiers"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},language:e=>{const{normalize:t}=e;return t(["Langue"])},music:e=>{const{normalize:t}=e;return t(["Musique"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["Si vous sélectionnez plus d’éléments que ce qui peut être affiché sur votre écran, le menu disparaîtra."])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["Sélectionnez les éléments de la barre de navigation supérieure"])},"navigation-items":e=>{const{normalize:t}=e;return t(["Barre de navigation"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["Page « En cours de lecture »"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(["Limiter le nombre d’albums affichés dans la section « Ajouts récents »"])},"recently-added-page":e=>{const{normalize:t}=e;return t(["Page « Ajouts récents »"])},search:e=>{const{normalize:t}=e;return t(["Recherche"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(["Liste des genres, séparés par des virgules, que le compositeur doit afficher sur la page « En cours de lecture »."])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["Laissez vide pour toujours afficher le compositeur."])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(['L’étiquette de genre de la piste actuelle est comparée en vérifiant si l’un des genres définis est inclus. Par exemple, en choisissant "classique, bande sonore", le compositeur pour les pistes dont l’étiquette de genre est "classique contemporain" sera affiché.'])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["Afficher le compositeur uniquement pour les genres listés"])},"show-composer-info":e=>{const{normalize:t}=e;return t(["Si actif, le compositeur de la piste en cours de lecture est affiché sur la page « En cours de lecture »"])},"show-composer":e=>{const{normalize:t}=e;return t(["Afficher le compositeur"])},"show-path":e=>{const{normalize:t}=e;return t(["Afficher le chemin du fichier sur la page « En cours de lecture »"])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["Connectez-vous avec votre nom d’utilisateur et votre mot de passe Last.fm pour activer le scrobbling."])},info:e=>{const{normalize:t}=e;return t(["Le nom d’utilisateur et le mot de passe Last.fm ne sont pas enregistrés, uniquement la clé de session. La clé de session n’expire pas."])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["L’option Last.fm n’est pas présente."])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["L’option Spotify n’est pas présente."])},"logged-as":e=>{const{normalize:t}=e;return t(["Connecté en tant que "])},requirements:e=>{const{normalize:t}=e;return t(["Vous devez posséder un compte Spotify Premium."])},scopes:e=>{const{normalize:t}=e;return t(["L’accès à l’API de Spotify permet l’analyse de votre bibliothèque Spotify. Les champs d’application requis sont les suivants :"])},user:e=>{const{normalize:t}=e;return t(["Accès autorisé pour "])},authorize:e=>{const{normalize:t}=e;return t(["Autoriser l’accès à l’API"])},"grant-access":e=>{const{normalize:t}=e;return t(["Accordez l’accès à l’API de Spotify"])},reauthorize:e=>{const{normalize:t}=e;return t(["Veuillez autoriser à nouveau l’accès à l’API pour accorder à OwnTone les droits d’accès supplémentaires suivants :"])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["Se connecter"])},logout:e=>{const{normalize:t}=e;return t(["Se déconnecter"])},password:e=>{const{normalize:t}=e;return t(["Mot de passe"])},username:e=>{const{normalize:t}=e;return t(["Nom d’utilisateur"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["Illustrations"])},general:e=>{const{normalize:t}=e;return t(["Général"])},"online-services":e=>{const{normalize:t}=e;return t(["Services en ligne"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["Télécommandes et sorties"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["Listes de lecture en vedette"])},"new-releases":e=>{const{normalize:t}=e;return t(["Nouvelle sorties"])},"show-more":e=>{const{normalize:t}=e;return t(["Afficher plus"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},"no-results":e=>{const{normalize:t}=e;return t(["Aucun résultat trouvé"])},placeholder:e=>{const{normalize:t}=e;return t(["Recherche"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’album"]),t(["Afficher les ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’artiste"]),t(["Afficher les ",n(r("count"))," artistes"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la liste de lecture"]),t(["Afficher les ",n(r("count"))," listes de lecture"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la piste"]),t(["Afficher les ",n(r("count"))," pistes"])])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["Dossier"])},plain:e=>{const{normalize:t}=e;return t(["Simple"])},smart:e=>{const{normalize:t}=e;return t(["Intelligente"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["Effacer l’historique"])},pause:e=>{const{normalize:t}=e;return t(["Mettre la lecture en pause"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},repeat:e=>{const{normalize:t}=e;return t(["Répéter toutes les pistes"])},"repeat-off":e=>{const{normalize:t}=e;return t(["Lire les pistes une fois"])},"repeat-once":e=>{const{normalize:t}=e;return t(["Répéter la piste en cours"])},"seek-backward":e=>{const{normalize:t}=e;return t(["Reculer dans la piste"])},"seek-forward":e=>{const{normalize:t}=e;return t(["Avancer dans la piste"])},shuffle:e=>{const{normalize:t}=e;return t(["Lire les pistes aléatoirement"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["Lire les pistes dans l’ordre"])},"skip-backward":e=>{const{normalize:t}=e;return t(["Reculer à la piste précédente"])},"skip-forward":e=>{const{normalize:t}=e;return t(["Avancer à la piste suivante"])},stop:e=>{const{normalize:t}=e;return t(["Arrêter la lecture"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["Voir/Cacher les paroles"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (erreur à l’enregistrement du réglage)"])},saved:e=>{const{normalize:t}=e;return t([" (réglage enregistré)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["Échec de connexion au serveur"])},"missing-port":e=>{const{normalize:t}=e;return t(["Port websocket manquant"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["La requête a échoué (status: ",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["La file d’attente enregistrée dans la liste de lecture ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste ajoutée à la file d’attente"]),t([n(r("count"))," pistes ajoutées à la file d’attente"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["La file d’attente est vide"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["Aujourd’hui"])},"last-week":e=>{const{normalize:t}=e;return t(["La semaine dernière"])},"last-month":e=>{const{normalize:t}=e;return t(["Le mois dernier"])},undefined:e=>{const{normalize:t}=e;return t(["Indéfini"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["mono"])},stereo:e=>{const{normalize:t}=e;return t(["stéréo"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," canal"]),t([n(r("count"))," canaux"])])}}}},{"zh-CN":{data:{kind:{file:e=>{const{normalize:t}=e;return t(["文件"])},url:e=>{const{normalize:t}=e;return t(["链接"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["流"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["添加"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},help:e=>{const{normalize:t}=e;return t(["添加一个可生成播放列表的播客RSS链接,这将允许OwnTone管理订阅"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["处理中…"])},title:e=>{const{normalize:t}=e;return t(["添加播客"])}},stream:{add:e=>{const{normalize:t}=e;return t(["添加"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},loading:e=>{const{normalize:t}=e;return t(["加载中…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["添加流"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"added-on":e=>{const{normalize:t}=e;return t(["添加时间"])},artist:e=>{const{normalize:t}=e;return t(["专辑艺人"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["标记为已播"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除播客"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])},type:e=>{const{normalize:t}=e;return t(["类型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"added-on":e=>{const{normalize:t}=e;return t(["添加时间"])},albums:e=>{const{normalize:t}=e;return t(["张专辑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])},type:e=>{const{normalize:t}=e;return t(["类型"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},albums:e=>{const{normalize:t}=e;return t(["张专辑"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},play:e=>{const{normalize:t}=e;return t(["播放"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},albums:e=>{const{normalize:t}=e;return t(["张专辑"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},play:e=>{const{normalize:t}=e;return t(["播放"])},path:e=>{const{normalize:t}=e;return t(["路径"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])},type:e=>{const{normalize:t}=e;return t(["类型"])},save:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},"playlist-name":e=>{const{normalize:t}=e;return t(["播放列表名称"])},save:e=>{const{normalize:t}=e;return t(["保存"])},saving:e=>{const{normalize:t}=e;return t(["保存中…"])},title:e=>{const{normalize:t}=e;return t(["保存播放清单到列表"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},album:e=>{const{normalize:t}=e;return t(["专辑"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["作曲家"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},genre:e=>{const{normalize:t}=e;return t(["流派"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盘符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["质量"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["专辑"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["艺人"])},type:e=>{const{normalize:t}=e;return t(["类型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["取消"])},pair:e=>{const{normalize:t}=e;return t(["遥控配对"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配对码"])},title:e=>{const{normalize:t}=e;return t(["请求遥控配对"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])},type:e=>{const{normalize:t}=e;return t(["类型"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},play:e=>{const{normalize:t}=e;return t(["播放"])},popularity:e=>{const{normalize:t}=e;return t(["流行度 / 粉丝数"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},owner:e=>{const{normalize:t}=e;return t(["所有者"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},album:e=>{const{normalize:t}=e;return t(["专辑"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盘符 / 曲目"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"added-on":e=>{const{normalize:t}=e;return t(["添加时间"])},"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},album:e=>{const{normalize:t}=e;return t(["专辑"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["评论"])},composer:e=>{const{normalize:t}=e;return t(["作曲家"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},genre:e=>{const{normalize:t}=e;return t(["流派"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["标记为最新"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["标记为已播放"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盘符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["质量"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["评级"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["专辑"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["艺人"])},type:e=>{const{normalize:t}=e;return t(["类型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},update:{all:e=>{const{normalize:t}=e;return t(["更新所有内容"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},feeds:e=>{const{normalize:t}=e;return t(["仅更新RSS订阅内容"])},info:e=>{const{normalize:t}=e;return t(["扫描新的、删除的和修改的文件"])},local:e=>{const{normalize:t}=e;return t(["仅更新本地资料库"])},progress:e=>{const{normalize:t}=e;return t(["正在更新本地资料库…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["重新扫描未修改文件的元数据"])},rescan:e=>{const{normalize:t}=e;return t(["重新扫描"])},spotify:e=>{const{normalize:t}=e;return t(["仅更新Spotify"])},title:e=>{const{normalize:t}=e;return t(["更新资料库"])}}},language:{de:e=>{const{normalize:t}=e;return t(["德语 (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["英语 (English)"])},fr:e=>{const{normalize:t}=e;return t(["法语 (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["简体中文"])},"zh-TW":e=>{const{normalize:t}=e;return t(["繁體中文"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["从资料库中永久移除该播客吗?"])},"info-2":e=>{const{normalize:t}=e;return t(["这也将移除RSS播放列表 "])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除播客"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["曲目无法播放"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([",被限制原因:",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["专辑"])},audiobook:e=>{const{normalize:t}=e;return t(["有声读物"])},music:e=>{const{normalize:t}=e;return t(["音乐"])},podcast:e=>{const{normalize:t}=e;return t(["播客"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["关于"])},albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP流错误:流载入失败或者由于网络原因无法载入"])},stream:e=>{const{normalize:t}=e;return t(["HTTP流"])},volume:e=>{const{normalize:t}=e;return t(["音量"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},music:e=>{const{normalize:t}=e;return t(["音乐"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["播客"])},radio:e=>{const{normalize:t}=e;return t(["广播电台"])},search:e=>{const{normalize:t}=e;return t(["搜索"])},settings:e=>{const{normalize:t}=e;return t(["设置"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["更新资料库"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["界面贡献者包括 ",n(r("bulma")),",",n(r("mdi")),",",n(r("vuejs")),",",n(r("axios"))," 和 ",n(r("others"))])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["编译支持来自于 ",n(r("options"))])},library:e=>{const{normalize:t}=e;return t(["资料库"])},more:e=>{const{normalize:t}=e;return t(["更多"])},"total-playtime":e=>{const{normalize:t}=e;return t(["总播放时长"])},tracks:e=>{const{normalize:t}=e;return t(["曲目总数"])},update:e=>{const{normalize:t}=e;return t(["更新"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("time"))," 前"])},updated:e=>{const{normalize:t}=e;return t(["更新于"])},uptime:e=>{const{normalize:t}=e;return t(["运行时长"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["版本 ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},filter:e=>{const{normalize:t}=e;return t(["筛选"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在播放列表出现的单曲和专辑"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隐藏单曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在Spotify资料库出现的专辑"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隐藏来自Spotify的专辑"])},title:e=>{const{normalize:t}=e;return t(["专辑"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["艺人 › 名称"])},"artist-date":e=>{const{normalize:t}=e;return t(["艺人 › 发行日期"])},title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近添加"])},"recently-released":e=>{const{normalize:t}=e;return t(["最近发行"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},filter:e=>{const{normalize:t}=e;return t(["筛选"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏只出现在Spotify库中的内容"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隐藏来自Spotify的内容"])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},rating:e=>{const{normalize:t}=e;return t(["评级"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位艺人"]),t([n(r("count"))," 位艺人"])])},filter:e=>{const{normalize:t}=e;return t(["筛选"])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近添加"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在播放列表出现的单曲和专辑"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隐藏单曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在Spotify资料库出现的专辑"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隐藏来自Spotify的艺人"])},title:e=>{const{normalize:t}=e;return t(["艺人"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个有声读物"]),t([n(r("count"))," 个有声读物"])])},title:e=>{const{normalize:t}=e;return t(["有声读物"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},play:e=>{const{normalize:t}=e;return t(["播放"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作者"]),t([n(r("count"))," 位作者"])])},title:e=>{const{normalize:t}=e;return t(["作者"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["作者"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},genres:e=>{const{normalize:t}=e;return t(["流派"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},rating:e=>{const{normalize:t}=e;return t(["评级"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作曲家"]),t([n(r("count"))," 位作曲家"])])},title:e=>{const{normalize:t}=e;return t(["作曲家"])}},files:{play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["文件"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},rating:e=>{const{normalize:t}=e;return t(["评级"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个流派"]),t([n(r("count"))," 个流派"])])},title:e=>{const{normalize:t}=e;return t(["流派"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["显示更多"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["最近添加"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["最近播放"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},history:e=>{const{normalize:t}=e;return t(["历史"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["浏览资料库添加曲目"])},live:e=>{const{normalize:t}=e;return t(["直播"])},title:e=>{const{normalize:t}=e;return t(["播放清单是空的"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," 曲目"])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["播放列表"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个播放列表"]),t([n(r("count"))," 个播放列表"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},play:e=>{const{normalize:t}=e;return t(["播放"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["从资料库中永久移除该播客?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["这也将移除该播客RSS列表 "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除播客"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["添加"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个播客"]),t([n(r("count"))," 个播客"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["全部标记为已播放"])},"new-episodes":e=>{const{normalize:t}=e;return t(["最新单集"])},title:e=>{const{normalize:t}=e;return t(["播客"])},update:e=>{const{normalize:t}=e;return t(["更新"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["添加流"])},clear:e=>{const{normalize:t}=e;return t(["清除"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},edit:e=>{const{normalize:t}=e;return t(["编辑"])},"hide-previous":e=>{const{normalize:t}=e;return t(["隐藏历史"])},title:e=>{const{normalize:t}=e;return t(["清单"])},save:e=>{const{normalize:t}=e;return t(["保存"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个电台"]),t([n(r("count"))," 个电台"])])},title:e=>{const{normalize:t}=e;return t(["广播电台"])}},search:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},expression:e=>{const{normalize:t}=e;return t(["表达式"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["提示:如果您使用 ",n(r("query"))," 前缀,则可以通过智能播放列表查询语言 ",n(r("help"))," 进行搜索"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到结果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜索"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["播客"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示专辑"]),t(["显示所有 ",n(r("count"))," 个专辑"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示艺人"]),t(["显示所有 ",n(r("count"))," 位艺人"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示有声书"]),t(["显示所有 ",n(r("count"))," 本有声书"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示作曲家"]),t(["显示所有 ",n(r("count"))," 位作曲家"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示播放列表"]),t(["显示所有 ",n(r("count"))," 个播放列表"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示播客"]),t(["显示所有 ",n(r("count"))," 个播客"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示曲目"]),t(["显示所有 ",n(r("count"))," 只曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])},tabs:{library:e=>{const{normalize:t}=e;return t(["资料库"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["封面"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone支持PNG和 JPEG封面,这些封面可以作为单独的图像文件放置在库中或嵌入到媒体文件中,也可以通过广播电台在线提供"])},"explanation-2":e=>{const{normalize:t}=e;return t(["除此之外,您还可以从以下素材提供者获取封面:"])},"show-coverart":e=>{const{normalize:t}=e;return t(["在专辑列表中显示封面艺术作品"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["忽略广播电台提供的作品"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["没有活跃的配对请求"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配对代码"])},"pairing-request":e=>{const{normalize:t}=e;return t(["远程配对请求来自于 "])},pairing:e=>{const{normalize:t}=e;return t(["遥控配对"])},send:e=>{const{normalize:t}=e;return t(["发送"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["如果您的扬声器需要配对,请在下面输入它显示的 PIN以激活"])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["扬声器配对和设备验证"])},"verification-code":e=>{const{normalize:t}=e;return t(["验证码"])},verify:e=>{const{normalize:t}=e;return t(["验证"])}},general:{audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},language:e=>{const{normalize:t}=e;return t(["语言"])},music:e=>{const{normalize:t}=e;return t(["音乐"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["如果您选择的项目多于屏幕上可以显示的项目,则侧边栏菜单将会消失"])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["选择顶部导航栏菜单项"])},"navigation-items":e=>{const{normalize:t}=e;return t(["导航条"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["“正在播放”页面"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["播客"])},radio:e=>{const{normalize:t}=e;return t(["广播电台"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(["限制“最近添加”页面上显示的专辑数量"])},"recently-added-page":e=>{const{normalize:t}=e;return t(["“最近添加”页面"])},search:e=>{const{normalize:t}=e;return t(["搜索"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(["以逗号分隔流派,作曲家会在“正在播放的页面”上显示"])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["留空以始终显示作曲家"])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(["通过检查是否包含定义的流派之一来匹配当前曲目的流派标签。例如,设置为“古典、原声带”将显示流派标签为“当代古典”的曲目的作曲家"])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["仅显示列出的流派的作曲家"])},"show-composer-info":e=>{const{normalize:t}=e;return t(["如果启用,当前播放曲目的作曲家将显示在“正在播放页面”上"])},"show-composer":e=>{const{normalize:t}=e;return t(["显示作曲家"])},"show-path":e=>{const{normalize:t}=e;return t(["在“正在播放”页面显示文件路径"])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["使用您的 Last.fm 用户名和密码登录以启用记录功能"])},info:e=>{const{normalize:t}=e;return t(["OwnTone不会存储您的 Last.fm 用户名/密码,仅存储会话密钥。会话密钥不会过期"])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone的构建没有来自Last.fm的官方支持"])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone的构建没有来自 Spotify 官方的支持,也未安装 libspotify"])},"logged-as":e=>{const{normalize:t}=e;return t(["登录为 "])},requirements:e=>{const{normalize:t}=e;return t(["您必须拥有 Spotify付费帐户"])},scopes:e=>{const{normalize:t}=e;return t(["访问 Spotify Web API 可以扫描您的 Spotify库。所需范围是:"])},user:e=>{const{normalize:t}=e;return t(["授予访问权限"])},authorize:e=>{const{normalize:t}=e;return t(["授权 Web API 访问"])},"grant-access":e=>{const{normalize:t}=e;return t(["授予对 Spotify Web API 的访问权限"])},reauthorize:e=>{const{normalize:t}=e;return t(["请重新授权 Web API 访问权限,以授予 OwnTone 以下附加访问权限:"])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["登入"])},logout:e=>{const{normalize:t}=e;return t(["退出"])},password:e=>{const{normalize:t}=e;return t(["密码"])},username:e=>{const{normalize:t}=e;return t(["用户名"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["封面"])},general:e=>{const{normalize:t}=e;return t(["概览"])},"online-services":e=>{const{normalize:t}=e;return t(["在线服务"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["遥控和输出"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["特色列表"])},"new-releases":e=>{const{normalize:t}=e;return t(["最新发行"])},"show-more":e=>{const{normalize:t}=e;return t(["显示更多"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])}},search:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到结果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜索"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示专辑"]),t(["显示所有 ",n(r("count"))," 个专辑"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示艺人"]),t(["显示所有 ",n(r("count"))," 位艺人"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示播放列表"]),t(["显示所有 ",n(r("count"))," 个播放列表"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示曲目"]),t(["显示所有 ",n(r("count"))," 只曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["文件夹"])},plain:e=>{const{normalize:t}=e;return t(["简单"])},smart:e=>{const{normalize:t}=e;return t(["智能"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["清除历史"])},pause:e=>{const{normalize:t}=e;return t(["暂停"])},play:e=>{const{normalize:t}=e;return t(["播放"])},repeat:e=>{const{normalize:t}=e;return t(["重复播放所有曲目"])},"repeat-off":e=>{const{normalize:t}=e;return t(["所有曲目仅播放一遍"])},"repeat-once":e=>{const{normalize:t}=e;return t(["重复当前曲目"])},"seek-backward":e=>{const{normalize:t}=e;return t(["在当前曲目后退"])},"seek-forward":e=>{const{normalize:t}=e;return t(["在当前曲目前进"])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放曲目"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["按顺序播放曲目"])},"skip-backward":e=>{const{normalize:t}=e;return t(["播放上一首"])},"skip-forward":e=>{const{normalize:t}=e;return t(["播放下一首"])},stop:e=>{const{normalize:t}=e;return t(["停止"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["显示/隐藏歌词"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (设置保存错误)"])},saved:e=>{const{normalize:t}=e;return t([" (设置已保存)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["无法连接到 OwnTone 服务器"])},"missing-port":e=>{const{normalize:t}=e;return t(["缺少 websocket 端口"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["请求失败 (状态:",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["清单以添加到播放列表 ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["已附加到队列的 ",n(r("count"))," 只曲目"]),t(["已附加到队列的 ",n(r("count"))," 只曲目"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["清单是空的"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["今日"])},"last-week":e=>{const{normalize:t}=e;return t(["上周"])},"last-month":e=>{const{normalize:t}=e;return t(["上月"])},undefined:e=>{const{normalize:t}=e;return t(["未定义"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["单声道"])},stereo:e=>{const{normalize:t}=e;return t(["立体声"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 信道"]),t([n(r("count"))," 信道"])])}}}},{"zh-TW":{data:{kind:{file:e=>{const{normalize:t}=e;return t(["文件"])},url:e=>{const{normalize:t}=e;return t(["鏈接"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["串流"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["新增"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},help:e=>{const{normalize:t}=e;return t(["新增一個可生成播放列表的Podcast RSS鏈接,這將允許OwnTone管理訂閱"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["處理中…"])},title:e=>{const{normalize:t}=e;return t(["新增Podcast"])}},stream:{add:e=>{const{normalize:t}=e;return t(["新增"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},loading:e=>{const{normalize:t}=e;return t(["載入中…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["新增串流"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"added-on":e=>{const{normalize:t}=e;return t(["新增時間"])},artist:e=>{const{normalize:t}=e;return t(["專輯藝人"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["標記為已播"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除Podcast"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])},type:e=>{const{normalize:t}=e;return t(["類型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"added-on":e=>{const{normalize:t}=e;return t(["新增時間"])},albums:e=>{const{normalize:t}=e;return t(["張專輯"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])},type:e=>{const{normalize:t}=e;return t(["類型"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},albums:e=>{const{normalize:t}=e;return t(["張專輯"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},play:e=>{const{normalize:t}=e;return t(["播放"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},albums:e=>{const{normalize:t}=e;return t(["張專輯"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},play:e=>{const{normalize:t}=e;return t(["播放"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])},type:e=>{const{normalize:t}=e;return t(["類型"])},save:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},"playlist-name":e=>{const{normalize:t}=e;return t(["播放列表名稱"])},save:e=>{const{normalize:t}=e;return t(["儲存"])},saving:e=>{const{normalize:t}=e;return t(["儲存中…"])},title:e=>{const{normalize:t}=e;return t(["儲存播放清單到列表"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},album:e=>{const{normalize:t}=e;return t(["專輯"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["作曲"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},genre:e=>{const{normalize:t}=e;return t(["音樂類型"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盤符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["品質"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["專輯"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["藝人"])},type:e=>{const{normalize:t}=e;return t(["類型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["取消"])},pair:e=>{const{normalize:t}=e;return t(["遙控配對"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配對碼"])},title:e=>{const{normalize:t}=e;return t(["請求遙控配對"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])},type:e=>{const{normalize:t}=e;return t(["類型"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},play:e=>{const{normalize:t}=e;return t(["播放"])},popularity:e=>{const{normalize:t}=e;return t(["流行度 / 粉絲數"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},owner:e=>{const{normalize:t}=e;return t(["所有者"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},album:e=>{const{normalize:t}=e;return t(["專輯"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盤符 / 曲目"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"added-on":e=>{const{normalize:t}=e;return t(["新增時間"])},"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},album:e=>{const{normalize:t}=e;return t(["專輯"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["評論"])},composer:e=>{const{normalize:t}=e;return t(["作曲家"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},genre:e=>{const{normalize:t}=e;return t(["音樂類型"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["標記為最新"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["標記為已播放"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盤符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["品質"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["評級"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["專輯"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["藝人"])},type:e=>{const{normalize:t}=e;return t(["類型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},update:{all:e=>{const{normalize:t}=e;return t(["更新所有內容"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},feeds:e=>{const{normalize:t}=e;return t(["僅更新RSS訂閱內容"])},info:e=>{const{normalize:t}=e;return t(["掃描新的、刪除的和修改的文件"])},local:e=>{const{normalize:t}=e;return t(["僅更新本地資料庫"])},progress:e=>{const{normalize:t}=e;return t(["正在更新本地資料庫…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["重新掃描未修改文件的中繼資料"])},rescan:e=>{const{normalize:t}=e;return t(["重新掃描"])},spotify:e=>{const{normalize:t}=e;return t(["僅更新Spotify"])},title:e=>{const{normalize:t}=e;return t(["更新資料庫"])}}},language:{de:e=>{const{normalize:t}=e;return t(["德語 (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["英語 (English)"])},fr:e=>{const{normalize:t}=e;return t(["法語 (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["簡體中文"])},"zh-TW":e=>{const{normalize:t}=e;return t(["繁體中文"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["從資料庫中永久移除該Podcast嗎?"])},"info-2":e=>{const{normalize:t}=e;return t(["這也將移除RSS播放列表 "])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除Podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["曲目無法播放"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([",被限制原因:",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["專輯"])},audiobook:e=>{const{normalize:t}=e;return t(["有聲書"])},music:e=>{const{normalize:t}=e;return t(["音樂"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["關於"])},albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP串流錯誤:串流載入失敗或者由於網絡原因無法載入"])},stream:e=>{const{normalize:t}=e;return t(["HTTP串流"])},volume:e=>{const{normalize:t}=e;return t(["音量"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},music:e=>{const{normalize:t}=e;return t(["音樂"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcast"])},radio:e=>{const{normalize:t}=e;return t(["電台"])},search:e=>{const{normalize:t}=e;return t(["搜尋"])},settings:e=>{const{normalize:t}=e;return t(["設定"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["更新資料庫"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["界面貢獻者包括 ",n(r("bulma")),",",n(r("mdi")),",",n(r("vuejs")),",",n(r("axios"))," 和 ",n(r("others"))])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["編譯支持來自於 ",n(r("options"))])},library:e=>{const{normalize:t}=e;return t(["資料庫"])},more:e=>{const{normalize:t}=e;return t(["更多"])},"total-playtime":e=>{const{normalize:t}=e;return t(["總播放時長"])},tracks:e=>{const{normalize:t}=e;return t(["曲目總數"])},update:e=>{const{normalize:t}=e;return t(["更新"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("time"))," 前"])},updated:e=>{const{normalize:t}=e;return t(["更新於"])},uptime:e=>{const{normalize:t}=e;return t(["運行時長"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["版本 ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},filter:e=>{const{normalize:t}=e;return t(["篩選"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在播放列表出現的單曲和專輯"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隱藏單曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在Spotify資料庫出現的專輯"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隱藏來自Spotify的專輯"])},title:e=>{const{normalize:t}=e;return t(["專輯"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["藝人 › 名稱"])},"artist-date":e=>{const{normalize:t}=e;return t(["藝人 › 發行日期"])},title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近新增"])},"recently-released":e=>{const{normalize:t}=e;return t(["最近發行"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},filter:e=>{const{normalize:t}=e;return t(["篩選"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏只出現在Spotify庫中的內容"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隱藏來自Spotify的內容"])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},rating:e=>{const{normalize:t}=e;return t(["評級"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位藝人"]),t([n(r("count"))," 位藝人"])])},filter:e=>{const{normalize:t}=e;return t(["篩選"])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近新增"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在播放列表出現的單曲和專輯"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隱藏單曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在Spotify資料庫出現的專輯"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隱藏來自Spotify的藝人"])},title:e=>{const{normalize:t}=e;return t(["藝人"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個有聲書"]),t([n(r("count"))," 個有聲書"])])},title:e=>{const{normalize:t}=e;return t(["有聲書"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},play:e=>{const{normalize:t}=e;return t(["播放"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作者"]),t([n(r("count"))," 位作者"])])},title:e=>{const{normalize:t}=e;return t(["作者"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["作者"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},rating:e=>{const{normalize:t}=e;return t(["評級"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作曲家"]),t([n(r("count"))," 位作曲家"])])},title:e=>{const{normalize:t}=e;return t(["作曲家"])}},files:{play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["文件"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},rating:e=>{const{normalize:t}=e;return t(["評級"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個音樂類型"]),t([n(r("count"))," 個音樂類型"])])},title:e=>{const{normalize:t}=e;return t(["音樂類型"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["顯示更多"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["最近新增"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["最近播放"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},history:e=>{const{normalize:t}=e;return t(["歷史"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["瀏覽資料庫新增曲目"])},live:e=>{const{normalize:t}=e;return t(["直播"])},title:e=>{const{normalize:t}=e;return t(["播放清單是空的"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," 曲目"])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["播放列表"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個播放列表"]),t([n(r("count"))," 個播放列表"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},play:e=>{const{normalize:t}=e;return t(["播放"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["從資料庫中永久移除該Podcast?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["這也將移除該PodcastRSS列表 "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除Podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["新增"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個Podcast"]),t([n(r("count"))," 個Podcast"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["全部標記為已播放"])},"new-episodes":e=>{const{normalize:t}=e;return t(["最新單集"])},title:e=>{const{normalize:t}=e;return t(["Podcast"])},update:e=>{const{normalize:t}=e;return t(["更新"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["新增串流"])},clear:e=>{const{normalize:t}=e;return t(["清除"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},edit:e=>{const{normalize:t}=e;return t(["編輯"])},"hide-previous":e=>{const{normalize:t}=e;return t(["隱藏歷史"])},title:e=>{const{normalize:t}=e;return t(["清單"])},save:e=>{const{normalize:t}=e;return t(["儲存"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個電台"]),t([n(r("count"))," 個電台"])])},title:e=>{const{normalize:t}=e;return t(["電台"])}},search:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},expression:e=>{const{normalize:t}=e;return t(["表達式"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["提示:如果您使用 ",n(r("query"))," 前綴,則可以通過智能播放列表查詢語言 ",n(r("help"))," 進行搜尋"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到結果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜尋"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcast"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示專輯"]),t(["顯示所有 ",n(r("count"))," 個專輯"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示藝人"]),t(["顯示所有 ",n(r("count"))," 位藝人"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示有聲書"]),t(["顯示所有 ",n(r("count"))," 本有聲書"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示作曲家"]),t(["顯示所有 ",n(r("count"))," 位作曲家"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示播放列表"]),t(["顯示所有 ",n(r("count"))," 個播放列表"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示Podcast"]),t(["顯示所有 ",n(r("count"))," 個Podcast"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示曲目"]),t(["顯示所有 ",n(r("count"))," 首曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])},tabs:{library:e=>{const{normalize:t}=e;return t(["資料庫"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["封面"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone支持PNG和 JPEG封面,這些封面可以作為單獨的圖像文件放置在庫中或嵌入到媒體文件中,也可以通過電台在線提供"])},"explanation-2":e=>{const{normalize:t}=e;return t(["除此之外,您還可以從以下素材提供者獲取封面:"])},"show-coverart":e=>{const{normalize:t}=e;return t(["在專輯列表中顯示封面藝術作品"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["忽略電台提供的作品"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["沒有活躍的配對請求"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配對代碼"])},"pairing-request":e=>{const{normalize:t}=e;return t(["遠程配對請求來自於 "])},pairing:e=>{const{normalize:t}=e;return t(["遙控配對"])},send:e=>{const{normalize:t}=e;return t(["發送"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["如果您的揚聲器需要配對,請在下面輸入它顯示的 PIN以啓用"])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["揚聲器配對和設備驗證"])},"verification-code":e=>{const{normalize:t}=e;return t(["驗證碼"])},verify:e=>{const{normalize:t}=e;return t(["驗證"])}},general:{audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},language:e=>{const{normalize:t}=e;return t(["語言"])},music:e=>{const{normalize:t}=e;return t(["音樂"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["如果您選擇的項目多於屏幕上可以顯示的項目,則側邊欄菜單將會消失"])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["選擇頂部導航欄菜單項"])},"navigation-items":e=>{const{normalize:t}=e;return t(["導航條"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["“正在播放”頁面"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcast"])},radio:e=>{const{normalize:t}=e;return t(["電台"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(["限制“最近新增”頁面上顯示的專輯數量"])},"recently-added-page":e=>{const{normalize:t}=e;return t(["“最近新增”頁面"])},search:e=>{const{normalize:t}=e;return t(["搜尋"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(["以逗號分隔音樂類型,作曲家會在“正在播放的頁面”上顯示"])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["留空以始終顯示作曲家"])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(["通過檢查是否包含定義的音樂類型之一來匹配當前曲目的音樂類型標籤。例如,設定為“古典、原聲帶”將顯示音樂類型標籤為“當代古典”的曲目的作曲家"])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["僅顯示列出的音樂類型的作曲家"])},"show-composer-info":e=>{const{normalize:t}=e;return t(["如果啓用,當前播放曲目的作曲家將顯示在“正在播放頁面”上"])},"show-composer":e=>{const{normalize:t}=e;return t(["顯示作曲家"])},"show-path":e=>{const{normalize:t}=e;return t(["在“正在播放”頁面顯示文件路徑"])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["使用您的 Last.fm 用戶名和密碼登入以啓用記錄功能"])},info:e=>{const{normalize:t}=e;return t(["OwnTone不會存儲您的 Last.fm 用戶名/密碼,僅存儲會話密鑰。會話密鑰不會過期"])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone並無Last.fm的官方支持"])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone並無 Spotify 官方的支持,也未安裝 libspotify"])},"logged-as":e=>{const{normalize:t}=e;return t(["登入為 "])},requirements:e=>{const{normalize:t}=e;return t(["您必須擁有 Spotify付費帳戶"])},scopes:e=>{const{normalize:t}=e;return t(["訪問 Spotify Web API 可以掃描您的 Spotify庫。所需範圍是:"])},user:e=>{const{normalize:t}=e;return t(["授予訪問權限"])},authorize:e=>{const{normalize:t}=e;return t(["授權 Web API 訪問"])},"grant-access":e=>{const{normalize:t}=e;return t(["授予對 Spotify Web API 的訪問權限"])},reauthorize:e=>{const{normalize:t}=e;return t(["請重新授權 Web API 訪問權限,以授予 OwnTone 以下附加訪問權限:"])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["登入"])},logout:e=>{const{normalize:t}=e;return t(["退出"])},password:e=>{const{normalize:t}=e;return t(["密碼"])},username:e=>{const{normalize:t}=e;return t(["用戶名"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["封面"])},general:e=>{const{normalize:t}=e;return t(["概覽"])},"online-services":e=>{const{normalize:t}=e;return t(["在線服務"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["遙控和輸出"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["特色列表"])},"new-releases":e=>{const{normalize:t}=e;return t(["最新發行"])},"show-more":e=>{const{normalize:t}=e;return t(["顯示更多"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])}},search:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到結果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜尋"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示專輯"]),t(["顯示所有 ",n(r("count"))," 個專輯"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示藝人"]),t(["顯示所有 ",n(r("count"))," 位藝人"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示播放列表"]),t(["顯示所有 ",n(r("count"))," 個播放列表"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示曲目"]),t(["顯示所有 ",n(r("count"))," 首曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["檔案夾"])},plain:e=>{const{normalize:t}=e;return t(["簡單"])},smart:e=>{const{normalize:t}=e;return t(["智能"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["清除歷史"])},pause:e=>{const{normalize:t}=e;return t(["暫停"])},play:e=>{const{normalize:t}=e;return t(["播放"])},repeat:e=>{const{normalize:t}=e;return t(["重復播放所有曲目"])},"repeat-off":e=>{const{normalize:t}=e;return t(["所有曲目僅播放一遍"])},"repeat-once":e=>{const{normalize:t}=e;return t(["重復當前曲目"])},"seek-backward":e=>{const{normalize:t}=e;return t(["在當前曲目後退"])},"seek-forward":e=>{const{normalize:t}=e;return t(["在當前曲目前進"])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放曲目"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["按順序播放曲目"])},"skip-backward":e=>{const{normalize:t}=e;return t(["播放上一首"])},"skip-forward":e=>{const{normalize:t}=e;return t(["播放下一首"])},stop:e=>{const{normalize:t}=e;return t(["停止"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["顯示/隱藏歌詞"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (設定儲存錯誤)"])},saved:e=>{const{normalize:t}=e;return t([" (設定已儲存)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["無法連接到 OwnTone 伺服器"])},"missing-port":e=>{const{normalize:t}=e;return t(["缺少 websocket 端口"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["請求失敗 (狀態:",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["清單以新增到播放列表 ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["已附加到隊列的 ",n(r("count"))," 首曲目"]),t(["已附加到隊列的 ",n(r("count"))," 首曲目"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["清單是空的"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["今日"])},"last-week":e=>{const{normalize:t}=e;return t(["上周"])},"last-month":e=>{const{normalize:t}=e;return t(["上月"])},undefined:e=>{const{normalize:t}=e;return t(["未定義"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["單聲道"])},stereo:e=>{const{normalize:t}=e;return t(["立體聲"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 信道"]),t([n(r("count"))," 信道"])])}}}}),ql=wS({availableLocales:"zh-TW",fallbackLocale:"en",fallbackWarn:!1,legacy:!1,locale:navigator.language,messages:IS,missingWarn:!1}),dr=jn("NotificationsStore",{state:()=>({list:[],next_id:1}),actions:{add(e){const t={id:this.next_id++,text:e.text,timeout:e.timeout,topic:e.topic,type:e.type};if(t.topic){const n=this.list.findIndex(r=>r.topic===t.topic);if(n>=0){this.list.splice(n,1,t);return}}this.list.push(t),e.timeout>0&&setTimeout(()=>{this.remove(t)},e.timeout)},remove(e){const t=this.list.indexOf(e);t!==-1&&this.list.splice(t,1)}}}),En=jn("PlayerStore",{state:()=>({consume:!1,item_id:0,item_length_ms:0,item_progress_ms:0,repeat:"off",shuffle:!1,state:"stop",volume:0})}),tr=jn("QueueStore",{state:()=>({count:0,items:[],version:0}),getters:{current(e){const t=En();return e.items.find(n=>n.id===t.item_id)??{}}}}),{t:ns}=ql.global;ue.interceptors.response.use(e=>e,e=>(e.request.status&&e.request.responseURL&&dr().add({text:ns("server.request-failed",{cause:e.request.statusText,status:e.request.status,url:e.request.responseURL}),type:"danger"}),Promise.reject(e)));const B={config(){return ue.get("./api/config")},lastfm(){return ue.get("./api/lastfm")},lastfm_login(e){return ue.post("./api/lastfm-login",e)},lastfm_logout(){return ue.get("./api/lastfm-logout")},library_add(e){return ue.post("./api/library/add",null,{params:{url:e}})},library_album(e){return ue.get(`./api/library/albums/${e}`)},library_album_track_update(e,t){return ue.put(`./api/library/albums/${e}/tracks`,null,{params:t})},library_album_tracks(e,t={limit:-1,offset:0}){return ue.get(`./api/library/albums/${e}/tracks`,{params:t})},library_albums(e){return ue.get("./api/library/albums",{params:{media_kind:e}})},library_artist(e){return ue.get(`./api/library/artists/${e}`)},library_artist_albums(e){return ue.get(`./api/library/artists/${e}/albums`)},library_artist_tracks(e){const t={expression:`songartistid is "${e}"`,type:"tracks"};return ue.get("./api/search",{params:t})},library_artists(e){return ue.get("./api/library/artists",{params:{media_kind:e}})},library_composer(e){return ue.get(`./api/library/composers/${encodeURIComponent(e)}`)},library_composer_albums(e){const t={expression:`composer is "${e}" and media_kind is music`,type:"albums"};return ue.get("./api/search",{params:t})},library_composer_tracks(e){const t={expression:`composer is "${e}" and media_kind is music`,type:"tracks"};return ue.get("./api/search",{params:t})},library_composers(e){return ue.get("./api/library/composers",{params:{media_kind:e}})},library_count(e){return ue.get(`./api/library/count?expression=${e}`)},library_files(e){return ue.get("./api/library/files",{params:{directory:e}})},library_genre(e,t){const n={expression:`genre is "${e}" and media_kind is ${t}`,type:"genres"};return ue.get("./api/search",{params:n})},library_genre_albums(e,t){const n={expression:`genre is "${e}" and media_kind is ${t}`,type:"albums"};return ue.get("./api/search",{params:n})},library_genre_tracks(e,t){const n={expression:`genre is "${e}" and media_kind is ${t}`,type:"tracks"};return ue.get("./api/search",{params:n})},library_genres(e){const t={expression:`media_kind is ${e}`,type:"genres"};return ue.get("./api/search",{params:t})},library_playlist(e){return ue.get(`./api/library/playlists/${e}`)},library_playlist_delete(e){return ue.delete(`./api/library/playlists/${e}`,null)},library_playlist_folder(e=0){return ue.get(`./api/library/playlists/${e}/playlists`)},library_playlist_tracks(e){return ue.get(`./api/library/playlists/${e}/tracks`)},library_podcast_episodes(e){const t={expression:`media_kind is podcast and songalbumid is "${e}" ORDER BY date_released DESC`,type:"tracks"};return ue.get("./api/search",{params:t})},library_podcasts_new_episodes(){const e={expression:"media_kind is podcast and play_count = 0 ORDER BY time_added DESC",type:"tracks"};return ue.get("./api/search",{params:e})},library_radio_streams(){const e={expression:"data_kind is url and song_length = 0",media_kind:"music",type:"tracks"};return ue.get("./api/search",{params:e})},library_rescan(e){return ue.put("./api/rescan",null,{params:{scan_kind:e}})},library_stats(){return ue.get("./api/library")},library_track(e){return ue.get(`./api/library/tracks/${e}`)},library_track_playlists(e){return ue.get(`./api/library/tracks/${e}/playlists`)},library_track_update(e,t={}){return ue.put(`./api/library/tracks/${e}`,null,{params:t})},library_update(e){return ue.put("./api/update",null,{params:{scan_kind:e}})},output_toggle(e){return ue.put(`./api/outputs/${e}/toggle`)},output_update(e,t){return ue.put(`./api/outputs/${e}`,t)},outputs(){return ue.get("./api/outputs")},pairing(){return ue.get("./api/pairing")},pairing_kickoff(e){return ue.post("./api/pairing",e)},player_consume(e){return ue.put(`./api/player/consume?state=${e}`)},player_next(){return ue.put("./api/player/next")},player_output_volume(e,t){return ue.put(`./api/player/volume?volume=${t}&output_id=${e}`)},player_pause(){return ue.put("./api/player/pause")},player_play(e={}){return ue.put("./api/player/play",null,{params:e})},player_play_expression(e,t,n){const r={clear:"true",expression:e,playback:"start",playback_from_position:n,shuffle:t};return ue.post("./api/queue/items/add",null,{params:r})},player_play_uri(e,t,n){const r={clear:"true",playback:"start",playback_from_position:n,shuffle:t,uris:e};return ue.post("./api/queue/items/add",null,{params:r})},player_previous(){return ue.put("./api/player/previous")},player_repeat(e){return ue.put(`./api/player/repeat?state=${e}`)},player_seek(e){return ue.put(`./api/player/seek?seek_ms=${e}`)},player_seek_to_pos(e){return ue.put(`./api/player/seek?position_ms=${e}`)},player_shuffle(e){return ue.put(`./api/player/shuffle?state=${e}`)},player_status(){return ue.get("./api/player")},player_stop(){return ue.put("./api/player/stop")},player_volume(e){return ue.put(`./api/player/volume?volume=${e}`)},queue(){return ue.get("./api/queue")},queue_add(e){return ue.post(`./api/queue/items/add?uris=${e}`).then(t=>(dr().add({text:ns("server.appended-tracks",{count:t.data.count}),timeout:2e3,type:"info"}),Promise.resolve(t)))},queue_add_next(e){let t=0;const{current:n}=tr();return n!=null&&n.id&&(t=n.position+1),ue.post(`./api/queue/items/add?uris=${e}&position=${t}`).then(r=>(dr().add({text:ns("server.appended-tracks",{count:r.data.count}),timeout:2e3,type:"info"}),Promise.resolve(r)))},queue_clear(){return ue.put("./api/queue/clear")},queue_expression_add(e){return ue.post("./api/queue/items/add",null,{params:{expression:e}}).then(t=>(dr().add({text:ns("server.appended-tracks",{count:t.data.count}),timeout:2e3,type:"info"}),Promise.resolve(t)))},queue_expression_add_next(e){const t={};t.expression=e,t.position=0;const{current:n}=tr();return n!=null&&n.id&&(t.position=n.position+1),ue.post("./api/queue/items/add",null,{params:t}).then(r=>(dr().add({text:ns("server.appended-tracks",{count:r.data.count}),timeout:2e3,type:"info"}),Promise.resolve(r)))},queue_move(e,t){return ue.put(`./api/queue/items/${e}?new_position=${t}`)},queue_remove(e){return ue.delete(`./api/queue/items/${e}`)},queue_save_playlist(e){return ue.post("./api/queue/save",null,{params:{name:e}}).then(t=>(dr().add({text:ns("server.queue-saved",{name:e}),timeout:2e3,type:"info"}),Promise.resolve(t)))},search(e){return ue.get("./api/search",{params:e})},settings(){return ue.get("./api/settings")},settings_update(e,t){return ue.put(`./api/settings/${e}/${t.name}`,t)},spotify(){return ue.get("./api/spotify")},spotify_logout(){return ue.get("./api/spotify-logout")}},ae=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},LS={name:"ModalDialogRemotePairing",props:{show:Boolean},emits:["close"],setup(){return{remoteStore:Nd()}},data(){return{pairing_req:{pin:""}}},computed:{pairing(){return this.remoteStore.pairing}},watch:{show(){this.show&&(this.loading=!1,setTimeout(()=>{this.$refs.pin_field.focus()},10))}},methods:{kickoff_pairing(){B.pairing_kickoff(this.pairing_req).then(()=>{this.pairing_req.pin=""})}}},NS={key:0,class:"modal is-active"},DS={class:"modal-content"},RS={class:"card"},MS={class:"card-content"},FS=["textContent"],VS=["textContent"],HS={class:"field"},US={class:"control"},jS=["placeholder"],BS={class:"card-footer is-clipped"},WS=["textContent"],qS=["textContent"];function GS(e,t,n,r,o,s){const i=O("mdicon");return x(),we(Rt,{name:"fade"},{default:N(()=>[n.show?(x(),I("div",NS,[c("div",{class:"modal-background",onClick:t[0]||(t[0]=a=>e.$emit("close"))}),c("div",DS,[c("div",RS,[c("div",MS,[c("p",{class:"title is-4",textContent:y(e.$t("dialog.remote-pairing.title"))},null,8,FS),c("form",{onSubmit:t[2]||(t[2]=gt((...a)=>s.kickoff_pairing&&s.kickoff_pairing(...a),["prevent"]))},[c("label",{class:"label",textContent:y(s.pairing.remote)},null,8,VS),c("div",HS,[c("div",US,[ht(c("input",{ref:"pin_field","onUpdate:modelValue":t[1]||(t[1]=a=>o.pairing_req.pin=a),class:"input",inputmode:"numeric",pattern:"[\\d]{4}",placeholder:e.$t("dialog.remote-pairing.pairing-code")},null,8,jS),[[_n,o.pairing_req.pin]])])])],32)]),c("footer",BS,[c("a",{class:"card-footer-item has-text-danger",onClick:t[3]||(t[3]=a=>e.$emit("close"))},[b(i,{class:"icon",name:"cancel",size:"16"}),c("span",{class:"is-size-7",textContent:y(e.$t("dialog.remote-pairing.cancel"))},null,8,WS)]),c("a",{class:"card-footer-item has-background-info has-text-white has-text-weight-bold",onClick:t[4]||(t[4]=(...a)=>s.kickoff_pairing&&s.kickoff_pairing(...a))},[b(i,{class:"icon",name:"cellphone",size:"16"}),c("span",{class:"is-size-7",textContent:y(e.$t("dialog.remote-pairing.pair"))},null,8,qS)])])])]),c("button",{class:"modal-close is-large","aria-label":"close",onClick:t[5]||(t[5]=a=>e.$emit("close"))})])):ee("",!0)]),_:1})}const KS=ae(LS,[["render",GS]]),ZS={name:"ModalDialog",props:{close_action:{default:"",type:String},delete_action:{default:"",type:String},ok_action:{default:"",type:String},show:Boolean,title:{required:!0,type:String}},emits:["delete","close","ok"]},YS={key:0,class:"modal is-active"},XS={class:"modal-content"},JS={class:"card"},QS={class:"card-content"},ex=["textContent"],tx={class:"card-footer is-clipped"},nx=["textContent"],rx=["textContent"],ox=["textContent"];function sx(e,t,n,r,o,s){const i=O("mdicon");return x(),we(Rt,{name:"fade"},{default:N(()=>[n.show?(x(),I("div",YS,[c("div",{class:"modal-background",onClick:t[0]||(t[0]=a=>e.$emit("close"))}),c("div",XS,[c("div",JS,[c("div",QS,[n.title?(x(),I("p",{key:0,class:"title is-4",textContent:y(n.title)},null,8,ex)):ee("",!0),vt(e.$slots,"modal-content")]),c("footer",tx,[c("a",{class:"card-footer-item has-text-dark",onClick:t[1]||(t[1]=a=>e.$emit("close"))},[b(i,{class:"icon",name:"cancel",size:"16"}),c("span",{class:"is-size-7",textContent:y(n.close_action)},null,8,nx)]),n.delete_action?(x(),I("a",{key:0,class:"card-footer-item has-background-danger has-text-white has-text-weight-bold",onClick:t[2]||(t[2]=a=>e.$emit("delete"))},[b(i,{class:"icon",name:"delete",size:"16"}),c("span",{class:"is-size-7",textContent:y(n.delete_action)},null,8,rx)])):ee("",!0),n.ok_action?(x(),I("a",{key:1,class:"card-footer-item has-background-info has-text-white has-text-weight-bold",onClick:t[3]||(t[3]=a=>e.$emit("ok"))},[b(i,{class:"icon",name:"check",size:"16"}),c("span",{class:"is-size-7",textContent:y(n.ok_action)},null,8,ox)])):ee("",!0)])])]),c("button",{class:"modal-close is-large","aria-label":"close",onClick:t[4]||(t[4]=a=>e.$emit("close"))})])):ee("",!0)]),_:3})}const Zd=ae(ZS,[["render",sx]]),Gl=jn("LibraryStore",{state:()=>({albums:0,artists:0,db_playtime:0,songs:0,rss:{},started_at:"01",updated_at:"01",update_dialog_scan_kind:"",updating:!1})}),Pt=jn("ServicesStore",{state:()=>({lastfm:{},spotify:{}})}),ix={name:"ModalDialogUpdate",components:{ModalDialog:Zd},props:{show:Boolean},emits:["close"],setup(){return{libraryStore:Gl(),servicesStore:Pt()}},data(){return{rescan_metadata:!1}},computed:{library(){return this.libraryStore.$state},rss(){return this.libraryStore.rss},spotify_enabled(){return this.servicesStore.spotify.webapi_token_valid},update_dialog_scan_kind:{get(){return this.library.update_dialog_scan_kind},set(e){this.library.update_dialog_scan_kind=e}}},methods:{close(){this.update_dialog_scan_kind="",this.$emit("close")},update_library(){this.rescan_metadata?B.library_rescan(this.update_dialog_scan_kind):B.library_update(this.update_dialog_scan_kind)}}},ax={key:0},lx=["textContent"],cx={key:0,class:"field"},ux={class:"control"},dx={class:"select is-small"},mx=["textContent"],fx=["textContent"],px=["textContent"],hx=["textContent"],_x={class:"field"},gx=["textContent"],yx={key:1},zx=["textContent"];function vx(e,t,n,r,o,s){const i=O("modal-dialog");return x(),we(i,{show:n.show,title:e.$t("dialog.update.title"),ok_action:s.library.updating?"":e.$t("dialog.update.rescan"),close_action:e.$t("dialog.update.cancel"),onOk:s.update_library,onClose:t[2]||(t[2]=a=>s.close())},{"modal-content":N(()=>[s.library.updating?(x(),I("div",yx,[c("p",{class:"mb-3",textContent:y(e.$t("dialog.update.progress"))},null,8,zx)])):(x(),I("div",ax,[c("p",{class:"mb-3",textContent:y(e.$t("dialog.update.info"))},null,8,lx),s.spotify_enabled||s.rss.tracks>0?(x(),I("div",cx,[c("div",ux,[c("div",dx,[ht(c("select",{"onUpdate:modelValue":t[0]||(t[0]=a=>s.update_dialog_scan_kind=a)},[c("option",{value:"",textContent:y(e.$t("dialog.update.all"))},null,8,mx),c("option",{value:"files",textContent:y(e.$t("dialog.update.local"))},null,8,fx),s.spotify_enabled?(x(),I("option",{key:0,value:"spotify",textContent:y(e.$t("dialog.update.spotify"))},null,8,px)):ee("",!0),s.rss.tracks>0?(x(),I("option",{key:1,value:"rss",textContent:y(e.$t("dialog.update.feeds"))},null,8,hx)):ee("",!0)],512),[[Ld,s.update_dialog_scan_kind]])])])])):ee("",!0),c("div",_x,[ht(c("input",{id:"rescan","onUpdate:modelValue":t[1]||(t[1]=a=>o.rescan_metadata=a),type:"checkbox",class:"switch is-rounded is-small"},null,512),[[Mn,o.rescan_metadata]]),c("label",{for:"rescan",textContent:y(e.$t("dialog.update.rescan-metadata"))},null,8,gx)])]))]),_:1},8,["show","title","ok_action","close_action","onOk"])}const bx=ae(ix,[["render",vx]]),Cx={name:"ControlSlider",props:{cursor:{default:"",type:String},disabled:Boolean,max:{required:!0,type:Number},value:{required:!0,type:Number}},emits:["update:value"],computed:{ratio(){return this.value/this.max}}},wx=["value","disabled","max"];function kx(e,t,n,r,o,s){return x(),I("input",{value:n.value,disabled:n.disabled,class:ke(["slider",{"is-inactive":n.disabled}]),max:n.max,type:"range",style:co({"--ratio":s.ratio,"--cursor":e.$filters.cursor(n.cursor)}),onInput:t[0]||(t[0]=i=>e.$emit("update:value",i.target.valueAsNumber))},null,46,wx)}const Yd=ae(Cx,[["render",kx]]),yn=jn("UIStore",{state:()=>({albums_sort:1,artist_albums_sort:1,artist_tracks_sort:1,artists_sort:1,composer_tracks_sort:1,genre_tracks_sort:1,hide_singles:!1,hide_spotify:!1,show_burger_menu:!1,show_only_next_items:!1,show_player_menu:!1,show_update_dialog:!1})}),Sx={name:"NavbarItemLink",props:{to:{required:!0,type:Object}},setup(){return{uiStore:yn()}},computed:{href(){return this.$router.resolve(this.to).href}},methods:{open(){this.uiStore.show_burger_menu&&(this.uiStore.show_burger_menu=!1),this.uiStore.show_player_menu&&(this.uiStore.show_player_menu=!1),this.$router.push(this.to)}}},xx=["href"];function Ex(e,t,n,r,o,s){return x(),I("a",{class:"navbar-item",href:s.href,onClick:t[0]||(t[0]=gt((...i)=>s.open&&s.open(...i),["stop","prevent"]))},[vt(e.$slots,"default")],8,xx)}const Oy=ae(Sx,[["render",Ex]]);var $x="M11,14C12,14 13.05,14.16 14.2,14.44C13.39,15.31 13,16.33 13,17.5C13,18.39 13.25,19.23 13.78,20H3V18C3,16.81 3.91,15.85 5.74,15.12C7.57,14.38 9.33,14 11,14M11,12C9.92,12 9,11.61 8.18,10.83C7.38,10.05 7,9.11 7,8C7,6.92 7.38,6 8.18,5.18C9,4.38 9.92,4 11,4C12.11,4 13.05,4.38 13.83,5.18C14.61,6 15,6.92 15,8C15,9.11 14.61,10.05 13.83,10.83C13.05,11.61 12.11,12 11,12M18.5,10H20L22,10V12H20V17.5A2.5,2.5 0 0,1 17.5,20A2.5,2.5 0 0,1 15,17.5A2.5,2.5 0 0,1 17.5,15C17.86,15 18.19,15.07 18.5,15.21V10Z",Tx="M12,11A1,1 0 0,0 11,12A1,1 0 0,0 12,13A1,1 0 0,0 13,12A1,1 0 0,0 12,11M12,16.5C9.5,16.5 7.5,14.5 7.5,12C7.5,9.5 9.5,7.5 12,7.5C14.5,7.5 16.5,9.5 16.5,12C16.5,14.5 14.5,16.5 12,16.5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",Ax="M13 14H11V9H13M13 18H11V16H13M1 21H23L12 2L1 21Z",Ox="M19.92,12.08L12,20L4.08,12.08L5.5,10.67L11,16.17V2H13V16.17L18.5,10.66L19.92,12.08M12,20H2V22H22V20H12Z",Px="M19 2L14 6.5V17.5L19 13V2M6.5 5C4.55 5 2.45 5.4 1 6.5V21.16C1 21.41 1.25 21.66 1.5 21.66C1.6 21.66 1.65 21.59 1.75 21.59C3.1 20.94 5.05 20.5 6.5 20.5C8.45 20.5 10.55 20.9 12 22C13.35 21.15 15.8 20.5 17.5 20.5C19.15 20.5 20.85 20.81 22.25 21.56C22.35 21.61 22.4 21.59 22.5 21.59C22.75 21.59 23 21.34 23 21.09V6.5C22.4 6.05 21.75 5.75 21 5.5V19C19.9 18.65 18.7 18.5 17.5 18.5C15.8 18.5 13.35 19.15 12 20V6.5C10.55 5.4 8.45 5 6.5 5Z",Ix="M12 21.5C10.65 20.65 8.2 20 6.5 20C4.85 20 3.15 20.3 1.75 21.05C1.65 21.1 1.6 21.1 1.5 21.1C1.25 21.1 1 20.85 1 20.6V6C1.6 5.55 2.25 5.25 3 5C4.11 4.65 5.33 4.5 6.5 4.5C8.45 4.5 10.55 4.9 12 6C13.45 4.9 15.55 4.5 17.5 4.5C18.67 4.5 19.89 4.65 21 5C21.75 5.25 22.4 5.55 23 6V20.6C23 20.85 22.75 21.1 22.5 21.1C22.4 21.1 22.35 21.1 22.25 21.05C20.85 20.3 19.15 20 17.5 20C15.8 20 13.35 20.65 12 21.5M12 8V19.5C13.35 18.65 15.8 18 17.5 18C18.7 18 19.9 18.15 21 18.5V7C19.9 6.65 18.7 6.5 17.5 6.5C15.8 6.5 13.35 7.15 12 8M13 11.5C14.11 10.82 15.6 10.5 17.5 10.5C18.41 10.5 19.26 10.59 20 10.78V9.23C19.13 9.08 18.29 9 17.5 9C15.73 9 14.23 9.28 13 9.84V11.5M17.5 11.67C15.79 11.67 14.29 11.93 13 12.46V14.15C14.11 13.5 15.6 13.16 17.5 13.16C18.54 13.16 19.38 13.24 20 13.4V11.9C19.13 11.74 18.29 11.67 17.5 11.67M20 14.57C19.13 14.41 18.29 14.33 17.5 14.33C15.67 14.33 14.17 14.6 13 15.13V16.82C14.11 16.16 15.6 15.83 17.5 15.83C18.54 15.83 19.38 15.91 20 16.07V14.57Z",Lx="M9 3V18H12V3H9M12 5L16 18L19 17L15 4L12 5M5 5V18H8V5H5M3 19V21H21V19H3Z",Nx="M12 10C10.9 10 10 10.9 10 12S10.9 14 12 14 14 13.1 14 12 13.1 10 12 10M18 12C18 8.7 15.3 6 12 6S6 8.7 6 12C6 14.2 7.2 16.1 9 17.2L10 15.5C8.8 14.8 8 13.5 8 12.1C8 9.9 9.8 8.1 12 8.1S16 9.9 16 12.1C16 13.6 15.2 14.9 14 15.5L15 17.2C16.8 16.2 18 14.2 18 12M12 2C6.5 2 2 6.5 2 12C2 15.7 4 18.9 7 20.6L8 18.9C5.6 17.5 4 14.9 4 12C4 7.6 7.6 4 12 4S20 7.6 20 12C20 15 18.4 17.5 16 18.9L17 20.6C20 18.9 22 15.7 22 12C22 6.5 17.5 2 12 2Z",Kl="M12 2C17.5 2 22 6.5 22 12S17.5 22 12 22 2 17.5 2 12 6.5 2 12 2M12 4C10.1 4 8.4 4.6 7.1 5.7L18.3 16.9C19.3 15.5 20 13.8 20 12C20 7.6 16.4 4 12 4M16.9 18.3L5.7 7.1C4.6 8.4 4 10.1 4 12C4 16.4 7.6 20 12 20C13.9 20 15.6 19.4 16.9 18.3Z",Dx="M1,10V12A9,9 0 0,1 10,21H12C12,14.92 7.07,10 1,10M1,14V16A5,5 0 0,1 6,21H8A7,7 0 0,0 1,14M1,18V21H4A3,3 0 0,0 1,18M21,3H3C1.89,3 1,3.89 1,5V8H3V5H21V19H14V21H21A2,2 0 0,0 23,19V5C23,3.89 22.1,3 21,3Z",Rx="M6,22H18L12,16M21,3H3A2,2 0 0,0 1,5V17A2,2 0 0,0 3,19H7V17H3V5H21V17H17V19H21A2,2 0 0,0 23,17V5A2,2 0 0,0 21,3Z",Mx="M17,19H7V5H17M17,1H7C5.89,1 5,1.89 5,3V21A2,2 0 0,0 7,23H17A2,2 0 0,0 19,21V3C19,1.89 18.1,1 17,1Z",Fx="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z",Vx="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z",Hx="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z",Ux="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z",jx="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z",Bx="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z",Wx="M20.37,8.91L19.37,10.64L7.24,3.64L8.24,1.91L11.28,3.66L12.64,3.29L16.97,5.79L17.34,7.16L20.37,8.91M6,19V7H11.07L18,11V19A2,2 0 0,1 16,21H8A2,2 0 0,1 6,19Z",qx="M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z",Gx="M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z",Kx="M3,15V13H5V15H3M3,11V9H5V11H3M7,15V13H9V15H7M7,11V9H9V11H7M11,15V13H13V15H11M11,11V9H13V11H11M15,15V13H17V15H15M15,11V9H17V11H15M19,15V13H21V15H19M19,11V9H21V11H19Z",Zx="M11.5,3C6.85,3 2.92,6.03 1.53,10.22L3.9,11C4.95,7.81 7.96,5.5 11.5,5.5C13.46,5.5 15.23,6.22 16.62,7.38L14,10H21V3L18.4,5.6C16.55,4 14.15,3 11.5,3M19,14V20C19,21.11 18.11,22 17,22H15A2,2 0 0,1 13,20V14A2,2 0 0,1 15,12H17C18.11,12 19,12.9 19,14M15,14V20H17V14H15M11,20C11,21.11 10.1,22 9,22H5V20H9V18H7V16H9V14H5V12H9A2,2 0 0,1 11,14V15.5A1.5,1.5 0 0,1 9.5,17A1.5,1.5 0 0,1 11,18.5V20Z",Yx="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M13,13H11V18A2,2 0 0,1 9,20A2,2 0 0,1 7,18A2,2 0 0,1 9,16C9.4,16 9.7,16.1 10,16.3V11H13V13M13,9V3.5L18.5,9H13Z",Xx="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z",Jx="M17.66 11.2C17.43 10.9 17.15 10.64 16.89 10.38C16.22 9.78 15.46 9.35 14.82 8.72C13.33 7.26 13 4.85 13.95 3C13 3.23 12.17 3.75 11.46 4.32C8.87 6.4 7.85 10.07 9.07 13.22C9.11 13.32 9.15 13.42 9.15 13.55C9.15 13.77 9 13.97 8.8 14.05C8.57 14.15 8.33 14.09 8.14 13.93C8.08 13.88 8.04 13.83 8 13.76C6.87 12.33 6.69 10.28 7.45 8.64C5.78 10 4.87 12.3 5 14.47C5.06 14.97 5.12 15.47 5.29 15.97C5.43 16.57 5.7 17.17 6 17.7C7.08 19.43 8.95 20.67 10.96 20.92C13.1 21.19 15.39 20.8 17.03 19.32C18.86 17.66 19.5 15 18.56 12.72L18.43 12.46C18.22 12 17.66 11.2 17.66 11.2M14.5 17.5C14.22 17.74 13.76 18 13.4 18.1C12.28 18.5 11.16 17.94 10.5 17.28C11.69 17 12.4 16.12 12.61 15.23C12.78 14.43 12.46 13.77 12.33 13C12.21 12.26 12.23 11.63 12.5 10.94C12.69 11.32 12.89 11.7 13.13 12C13.9 13 15.11 13.44 15.37 14.8C15.41 14.94 15.43 15.08 15.43 15.23C15.46 16.05 15.1 16.95 14.5 17.5H14.5Z",Qx="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z",eE="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z",tE="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3",nE="M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z",rE="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z",oE="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z",sE="M12,2A3,3 0 0,1 15,5V11A3,3 0 0,1 12,14A3,3 0 0,1 9,11V5A3,3 0 0,1 12,2M19,11C19,14.53 16.39,17.44 13,17.93V21H11V17.93C7.61,17.44 5,14.53 5,11H7A5,5 0 0,0 12,16A5,5 0 0,0 17,11H19Z",iE="M21,3V15.5A3.5,3.5 0 0,1 17.5,19A3.5,3.5 0 0,1 14,15.5A3.5,3.5 0 0,1 17.5,12C18.04,12 18.55,12.12 19,12.34V6.47L9,8.6V17.5A3.5,3.5 0 0,1 5.5,21A3.5,3.5 0 0,1 2,17.5A3.5,3.5 0 0,1 5.5,14C6.04,14 6.55,14.12 7,14.34V6L21,3Z",aE="M4,6H2V20A2,2 0 0,0 4,22H18V20H4M18,7H15V12.5A2.5,2.5 0 0,1 12.5,15A2.5,2.5 0 0,1 10,12.5A2.5,2.5 0 0,1 12.5,10C13.07,10 13.58,10.19 14,10.5V5H18M20,2H8A2,2 0 0,0 6,4V16A2,2 0 0,0 8,18H20A2,2 0 0,0 22,16V4A2,2 0 0,0 20,2Z",lE="M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z",cE="M14,19H18V5H14M6,19H10V5H6V19Z",uE="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z",dE="M22,14H20V16H14V13H16V11H14V6A2,2 0 0,0 12,4H4V2H2V10H4V8H10V11H8V13H10V18A2,2 0 0,0 12,20H20V22H22",mE="M8,5.14V19.14L19,12.14L8,5.14Z",fE="M3 10H14V12H3V10M3 6H14V8H3V6M3 14H10V16H3V14M16 13V21L22 17L16 13Z",pE="M3 16H10V14H3M18 14V10H16V14H12V16H16V20H18V16H22V14M14 6H3V8H14M14 10H3V12H14V10Z",hE="M20,6A2,2 0 0,1 22,8V20A2,2 0 0,1 20,22H4A2,2 0 0,1 2,20V8C2,7.15 2.53,6.42 3.28,6.13L15.71,1L16.47,2.83L8.83,6H20M20,8H4V12H16V10H18V12H20V8M7,14A3,3 0 0,0 4,17A3,3 0 0,0 7,20A3,3 0 0,0 10,17A3,3 0 0,0 7,14Z",_E="M12,10A2,2 0 0,1 14,12C14,12.5 13.82,12.94 13.53,13.29L16.7,22H14.57L12,14.93L9.43,22H7.3L10.47,13.29C10.18,12.94 10,12.5 10,12A2,2 0 0,1 12,10M12,8A4,4 0 0,0 8,12C8,12.5 8.1,13 8.28,13.46L7.4,15.86C6.53,14.81 6,13.47 6,12A6,6 0 0,1 12,6A6,6 0 0,1 18,12C18,13.47 17.47,14.81 16.6,15.86L15.72,13.46C15.9,13 16,12.5 16,12A4,4 0 0,0 12,8M12,4A8,8 0 0,0 4,12C4,14.36 5,16.5 6.64,17.94L5.92,19.94C3.54,18.11 2,15.23 2,12A10,10 0 0,1 12,2A10,10 0 0,1 22,12C22,15.23 20.46,18.11 18.08,19.94L17.36,17.94C19,16.5 20,14.36 20,12A8,8 0 0,0 12,4Z",gE="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z",yE="M17,17H7V14L3,18L7,22V19H19V13H17M7,7H17V10L21,6L17,2V5H5V11H7V7Z",zE="M2,5.27L3.28,4L20,20.72L18.73,22L15.73,19H7V22L3,18L7,14V17H13.73L7,10.27V11H5V8.27L2,5.27M17,13H19V17.18L17,15.18V13M17,5V2L21,6L17,10V7H8.82L6.82,5H17Z",vE="M13,15V9H12L10,10V11H11.5V15M17,17H7V14L3,18L7,22V19H19V13H17M7,7H17V10L21,6L17,2V5H5V11H7V7Z",bE="M12.5,3C17.15,3 21.08,6.03 22.47,10.22L20.1,11C19.05,7.81 16.04,5.5 12.5,5.5C10.54,5.5 8.77,6.22 7.38,7.38L10,10H3V3L5.6,5.6C7.45,4 9.85,3 12.5,3M10,12V22H8V14H6V12H10M18,14V20C18,21.11 17.11,22 16,22H14A2,2 0 0,1 12,20V14A2,2 0 0,1 14,12H16C17.11,12 18,12.9 18,14M14,14V20H16V14H14Z",CE="M6.18,15.64A2.18,2.18 0 0,1 8.36,17.82C8.36,19 7.38,20 6.18,20C5,20 4,19 4,17.82A2.18,2.18 0 0,1 6.18,15.64M4,4.44A15.56,15.56 0 0,1 19.56,20H16.73A12.73,12.73 0 0,0 4,7.27V4.44M4,10.1A9.9,9.9 0 0,1 13.9,20H11.07A7.07,7.07 0 0,0 4,12.93V10.1Z",wE="M15,20A1,1 0 0,0 16,19V4H8A1,1 0 0,0 7,5V16H5V5A3,3 0 0,1 8,2H19A3,3 0 0,1 22,5V6H20V5A1,1 0 0,0 19,4A1,1 0 0,0 18,5V9L18,19A3,3 0 0,1 15,22H5A3,3 0 0,1 2,19V18H13A2,2 0 0,0 15,20M9,6H14V8H9V6M9,10H14V12H9V10M9,14H14V16H9V14Z",kE="M13.8 22H5C3.3 22 2 20.7 2 19V18H13.1C13 18.3 13 18.7 13 19C13 20.1 13.3 21.1 13.8 22M13.8 16H5V5C5 3.3 6.3 2 8 2H19C20.7 2 22 3.3 22 5V6H20V5C20 4.4 19.6 4 19 4S18 4.4 18 5V13.1C16.2 13.4 14.7 14.5 13.8 16M8 8H15V6H8V8M8 12H14V10H8V12M17 16V22L22 19L17 16Z",SE="M4,1H20A1,1 0 0,1 21,2V6A1,1 0 0,1 20,7H4A1,1 0 0,1 3,6V2A1,1 0 0,1 4,1M4,9H20A1,1 0 0,1 21,10V14A1,1 0 0,1 20,15H4A1,1 0 0,1 3,14V10A1,1 0 0,1 4,9M4,17H20A1,1 0 0,1 21,18V22A1,1 0 0,1 20,23H4A1,1 0 0,1 3,22V18A1,1 0 0,1 4,17M9,5H10V3H9V5M9,13H10V11H9V13M9,21H10V19H9V21M5,3V5H7V3H5M5,11V13H7V11H5M5,19V21H7V19H5Z",xE="M14.83,13.41L13.42,14.82L16.55,17.95L14.5,20H20V14.5L17.96,16.54L14.83,13.41M14.5,4L16.54,6.04L4,18.59L5.41,20L17.96,7.46L20,9.5V4M10.59,9.17L5.41,4L4,5.41L9.17,10.58L10.59,9.17Z",EE="M16,4.5V7H5V9H16V11.5L19.5,8M16,12.5V15H5V17H16V19.5L19.5,16",$E="M20,5V19L13,12M6,5V19H4V5M13,5V19L6,12",TE="M4,5V19L11,12M18,5V19H20V5M11,5V19L18,12",AE="M12,12A3,3 0 0,0 9,15A3,3 0 0,0 12,18A3,3 0 0,0 15,15A3,3 0 0,0 12,12M12,20A5,5 0 0,1 7,15A5,5 0 0,1 12,10A5,5 0 0,1 17,15A5,5 0 0,1 12,20M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8C10.89,8 10,7.1 10,6C10,4.89 10.89,4 12,4M17,2H7C5.89,2 5,2.89 5,4V20A2,2 0 0,0 7,22H17A2,2 0 0,0 19,20V4C19,2.89 18.1,2 17,2Z",OE="M17.9,10.9C14.7,9 9.35,8.8 6.3,9.75C5.8,9.9 5.3,9.6 5.15,9.15C5,8.65 5.3,8.15 5.75,8C9.3,6.95 15.15,7.15 18.85,9.35C19.3,9.6 19.45,10.2 19.2,10.65C18.95,11 18.35,11.15 17.9,10.9M17.8,13.7C17.55,14.05 17.1,14.2 16.75,13.95C14.05,12.3 9.95,11.8 6.8,12.8C6.4,12.9 5.95,12.7 5.85,12.3C5.75,11.9 5.95,11.45 6.35,11.35C10,10.25 14.5,10.8 17.6,12.7C17.9,12.85 18.05,13.35 17.8,13.7M16.6,16.45C16.4,16.75 16.05,16.85 15.75,16.65C13.4,15.2 10.45,14.9 6.95,15.7C6.6,15.8 6.3,15.55 6.2,15.25C6.1,14.9 6.35,14.6 6.65,14.5C10.45,13.65 13.75,14 16.35,15.6C16.7,15.75 16.75,16.15 16.6,16.45M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",PE="M18,18H6V6H18V18Z",IE="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z",LE="M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z",NE="M16.36,14C16.44,13.34 16.5,12.68 16.5,12C16.5,11.32 16.44,10.66 16.36,10H19.74C19.9,10.64 20,11.31 20,12C20,12.69 19.9,13.36 19.74,14M14.59,19.56C15.19,18.45 15.65,17.25 15.97,16H18.92C17.96,17.65 16.43,18.93 14.59,19.56M14.34,14H9.66C9.56,13.34 9.5,12.68 9.5,12C9.5,11.32 9.56,10.65 9.66,10H14.34C14.43,10.65 14.5,11.32 14.5,12C14.5,12.68 14.43,13.34 14.34,14M12,19.96C11.17,18.76 10.5,17.43 10.09,16H13.91C13.5,17.43 12.83,18.76 12,19.96M8,8H5.08C6.03,6.34 7.57,5.06 9.4,4.44C8.8,5.55 8.35,6.75 8,8M5.08,16H8C8.35,17.25 8.8,18.45 9.4,19.56C7.57,18.93 6.03,17.65 5.08,16M4.26,14C4.1,13.36 4,12.69 4,12C4,11.31 4.1,10.64 4.26,10H7.64C7.56,10.66 7.5,11.32 7.5,12C7.5,12.68 7.56,13.34 7.64,14M12,4.03C12.83,5.23 13.5,6.57 13.91,8H10.09C10.5,6.57 11.17,5.23 12,4.03M18.92,8H15.97C15.65,6.75 15.19,5.55 14.59,4.44C16.43,5.07 17.96,6.34 18.92,8M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z";const DE={name:"NavbarItemOutput",components:{ControlSlider:Yd},props:{output:{required:!0,type:Object}},data(){return{cursor:Kl,volume:this.output.selected?this.output.volume:0}},computed:{type_class(){return this.output.type.startsWith("AirPlay")?"cast-variant":this.output.type==="Chromecast"?"cast":this.output.type==="fifo"?"pipe":"server"}},watch:{output(){this.volume=this.output.volume}},methods:{change_volume(){B.player_output_volume(this.output.id,this.volume)},set_enabled(){const e={selected:!this.output.selected};B.output_update(this.output.id,e)}}},RE={class:"navbar-item"},ME={class:"level is-mobile"},FE={class:"level-left is-flex-grow-1"},VE={class:"level-item is-flex-grow-0"},HE={class:"level-item"},UE={class:"is-flex-grow-1"},jE=["textContent"];function BE(e,t,n,r,o,s){const i=O("mdicon"),a=O("control-slider");return x(),I("div",RE,[c("div",ME,[c("div",FE,[c("div",VE,[c("a",{class:ke(["button is-white is-small",{"has-text-grey-light":!n.output.selected}]),onClick:t[0]||(t[0]=(...l)=>s.set_enabled&&s.set_enabled(...l))},[b(i,{class:"icon",name:s.type_class,size:"18",title:n.output.type},null,8,["name","title"])],2)]),c("div",HE,[c("div",UE,[c("p",{class:ke(["heading",{"has-text-grey-light":!n.output.selected}]),textContent:y(n.output.name)},null,10,jE),b(a,{value:o.volume,"onUpdate:value":t[1]||(t[1]=l=>o.volume=l),disabled:!n.output.selected,max:100,cursor:o.cursor,onChange:s.change_volume},null,8,["value","disabled","cursor","onChange"])])])])])])}const WE=ae(DE,[["render",BE]]),qE={name:"PlayerButtonConsume",props:{icon_size:{default:16,type:Number}},setup(){return{playerStore:En()}},computed:{is_consume(){return this.playerStore.consume}},methods:{toggle_consume_mode(){B.player_consume(!this.is_consume)}}};function GE(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:ke({"is-info":s.is_consume}),onClick:t[0]||(t[0]=(...a)=>s.toggle_consume_mode&&s.toggle_consume_mode(...a))},[b(i,{class:"icon",name:"fire",size:n.icon_size,title:e.$t("player.button.consume")},null,8,["size","title"])],2)}const KE=ae(qE,[["render",GE]]),Zl=jn("LyricsStore",{state:()=>({content:[],pane:!1})}),ZE={name:"PlayerButtonLyrics",props:{icon_size:{default:16,type:Number}},setup(){return{lyricsStore:Zl()}},computed:{icon_name(){return this.is_active?"script-text-play":"script-text-outline"},is_active(){return this.lyricsStore.pane}},methods:{toggle_lyrics(){this.lyricsStore.pane=!this.lyricsStore.pane}}};function YE(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:ke({"is-info":s.is_active}),onClick:t[0]||(t[0]=(...a)=>s.toggle_lyrics&&s.toggle_lyrics(...a))},[b(i,{class:"icon",name:s.icon_name,size:n.icon_size,title:e.$t("player.button.toggle-lyrics")},null,8,["name","size","title"])],2)}const XE=ae(ZE,[["render",YE]]),JE={name:"PlayerButtonNext",props:{icon_size:{default:16,type:Number}},computed:{disabled(){var e;return((e=tr())==null?void 0:e.count)<=0}},methods:{play_next(){this.disabled||B.player_next()}}},QE=["disabled"];function e2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.play_next&&s.play_next(...a))},[b(i,{name:"skip-forward",size:n.icon_size,title:e.$t("player.button.skip-forward")},null,8,["size","title"])],8,QE)}const t2=ae(JE,[["render",e2]]),n2={name:"PlayerButtonPlayPause",props:{icon_size:{default:16,type:Number},show_disabled_message:Boolean},setup(){return{notificationsStore:dr(),playerStore:En(),queueStore:tr()}},computed:{disabled(){var e;return((e=this.queueStore)==null?void 0:e.count)<=0},icon_name(){if(this.is_playing){if(this.is_pause_allowed)return"pause"}else return"play";return"stop"},is_pause_allowed(){const{current:e}=this.queueStore;return e&&e.data_kind!=="pipe"},is_playing(){return this.playerStore.state==="play"}},methods:{toggle_play_pause(){if(this.disabled){this.show_disabled_message&&this.notificationsStore.add({text:this.$t("server.empty-queue"),timeout:2e3,topic:"connection",type:"info"});return}this.is_playing&&this.is_pause_allowed?B.player_pause():this.is_playing&&!this.is_pause_allowed?B.player_stop():B.player_play()}}},r2=["disabled"];function o2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.toggle_play_pause&&s.toggle_play_pause(...a))},[b(i,{name:s.icon_name,size:n.icon_size,title:e.$t(`player.button.${s.icon_name}`)},null,8,["name","size","title"])],8,r2)}const s2=ae(n2,[["render",o2]]),i2={name:"PlayerButtonPrevious",props:{icon_size:{default:16,type:Number}},setup(){return{queueStore:tr()}},computed:{disabled(){return this.queueStore.count<=0}},methods:{play_previous(){this.disabled||B.player_previous()}}},a2=["disabled"];function l2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.play_previous&&s.play_previous(...a))},[b(i,{name:"skip-backward",size:n.icon_size,title:e.$t("player.button.skip-backward")},null,8,["size","title"])],8,a2)}const c2=ae(i2,[["render",l2]]),u2={name:"PlayerButtonRepeat",props:{icon_size:{default:16,type:Number}},setup(){return{playerStore:En()}},computed:{icon_name(){return this.is_repeat_all?"repeat":this.is_repeat_single?"repeat-once":"repeat-off"},is_repeat_all(){return this.playerStore.repeat==="all"},is_repeat_off(){return!this.is_repeat_all&&!this.is_repeat_single},is_repeat_single(){return this.playerStore.repeat==="single"}},methods:{toggle_repeat_mode(){this.is_repeat_all?B.player_repeat("single"):this.is_repeat_single?B.player_repeat("off"):B.player_repeat("all")}}};function d2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:ke({"is-info":!s.is_repeat_off}),onClick:t[0]||(t[0]=(...a)=>s.toggle_repeat_mode&&s.toggle_repeat_mode(...a))},[b(i,{class:"icon",name:s.icon_name,size:n.icon_size,title:e.$t(`player.button.${s.icon_name}`)},null,8,["name","size","title"])],2)}const m2=ae(u2,[["render",d2]]),f2={name:"PlayerButtonSeekBack",props:{icon_size:{default:16,type:Number},seek_ms:{required:!0,type:Number}},setup(){return{playerStore:En(),queueStore:tr()}},computed:{disabled(){var e;return((e=this.queueStore)==null?void 0:e.count)<=0||this.is_stopped||this.current.data_kind==="pipe"},is_stopped(){return this.player.state==="stop"},current(){return this.queueStore.current},player(){return this.playerStore},visible(){return["podcast","audiobook"].includes(this.current.media_kind)}},methods:{seek(){this.disabled||B.player_seek(this.seek_ms*-1)}}},p2=["disabled"];function h2(e,t,n,r,o,s){const i=O("mdicon");return s.visible?(x(),I("a",{key:0,disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.seek&&s.seek(...a))},[b(i,{name:"rewind-10",size:n.icon_size,title:e.$t("player.button.seek-backward")},null,8,["size","title"])],8,p2)):ee("",!0)}const _2=ae(f2,[["render",h2]]),g2={name:"PlayerButtonSeekForward",props:{icon_size:{default:16,type:Number},seek_ms:{required:!0,type:Number}},setup(){return{playerStore:En(),queueStore:tr()}},computed:{disabled(){var e;return((e=this.queueStore)==null?void 0:e.count)<=0||this.is_stopped||this.current.data_kind==="pipe"},is_stopped(){return this.player.state==="stop"},current(){return this.queueStore.current},player(){return this.playerStore},visible(){return["podcast","audiobook"].includes(this.current.media_kind)}},methods:{seek(){this.disabled||B.player_seek(this.seek_ms)}}},y2=["disabled"];function z2(e,t,n,r,o,s){const i=O("mdicon");return s.visible?(x(),I("a",{key:0,disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.seek&&s.seek(...a))},[b(i,{name:"fast-forward-30",size:n.icon_size,title:e.$t("player.button.seek-forward")},null,8,["size","title"])],8,y2)):ee("",!0)}const v2=ae(g2,[["render",z2]]),b2={name:"PlayerButtonShuffle",props:{icon_size:{default:16,type:Number}},setup(){return{playerStore:En()}},computed:{icon_name(){return this.is_shuffle?"shuffle":"shuffle-disabled"},is_shuffle(){return this.playerStore.shuffle}},methods:{toggle_shuffle_mode(){B.player_shuffle(!this.is_shuffle)}}};function C2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:ke({"is-info":s.is_shuffle}),onClick:t[0]||(t[0]=(...a)=>s.toggle_shuffle_mode&&s.toggle_shuffle_mode(...a))},[b(i,{class:"icon",name:s.icon_name,size:n.icon_size,title:e.$t(`player.button.${s.icon_name}`)},null,8,["name","size","title"])],2)}const w2=ae(b2,[["render",C2]]),Us={audio:new Audio,context:null,play(e){this.stop(),this.context.resume().then(()=>{this.audio.src=`${String(e||"")}?x=${Date.now()}`,this.audio.crossOrigin="anonymous",this.audio.load()})},setVolume(e){this.audio&&(this.audio.volume=Math.min(1,Math.max(0,parseFloat(e)||0)))},setup(){return this.context=new(window.AudioContext||window.webkitAudioContext),this.context.createMediaElementSource(this.audio).connect(this.context.destination),this.audio.addEventListener("canplaythrough",()=>{this.audio.play()}),this.audio.addEventListener("canplay",()=>{this.audio.play()}),this.audio},stop(){try{this.audio.pause()}catch{}try{this.audio.stop()}catch{}try{this.audio.close()}catch{}}},Xd=jn("OutputsStore",{state:()=>({outputs:[]})}),k2={name:"NavbarBottom",components:{ControlSlider:Yd,NavbarItemLink:Oy,NavbarItemOutput:WE,PlayerButtonConsume:KE,PlayerButtonLyrics:XE,PlayerButtonNext:t2,PlayerButtonPlayPause:s2,PlayerButtonPrevious:c2,PlayerButtonRepeat:m2,PlayerButtonSeekBack:_2,PlayerButtonSeekForward:v2,PlayerButtonShuffle:w2},setup(){return{notificationsStore:dr(),outputsStore:Xd(),playerStore:En(),queueStore:tr(),uiStore:yn()}},data(){return{cursor:Kl,loading:!1,old_volume:0,playing:!1,show_desktop_outputs_menu:!1,show_outputs_menu:!1,stream_volume:10}},computed:{is_now_playing_page(){return this.$route.name==="now-playing"},current(){return this.queueStore.current},outputs(){return this.outputsStore.outputs},player(){return this.playerStore},show_player_menu:{get(){return this.uiStore.show_player_menu},set(e){this.uiStore.show_player_menu=e}}},watch:{"playerStore.volume"(){this.player.volume>0&&(this.old_volume=this.player.volume)}},mounted(){this.setupAudio()},unmounted(){this.closeAudio()},methods:{change_stream_volume(){Us.setVolume(this.stream_volume/100)},change_volume(){B.player_volume(this.player.volume)},closeAudio(){Us.stop(),this.playing=!1},on_click_outside_outputs(){this.show_outputs_menu=!1},playChannel(){this.playing||(this.loading=!0,Us.play("/stream.mp3"),Us.setVolume(this.stream_volume/100))},setupAudio(){const e=Us.setup();e.addEventListener("waiting",()=>{this.playing=!1,this.loading=!0}),e.addEventListener("playing",()=>{this.playing=!0,this.loading=!1}),e.addEventListener("ended",()=>{this.playing=!1,this.loading=!1}),e.addEventListener("error",()=>{this.closeAudio(),this.notificationsStore.add({text:this.$t("navigation.stream-error"),type:"danger"}),this.playing=!1,this.loading=!1})},togglePlay(){this.loading||(this.playing&&this.closeAudio(),this.playChannel())},toggle_mute_volume(){this.player.volume=this.player.volume>0?0:this.old_volume,this.change_volume()}}},S2={class:"navbar-dropdown is-right fd-width-auto"},x2={class:"navbar-item"},E2={class:"level is-mobile"},$2={class:"level-left is-flex-grow-1"},T2={class:"level-item is-flex-grow-0"},A2={class:"level-item"},O2=["textContent"],P2=c("hr",{class:"my-3"},null,-1),I2=c("hr",{class:"my-3"},null,-1),L2={class:"navbar-item"},N2={class:"level is-mobile"},D2={class:"level-left is-flex-grow-1"},R2={class:"level-item is-flex-grow-0"},M2={class:"level-item"},F2={class:"is-flex-grow-1"},V2=["textContent"],H2={href:"stream.mp3",class:"heading ml-2",target:"_blank"},U2=c("hr",{class:"my-3"},null,-1),j2={class:"navbar-item is-justify-content-center"},B2={class:"buttons has-addons"},W2={class:"navbar-brand is-flex-grow-1"},q2={class:"fd-is-text-clipped"},G2=["textContent"],K2=c("br",null,null,-1),Z2=["textContent"],Y2=["textContent"],X2={class:"navbar-item"},J2={class:"buttons has-addons is-centered"},Q2=c("hr",{class:"my-3"},null,-1),e$={class:"navbar-item"},t$={class:"level is-mobile"},n$={class:"level-left is-flex-grow-1"},r$={class:"level-item is-flex-grow-0"},o$={class:"level-item"},s$={class:"is-flex-grow-1"},i$=["textContent"],a$=c("hr",{class:"my-3"},null,-1),l$=c("hr",{class:"my-3"},null,-1),c$={class:"navbar-item mb-5"},u$={class:"level is-mobile"},d$={class:"level-left is-flex-grow-1"},m$={class:"level-item is-flex-grow-0"},f$={class:"level-item"},p$={class:"is-flex-grow-1"},h$=["textContent"],_$={href:"stream.mp3",class:"heading ml-2",target:"_blank"};function g$(e,t,n,r,o,s){const i=O("mdicon"),a=O("control-slider"),l=O("navbar-item-output"),u=O("player-button-repeat"),m=O("player-button-shuffle"),d=O("player-button-consume"),f=O("player-button-lyrics"),p=O("navbar-item-link"),h=O("player-button-previous"),g=O("player-button-seek-back"),z=O("player-button-play-pause"),k=O("player-button-seek-forward"),w=O("player-button-next");return x(),I("nav",{class:ke(["navbar is-block is-white is-fixed-bottom fd-bottom-navbar",{"is-transparent":s.is_now_playing_page,"is-dark":!s.is_now_playing_page}]),role:"navigation","aria-label":"player controls"},[c("div",{class:ke(["navbar-item has-dropdown has-dropdown-up is-hidden-touch",{"is-active":s.show_player_menu}])},[c("div",S2,[c("div",x2,[c("div",E2,[c("div",$2,[c("div",T2,[c("a",{class:"button is-white is-small",onClick:t[0]||(t[0]=(..._)=>s.toggle_mute_volume&&s.toggle_mute_volume(..._))},[b(i,{class:"icon",name:s.player.volume>0?"volume-high":"volume-off",size:"18"},null,8,["name"])])]),c("div",A2,[c("div",null,[c("p",{class:"heading",textContent:y(e.$t("navigation.volume"))},null,8,O2),b(a,{value:s.player.volume,"onUpdate:value":t[1]||(t[1]=_=>s.player.volume=_),max:100,onChange:s.change_volume},null,8,["value","onChange"])])])])])]),P2,(x(!0),I(ve,null,_t(s.outputs,_=>(x(),we(l,{key:_.id,output:_},null,8,["output"]))),128)),I2,c("div",L2,[c("div",N2,[c("div",D2,[c("div",R2,[c("a",{class:ke(["button is-white is-small",{"has-text-grey-light":!o.playing&&!o.loading,"is-loading":o.loading}]),onClick:t[2]||(t[2]=(..._)=>s.togglePlay&&s.togglePlay(..._))},[b(i,{class:"icon",name:"broadcast",size:"18"})],2)]),c("div",M2,[c("div",F2,[c("div",{class:ke(["is-flex is-align-content-center",{"has-text-grey-light":!o.playing}])},[c("p",{class:"heading",textContent:y(e.$t("navigation.stream"))},null,8,V2),c("a",H2,[b(i,{class:"icon is-small",name:"open-in-new",size:"16"})])],2),b(a,{value:o.stream_volume,"onUpdate:value":t[3]||(t[3]=_=>o.stream_volume=_),disabled:!o.playing,max:100,cursor:o.cursor,onChange:s.change_stream_volume},null,8,["value","disabled","cursor","onChange"])])])])])]),U2,c("div",j2,[c("div",B2,[b(u,{class:"button"}),b(m,{class:"button"}),b(d,{class:"button"}),b(f,{class:"button"})])])])],2),c("div",W2,[b(p,{to:{name:"queue"},class:"mr-auto"},{default:N(()=>[b(i,{class:"icon",name:"playlist-play",size:"24"})]),_:1}),s.is_now_playing_page?ee("",!0):(x(),we(p,{key:0,to:{name:"now-playing"},exact:"",class:"is-expanded is-clipped is-size-7"},{default:N(()=>[c("div",q2,[c("strong",{textContent:y(s.current.title)},null,8,G2),K2,c("span",{textContent:y(s.current.artist)},null,8,Z2),s.current.album?(x(),I("span",{key:0,textContent:y(e.$t("navigation.now-playing",{album:s.current.album}))},null,8,Y2)):ee("",!0)])]),_:1})),s.is_now_playing_page?(x(),we(h,{key:1,class:"navbar-item px-2",icon_size:24})):ee("",!0),s.is_now_playing_page?(x(),we(g,{key:2,seek_ms:1e4,class:"navbar-item px-2",icon_size:24})):ee("",!0),b(z,{class:"navbar-item px-2",icon_size:36,show_disabled_message:""}),s.is_now_playing_page?(x(),we(k,{key:3,seek_ms:3e4,class:"navbar-item px-2",icon_size:24})):ee("",!0),s.is_now_playing_page?(x(),we(w,{key:4,class:"navbar-item px-2",icon_size:24})):ee("",!0),c("a",{class:"navbar-item ml-auto",onClick:t[4]||(t[4]=_=>s.show_player_menu=!s.show_player_menu)},[b(i,{class:"icon",name:s.show_player_menu?"chevron-down":"chevron-up"},null,8,["name"])])]),c("div",{class:ke(["navbar-menu is-hidden-desktop",{"is-active":s.show_player_menu}])},[c("div",X2,[c("div",J2,[b(u,{class:"button"}),b(m,{class:"button"}),b(d,{class:"button"}),b(f,{class:"button"})])]),Q2,c("div",e$,[c("div",t$,[c("div",n$,[c("div",r$,[c("a",{class:"button is-white is-small",onClick:t[5]||(t[5]=(..._)=>s.toggle_mute_volume&&s.toggle_mute_volume(..._))},[b(i,{class:"icon",name:s.player.volume>0?"volume-high":"volume-off",size:"18"},null,8,["name"])])]),c("div",o$,[c("div",s$,[c("p",{class:"heading",textContent:y(e.$t("navigation.volume"))},null,8,i$),b(a,{value:s.player.volume,"onUpdate:value":t[6]||(t[6]=_=>s.player.volume=_),max:100,onChange:s.change_volume},null,8,["value","onChange"])])])])])]),a$,(x(!0),I(ve,null,_t(s.outputs,_=>(x(),we(l,{key:_.id,output:_},null,8,["output"]))),128)),l$,c("div",c$,[c("div",u$,[c("div",d$,[c("div",m$,[c("a",{class:ke(["button is-white is-small",{"has-text-grey-light":!o.playing&&!o.loading,"is-loading":o.loading}]),onClick:t[7]||(t[7]=(..._)=>s.togglePlay&&s.togglePlay(..._))},[b(i,{class:"icon",name:"radio-tower",size:"16"})],2)]),c("div",f$,[c("div",p$,[c("div",{class:ke(["is-flex is-align-content-center",{"has-text-grey-light":!o.playing}])},[c("p",{class:"heading",textContent:y(e.$t("navigation.stream"))},null,8,h$),c("a",_$,[b(i,{class:"icon is-small",name:"open-in-new",size:"16"})])],2),b(a,{value:o.stream_volume,"onUpdate:value":t[8]||(t[8]=_=>o.stream_volume=_),disabled:!o.playing,max:100,cursor:o.cursor,onChange:s.change_stream_volume},null,8,["value","disabled","cursor","onChange"])])])])])])],2)],2)}const y$=ae(k2,[["render",g$]]),Jd=jn("SearchStore",{state:()=>({recent_searches:[],search_query:"",search_source:"search-library"}),actions:{add(e){const t=this.recent_searches.indexOf(e);t!==-1&&this.recent_searches.splice(t,1),this.recent_searches.unshift(e),this.recent_searches.length>5&&this.recent_searches.pop()},remove(e){const t=this.recent_searches.indexOf(e);t!==-1&&this.recent_searches.splice(t,1)}}}),sr=jn("SettingsStore",{state:()=>({categories:[]}),getters:{recently_added_limit:e=>{var t;return((t=e.setting("webinterface","recently_added_limit"))==null?void 0:t.value)??100},show_composer_for_genre:e=>{var t;return((t=e.setting("webinterface","show_composer_for_genre"))==null?void 0:t.value)??null},show_composer_now_playing:e=>{var t;return((t=e.setting("webinterface","show_composer_now_playing"))==null?void 0:t.value)??!1},show_cover_artwork_in_album_lists:e=>{var t;return((t=e.setting("webinterface","show_cover_artwork_in_album_lists"))==null?void 0:t.value)??!1},show_filepath_now_playing:e=>{var t;return((t=e.setting("webinterface","show_filepath_now_playing"))==null?void 0:t.value)??!1},show_menu_item_audiobooks:e=>{var t;return((t=e.setting("webinterface","show_menu_item_audiobooks"))==null?void 0:t.value)??!1},show_menu_item_files:e=>{var t;return((t=e.setting("webinterface","show_menu_item_files"))==null?void 0:t.value)??!1},show_menu_item_music:e=>{var t;return((t=e.setting("webinterface","show_menu_item_music"))==null?void 0:t.value)??!1},show_menu_item_playlists:e=>{var t;return((t=e.setting("webinterface","show_menu_item_playlists"))==null?void 0:t.value)??!1},show_menu_item_podcasts:e=>{var t;return((t=e.setting("webinterface","show_menu_item_podcasts"))==null?void 0:t.value)??!1},show_menu_item_radio:e=>{var t;return((t=e.setting("webinterface","show_menu_item_radio"))==null?void 0:t.value)??!1},show_menu_item_search:e=>{var t;return((t=e.setting("webinterface","show_menu_item_search"))==null?void 0:t.value)??!1}},actions:{update(e){const t=this.categories.find(r=>r.name===e.category);if(!t)return;const n=t.options.find(r=>r.name===e.name);n&&(n.value=e.value)},setting(e,t){var n;return((n=this.categories.find(r=>r.name===e))==null?void 0:n.options.find(r=>r.name===t))??{}}}}),z$={name:"NavbarTop",components:{NavbarItemLink:Oy},setup(){return{searchStore:Jd(),servicesStore:Pt(),settingsStore:sr(),uiStore:yn()}},data(){return{show_settings_menu:!1}},computed:{show_burger_menu:{get(){return this.uiStore.show_burger_menu},set(e){this.uiStore.show_burger_menu=e}},show_update_dialog:{get(){return this.uiStore.show_update_dialog},set(e){this.uiStore.show_update_dialog=e}},spotify_enabled(){return this.servicesStore.spotify.webapi_token_valid},zindex(){return this.uiStore.show_player_menu?"z-index: 21":""}},watch:{$route(e,t){this.show_settings_menu=!1}},methods:{on_click_outside_settings(){this.show_settings_menu=!this.show_settings_menu},open_update_dialog(){this.show_update_dialog=!0,this.show_settings_menu=!1,this.show_burger_menu=!1}}},v$={class:"navbar-brand"},b$=c("span",null,null,-1),C$=c("span",null,null,-1),w$=c("span",null,null,-1),k$=[b$,C$,w$],S$=c("div",{class:"navbar-start"},null,-1),x$={class:"navbar-end"},E$={class:"navbar-item is-arrowless is-hidden-touch"},$$={class:"navbar-dropdown is-right"},T$=["textContent"],A$=["textContent"],O$=["textContent"],P$=["textContent"],I$=["textContent"],L$=["textContent"],N$=["textContent"],D$=["textContent"],R$=["textContent"],M$=["textContent"],F$=["textContent"],V$=c("hr",{class:"my-3"},null,-1),H$=["textContent"];function U$(e,t,n,r,o,s){const i=O("mdicon"),a=O("navbar-item-link");return x(),I("nav",{class:"navbar is-light is-fixed-top",style:co(s.zindex),role:"navigation","aria-label":"main navigation"},[c("div",v$,[r.settingsStore.show_menu_item_playlists?(x(),we(a,{key:0,to:{name:"playlists"}},{default:N(()=>[b(i,{class:"icon",name:"music-box-multiple",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_music?(x(),we(a,{key:1,to:{name:"music"}},{default:N(()=>[b(i,{class:"icon",name:"music",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_podcasts?(x(),we(a,{key:2,to:{name:"podcasts"}},{default:N(()=>[b(i,{class:"icon",name:"microphone",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_audiobooks?(x(),we(a,{key:3,to:{name:"audiobooks"}},{default:N(()=>[b(i,{class:"icon",name:"book-open-variant",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_radio?(x(),we(a,{key:4,to:{name:"radio"}},{default:N(()=>[b(i,{class:"icon",name:"radio",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_files?(x(),we(a,{key:5,to:{name:"files"}},{default:N(()=>[b(i,{class:"icon",name:"folder-open",size:"16"})]),_:1})):ee("",!0),r.settingsStore.show_menu_item_search?(x(),we(a,{key:6,to:{name:r.searchStore.search_source}},{default:N(()=>[b(i,{class:"icon",name:"magnify",size:"16"})]),_:1},8,["to"])):ee("",!0),c("div",{class:ke(["navbar-burger",{"is-active":s.show_burger_menu}]),onClick:t[0]||(t[0]=l=>s.show_burger_menu=!s.show_burger_menu)},k$,2)]),c("div",{class:ke(["navbar-menu",{"is-active":s.show_burger_menu}])},[S$,c("div",x$,[c("div",{class:ke(["navbar-item has-dropdown is-hoverable",{"is-active":o.show_settings_menu}]),onClick:t[2]||(t[2]=(...l)=>s.on_click_outside_settings&&s.on_click_outside_settings(...l))},[c("a",E$,[b(i,{class:"icon",name:"menu",size:"24"})]),c("div",$$,[b(a,{to:{name:"playlists"}},{default:N(()=>[b(i,{class:"icon",name:"music-box-multiple",size:"16"}),c("b",{textContent:y(e.$t("navigation.playlists"))},null,8,T$)]),_:1}),b(a,{to:{name:"music"}},{default:N(()=>[b(i,{class:"icon",name:"music",size:"16"}),c("b",{textContent:y(e.$t("navigation.music"))},null,8,A$)]),_:1}),b(a,{to:{name:"music-artists"}},{default:N(()=>[c("span",{class:"pl-5",textContent:y(e.$t("navigation.artists"))},null,8,O$)]),_:1}),b(a,{to:{name:"music-albums"}},{default:N(()=>[c("span",{class:"pl-5",textContent:y(e.$t("navigation.albums"))},null,8,P$)]),_:1}),b(a,{to:{name:"music-genres"}},{default:N(()=>[c("span",{class:"pl-5",textContent:y(e.$t("navigation.genres"))},null,8,I$)]),_:1}),s.spotify_enabled?(x(),we(a,{key:0,to:{name:"music-spotify"}},{default:N(()=>[c("span",{class:"pl-5",textContent:y(e.$t("navigation.spotify"))},null,8,L$)]),_:1})):ee("",!0),b(a,{to:{name:"podcasts"}},{default:N(()=>[b(i,{class:"icon",name:"microphone",size:"16"}),c("b",{textContent:y(e.$t("navigation.podcasts"))},null,8,N$)]),_:1}),b(a,{to:{name:"audiobooks"}},{default:N(()=>[b(i,{class:"icon",name:"book-open-variant",size:"16"}),c("b",{textContent:y(e.$t("navigation.audiobooks"))},null,8,D$)]),_:1}),b(a,{to:{name:"radio"}},{default:N(()=>[b(i,{class:"icon",name:"radio",size:"16"}),c("b",{textContent:y(e.$t("navigation.radio"))},null,8,R$)]),_:1}),b(a,{to:{name:"files"}},{default:N(()=>[b(i,{class:"icon",name:"folder-open",size:"16"}),c("b",{textContent:y(e.$t("navigation.files"))},null,8,M$)]),_:1}),b(a,{to:{name:r.searchStore.search_source}},{default:N(()=>[b(i,{class:"icon",name:"magnify",size:"16"}),c("b",{textContent:y(e.$t("navigation.search"))},null,8,F$)]),_:1},8,["to"]),V$,b(a,{to:{name:"settings-webinterface"}},{default:N(()=>[Dt(y(e.$t("navigation.settings")),1)]),_:1}),c("a",{class:"navbar-item",onClick:t[1]||(t[1]=gt(l=>s.open_update_dialog(),["stop","prevent"])),textContent:y(e.$t("navigation.update-library"))},null,8,H$),b(a,{to:{name:"about"}},{default:N(()=>[Dt(y(e.$t("navigation.about")),1)]),_:1})])],2)])],2),ht(c("div",{class:"is-overlay",onClick:t[3]||(t[3]=l=>o.show_settings_menu=!1)},null,512),[[Si,o.show_settings_menu]])],4)}const j$=ae(z$,[["render",U$]]),B$={name:"NotificationList",setup(){return{notificationsStore:dr()}},computed:{notifications(){return this.notificationsStore.list}},methods:{remove(e){this.notificationsStore.remove(e)}}},W$={key:0,class:"notifications"},q$={class:"columns is-centered"},G$={class:"column is-half"},K$=["onClick"],Z$=["textContent"];function Y$(e,t,n,r,o,s){return s.notifications.length>0?(x(),I("section",W$,[c("div",q$,[c("div",G$,[(x(!0),I(ve,null,_t(s.notifications,i=>(x(),I("div",{key:i.id,class:ke(["notification",i.type?`is-${i.type}`:""])},[c("button",{class:"delete",onClick:a=>s.remove(i)},null,8,K$),c("div",{class:"text",textContent:y(i.text)},null,8,Z$)],2))),128))])])])):ee("",!0)}const X$=ae(B$,[["render",Y$],["__scopeId","data-v-a896a8d3"]]);var Py=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Yl(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Iy(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function r(){return this instanceof r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,o.get?o:{enumerable:!0,get:function(){return e[r]}})}),n}var Ly={exports:{}};(function(e){(function(t,n){e.exports?e.exports=n():t.ReconnectingWebSocket=n()})(Py,function(){if(!("WebSocket"in window))return;function t(n,r,o){var s={debug:!1,automaticOpen:!0,reconnectInterval:1e3,maxReconnectInterval:3e4,reconnectDecay:1.5,timeoutInterval:2e3,maxReconnectAttempts:null};o||(o={});for(var i in s)typeof o[i]<"u"?this[i]=o[i]:this[i]=s[i];this.url=n,this.reconnectAttempts=0,this.readyState=WebSocket.CONNECTING,this.protocol=null;var a=this,l,u=!1,m=!1,d=document.createElement("div");d.addEventListener("open",function(p){a.onopen(p)}),d.addEventListener("close",function(p){a.onclose(p)}),d.addEventListener("connecting",function(p){a.onconnecting(p)}),d.addEventListener("message",function(p){a.onmessage(p)}),d.addEventListener("error",function(p){a.onerror(p)}),this.addEventListener=d.addEventListener.bind(d),this.removeEventListener=d.removeEventListener.bind(d),this.dispatchEvent=d.dispatchEvent.bind(d);function f(p,h){var g=document.createEvent("CustomEvent");return g.initCustomEvent(p,!1,!1,h),g}this.open=function(p){if(l=new WebSocket(a.url,r||[]),p){if(this.maxReconnectAttempts&&this.reconnectAttempts>this.maxReconnectAttempts)return}else d.dispatchEvent(f("connecting")),this.reconnectAttempts=0;(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","attempt-connect",a.url);var h=l,g=setTimeout(function(){(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","connection-timeout",a.url),m=!0,h.close(),m=!1},a.timeoutInterval);l.onopen=function(z){clearTimeout(g),(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onopen",a.url),a.protocol=l.protocol,a.readyState=WebSocket.OPEN,a.reconnectAttempts=0;var k=f("open");k.isReconnect=p,p=!1,d.dispatchEvent(k)},l.onclose=function(z){if(clearTimeout(w),l=null,u)a.readyState=WebSocket.CLOSED,d.dispatchEvent(f("close"));else{a.readyState=WebSocket.CONNECTING;var k=f("connecting");k.code=z.code,k.reason=z.reason,k.wasClean=z.wasClean,d.dispatchEvent(k),!p&&!m&&((a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onclose",a.url),d.dispatchEvent(f("close")));var w=a.reconnectInterval*Math.pow(a.reconnectDecay,a.reconnectAttempts);setTimeout(function(){a.reconnectAttempts++,a.open(!0)},w>a.maxReconnectInterval?a.maxReconnectInterval:w)}},l.onmessage=function(z){(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onmessage",a.url,z.data);var k=f("message");k.data=z.data,d.dispatchEvent(k)},l.onerror=function(z){(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onerror",a.url,z),d.dispatchEvent(f("error"))}},this.automaticOpen==!0&&this.open(!1),this.send=function(p){if(l)return(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","send",a.url,p),l.send(p);throw"INVALID_STATE_ERR : Pausing to reconnect websocket"},this.close=function(p,h){typeof p>"u"&&(p=1e3),u=!0,l&&l.close(p,h)},this.refresh=function(){l&&l.close()}}return t.prototype.onopen=function(n){},t.prototype.onclose=function(n){},t.prototype.onconnecting=function(n){},t.prototype.onmessage=function(n){},t.prototype.onerror=function(n){},t.debugAll=!1,t.CONNECTING=WebSocket.CONNECTING,t.OPEN=WebSocket.OPEN,t.CLOSING=WebSocket.CLOSING,t.CLOSED=WebSocket.CLOSED,t})})(Ly);var J$=Ly.exports;const Jf=Yl(J$),Fo=jn("ConfigurationStore",{state:()=>({buildoptions:[],version:"",websocket_port:0})}),Q$={name:"App",components:{ModalDialogRemotePairing:KS,ModalDialogUpdate:bx,NavbarBottom:y$,NavbarTop:j$,NotificationList:X$},setup(){return{configurationStore:Fo(),libraryStore:Gl(),lyricsStore:Zl(),notificationsStore:dr(),outputsStore:Xd(),playerStore:En(),queueStore:tr(),remotesStore:Nd(),servicesStore:Pt(),settingsStore:sr(),uiStore:yn()}},data(){return{pairing_active:!1,reconnect_attempts:0,token_timer_id:0}},computed:{show_burger_menu:{get(){return this.uiStore.show_burger_menu},set(e){this.uiStore.show_burger_menu=e}},show_player_menu:{get(){return this.uiStore.show_player_menu},set(e){this.uiStore.show_player_menu=e}},show_update_dialog:{get(){return this.uiStore.show_update_dialog},set(e){this.uiStore.show_update_dialog=e}}},watch:{show_burger_menu(){this.update_is_clipped()},show_player_menu(){this.update_is_clipped()}},created(){this.connect(),this.$Progress.start(),this.$router.beforeEach((e,t,n)=>{e.meta.show_progress&&!(e.path===t.path&&e.hash)&&(e.meta.progress&&this.$Progress.parseMeta(e.meta.progress),this.$Progress.start()),n()}),this.$router.afterEach((e,t)=>{e.meta.show_progress&&this.$Progress.finish()})},methods:{connect(){B.config().then(({data:e})=>{this.configurationStore.$state=e,this.uiStore.hide_singles=e.hide_singles,document.title=e.library_name,this.open_ws(),this.$Progress.finish()}).catch(()=>{this.notificationsStore.add({text:this.$t("server.connection-failed"),topic:"connection",type:"danger"})})},open_ws(){const e=this.configurationStore.websocket_port,t=e<=0?this.create_websocket():this.create_websocket_with_port(e),n=this;t.onopen=()=>{n.reconnect_attempts=0,t.send(JSON.stringify({notify:["update","database","player","options","outputs","volume","queue","spotify","lastfm","pairing"]})),n.update_outputs(),n.update_player_status(),n.update_library_stats(),n.update_settings(),n.update_queue(),n.update_spotify(),n.update_lastfm(),n.update_pairing()};let r=!1;const o=()=>{r||(n.update_outputs(),n.update_player_status(),n.update_library_stats(),n.update_settings(),n.update_queue(),n.update_spotify(),n.update_lastfm(),n.update_pairing(),r=!0,setTimeout(()=>{r=!1},500))};window.addEventListener("focus",o),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&o()}),t.onmessage=s=>{const i=JSON.parse(s.data);(i.notify.includes("update")||i.notify.includes("database"))&&n.update_library_stats(),(i.notify.includes("player")||i.notify.includes("options")||i.notify.includes("volume"))&&n.update_player_status(),(i.notify.includes("outputs")||i.notify.includes("volume"))&&n.update_outputs(),i.notify.includes("queue")&&n.update_queue(),i.notify.includes("spotify")&&n.update_spotify(),i.notify.includes("lastfm")&&n.update_lastfm(),i.notify.includes("pairing")&&n.update_pairing()}},create_websocket(){const e=window.location.hostname,t="/ws",n=window.location.port;let r="ws://";window.location.protocol==="https:"&&(r="wss://");const o=`${r}${e}:${n}${t}`;return new Jf(o,"notify",{maxReconnectInterval:2e3,reconnectInterval:1e3})},create_websocket_with_port(e){let t="ws://";window.location.protocol==="https:"&&(t="wss://");let n=`${t}${window.location.hostname}:${e}`;return new Jf(n,"notify",{maxReconnectInterval:2e3,reconnectInterval:1e3})},update_is_clipped(){this.show_burger_menu||this.show_player_menu?document.querySelector("html").classList.add("is-clipped"):document.querySelector("html").classList.remove("is-clipped")},update_lastfm(){B.lastfm().then(({data:e})=>{this.servicesStore.lastfm=e})},update_library_stats(){B.library_stats().then(({data:e})=>{this.libraryStore.$state=e}),B.library_count("scan_kind is rss").then(({data:e})=>{this.libraryStore.rss=e})},update_lyrics(){const e=this.queueStore.current;e!=null&&e.track_id?B.library_track(e.track_id).then(({data:t})=>{this.lyricsStore.lyrics=t.lyrics}):this.lyricsStore.$reset()},update_outputs(){B.outputs().then(({data:e})=>{this.outputsStore.outputs=e.outputs})},update_pairing(){B.pairing().then(({data:e})=>{this.remotesStore.$state=e,this.pairing_active=e.active})},update_player_status(){B.player_status().then(({data:e})=>{this.playerStore.$state=e,this.update_lyrics()})},update_queue(){B.queue().then(({data:e})=>{this.queueStore.$state=e,this.update_lyrics()})},update_settings(){B.settings().then(({data:e})=>{this.settingsStore.$state=e})},update_spotify(){B.spotify().then(({data:e})=>{this.servicesStore.spotify=e,this.token_timer_id>0&&(window.clearTimeout(this.token_timer_id),this.token_timer_id=0),e.webapi_token_expires_in>0&&e.webapi_token&&(this.token_timer_id=window.setTimeout(this.update_spotify,1e3*e.webapi_token_expires_in))})}},template:""},eT={id:"app"};function tT(e,t,n,r,o,s){const i=O("navbar-top"),a=O("vue-progress-bar"),l=O("router-view"),u=O("modal-dialog-remote-pairing"),m=O("modal-dialog-update"),d=O("notification-list"),f=O("navbar-bottom");return x(),I("div",eT,[b(i),b(a,{class:"has-background-info"}),b(l,null,{default:N(({Component:p})=>[(x(),we(Ll(p)))]),_:1}),b(u,{show:o.pairing_active,onClose:t[0]||(t[0]=p=>o.pairing_active=!1)},null,8,["show"]),b(m,{show:s.show_update_dialog,onClose:t[1]||(t[1]=p=>s.show_update_dialog=!1)},null,8,["show"]),ht(b(d,null,null,512),[[Si,!s.show_burger_menu]]),b(f),ht(c("div",{class:"fd-overlay-fullscreen",onClick:t[2]||(t[2]=p=>s.show_burger_menu=s.show_player_menu=!1)},null,512),[[Si,s.show_burger_menu||s.show_player_menu]])])}const nT=ae(Q$,[["render",tT]]),Ny=function(){return document.ontouchstart!==null?"click":"touchstart"},il="__vue_click_away__",Dy=function(e,t,n){Ry(e);let r=n.context,o=t.value,s=!1;setTimeout(function(){s=!0},0),e[il]=function(i){if((!e||!e.contains(i.target))&&o&&s&&typeof o=="function")return o.call(r,i)},document.addEventListener(Ny(),e[il],!1)},Ry=function(e){document.removeEventListener(Ny(),e[il],!1),delete e[il]},rT=function(e,t,n){t.value!==t.oldValue&&Dy(e,t,n)},oT={install:function(e){e.directive("click-away",sT)}},sT={mounted:Dy,updated:rT,unmounted:Ry};var lr=(e=>(e.LOADING="loading",e.LOADED="loaded",e.ERROR="error",e))(lr||{});const iT=typeof window<"u"&&window!==null,aT=dT(),lT=Object.prototype.propertyIsEnumerable,Qf=Object.getOwnPropertySymbols;function ui(e){return typeof e=="function"||toString.call(e)==="[object Object]"}function cT(e){return typeof e=="object"?e===null:typeof e!="function"}function uT(e){return e!=="__proto__"&&e!=="constructor"&&e!=="prototype"}function dT(){return iT&&"IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype?("isIntersecting"in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,"isIntersecting",{get(){return this.intersectionRatio>0}}),!0):!1}function mT(e,...t){if(!ui(e))throw new TypeError("expected the first argument to be an object");if(t.length===0||typeof Symbol!="function"||typeof Qf!="function")return e;for(const n of t){const r=Qf(n);for(const o of r)lT.call(n,o)&&(e[o]=n[o])}return e}function My(e,...t){let n=0;for(cT(e)&&(e=t[n++]),e||(e={});n{this._logger("Not support IntersectionObserver!")})),this._initIntersectionObserver(t,r,s,i,a)}update(t,n){var a;if(!t)return;(a=this._realObserver(t))==null||a.unobserve(t);const{src:r,error:o,lifecycle:s,delay:i}=this._valueFormatter(typeof n=="string"?n:n.value);this._initIntersectionObserver(t,r,o,s,i)}unmount(t){var n;t&&((n=this._realObserver(t))==null||n.unobserve(t),this._images.delete(t))}loadImages(t,n,r,o){this._setImageSrc(t,n,r,o)}_setImageSrc(t,n,r,o){t.tagName.toLowerCase()==="img"?(n&&t.getAttribute("src")!==n&&t.setAttribute("src",n),this._listenImageStatus(t,()=>{this._lifecycle(lr.LOADED,o,t)},()=>{var s;t.onload=null,this._lifecycle(lr.ERROR,o,t),(s=this._realObserver(t))==null||s.disconnect(),r&&t.getAttribute("src")!==r&&t.setAttribute("src",r),this._log(()=>{this._logger(`Image failed to load!And failed src was: ${n} `)})})):t.style.backgroundImage=`url('${n}')`}_initIntersectionObserver(t,n,r,o,s){var a;const i=this.options.observerOptions;this._images.set(t,new IntersectionObserver(l=>{Array.prototype.forEach.call(l,u=>{s&&s>0?this._delayedIntersectionCallback(t,u,s,n,r,o):this._intersectionCallback(t,u,n,r,o)})},i)),(a=this._realObserver(t))==null||a.observe(t)}_intersectionCallback(t,n,r,o,s){var i;n.isIntersecting&&((i=this._realObserver(t))==null||i.unobserve(n.target),this._setImageSrc(t,r,o,s))}_delayedIntersectionCallback(t,n,r,o,s,i){if(n.isIntersecting){if(n.target.hasAttribute(Go))return;const a=setTimeout(()=>{this._intersectionCallback(t,n,o,s,i),n.target.removeAttribute(Go)},r);n.target.setAttribute(Go,String(a))}else n.target.hasAttribute(Go)&&(clearTimeout(Number(n.target.getAttribute(Go))),n.target.removeAttribute(Go))}_listenImageStatus(t,n,r){t.onload=n,t.onerror=r}_valueFormatter(t){let n=t,r=this.options.loading,o=this.options.error,s=this.options.lifecycle,i=this.options.delay;return ui(t)&&(n=t.src,r=t.loading||this.options.loading,o=t.error||this.options.error,s=t.lifecycle||this.options.lifecycle,i=t.delay||this.options.delay),{src:n,loading:r,error:o,lifecycle:s,delay:i}}_log(t){this.options.log&&t()}_lifecycle(t,n,r){switch(t){case lr.LOADING:r==null||r.setAttribute("lazy",lr.LOADING),n!=null&&n.loading&&n.loading(r);break;case lr.LOADED:r==null||r.setAttribute("lazy",lr.LOADED),n!=null&&n.loaded&&n.loaded(r);break;case lr.ERROR:r==null||r.setAttribute("lazy",lr.ERROR),n!=null&&n.error&&n.error(r);break}}_realObserver(t){return this._images.get(t)}_logger(t,...n){let r=console.error;switch(this.options.logLevel){case"error":r=console.error;break;case"warn":r=console.warn;break;case"info":r=console.info;break;case"debug":r=console.debug;break}r(t,n)}}const _T={install(e,t){const n=new hT(t);e.config.globalProperties.$Lazyload=n,e.provide("Lazyload",n),e.directive("lazy",{mounted:n.mount.bind(n),updated:n.update.bind(n),unmounted:n.unmount.bind(n)})}};var Fy={exports:{}};const Vy=Iy(R0);(function(e){e.exports=function(t){var n={};function r(o){if(n[o])return n[o].exports;var s=n[o]={i:o,l:!1,exports:{}};return t[o].call(s.exports,s,s.exports,r),s.l=!0,s.exports}return r.m=t,r.c=n,r.d=function(o,s,i){r.o(o,s)||Object.defineProperty(o,s,{enumerable:!0,get:i})},r.r=function(o){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},r.t=function(o,s){if(s&1&&(o=r(o)),s&8||s&4&&typeof o=="object"&&o&&o.__esModule)return o;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:o}),s&2&&typeof o!="string")for(var a in o)r.d(i,a,(function(l){return o[l]}).bind(null,a));return i},r.n=function(o){var s=o&&o.__esModule?function(){return o.default}:function(){return o};return r.d(s,"a",s),s},r.o=function(o,s){return Object.prototype.hasOwnProperty.call(o,s)},r.p="",r(r.s="fb15")}({8875:function(t,n,r){var o,s,i;(function(a,l){s=[],o=l,i=typeof o=="function"?o.apply(n,s):o,i!==void 0&&(t.exports=i)})(typeof self<"u"?self:this,function(){function a(){var l=Object.getOwnPropertyDescriptor(document,"currentScript");if(!l&&"currentScript"in document&&document.currentScript||l&&l.get!==a&&document.currentScript)return document.currentScript;try{throw new Error}catch(v){var u=/.*at [^(]*\((.*):(.+):(.+)\)$/ig,m=/@([^@]*):(\d+):(\d+)\s*$/ig,d=u.exec(v.stack)||m.exec(v.stack),f=d&&d[1]||!1,p=d&&d[2]||!1,h=document.location.href.replace(document.location.hash,""),g,z,k,w=document.getElementsByTagName("script");f===h&&(g=document.documentElement.outerHTML,z=new RegExp("(?:[^\\n]+?\\n){0,"+(p-2)+"}[^<]*